3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
20 /* This file contains system pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
30 #define PERL_IN_PP_SYS_C
35 /* Shadow password support for solaris - pdo@cs.umd.edu
36 * Not just Solaris: at least HP-UX, IRIX, Linux.
37 * The API is from SysV.
39 * There are at least two more shadow interfaces,
40 * see the comments in pp_gpwent().
44 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
45 * and another MAXINT from "perl.h" <- <sys/param.h>. */
52 # include <sys/resource.h>
61 # include <sys/select.h>
65 /* XXX Configure test needed.
66 h_errno might not be a simple 'int', especially for multi-threaded
67 applications, see "extern int errno in perl.h". Creating such
68 a test requires taking into account the differences between
69 compiling multithreaded and singlethreaded ($ccflags et al).
70 HOST_NOT_FOUND is typically defined in <netdb.h>.
72 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
80 struct passwd *getpwnam (char *);
81 struct passwd *getpwuid (Uid_t);
85 struct passwd *getpwent (void);
86 # elif defined (VMS) && defined (my_getpwent)
87 struct passwd *Perl_my_getpwent (pTHX);
96 struct group *getgrnam (char *);
97 struct group *getgrgid (Gid_t);
101 struct group *getgrent (void);
107 # if defined(_MSC_VER) || defined(__MINGW32__)
108 # include <sys/utime.h>
115 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
118 # define my_chsize PerlLIO_chsize
119 #elif defined(HAS_TRUNCATE)
120 # define my_chsize PerlLIO_chsize
122 I32 my_chsize(int fd, Off_t length);
127 #else /* no flock() */
129 /* fcntl.h might not have been included, even if it exists, because
130 the current Configure only sets I_FCNTL if it's needed to pick up
131 the *_OK constants. Make sure it has been included before testing
132 the fcntl() locking constants. */
133 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
137 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
138 # define FLOCK fcntl_emulate_flock
139 # define FCNTL_EMULATE_FLOCK
140 # elif defined(HAS_LOCKF)
141 # define FLOCK lockf_emulate_flock
142 # define LOCKF_EMULATE_FLOCK
146 static int FLOCK (int, int);
149 * These are the flock() constants. Since this sytems doesn't have
150 * flock(), the values of the constants are probably not available.
164 # endif /* emulating flock() */
166 #endif /* no flock() */
169 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
171 #if defined(I_SYS_ACCESS) && !defined(R_OK)
172 # include <sys/access.h>
178 /* Missing protos on LynxOS */
179 void sethostent(int);
180 void endhostent(void);
182 void endnetent(void);
183 void setprotoent(int);
184 void endprotoent(void);
185 void setservent(int);
186 void endservent(void);
190 # include "amigaos4/amigaio.h"
193 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
195 /* F_OK unused: if stat() cannot find it... */
197 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
198 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
199 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
202 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
203 # ifdef I_SYS_SECURITY
204 # include <sys/security.h>
208 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
211 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
215 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
217 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
221 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
222 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
223 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
226 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
228 const Uid_t ruid = getuid();
229 const Uid_t euid = geteuid();
230 const Gid_t rgid = getgid();
231 const Gid_t egid = getegid();
234 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
235 Perl_croak(aTHX_ "switching effective uid is not implemented");
238 if (setreuid(euid, ruid))
239 # elif defined(HAS_SETRESUID)
240 if (setresuid(euid, ruid, (Uid_t)-1))
242 /* diag_listed_as: entering effective %s failed */
243 Perl_croak(aTHX_ "entering effective uid failed");
246 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
247 Perl_croak(aTHX_ "switching effective gid is not implemented");
250 if (setregid(egid, rgid))
251 # elif defined(HAS_SETRESGID)
252 if (setresgid(egid, rgid, (Gid_t)-1))
254 /* diag_listed_as: entering effective %s failed */
255 Perl_croak(aTHX_ "entering effective gid failed");
258 res = access(path, mode);
261 if (setreuid(ruid, euid))
262 #elif defined(HAS_SETRESUID)
263 if (setresuid(ruid, euid, (Uid_t)-1))
265 /* diag_listed_as: leaving effective %s failed */
266 Perl_croak(aTHX_ "leaving effective uid failed");
269 if (setregid(rgid, egid))
270 #elif defined(HAS_SETRESGID)
271 if (setresgid(rgid, egid, (Gid_t)-1))
273 /* diag_listed_as: leaving effective %s failed */
274 Perl_croak(aTHX_ "leaving effective gid failed");
278 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
285 const char * const tmps = POPpconstx;
286 const U8 gimme = GIMME_V;
287 const char *mode = "r";
290 if (PL_op->op_private & OPpOPEN_IN_RAW)
292 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
294 fp = PerlProc_popen(tmps, mode);
296 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
298 PerlIO_apply_layers(aTHX_ fp,mode,type);
300 if (gimme == G_VOID) {
302 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
305 else if (gimme == G_SCALAR) {
306 ENTER_with_name("backtick");
308 PL_rs = &PL_sv_undef;
309 SvPVCLEAR(TARG); /* note that this preserves previous buffer */
310 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
312 LEAVE_with_name("backtick");
318 SV * const sv = newSV(79);
319 if (sv_gets(sv, fp, 0) == NULL) {
324 if (SvLEN(sv) - SvCUR(sv) > 20) {
325 SvPV_shrink_to_cur(sv);
330 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
331 TAINT; /* "I believe that this is not gratuitous!" */
334 STATUS_NATIVE_CHILD_SET(-1);
335 if (gimme == G_SCALAR)
346 GV * const gv = (PL_op->op_flags & OPf_SPECIAL) ? NULL : (GV *)POPs;
350 /* make a copy of the pattern if it is gmagical, to ensure that magic
351 * is called once and only once */
352 if (SvGMAGICAL(TOPs)) TOPs = sv_2mortal(newSVsv(TOPs));
354 tryAMAGICunTARGETlist(iter_amg, (PL_op->op_flags & OPf_SPECIAL));
356 if (PL_op->op_flags & OPf_SPECIAL) {
357 /* call Perl-level glob function instead. Stack args are:
359 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
368 /* Note that we only ever get here if File::Glob fails to load
369 * without at the same time croaking, for some reason, or if
370 * perl was built with PERL_EXTERNAL_GLOB */
372 ENTER_with_name("glob");
377 * The external globbing program may use things we can't control,
378 * so for security reasons we must assume the worst.
381 taint_proper(PL_no_security, "glob");
385 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
388 SAVESPTR(PL_rs); /* This is not permanent, either. */
389 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
392 *SvPVX(PL_rs) = '\n';
396 result = do_readline();
397 LEAVE_with_name("glob");
403 PL_last_in_gv = cGVOP_gv;
404 return do_readline();
414 do_join(TARG, &PL_sv_no, MARK, SP);
418 else if (SP == MARK) {
425 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
428 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
429 /* well-formed exception supplied */
432 SV * const errsv = ERRSV;
435 if (SvGMAGICAL(errsv)) {
436 exsv = sv_newmortal();
437 sv_setsv_nomg(exsv, errsv);
441 else if (SvPOKp(errsv) ? SvCUR(errsv) : SvNIOKp(errsv)) {
442 exsv = sv_newmortal();
443 sv_setsv_nomg(exsv, errsv);
444 sv_catpvs(exsv, "\t...caught");
447 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
450 if (SvROK(exsv) && !PL_warnhook)
451 Perl_warn(aTHX_ "%" SVf, SVfARG(exsv));
463 VMSISH_HUSHED || (PL_curcop->op_private & OPpHUSH_VMSISH);
465 if (SP - MARK != 1) {
467 do_join(TARG, &PL_sv_no, MARK, SP);
475 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
476 /* well-formed exception supplied */
479 SV * const errsv = ERRSV;
483 if (sv_isobject(exsv)) {
484 HV * const stash = SvSTASH(SvRV(exsv));
485 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
487 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
488 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
495 call_sv(MUTABLE_SV(GvCV(gv)),
496 G_SCALAR|G_EVAL|G_KEEPERR);
497 exsv = sv_mortalcopy(*PL_stack_sp--);
501 else if (SvPOK(errsv) && SvCUR(errsv)) {
502 exsv = sv_mortalcopy(errsv);
503 sv_catpvs(exsv, "\t...propagated");
506 exsv = newSVpvs_flags("Died", SVs_TEMP);
510 NOT_REACHED; /* NOTREACHED */
511 return NULL; /* avoid missing return from non-void function warning */
517 Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv,
518 const MAGIC *const mg, const U32 flags, U32 argc, ...)
524 PERL_ARGS_ASSERT_TIED_METHOD;
526 /* Ensure that our flag bits do not overlap. */
527 STATIC_ASSERT_STMT((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
528 STATIC_ASSERT_STMT((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
529 STATIC_ASSERT_STMT((TIED_METHOD_SAY & G_WANT) == 0);
531 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
532 PUSHSTACKi(PERLSI_MAGIC);
533 /* extend for object + args. If argc might wrap/truncate when cast
534 * to SSize_t and incremented, set to -1, which will trigger a panic in
536 * The weird way this is written is because g++ is dumb enough to
537 * warn "comparison is always false" on something like:
539 * sizeof(a) >= sizeof(b) && a >= B_t_MAX -1
541 * (where the LH condition is false)
544 (argc > (sizeof(argc) >= sizeof(SSize_t) ? SSize_t_MAX - 1 : argc))
545 ? -1 : (SSize_t)argc + 1;
546 EXTEND(SP, extend_size);
548 PUSHs(SvTIED_obj(sv, mg));
549 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
550 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
554 const U32 mortalize_not_needed
555 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
557 va_start(args, argc);
559 SV *const arg = va_arg(args, SV *);
560 if(mortalize_not_needed)
569 ENTER_with_name("call_tied_method");
570 if (flags & TIED_METHOD_SAY) {
571 /* local $\ = "\n" */
572 SAVEGENERICSV(PL_ors_sv);
573 PL_ors_sv = newSVpvs("\n");
575 ret_args = call_sv(methname, (flags & G_WANT)|G_METHOD_NAMED);
580 if (ret_args) { /* copy results back to original stack */
581 EXTEND(sp, ret_args);
582 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
586 LEAVE_with_name("call_tied_method");
590 #define tied_method0(a,b,c,d) \
591 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
592 #define tied_method1(a,b,c,d,e) \
593 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
594 #define tied_method2(a,b,c,d,e,f) \
595 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
608 GV * const gv = MUTABLE_GV(*++MARK);
610 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
611 DIE(aTHX_ PL_no_usym, "filehandle");
613 if ((io = GvIOp(gv))) {
615 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
618 Perl_croak(aTHX_ "Cannot open %" HEKf " as a filehandle: it is already open as a dirhandle",
619 HEKfARG(GvENAME_HEK(gv)));
621 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
623 /* Method's args are same as ours ... */
624 /* ... except handle is replaced by the object */
625 return Perl_tied_method(aTHX_ SV_CONST(OPEN), mark - 1, MUTABLE_SV(io), mg,
626 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
638 tmps = SvPV_const(sv, len);
639 ok = do_open6(gv, tmps, len, NULL, MARK+1, (SP-MARK));
642 PUSHi( (I32)PL_forkprocess );
643 else if (PL_forkprocess == 0) /* we are a new child */
653 /* pp_coreargs pushes a NULL to indicate no args passed to
656 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
662 IO * const io = GvIO(gv);
664 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
666 return tied_method0(SV_CONST(CLOSE), SP, MUTABLE_SV(io), mg);
670 PUSHs(boolSV(do_close(gv, TRUE)));
682 GV * const wgv = MUTABLE_GV(POPs);
683 GV * const rgv = MUTABLE_GV(POPs);
687 do_close(rgv, FALSE);
691 do_close(wgv, FALSE);
693 if (PerlProc_pipe_cloexec(fd) < 0)
696 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r" PIPE_OPEN_MODE);
697 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w" PIPE_OPEN_MODE);
698 IoOFP(rstio) = IoIFP(rstio);
699 IoIFP(wstio) = IoOFP(wstio);
700 IoTYPE(rstio) = IoTYPE_RDONLY;
701 IoTYPE(wstio) = IoTYPE_WRONLY;
703 if (!IoIFP(rstio) || !IoOFP(wstio)) {
705 PerlIO_close(IoIFP(rstio));
707 PerlLIO_close(fd[0]);
709 PerlIO_close(IoOFP(wstio));
711 PerlLIO_close(fd[1]);
719 DIE(aTHX_ PL_no_func, "pipe");
733 gv = MUTABLE_GV(POPs);
737 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
739 return tied_method0(SV_CONST(FILENO), SP, MUTABLE_SV(io), mg);
742 if (io && IoDIRP(io)) {
743 #if defined(HAS_DIRFD) || defined(HAS_DIR_DD_FD)
744 PUSHi(my_dirfd(IoDIRP(io)));
746 #elif defined(ENOTSUP)
747 errno = ENOTSUP; /* Operation not supported */
749 #elif defined(EOPNOTSUPP)
750 errno = EOPNOTSUPP; /* Operation not supported on socket */
753 errno = EINVAL; /* Invalid argument */
758 if (!io || !(fp = IoIFP(io))) {
759 /* Can't do this because people seem to do things like
760 defined(fileno($foo)) to check whether $foo is a valid fh.
767 PUSHi(PerlIO_fileno(fp));
778 if (MAXARG < 1 || (!TOPs && !POPs)) {
779 anum = PerlLIO_umask(022);
780 /* setting it to 022 between the two calls to umask avoids
781 * to have a window where the umask is set to 0 -- meaning
782 * that another thread could create world-writeable files. */
784 (void)PerlLIO_umask(anum);
787 anum = PerlLIO_umask(POPi);
788 TAINT_PROPER("umask");
791 /* Only DIE if trying to restrict permissions on "user" (self).
792 * Otherwise it's harmless and more useful to just return undef
793 * since 'group' and 'other' concepts probably don't exist here. */
794 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
795 DIE(aTHX_ "umask not implemented");
796 XPUSHs(&PL_sv_undef);
815 gv = MUTABLE_GV(POPs);
819 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
821 /* This takes advantage of the implementation of the varargs
822 function, which I don't think that the optimiser will be able to
823 figure out. Although, as it's a static function, in theory it
825 return Perl_tied_method(aTHX_ SV_CONST(BINMODE), SP, MUTABLE_SV(io), mg,
826 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
827 discp ? 1 : 0, discp);
831 if (!io || !(fp = IoIFP(io))) {
833 SETERRNO(EBADF,RMS_IFI);
840 const char *d = NULL;
843 d = SvPV_const(discp, len);
844 mode = mode_from_discipline(d, len);
845 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
846 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
847 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
868 const I32 markoff = MARK - PL_stack_base;
869 const char *methname;
870 int how = PERL_MAGIC_tied;
874 switch(SvTYPE(varsv)) {
878 methname = "TIEHASH";
879 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
880 HvLAZYDEL_off(varsv);
881 hv_free_ent((HV *)varsv, entry);
883 HvEITER_set(MUTABLE_HV(varsv), 0);
887 methname = "TIEARRAY";
888 if (!AvREAL(varsv)) {
890 Perl_croak(aTHX_ "Cannot tie unreifiable array");
891 av_clear((AV *)varsv);
898 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
899 methname = "TIEHANDLE";
900 how = PERL_MAGIC_tiedscalar;
901 /* For tied filehandles, we apply tiedscalar magic to the IO
902 slot of the GP rather than the GV itself. AMS 20010812 */
904 GvIOp(varsv) = newIO();
905 varsv = MUTABLE_SV(GvIOp(varsv));
908 if (SvTYPE(varsv) == SVt_PVLV && LvTYPE(varsv) == 'y') {
909 vivify_defelem(varsv);
910 varsv = LvTARG(varsv);
914 methname = "TIESCALAR";
915 how = PERL_MAGIC_tiedscalar;
919 if (sv_isobject(*MARK)) { /* Calls GET magic. */
920 ENTER_with_name("call_TIE");
921 PUSHSTACKi(PERLSI_MAGIC);
923 EXTEND(SP,(I32)items);
927 call_method(methname, G_SCALAR);
930 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
931 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
932 * wrong error message, and worse case, supreme action at a distance.
933 * (Sorry obfuscation writers. You're not going to be given this one.)
935 stash = gv_stashsv(*MARK, 0);
938 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
939 methname, SVfARG(*MARK));
940 else if (isGV(*MARK)) {
941 /* If the glob doesn't name an existing package, using
942 * SVfARG(*MARK) would yield "*Foo::Bar" or *main::Foo. So
943 * generate the name for the error message explicitly. */
944 SV *stashname = sv_2mortal(newSV(0));
945 gv_fullname4(stashname, (GV *) *MARK, NULL, FALSE);
946 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
947 methname, SVfARG(stashname));
950 SV *stashname = !SvPOK(*MARK) ? &PL_sv_no
951 : SvCUR(*MARK) ? *MARK
952 : sv_2mortal(newSVpvs("main"));
953 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\""
954 " (perhaps you forgot to load \"%" SVf "\"?)",
955 methname, SVfARG(stashname), SVfARG(stashname));
958 else if (!(gv = gv_fetchmethod(stash, methname))) {
959 /* The effective name can only be NULL for stashes that have
960 * been deleted from the symbol table, which this one can't
961 * be, since we just looked it up by name.
963 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" HEKf "\"",
964 methname, HvENAME_HEK_NN(stash));
966 ENTER_with_name("call_TIE");
967 PUSHSTACKi(PERLSI_MAGIC);
969 EXTEND(SP,(I32)items);
973 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
979 if (sv_isobject(sv)) {
980 sv_unmagic(varsv, how);
981 /* Croak if a self-tie on an aggregate is attempted. */
982 if (varsv == SvRV(sv) &&
983 (SvTYPE(varsv) == SVt_PVAV ||
984 SvTYPE(varsv) == SVt_PVHV))
986 "Self-ties of arrays and hashes are not supported");
987 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
989 LEAVE_with_name("call_TIE");
990 SP = PL_stack_base + markoff;
996 /* also used for: pp_dbmclose() */
1003 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1004 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1006 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1009 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1010 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
1012 if ((mg = SvTIED_mg(sv, how))) {
1013 SV * const obj = SvRV(SvTIED_obj(sv, mg));
1014 if (obj && SvSTASH(obj)) {
1015 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
1017 if (gv && isGV(gv) && (cv = GvCV(gv))) {
1019 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
1020 mXPUSHi(SvREFCNT(obj) - 1);
1022 ENTER_with_name("call_UNTIE");
1023 call_sv(MUTABLE_SV(cv), G_VOID);
1024 LEAVE_with_name("call_UNTIE");
1027 else if (mg && SvREFCNT(obj) > 1) {
1028 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
1029 "untie attempted while %" UVuf " inner references still exist",
1030 (UV)SvREFCNT(obj) - 1 ) ;
1034 sv_unmagic(sv, how) ;
1043 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1044 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1046 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1049 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1050 !(sv = defelem_target(sv, NULL))) goto ret_undef;
1052 if ((mg = SvTIED_mg(sv, how))) {
1053 SETs(SvTIED_obj(sv, mg));
1054 return NORMAL; /* PUTBACK not needed, pp_tied never moves SP */
1068 HV * const hv = MUTABLE_HV(POPs);
1069 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1070 stash = gv_stashsv(sv, 0);
1071 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1073 require_pv("AnyDBM_File.pm");
1075 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1076 DIE(aTHX_ "No dbm on this machine");
1086 mPUSHu(O_RDWR|O_CREAT);
1090 if (!SvOK(right)) right = &PL_sv_no;
1094 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1097 if (!sv_isobject(TOPs)) {
1105 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1107 if (sv_isobject(TOPs))
1112 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1113 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1130 struct timeval timebuf;
1131 struct timeval *tbuf = &timebuf;
1135 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1140 # if BYTEORDER & 0xf0000
1141 # define ORDERBYTE (0x88888888 - BYTEORDER)
1143 # define ORDERBYTE (0x4444 - BYTEORDER)
1149 for (i = 1; i <= 3; i++) {
1150 SV * const sv = svs[i] = SP[i];
1154 if (SvREADONLY(sv)) {
1155 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1156 Perl_croak_no_modify();
1158 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1161 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1162 "Non-string passed as bitmask");
1163 if (SvGAMAGIC(sv)) {
1164 svs[i] = sv_newmortal();
1165 sv_copypv_nomg(svs[i], sv);
1168 SvPV_force_nomg_nolen(sv); /* force string conversion */
1175 /* little endians can use vecs directly */
1176 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1183 masksize = NFDBITS / NBBY;
1185 masksize = sizeof(long); /* documented int, everyone seems to use long */
1187 Zero(&fd_sets[0], 4, char*);
1190 # if SELECT_MIN_BITS == 1
1191 growsize = sizeof(fd_set);
1193 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1194 # undef SELECT_MIN_BITS
1195 # define SELECT_MIN_BITS __FD_SETSIZE
1197 /* If SELECT_MIN_BITS is greater than one we most probably will want
1198 * to align the sizes with SELECT_MIN_BITS/8 because for example
1199 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1200 * UNIX, Solaris, Darwin) the smallest quantum select() operates
1201 * on (sets/tests/clears bits) is 32 bits. */
1202 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1208 value = SvNV_nomg(sv);
1211 timebuf.tv_sec = (long)value;
1212 value -= (NV)timebuf.tv_sec;
1213 timebuf.tv_usec = (long)(value * 1000000.0);
1218 for (i = 1; i <= 3; i++) {
1220 if (!SvOK(sv) || SvCUR(sv) == 0) {
1227 Sv_Grow(sv, growsize);
1231 while (++j <= growsize) {
1235 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1237 Newx(fd_sets[i], growsize, char);
1238 for (offset = 0; offset < growsize; offset += masksize) {
1239 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1240 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1243 fd_sets[i] = SvPVX(sv);
1247 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1248 /* Can't make just the (void*) conditional because that would be
1249 * cpp #if within cpp macro, and not all compilers like that. */
1250 nfound = PerlSock_select(
1252 (Select_fd_set_t) fd_sets[1],
1253 (Select_fd_set_t) fd_sets[2],
1254 (Select_fd_set_t) fd_sets[3],
1255 (void*) tbuf); /* Workaround for compiler bug. */
1257 nfound = PerlSock_select(
1259 (Select_fd_set_t) fd_sets[1],
1260 (Select_fd_set_t) fd_sets[2],
1261 (Select_fd_set_t) fd_sets[3],
1264 for (i = 1; i <= 3; i++) {
1267 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1269 for (offset = 0; offset < growsize; offset += masksize) {
1270 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1271 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1273 Safefree(fd_sets[i]);
1276 SvSetMagicSV(SP[i], sv);
1283 if (GIMME_V == G_ARRAY && tbuf) {
1284 value = (NV)(timebuf.tv_sec) +
1285 (NV)(timebuf.tv_usec) / 1000000.0;
1290 DIE(aTHX_ "select not implemented");
1298 =for apidoc setdefout
1300 Sets C<PL_defoutgv>, the default file handle for output, to the passed in
1301 typeglob. As C<PL_defoutgv> "owns" a reference on its typeglob, the reference
1302 count of the passed in typeglob is increased by one, and the reference count
1303 of the typeglob that C<PL_defoutgv> points to is decreased by one.
1309 Perl_setdefout(pTHX_ GV *gv)
1311 GV *oldgv = PL_defoutgv;
1313 PERL_ARGS_ASSERT_SETDEFOUT;
1315 SvREFCNT_inc_simple_void_NN(gv);
1317 SvREFCNT_dec(oldgv);
1324 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1325 GV * egv = GvEGVx(PL_defoutgv);
1330 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1331 gvp = hv && HvENAME(hv)
1332 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1334 if (gvp && *gvp == egv) {
1335 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1339 mXPUSHs(newRV(MUTABLE_SV(egv)));
1343 if (!GvIO(newdefout))
1344 gv_IOadd(newdefout);
1345 setdefout(newdefout);
1354 /* pp_coreargs pushes a NULL to indicate no args passed to
1357 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1358 IO *const io = GvIO(gv);
1364 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1366 const U8 gimme = GIMME_V;
1367 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1368 if (gimme == G_SCALAR) {
1370 SvSetMagicSV_nosteal(TARG, TOPs);
1375 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1376 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1378 SETERRNO(EBADF,RMS_IFI);
1382 sv_setpvs(TARG, " ");
1383 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1384 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1385 /* Find out how many bytes the char needs */
1386 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1389 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1390 SvCUR_set(TARG,1+len);
1394 else SvUTF8_off(TARG);
1400 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1403 const U8 gimme = GIMME_V;
1405 PERL_ARGS_ASSERT_DOFORM;
1408 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1410 cx = cx_pushblock(CXt_FORMAT, gimme, PL_stack_sp, PL_savestack_ix);
1411 cx_pushformat(cx, cv, retop, gv);
1412 if (CvDEPTH(cv) >= 2)
1413 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1414 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1416 setdefout(gv); /* locally select filehandle so $% et al work */
1433 gv = MUTABLE_GV(POPs);
1450 SV * const tmpsv = sv_newmortal();
1451 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1452 DIE(aTHX_ "Undefined format \"%" SVf "\" called", SVfARG(tmpsv));
1454 IoFLAGS(io) &= ~IOf_DIDTOP;
1455 RETURNOP(doform(cv,gv,PL_op->op_next));
1461 GV * const gv = CX_CUR()->blk_format.gv;
1462 IO * const io = GvIOp(gv);
1467 bool is_return = cBOOL(PL_op->op_type == OP_RETURN);
1469 if (is_return || !io || !(ofp = IoOFP(io)))
1472 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1473 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1475 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1476 PL_formtarget != PL_toptarget)
1480 if (!IoTOP_GV(io)) {
1483 if (!IoTOP_NAME(io)) {
1485 if (!IoFMT_NAME(io))
1486 IoFMT_NAME(io) = savepv(GvNAME(gv));
1487 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%" HEKf "_TOP",
1488 HEKfARG(GvNAME_HEK(gv))));
1489 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1490 if ((topgv && GvFORM(topgv)) ||
1491 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1492 IoTOP_NAME(io) = savesvpv(topname);
1494 IoTOP_NAME(io) = savepvs("top");
1496 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1497 if (!topgv || !GvFORM(topgv)) {
1498 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1501 IoTOP_GV(io) = topgv;
1503 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1504 I32 lines = IoLINES_LEFT(io);
1505 const char *s = SvPVX_const(PL_formtarget);
1506 const char *e = SvEND(PL_formtarget);
1507 if (lines <= 0) /* Yow, header didn't even fit!!! */
1509 while (lines-- > 0) {
1510 s = (char *) memchr(s, '\n', e - s);
1516 const STRLEN save = SvCUR(PL_formtarget);
1517 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1518 do_print(PL_formtarget, ofp);
1519 SvCUR_set(PL_formtarget, save);
1520 sv_chop(PL_formtarget, s);
1521 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1524 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1525 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1526 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1528 PL_formtarget = PL_toptarget;
1529 IoFLAGS(io) |= IOf_DIDTOP;
1531 assert(fgv); /* IoTOP_GV(io) should have been set above */
1534 SV * const sv = sv_newmortal();
1535 gv_efullname4(sv, fgv, NULL, FALSE);
1536 DIE(aTHX_ "Undefined top format \"%" SVf "\" called", SVfARG(sv));
1538 return doform(cv, gv, PL_op);
1543 assert(CxTYPE(cx) == CXt_FORMAT);
1544 SP = PL_stack_base + cx->blk_oldsp; /* ignore retval of formline */
1548 retop = cx->blk_sub.retop;
1554 /* XXX the semantics of doing 'return' in a format aren't documented.
1555 * Currently we ignore any args to 'return' and just return
1556 * a single undef in both scalar and list contexts
1558 PUSHs(&PL_sv_undef);
1559 else if (!io || !(fp = IoOFP(io))) {
1560 if (io && IoIFP(io))
1561 report_wrongway_fh(gv, '<');
1567 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1568 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1570 if (!do_print(PL_formtarget, fp))
1573 FmLINES(PL_formtarget) = 0;
1574 SvCUR_set(PL_formtarget, 0);
1575 *SvEND(PL_formtarget) = '\0';
1576 if (IoFLAGS(io) & IOf_FLUSH)
1577 (void)PerlIO_flush(fp);
1581 PL_formtarget = PL_bodytarget;
1587 dSP; dMARK; dORIGMARK;
1591 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1592 IO *const io = GvIO(gv);
1594 /* Treat empty list as "" */
1595 if (MARK == SP) XPUSHs(&PL_sv_no);
1598 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1600 if (MARK == ORIGMARK) {
1603 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1606 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1608 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1615 SETERRNO(EBADF,RMS_IFI);
1618 else if (!(fp = IoOFP(io))) {
1620 report_wrongway_fh(gv, '<');
1621 else if (ckWARN(WARN_CLOSED))
1623 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1627 SV *sv = sv_newmortal();
1628 do_sprintf(sv, SP - MARK, MARK + 1);
1629 if (!do_print(sv, fp))
1632 if (IoFLAGS(io) & IOf_FLUSH)
1633 if (PerlIO_flush(fp) == EOF)
1642 PUSHs(&PL_sv_undef);
1649 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1650 const int mode = POPi;
1651 SV * const sv = POPs;
1652 GV * const gv = MUTABLE_GV(POPs);
1655 /* Need TIEHANDLE method ? */
1656 const char * const tmps = SvPV_const(sv, len);
1657 if (do_open_raw(gv, tmps, len, mode, perm, NULL)) {
1658 IoLINES(GvIOp(gv)) = 0;
1662 PUSHs(&PL_sv_undef);
1668 /* also used for: pp_read() and pp_recv() (where supported) */
1672 dSP; dMARK; dORIGMARK; dTARGET;
1686 bool charstart = FALSE;
1687 STRLEN charskip = 0;
1689 GV * const gv = MUTABLE_GV(*++MARK);
1692 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1693 && gv && (io = GvIO(gv)) )
1695 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1697 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1698 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1708 length = SvIVx(*++MARK);
1710 DIE(aTHX_ "Negative length");
1713 offset = SvIVx(*++MARK);
1717 if (!io || !IoIFP(io)) {
1719 SETERRNO(EBADF,RMS_IFI);
1723 /* Note that fd can here validly be -1, don't check it yet. */
1724 fd = PerlIO_fileno(IoIFP(io));
1726 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1727 if (PL_op->op_type == OP_SYSREAD || PL_op->op_type == OP_RECV) {
1728 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
1729 "%s() is deprecated on :utf8 handles. "
1730 "This will be a fatal error in Perl 5.30",
1733 buffer = SvPVutf8_force(bufsv, blen);
1734 /* UTF-8 may not have been set if they are all low bytes */
1739 buffer = SvPV_force(bufsv, blen);
1740 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1742 if (DO_UTF8(bufsv)) {
1743 blen = sv_len_utf8_nomg(bufsv);
1752 if (PL_op->op_type == OP_RECV) {
1753 Sock_size_t bufsize;
1754 char namebuf[MAXPATHLEN];
1756 SETERRNO(EBADF,SS_IVCHAN);
1759 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1760 bufsize = sizeof (struct sockaddr_in);
1762 bufsize = sizeof namebuf;
1764 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1768 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1769 /* 'offset' means 'flags' here */
1770 count = PerlSock_recvfrom(fd, buffer, length, offset,
1771 (struct sockaddr *)namebuf, &bufsize);
1774 /* MSG_TRUNC can give oversized count; quietly lose it */
1777 SvCUR_set(bufsv, count);
1778 *SvEND(bufsv) = '\0';
1779 (void)SvPOK_only(bufsv);
1783 /* This should not be marked tainted if the fp is marked clean */
1784 if (!(IoFLAGS(io) & IOf_UNTAINT))
1785 SvTAINTED_on(bufsv);
1787 #if defined(__CYGWIN__)
1788 /* recvfrom() on cygwin doesn't set bufsize at all for
1789 connected sockets, leaving us with trash in the returned
1790 name, so use the same test as the Win32 code to check if it
1791 wasn't set, and set it [perl #118843] */
1792 if (bufsize == sizeof namebuf)
1795 sv_setpvn(TARG, namebuf, bufsize);
1801 if (-offset > (SSize_t)blen)
1802 DIE(aTHX_ "Offset outside string");
1805 if (DO_UTF8(bufsv)) {
1806 /* convert offset-as-chars to offset-as-bytes */
1807 if (offset >= (SSize_t)blen)
1808 offset += SvCUR(bufsv) - blen;
1810 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1814 /* Reestablish the fd in case it shifted from underneath us. */
1815 fd = PerlIO_fileno(IoIFP(io));
1817 orig_size = SvCUR(bufsv);
1818 /* Allocating length + offset + 1 isn't perfect in the case of reading
1819 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1821 (should be 2 * length + offset + 1, or possibly something longer if
1822 IN_ENCODING Is true) */
1823 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1824 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1825 Zero(buffer+orig_size, offset-orig_size, char);
1827 buffer = buffer + offset;
1829 read_target = bufsv;
1831 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1832 concatenate it to the current buffer. */
1834 /* Truncate the existing buffer to the start of where we will be
1836 SvCUR_set(bufsv, offset);
1838 read_target = sv_newmortal();
1839 SvUPGRADE(read_target, SVt_PV);
1840 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1843 if (PL_op->op_type == OP_SYSREAD) {
1844 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1845 if (IoTYPE(io) == IoTYPE_SOCKET) {
1847 SETERRNO(EBADF,SS_IVCHAN);
1851 count = PerlSock_recv(fd, buffer, length, 0);
1857 SETERRNO(EBADF,RMS_IFI);
1861 count = PerlLIO_read(fd, buffer, length);
1866 count = PerlIO_read(IoIFP(io), buffer, length);
1867 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1868 if (count == 0 && PerlIO_error(IoIFP(io)))
1872 if (IoTYPE(io) == IoTYPE_WRONLY)
1873 report_wrongway_fh(gv, '>');
1876 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1877 *SvEND(read_target) = '\0';
1878 (void)SvPOK_only(read_target);
1879 if (fp_utf8 && !IN_BYTES) {
1880 /* Look at utf8 we got back and count the characters */
1881 const char *bend = buffer + count;
1882 while (buffer < bend) {
1884 skip = UTF8SKIP(buffer);
1887 if (buffer - charskip + skip > bend) {
1888 /* partial character - try for rest of it */
1889 length = skip - (bend-buffer);
1890 offset = bend - SvPVX_const(bufsv);
1902 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1903 provided amount read (count) was what was requested (length)
1905 if (got < wanted && count == length) {
1906 length = wanted - got;
1907 offset = bend - SvPVX_const(bufsv);
1910 /* return value is character count */
1914 else if (buffer_utf8) {
1915 /* Let svcatsv upgrade the bytes we read in to utf8.
1916 The buffer is a mortal so will be freed soon. */
1917 sv_catsv_nomg(bufsv, read_target);
1920 /* This should not be marked tainted if the fp is marked clean */
1921 if (!(IoFLAGS(io) & IOf_UNTAINT))
1922 SvTAINTED_on(bufsv);
1933 /* also used for: pp_send() where defined */
1937 dSP; dMARK; dORIGMARK; dTARGET;
1942 STRLEN orig_blen_bytes;
1943 const int op_type = PL_op->op_type;
1946 GV *const gv = MUTABLE_GV(*++MARK);
1947 IO *const io = GvIO(gv);
1950 if (op_type == OP_SYSWRITE && io) {
1951 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1953 if (MARK == SP - 1) {
1955 mXPUSHi(sv_len(sv));
1959 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1960 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1970 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1972 if (io && IoIFP(io))
1973 report_wrongway_fh(gv, '<');
1976 SETERRNO(EBADF,RMS_IFI);
1979 fd = PerlIO_fileno(IoIFP(io));
1981 SETERRNO(EBADF,SS_IVCHAN);
1986 /* Do this first to trigger any overloading. */
1987 buffer = SvPV_const(bufsv, blen);
1988 orig_blen_bytes = blen;
1989 doing_utf8 = DO_UTF8(bufsv);
1991 if (PerlIO_isutf8(IoIFP(io))) {
1992 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
1993 "%s() is deprecated on :utf8 handles. "
1994 "This will be a fatal error in Perl 5.30",
1996 if (!SvUTF8(bufsv)) {
1997 /* We don't modify the original scalar. */
1998 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1999 buffer = (char *) tmpbuf;
2003 else if (doing_utf8) {
2004 STRLEN tmplen = blen;
2005 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
2008 buffer = (char *) tmpbuf;
2012 assert((char *)result == buffer);
2013 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
2018 if (op_type == OP_SEND) {
2019 const int flags = SvIVx(*++MARK);
2022 char * const sockbuf = SvPVx(*++MARK, mlen);
2023 retval = PerlSock_sendto(fd, buffer, blen,
2024 flags, (struct sockaddr *)sockbuf, mlen);
2027 retval = PerlSock_send(fd, buffer, blen, flags);
2033 Size_t length = 0; /* This length is in characters. */
2039 /* The SV is bytes, and we've had to upgrade it. */
2040 blen_chars = orig_blen_bytes;
2042 /* The SV really is UTF-8. */
2043 /* Don't call sv_len_utf8 on a magical or overloaded
2044 scalar, as we might get back a different result. */
2045 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
2052 length = blen_chars;
2054 #if Size_t_size > IVSIZE
2055 length = (Size_t)SvNVx(*++MARK);
2057 length = (Size_t)SvIVx(*++MARK);
2059 if ((SSize_t)length < 0) {
2061 DIE(aTHX_ "Negative length");
2066 offset = SvIVx(*++MARK);
2068 if (-offset > (IV)blen_chars) {
2070 DIE(aTHX_ "Offset outside string");
2072 offset += blen_chars;
2073 } else if (offset > (IV)blen_chars) {
2075 DIE(aTHX_ "Offset outside string");
2079 if (length > blen_chars - offset)
2080 length = blen_chars - offset;
2082 /* Here we convert length from characters to bytes. */
2083 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
2084 /* Either we had to convert the SV, or the SV is magical, or
2085 the SV has overloading, in which case we can't or mustn't
2086 or mustn't call it again. */
2088 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
2089 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
2091 /* It's a real UTF-8 SV, and it's not going to change under
2092 us. Take advantage of any cache. */
2094 I32 len_I32 = length;
2096 /* Convert the start and end character positions to bytes.
2097 Remember that the second argument to sv_pos_u2b is relative
2099 sv_pos_u2b(bufsv, &start, &len_I32);
2106 buffer = buffer+offset;
2108 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2109 if (IoTYPE(io) == IoTYPE_SOCKET) {
2110 retval = PerlSock_send(fd, buffer, length, 0);
2115 /* See the note at doio.c:do_print about filesize limits. --jhi */
2116 retval = PerlLIO_write(fd, buffer, length);
2124 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2127 #if Size_t_size > IVSIZE
2147 * in Perl 5.12 and later, the additional parameter is a bitmask:
2150 * 2 = eof() <- ARGV magic
2152 * I'll rely on the compiler's trace flow analysis to decide whether to
2153 * actually assign this out here, or punt it into the only block where it is
2154 * used. Doing it out here is DRY on the condition logic.
2159 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2165 if (PL_op->op_flags & OPf_SPECIAL) {
2166 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2170 gv = PL_last_in_gv; /* eof */
2178 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2179 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2182 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2183 if (io && !IoIFP(io)) {
2184 if ((IoFLAGS(io) & IOf_START) && av_tindex(GvAVn(gv)) < 0) {
2187 IoFLAGS(io) &= ~IOf_START;
2188 do_open6(gv, "-", 1, NULL, NULL, 0);
2196 *svp = newSVpvs("-");
2198 else if (!nextargv(gv, FALSE))
2203 PUSHs(boolSV(do_eof(gv)));
2213 if (MAXARG != 0 && (TOPs || POPs))
2214 PL_last_in_gv = MUTABLE_GV(POPs);
2221 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2223 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2228 SETERRNO(EBADF,RMS_IFI);
2233 #if LSEEKSIZE > IVSIZE
2234 PUSHn( do_tell(gv) );
2236 PUSHi( do_tell(gv) );
2242 /* also used for: pp_seek() */
2247 const int whence = POPi;
2248 #if LSEEKSIZE > IVSIZE
2249 const Off_t offset = (Off_t)SvNVx(POPs);
2251 const Off_t offset = (Off_t)SvIVx(POPs);
2254 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2255 IO *const io = GvIO(gv);
2258 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2260 #if LSEEKSIZE > IVSIZE
2261 SV *const offset_sv = newSVnv((NV) offset);
2263 SV *const offset_sv = newSViv(offset);
2266 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2271 if (PL_op->op_type == OP_SEEK)
2272 PUSHs(boolSV(do_seek(gv, offset, whence)));
2274 const Off_t sought = do_sysseek(gv, offset, whence);
2276 PUSHs(&PL_sv_undef);
2278 SV* const sv = sought ?
2279 #if LSEEKSIZE > IVSIZE
2284 : newSVpvn(zero_but_true, ZBTLEN);
2294 /* There seems to be no consensus on the length type of truncate()
2295 * and ftruncate(), both off_t and size_t have supporters. In
2296 * general one would think that when using large files, off_t is
2297 * at least as wide as size_t, so using an off_t should be okay. */
2298 /* XXX Configure probe for the length type of *truncate() needed XXX */
2301 #if Off_t_size > IVSIZE
2306 /* Checking for length < 0 is problematic as the type might or
2307 * might not be signed: if it is not, clever compilers will moan. */
2308 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2311 SV * const sv = POPs;
2316 if (PL_op->op_flags & OPf_SPECIAL
2317 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2318 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2325 TAINT_PROPER("truncate");
2326 if (!(fp = IoIFP(io))) {
2330 int fd = PerlIO_fileno(fp);
2332 SETERRNO(EBADF,RMS_IFI);
2336 SETERRNO(EINVAL, LIB_INVARG);
2341 if (ftruncate(fd, len) < 0)
2343 if (my_chsize(fd, len) < 0)
2351 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2352 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2353 goto do_ftruncate_io;
2356 const char * const name = SvPV_nomg_const_nolen(sv);
2357 TAINT_PROPER("truncate");
2359 if (truncate(name, len) < 0)
2366 #if defined(USE_64_BIT_RAWIO) && defined(O_LARGEFILE)
2367 mode |= O_LARGEFILE; /* Transparently largefiley. */
2370 /* On open(), the Win32 CRT tries to seek around text
2371 * files using 32-bit offsets, which causes the open()
2372 * to fail on large files, so open in binary mode.
2376 tmpfd = PerlLIO_open_cloexec(name, mode);
2381 if (my_chsize(tmpfd, len) < 0)
2383 PerlLIO_close(tmpfd);
2392 SETERRNO(EBADF,RMS_IFI);
2398 /* also used for: pp_fcntl() */
2403 SV * const argsv = POPs;
2404 const unsigned int func = POPu;
2406 GV * const gv = MUTABLE_GV(POPs);
2407 IO * const io = GvIOn(gv);
2413 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2417 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2420 s = SvPV_force(argsv, len);
2421 need = IOCPARM_LEN(func);
2423 s = Sv_Grow(argsv, need + 1);
2424 SvCUR_set(argsv, need);
2427 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2430 retval = SvIV(argsv);
2431 s = INT2PTR(char*,retval); /* ouch */
2434 optype = PL_op->op_type;
2435 TAINT_PROPER(PL_op_desc[optype]);
2437 if (optype == OP_IOCTL)
2439 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2441 DIE(aTHX_ "ioctl is not implemented");
2445 DIE(aTHX_ "fcntl is not implemented");
2446 #elif defined(OS2) && defined(__EMX__)
2447 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2449 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2452 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2454 if (s[SvCUR(argsv)] != 17)
2455 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2457 s[SvCUR(argsv)] = 0; /* put our null back */
2458 SvSETMAGIC(argsv); /* Assume it has changed */
2467 PUSHp(zero_but_true, ZBTLEN);
2478 const int argtype = POPi;
2479 GV * const gv = MUTABLE_GV(POPs);
2480 IO *const io = GvIO(gv);
2481 PerlIO *const fp = io ? IoIFP(io) : NULL;
2483 /* XXX Looks to me like io is always NULL at this point */
2485 (void)PerlIO_flush(fp);
2486 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2491 SETERRNO(EBADF,RMS_IFI);
2496 DIE(aTHX_ PL_no_func, "flock");
2507 const int protocol = POPi;
2508 const int type = POPi;
2509 const int domain = POPi;
2510 GV * const gv = MUTABLE_GV(POPs);
2511 IO * const io = GvIOn(gv);
2515 do_close(gv, FALSE);
2517 TAINT_PROPER("socket");
2518 fd = PerlSock_socket_cloexec(domain, type, protocol);
2522 IoIFP(io) = PerlIO_fdopen(fd, "r" SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2523 IoOFP(io) = PerlIO_fdopen(fd, "w" SOCKET_OPEN_MODE);
2524 IoTYPE(io) = IoTYPE_SOCKET;
2525 if (!IoIFP(io) || !IoOFP(io)) {
2526 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2527 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2528 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2538 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2541 const int protocol = POPi;
2542 const int type = POPi;
2543 const int domain = POPi;
2545 GV * const gv2 = MUTABLE_GV(POPs);
2546 IO * const io2 = GvIOn(gv2);
2547 GV * const gv1 = MUTABLE_GV(POPs);
2548 IO * const io1 = GvIOn(gv1);
2551 do_close(gv1, FALSE);
2553 do_close(gv2, FALSE);
2555 TAINT_PROPER("socketpair");
2556 if (PerlSock_socketpair_cloexec(domain, type, protocol, fd) < 0)
2558 IoIFP(io1) = PerlIO_fdopen(fd[0], "r" SOCKET_OPEN_MODE);
2559 IoOFP(io1) = PerlIO_fdopen(fd[0], "w" SOCKET_OPEN_MODE);
2560 IoTYPE(io1) = IoTYPE_SOCKET;
2561 IoIFP(io2) = PerlIO_fdopen(fd[1], "r" SOCKET_OPEN_MODE);
2562 IoOFP(io2) = PerlIO_fdopen(fd[1], "w" SOCKET_OPEN_MODE);
2563 IoTYPE(io2) = IoTYPE_SOCKET;
2564 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2565 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2566 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2567 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2568 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2569 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2570 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2576 DIE(aTHX_ PL_no_sock_func, "socketpair");
2582 /* also used for: pp_connect() */
2587 SV * const addrsv = POPs;
2588 /* OK, so on what platform does bind modify addr? */
2590 GV * const gv = MUTABLE_GV(POPs);
2591 IO * const io = GvIOn(gv);
2598 fd = PerlIO_fileno(IoIFP(io));
2602 addr = SvPV_const(addrsv, len);
2603 op_type = PL_op->op_type;
2604 TAINT_PROPER(PL_op_desc[op_type]);
2605 if ((op_type == OP_BIND
2606 ? PerlSock_bind(fd, (struct sockaddr *)addr, len)
2607 : PerlSock_connect(fd, (struct sockaddr *)addr, len))
2615 SETERRNO(EBADF,SS_IVCHAN);
2622 const int backlog = POPi;
2623 GV * const gv = MUTABLE_GV(POPs);
2624 IO * const io = GvIOn(gv);
2629 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2636 SETERRNO(EBADF,SS_IVCHAN);
2644 char namebuf[MAXPATHLEN];
2645 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2646 Sock_size_t len = sizeof (struct sockaddr_in);
2648 Sock_size_t len = sizeof namebuf;
2650 GV * const ggv = MUTABLE_GV(POPs);
2651 GV * const ngv = MUTABLE_GV(POPs);
2654 IO * const gstio = GvIO(ggv);
2655 if (!gstio || !IoIFP(gstio))
2659 fd = PerlSock_accept_cloexec(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2662 /* Some platforms indicate zero length when an AF_UNIX client is
2663 * not bound. Simulate a non-zero-length sockaddr structure in
2665 namebuf[0] = 0; /* sun_len */
2666 namebuf[1] = AF_UNIX; /* sun_family */
2674 do_close(ngv, FALSE);
2675 IoIFP(nstio) = PerlIO_fdopen(fd, "r" SOCKET_OPEN_MODE);
2676 IoOFP(nstio) = PerlIO_fdopen(fd, "w" SOCKET_OPEN_MODE);
2677 IoTYPE(nstio) = IoTYPE_SOCKET;
2678 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2679 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2680 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2681 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2685 #ifdef __SCO_VERSION__
2686 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2689 PUSHp(namebuf, len);
2693 report_evil_fh(ggv);
2694 SETERRNO(EBADF,SS_IVCHAN);
2704 const int how = POPi;
2705 GV * const gv = MUTABLE_GV(POPs);
2706 IO * const io = GvIOn(gv);
2711 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2716 SETERRNO(EBADF,SS_IVCHAN);
2721 /* also used for: pp_gsockopt() */
2726 const int optype = PL_op->op_type;
2727 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2728 const unsigned int optname = (unsigned int) POPi;
2729 const unsigned int lvl = (unsigned int) POPi;
2730 GV * const gv = MUTABLE_GV(POPs);
2731 IO * const io = GvIOn(gv);
2738 fd = PerlIO_fileno(IoIFP(io));
2744 (void)SvPOK_only(sv);
2748 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2751 /* XXX Configure test: does getsockopt set the length properly? */
2760 #if defined(__SYMBIAN32__)
2761 # define SETSOCKOPT_OPTION_VALUE_T void *
2763 # define SETSOCKOPT_OPTION_VALUE_T const char *
2765 /* XXX TODO: We need to have a proper type (a Configure probe,
2766 * etc.) for what the C headers think of the third argument of
2767 * setsockopt(), the option_value read-only buffer: is it
2768 * a "char *", or a "void *", const or not. Some compilers
2769 * don't take kindly to e.g. assuming that "char *" implicitly
2770 * promotes to a "void *", or to explicitly promoting/demoting
2771 * consts to non/vice versa. The "const void *" is the SUS
2772 * definition, but that does not fly everywhere for the above
2774 SETSOCKOPT_OPTION_VALUE_T buf;
2778 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2782 aint = (int)SvIV(sv);
2783 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2786 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2796 SETERRNO(EBADF,SS_IVCHAN);
2803 /* also used for: pp_getsockname() */
2808 const int optype = PL_op->op_type;
2809 GV * const gv = MUTABLE_GV(POPs);
2810 IO * const io = GvIOn(gv);
2818 sv = sv_2mortal(newSV(257));
2819 (void)SvPOK_only(sv);
2823 fd = PerlIO_fileno(IoIFP(io));
2827 case OP_GETSOCKNAME:
2828 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2831 case OP_GETPEERNAME:
2832 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2834 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2836 static const char nowhere[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
2837 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2838 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2839 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2840 sizeof(u_short) + sizeof(struct in_addr))) {
2847 #ifdef BOGUS_GETNAME_RETURN
2848 /* Interactive Unix, getpeername() and getsockname()
2849 does not return valid namelen */
2850 if (len == BOGUS_GETNAME_RETURN)
2851 len = sizeof(struct sockaddr);
2860 SETERRNO(EBADF,SS_IVCHAN);
2869 /* also used for: pp_lstat() */
2880 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2881 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2882 if (PL_op->op_type == OP_LSTAT) {
2883 if (gv != PL_defgv) {
2884 do_fstat_warning_check:
2885 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2886 "lstat() on filehandle%s%" SVf,
2889 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2891 } else if (PL_laststype != OP_LSTAT)
2892 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2893 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2896 if (gv == PL_defgv) {
2897 if (PL_laststatval < 0)
2898 SETERRNO(EBADF,RMS_IFI);
2901 PL_laststype = OP_STAT;
2902 PL_statgv = gv ? gv : (GV *)io;
2903 SvPVCLEAR(PL_statname);
2909 int fd = PerlIO_fileno(IoIFP(io));
2912 PL_laststatval = -1;
2913 SETERRNO(EBADF,RMS_IFI);
2915 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
2917 } else if (IoDIRP(io)) {
2919 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2922 PL_laststatval = -1;
2923 SETERRNO(EBADF,RMS_IFI);
2927 PL_laststatval = -1;
2928 SETERRNO(EBADF,RMS_IFI);
2932 if (PL_laststatval < 0) {
2940 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2941 io = MUTABLE_IO(SvRV(sv));
2942 if (PL_op->op_type == OP_LSTAT)
2943 goto do_fstat_warning_check;
2944 goto do_fstat_have_io;
2946 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2947 temp = SvPV_nomg_const(sv, len);
2948 sv_setpv(PL_statname, temp);
2950 PL_laststype = PL_op->op_type;
2951 file = SvPV_nolen_const(PL_statname);
2952 if (!IS_SAFE_PATHNAME(temp, len, OP_NAME(PL_op))) {
2953 PL_laststatval = -1;
2955 else if (PL_op->op_type == OP_LSTAT)
2956 PL_laststatval = PerlLIO_lstat(file, &PL_statcache);
2958 PL_laststatval = PerlLIO_stat(file, &PL_statcache);
2959 if (PL_laststatval < 0) {
2960 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
2961 /* PL_warn_nl is constant */
2962 GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
2963 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2964 GCC_DIAG_RESTORE_STMT;
2971 if (gimme != G_ARRAY) {
2972 if (gimme != G_VOID)
2973 XPUSHs(boolSV(max));
2979 mPUSHi(PL_statcache.st_dev);
2982 * We try to represent st_ino as a native IV or UV where
2983 * possible, but fall back to a decimal string where
2984 * necessary. The code to generate these decimal strings
2985 * is quite obtuse, because (a) we're portable to non-POSIX
2986 * platforms where st_ino might be signed; (b) we didn't
2987 * necessarily detect at Configure time whether st_ino is
2988 * signed; (c) we're portable to non-POSIX platforms where
2989 * ino_t isn't defined, so have no name for the type of
2990 * st_ino; and (d) sprintf() doesn't necessarily support
2991 * integers as large as st_ino.
2995 CLANG_DIAG_IGNORE_STMT(-Wtautological-compare);
2996 GCC_DIAG_IGNORE_STMT(-Wtype-limits);
2997 neg = PL_statcache.st_ino < 0;
2998 GCC_DIAG_RESTORE_STMT;
2999 CLANG_DIAG_RESTORE_STMT;
3001 s.st_ino = (IV)PL_statcache.st_ino;
3002 if (LIKELY(s.st_ino == PL_statcache.st_ino)) {
3005 char buf[sizeof(s.st_ino)*3+1], *p;
3006 s.st_ino = PL_statcache.st_ino;
3007 for (p = buf + sizeof(buf); p != buf+1; ) {
3009 t.st_ino = s.st_ino / 10;
3010 *--p = '0' + (int)(t.st_ino*10 - s.st_ino);
3011 s.st_ino = t.st_ino;
3016 mPUSHp(p, buf+sizeof(buf) - p);
3019 s.st_ino = (UV)PL_statcache.st_ino;
3020 if (LIKELY(s.st_ino == PL_statcache.st_ino)) {
3023 char buf[sizeof(s.st_ino)*3], *p;
3024 s.st_ino = PL_statcache.st_ino;
3025 for (p = buf + sizeof(buf); p != buf; ) {
3027 t.st_ino = s.st_ino / 10;
3028 *--p = '0' + (int)(s.st_ino - t.st_ino*10);
3029 s.st_ino = t.st_ino;
3033 mPUSHp(p, buf+sizeof(buf) - p);
3037 mPUSHu(PL_statcache.st_mode);
3038 mPUSHu(PL_statcache.st_nlink);
3040 sv_setuid(PUSHmortal, PL_statcache.st_uid);
3041 sv_setgid(PUSHmortal, PL_statcache.st_gid);
3043 #ifdef USE_STAT_RDEV
3044 mPUSHi(PL_statcache.st_rdev);
3046 PUSHs(newSVpvs_flags("", SVs_TEMP));
3048 #if Off_t_size > IVSIZE
3049 mPUSHn(PL_statcache.st_size);
3051 mPUSHi(PL_statcache.st_size);
3054 mPUSHn(PL_statcache.st_atime);
3055 mPUSHn(PL_statcache.st_mtime);
3056 mPUSHn(PL_statcache.st_ctime);
3058 mPUSHi(PL_statcache.st_atime);
3059 mPUSHi(PL_statcache.st_mtime);
3060 mPUSHi(PL_statcache.st_ctime);
3062 #ifdef USE_STAT_BLOCKS
3063 mPUSHu(PL_statcache.st_blksize);
3064 mPUSHu(PL_statcache.st_blocks);
3066 PUSHs(newSVpvs_flags("", SVs_TEMP));
3067 PUSHs(newSVpvs_flags("", SVs_TEMP));
3073 /* All filetest ops avoid manipulating the perl stack pointer in their main
3074 bodies (since commit d2c4d2d1e22d3125), and return using either
3075 S_ft_return_false() or S_ft_return_true(). These two helper functions are
3076 the only two which manipulate the perl stack. To ensure that no stack
3077 manipulation macros are used, the filetest ops avoid defining a local copy
3078 of the stack pointer with dSP. */
3080 /* If the next filetest is stacked up with this one
3081 (PL_op->op_private & OPpFT_STACKING), we leave
3082 the original argument on the stack for success,
3083 and skip the stacked operators on failure.
3084 The next few macros/functions take care of this.
3088 S_ft_return_false(pTHX_ SV *ret) {
3092 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
3096 if (PL_op->op_private & OPpFT_STACKING) {
3097 while (next && OP_IS_FILETEST(next->op_type)
3098 && next->op_private & OPpFT_STACKED)
3099 next = next->op_next;
3104 PERL_STATIC_INLINE OP *
3105 S_ft_return_true(pTHX_ SV *ret) {
3107 if (PL_op->op_flags & OPf_REF)
3108 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
3109 else if (!(PL_op->op_private & OPpFT_STACKING))
3115 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
3116 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
3117 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
3119 #define tryAMAGICftest_MG(chr) STMT_START { \
3120 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
3121 && PL_op->op_flags & OPf_KIDS) { \
3122 OP *next = S_try_amagic_ftest(aTHX_ chr); \
3123 if (next) return next; \
3128 S_try_amagic_ftest(pTHX_ char chr) {
3129 SV *const arg = *PL_stack_sp;
3132 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
3136 const char tmpchr = chr;
3137 SV * const tmpsv = amagic_call(arg,
3138 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
3139 ftest_amg, AMGf_unary);
3144 return SvTRUE(tmpsv)
3145 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
3151 /* also used for: pp_fteexec() pp_fteread() pp_ftewrite() pp_ftrexec()
3157 /* Not const, because things tweak this below. Not bool, because there's
3158 no guarantee that OPpFT_ACCESS is <= CHAR_MAX */
3159 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3160 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3161 /* Giving some sort of initial value silences compilers. */
3163 int access_mode = R_OK;
3165 int access_mode = 0;
3168 /* access_mode is never used, but leaving use_access in makes the
3169 conditional compiling below much clearer. */
3172 Mode_t stat_mode = S_IRUSR;
3174 bool effective = FALSE;
3177 switch (PL_op->op_type) {
3178 case OP_FTRREAD: opchar = 'R'; break;
3179 case OP_FTRWRITE: opchar = 'W'; break;
3180 case OP_FTREXEC: opchar = 'X'; break;
3181 case OP_FTEREAD: opchar = 'r'; break;
3182 case OP_FTEWRITE: opchar = 'w'; break;
3183 case OP_FTEEXEC: opchar = 'x'; break;
3185 tryAMAGICftest_MG(opchar);
3187 switch (PL_op->op_type) {
3189 #if !(defined(HAS_ACCESS) && defined(R_OK))
3195 #if defined(HAS_ACCESS) && defined(W_OK)
3200 stat_mode = S_IWUSR;
3204 #if defined(HAS_ACCESS) && defined(X_OK)
3209 stat_mode = S_IXUSR;
3213 #ifdef PERL_EFF_ACCESS
3216 stat_mode = S_IWUSR;
3220 #ifndef PERL_EFF_ACCESS
3227 #ifdef PERL_EFF_ACCESS
3232 stat_mode = S_IXUSR;
3238 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3240 const char *name = SvPV(*PL_stack_sp, len);
3241 if (!IS_SAFE_PATHNAME(name, len, OP_NAME(PL_op))) {
3244 else if (effective) {
3245 # ifdef PERL_EFF_ACCESS
3246 result = PERL_EFF_ACCESS(name, access_mode);
3248 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3254 result = access(name, access_mode);
3256 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3267 result = my_stat_flags(0);
3270 if (cando(stat_mode, effective, &PL_statcache))
3276 /* also used for: pp_ftatime() pp_ftctime() pp_ftmtime() pp_ftsize() */
3281 const int op_type = PL_op->op_type;
3285 case OP_FTIS: opchar = 'e'; break;
3286 case OP_FTSIZE: opchar = 's'; break;
3287 case OP_FTMTIME: opchar = 'M'; break;
3288 case OP_FTCTIME: opchar = 'C'; break;
3289 case OP_FTATIME: opchar = 'A'; break;
3291 tryAMAGICftest_MG(opchar);
3293 result = my_stat_flags(0);
3296 if (op_type == OP_FTIS)
3299 /* You can't dTARGET inside OP_FTIS, because you'll get
3300 "panic: pad_sv po" - the op is not flagged to have a target. */
3304 #if Off_t_size > IVSIZE
3305 sv_setnv(TARG, (NV)PL_statcache.st_size);
3307 sv_setiv(TARG, (IV)PL_statcache.st_size);
3312 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3316 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3320 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3324 return SvTRUE_nomg_NN(TARG)
3325 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3330 /* also used for: pp_ftblk() pp_ftchr() pp_ftdir() pp_fteowned()
3331 * pp_ftfile() pp_ftpipe() pp_ftsgid() pp_ftsock()
3332 * pp_ftsuid() pp_ftsvtx() pp_ftzero() */
3339 switch (PL_op->op_type) {
3340 case OP_FTROWNED: opchar = 'O'; break;
3341 case OP_FTEOWNED: opchar = 'o'; break;
3342 case OP_FTZERO: opchar = 'z'; break;
3343 case OP_FTSOCK: opchar = 'S'; break;
3344 case OP_FTCHR: opchar = 'c'; break;
3345 case OP_FTBLK: opchar = 'b'; break;
3346 case OP_FTFILE: opchar = 'f'; break;
3347 case OP_FTDIR: opchar = 'd'; break;
3348 case OP_FTPIPE: opchar = 'p'; break;
3349 case OP_FTSUID: opchar = 'u'; break;
3350 case OP_FTSGID: opchar = 'g'; break;
3351 case OP_FTSVTX: opchar = 'k'; break;
3353 tryAMAGICftest_MG(opchar);
3355 result = my_stat_flags(0);
3358 switch (PL_op->op_type) {
3360 if (PL_statcache.st_uid == PerlProc_getuid())
3364 if (PL_statcache.st_uid == PerlProc_geteuid())
3368 if (PL_statcache.st_size == 0)
3372 if (S_ISSOCK(PL_statcache.st_mode))
3376 if (S_ISCHR(PL_statcache.st_mode))
3380 if (S_ISBLK(PL_statcache.st_mode))
3384 if (S_ISREG(PL_statcache.st_mode))
3388 if (S_ISDIR(PL_statcache.st_mode))
3392 if (S_ISFIFO(PL_statcache.st_mode))
3397 if (PL_statcache.st_mode & S_ISUID)
3403 if (PL_statcache.st_mode & S_ISGID)
3409 if (PL_statcache.st_mode & S_ISVTX)
3421 tryAMAGICftest_MG('l');
3422 result = my_lstat_flags(0);
3426 if (S_ISLNK(PL_statcache.st_mode))
3439 tryAMAGICftest_MG('t');
3441 if (PL_op->op_flags & OPf_REF)
3444 SV *tmpsv = *PL_stack_sp;
3445 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3446 name = SvPV_nomg(tmpsv, namelen);
3447 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3451 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3452 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3453 else if (name && isDIGIT(*name) && grok_atoUV(name, &uv, NULL) && uv <= PERL_INT_MAX)
3458 SETERRNO(EBADF,RMS_IFI);
3461 if (PerlLIO_isatty(fd))
3467 /* also used for: pp_ftbinary() */
3480 const U8 * first_variant;
3482 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3484 if (PL_op->op_flags & OPf_REF)
3486 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3491 gv = MAYBE_DEREF_GV_nomg(sv);
3495 if (gv == PL_defgv) {
3497 io = SvTYPE(PL_statgv) == SVt_PVIO
3501 goto really_filename;
3506 SvPVCLEAR(PL_statname);
3507 io = GvIO(PL_statgv);
3509 PL_laststatval = -1;
3510 PL_laststype = OP_STAT;
3511 if (io && IoIFP(io)) {
3513 if (! PerlIO_has_base(IoIFP(io)))
3514 DIE(aTHX_ "-T and -B not implemented on filehandles");
3515 fd = PerlIO_fileno(IoIFP(io));
3517 SETERRNO(EBADF,RMS_IFI);
3520 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3521 if (PL_laststatval < 0)
3523 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3524 if (PL_op->op_type == OP_FTTEXT)
3529 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3530 i = PerlIO_getc(IoIFP(io));
3532 (void)PerlIO_ungetc(IoIFP(io),i);
3534 /* null file is anything */
3537 len = PerlIO_get_bufsiz(IoIFP(io));
3538 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3539 /* sfio can have large buffers - limit to 512 */
3544 SETERRNO(EBADF,RMS_IFI);
3546 SETERRNO(EBADF,RMS_IFI);
3557 temp = SvPV_nomg_const(sv, temp_len);
3558 sv_setpv(PL_statname, temp);
3559 if (!IS_SAFE_PATHNAME(temp, temp_len, OP_NAME(PL_op))) {
3560 PL_laststatval = -1;
3561 PL_laststype = OP_STAT;
3565 file = SvPVX_const(PL_statname);
3567 if (!(fp = PerlIO_open(file, "r"))) {
3569 PL_laststatval = -1;
3570 PL_laststype = OP_STAT;
3572 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
3573 /* PL_warn_nl is constant */
3574 GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
3575 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3576 GCC_DIAG_RESTORE_STMT;
3580 PL_laststype = OP_STAT;
3581 fd = PerlIO_fileno(fp);
3583 (void)PerlIO_close(fp);
3584 SETERRNO(EBADF,RMS_IFI);
3587 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3588 if (PL_laststatval < 0) {
3590 (void)PerlIO_close(fp);
3594 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3595 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3596 (void)PerlIO_close(fp);
3598 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3599 FT_RETURNNO; /* special case NFS directories */
3600 FT_RETURNYES; /* null file is anything */
3605 /* now scan s to look for textiness */
3607 #if defined(DOSISH) || defined(USEMYBINMODE)
3608 /* ignore trailing ^Z on short files */
3609 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3614 if (! is_utf8_invariant_string_loc((U8 *) s, len, &first_variant)) {
3616 /* Here contains a variant under UTF-8 . See if the entire string is
3618 if (is_utf8_fixed_width_buf_flags(first_variant,
3619 len - ((char *) first_variant - (char *) s),
3622 if (PL_op->op_type == OP_FTTEXT) {
3631 /* Here, is not UTF-8 or is entirely ASCII. Look through the buffer for
3632 * things that wouldn't be in ASCII text or rich ASCII text. Count these
3634 for (i = 0; i < len; i++, s++) {
3635 if (!*s) { /* null never allowed in text */
3639 #ifdef USE_LOCALE_CTYPE
3640 if (IN_LC_RUNTIME(LC_CTYPE)) {
3641 if ( isPRINT_LC(*s) || isSPACE_LC(*s)) {
3648 /* VT occurs so rarely in text, that we consider it odd */
3649 || (isSPACE_A(*s) && *s != VT_NATIVE)
3651 /* But there is a fair amount of backspaces and escapes in
3654 || *s == ESC_NATIVE)
3661 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3672 const char *tmps = NULL;
3676 SV * const sv = POPs;
3677 if (PL_op->op_flags & OPf_SPECIAL) {
3678 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3680 if (ckWARN(WARN_UNOPENED)) {
3681 Perl_warner(aTHX_ packWARN(WARN_UNOPENED),
3682 "chdir() on unopened filehandle %" SVf, sv);
3684 SETERRNO(EBADF,RMS_IFI);
3686 TAINT_PROPER("chdir");
3690 else if (!(gv = MAYBE_DEREF_GV(sv)))
3691 tmps = SvPV_nomg_const_nolen(sv);
3694 HV * const table = GvHVn(PL_envgv);
3698 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3699 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3701 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3705 tmps = SvPV_nolen_const(*svp);
3709 SETERRNO(EINVAL, LIB_INVARG);
3710 TAINT_PROPER("chdir");
3715 TAINT_PROPER("chdir");
3718 IO* const io = GvIO(gv);
3721 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3722 } else if (IoIFP(io)) {
3723 int fd = PerlIO_fileno(IoIFP(io));
3727 PUSHi(fchdir(fd) >= 0);
3737 DIE(aTHX_ PL_no_func, "fchdir");
3741 PUSHi( PerlDir_chdir(tmps) >= 0 );
3743 /* Clear the DEFAULT element of ENV so we'll get the new value
3745 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3752 SETERRNO(EBADF,RMS_IFI);
3759 /* also used for: pp_chmod() pp_kill() pp_unlink() pp_utime() */
3763 dSP; dMARK; dTARGET;
3764 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3775 char * const tmps = POPpx;
3776 TAINT_PROPER("chroot");
3777 PUSHi( chroot(tmps) >= 0 );
3780 DIE(aTHX_ PL_no_func, "chroot");
3791 const char * const tmps2 = POPpconstx;
3792 const char * const tmps = SvPV_nolen_const(TOPs);
3793 TAINT_PROPER("rename");
3795 anum = PerlLIO_rename(tmps, tmps2);
3797 if (!(anum = PerlLIO_stat(tmps, &statbuf))) {
3798 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3801 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
3802 (void)UNLINK(tmps2);
3803 if (!(anum = link(tmps, tmps2)))
3804 anum = UNLINK(tmps);
3813 /* also used for: pp_symlink() */
3815 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3819 const int op_type = PL_op->op_type;
3823 if (op_type == OP_LINK)
3824 DIE(aTHX_ PL_no_func, "link");
3826 # ifndef HAS_SYMLINK
3827 if (op_type == OP_SYMLINK)
3828 DIE(aTHX_ PL_no_func, "symlink");
3832 const char * const tmps2 = POPpconstx;
3833 const char * const tmps = SvPV_nolen_const(TOPs);
3834 TAINT_PROPER(PL_op_desc[op_type]);
3836 # if defined(HAS_LINK) && defined(HAS_SYMLINK)
3837 /* Both present - need to choose which. */
3838 (op_type == OP_LINK) ?
3839 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3840 # elif defined(HAS_LINK)
3841 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3842 PerlLIO_link(tmps, tmps2);
3843 # elif defined(HAS_SYMLINK)
3844 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3845 symlink(tmps, tmps2);
3849 SETi( result >= 0 );
3854 /* also used for: pp_symlink() */
3859 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3869 char buf[MAXPATHLEN];
3874 /* NOTE: if the length returned by readlink() is sizeof(buf) - 1,
3875 * it is impossible to know whether the result was truncated. */
3876 len = readlink(tmps, buf, sizeof(buf) - 1);
3885 RETSETUNDEF; /* just pretend it's a normal file */
3889 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3891 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3893 char * const save_filename = filename;
3898 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3900 PERL_ARGS_ASSERT_DOONELINER;
3902 Newx(cmdline, size, char);
3903 my_strlcpy(cmdline, cmd, size);
3904 my_strlcat(cmdline, " ", size);
3905 for (s = cmdline + strlen(cmdline); *filename; ) {
3909 if (s - cmdline < size)
3910 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3911 myfp = PerlProc_popen(cmdline, "r");
3915 SV * const tmpsv = sv_newmortal();
3916 /* Need to save/restore 'PL_rs' ?? */
3917 s = sv_gets(tmpsv, myfp, 0);
3918 (void)PerlProc_pclose(myfp);
3922 #ifdef HAS_SYS_ERRLIST
3927 /* you don't see this */
3928 const char * const errmsg = Strerror(e) ;
3931 if (instr(s, errmsg)) {
3938 #define EACCES EPERM
3940 if (instr(s, "cannot make"))
3941 SETERRNO(EEXIST,RMS_FEX);
3942 else if (instr(s, "existing file"))
3943 SETERRNO(EEXIST,RMS_FEX);
3944 else if (instr(s, "ile exists"))
3945 SETERRNO(EEXIST,RMS_FEX);
3946 else if (instr(s, "non-exist"))
3947 SETERRNO(ENOENT,RMS_FNF);
3948 else if (instr(s, "does not exist"))
3949 SETERRNO(ENOENT,RMS_FNF);
3950 else if (instr(s, "not empty"))
3951 SETERRNO(EBUSY,SS_DEVOFFLINE);
3952 else if (instr(s, "cannot access"))
3953 SETERRNO(EACCES,RMS_PRV);
3955 SETERRNO(EPERM,RMS_PRV);
3958 else { /* some mkdirs return no failure indication */
3960 anum = (PerlLIO_stat(save_filename, &statbuf) >= 0);
3961 if (PL_op->op_type == OP_RMDIR)
3966 SETERRNO(EACCES,RMS_PRV); /* a guess */
3975 /* This macro removes trailing slashes from a directory name.
3976 * Different operating and file systems take differently to
3977 * trailing slashes. According to POSIX 1003.1 1996 Edition
3978 * any number of trailing slashes should be allowed.
3979 * Thusly we snip them away so that even non-conforming
3980 * systems are happy.
3981 * We should probably do this "filtering" for all
3982 * the functions that expect (potentially) directory names:
3983 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3984 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3986 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3987 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3990 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3991 (tmps) = savepvn((tmps), (len)); \
4001 const unsigned int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPu : 0777;
4003 TRIMSLASHES(tmps,len,copy);
4005 TAINT_PROPER("mkdir");
4007 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
4011 SETi( dooneliner("mkdir", tmps) );
4012 oldumask = PerlLIO_umask(0);
4013 PerlLIO_umask(oldumask);
4014 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
4029 TRIMSLASHES(tmps,len,copy);
4030 TAINT_PROPER("rmdir");
4032 SETi( PerlDir_rmdir(tmps) >= 0 );
4034 SETi( dooneliner("rmdir", tmps) );
4041 /* Directory calls. */
4045 #if defined(Direntry_t) && defined(HAS_READDIR)
4047 const char * const dirname = POPpconstx;
4048 GV * const gv = MUTABLE_GV(POPs);
4049 IO * const io = GvIOn(gv);
4051 if ((IoIFP(io) || IoOFP(io)))
4052 Perl_croak(aTHX_ "Cannot open %" HEKf " as a dirhandle: it is already open as a filehandle",
4053 HEKfARG(GvENAME_HEK(gv)));
4055 PerlDir_close(IoDIRP(io));
4056 if (!(IoDIRP(io) = PerlDir_open(dirname)))
4062 SETERRNO(EBADF,RMS_DIR);
4065 DIE(aTHX_ PL_no_dir_func, "opendir");
4071 #if !defined(Direntry_t) || !defined(HAS_READDIR)
4072 DIE(aTHX_ PL_no_dir_func, "readdir");
4074 #if !defined(I_DIRENT) && !defined(VMS)
4075 Direntry_t *readdir (DIR *);
4080 const U8 gimme = GIMME_V;
4081 GV * const gv = MUTABLE_GV(POPs);
4082 const Direntry_t *dp;
4083 IO * const io = GvIOn(gv);
4086 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4087 "readdir() attempted on invalid dirhandle %" HEKf,
4088 HEKfARG(GvENAME_HEK(gv)));
4093 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
4097 sv = newSVpvn(dp->d_name, dp->d_namlen);
4099 sv = newSVpv(dp->d_name, 0);
4101 if (!(IoFLAGS(io) & IOf_UNTAINT))
4104 } while (gimme == G_ARRAY);
4106 if (!dp && gimme != G_ARRAY)
4113 SETERRNO(EBADF,RMS_ISI);
4114 if (gimme == G_ARRAY)
4123 #if defined(HAS_TELLDIR) || defined(telldir)
4125 /* XXX does _anyone_ need this? --AD 2/20/1998 */
4126 /* XXX netbsd still seemed to.
4127 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
4128 --JHI 1999-Feb-02 */
4129 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
4130 long telldir (DIR *);
4132 GV * const gv = MUTABLE_GV(POPs);
4133 IO * const io = GvIOn(gv);
4136 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4137 "telldir() attempted on invalid dirhandle %" HEKf,
4138 HEKfARG(GvENAME_HEK(gv)));
4142 PUSHi( PerlDir_tell(IoDIRP(io)) );
4146 SETERRNO(EBADF,RMS_ISI);
4149 DIE(aTHX_ PL_no_dir_func, "telldir");
4155 #if defined(HAS_SEEKDIR) || defined(seekdir)
4157 const long along = POPl;
4158 GV * const gv = MUTABLE_GV(POPs);
4159 IO * const io = GvIOn(gv);
4162 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4163 "seekdir() attempted on invalid dirhandle %" HEKf,
4164 HEKfARG(GvENAME_HEK(gv)));
4167 (void)PerlDir_seek(IoDIRP(io), along);
4172 SETERRNO(EBADF,RMS_ISI);
4175 DIE(aTHX_ PL_no_dir_func, "seekdir");
4181 #if defined(HAS_REWINDDIR) || defined(rewinddir)
4183 GV * const gv = MUTABLE_GV(POPs);
4184 IO * const io = GvIOn(gv);
4187 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4188 "rewinddir() attempted on invalid dirhandle %" HEKf,
4189 HEKfARG(GvENAME_HEK(gv)));
4192 (void)PerlDir_rewind(IoDIRP(io));
4196 SETERRNO(EBADF,RMS_ISI);
4199 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4205 #if defined(Direntry_t) && defined(HAS_READDIR)
4207 GV * const gv = MUTABLE_GV(POPs);
4208 IO * const io = GvIOn(gv);
4211 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4212 "closedir() attempted on invalid dirhandle %" HEKf,
4213 HEKfARG(GvENAME_HEK(gv)));
4216 #ifdef VOID_CLOSEDIR
4217 PerlDir_close(IoDIRP(io));
4219 if (PerlDir_close(IoDIRP(io)) < 0) {
4220 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4229 SETERRNO(EBADF,RMS_IFI);
4232 DIE(aTHX_ PL_no_dir_func, "closedir");
4236 /* Process control. */
4243 #ifdef HAS_SIGPROCMASK
4244 sigset_t oldmask, newmask;
4248 PERL_FLUSHALL_FOR_CHILD;
4249 #ifdef HAS_SIGPROCMASK
4250 sigfillset(&newmask);
4251 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4253 childpid = PerlProc_fork();
4254 if (childpid == 0) {
4258 for (sig = 1; sig < SIG_SIZE; sig++)
4259 PL_psig_pend[sig] = 0;
4261 #ifdef HAS_SIGPROCMASK
4264 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4271 #ifdef PERL_USES_PL_PIDSTATUS
4272 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4277 #elif (defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)) || defined(__amigaos4__)
4282 PERL_FLUSHALL_FOR_CHILD;
4283 childpid = PerlProc_fork();
4289 DIE(aTHX_ PL_no_func, "fork");
4295 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4300 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4301 childpid = wait4pid(-1, &argflags, 0);
4303 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4308 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4309 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4310 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4312 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4317 DIE(aTHX_ PL_no_func, "wait");
4323 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4325 const int optype = POPi;
4326 const Pid_t pid = TOPi;
4330 result = amigaos_waitpid(aTHX_ optype, pid, &argflags);
4331 STATUS_NATIVE_CHILD_SET((result >= 0) ? argflags : -1);
4332 result = result == 0 ? pid : -1;
4336 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4337 result = wait4pid(pid, &argflags, optype);
4339 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4344 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4345 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4346 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4348 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4350 # endif /* __amigaos4__ */
4354 DIE(aTHX_ PL_no_func, "waitpid");
4360 dSP; dMARK; dORIGMARK; dTARGET;
4361 #if defined(__LIBCATAMOUNT__)
4362 PL_statusvalue = -1;
4367 # ifdef __amigaos4__
4373 while (++MARK <= SP) {
4374 SV *origsv = *MARK, *copysv;
4378 #if defined(WIN32) || defined(__VMS)
4380 * Because of a nasty platform-specific variation on the meaning
4381 * of arguments to this op, we must preserve numeric arguments
4382 * as numeric, not just retain the string value.
4384 if (SvNIOK(origsv) || SvNIOKp(origsv)) {
4385 copysv = newSV_type(SVt_PVNV);
4387 if (SvPOK(origsv) || SvPOKp(origsv)) {
4388 pv = SvPV_nomg(origsv, len);
4389 sv_setpvn(copysv, pv, len);
4392 if (SvIOK(origsv) || SvIOKp(origsv))
4393 SvIV_set(copysv, SvIVX(origsv));
4394 if (SvNOK(origsv) || SvNOKp(origsv))
4395 SvNV_set(copysv, SvNVX(origsv));
4396 SvFLAGS(copysv) |= SvFLAGS(origsv) &
4397 (SVf_IOK|SVf_NOK|SVf_POK|SVp_IOK|SVp_NOK|SVp_POK|
4398 SVf_UTF8|SVf_IVisUV);
4402 pv = SvPV_nomg(origsv, len);
4403 copysv = newSVpvn_flags(pv, len,
4404 (SvFLAGS(origsv) & SVf_UTF8) | SVs_TEMP);
4412 TAINT_PROPER("system");
4414 PERL_FLUSHALL_FOR_CHILD;
4415 #if (defined(HAS_FORK) || defined(__amigaos4__)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4418 struct UserData userdata;
4425 bool child_success = FALSE;
4426 #ifdef HAS_SIGPROCMASK
4427 sigset_t newset, oldset;
4430 if (PerlProc_pipe_cloexec(pp) >= 0)
4433 amigaos_fork_set_userdata(aTHX_
4439 pthread_create(&proc,NULL,amigaos_system_child,(void *)&userdata);
4440 child_success = proc > 0;
4442 #ifdef HAS_SIGPROCMASK
4443 sigemptyset(&newset);
4444 sigaddset(&newset, SIGCHLD);
4445 sigprocmask(SIG_BLOCK, &newset, &oldset);
4447 while ((childpid = PerlProc_fork()) == -1) {
4448 if (errno != EAGAIN) {
4453 PerlLIO_close(pp[0]);
4454 PerlLIO_close(pp[1]);
4456 #ifdef HAS_SIGPROCMASK
4457 sigprocmask(SIG_SETMASK, &oldset, NULL);
4463 child_success = childpid > 0;
4465 if (child_success) {
4466 Sigsave_t ihand,qhand; /* place to save signals during system() */
4469 #ifndef __amigaos4__
4471 PerlLIO_close(pp[1]);
4474 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4475 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4478 result = pthread_join(proc, (void **)&status);
4481 result = wait4pid(childpid, &status, 0);
4482 } while (result == -1 && errno == EINTR);
4485 #ifdef HAS_SIGPROCMASK
4486 sigprocmask(SIG_SETMASK, &oldset, NULL);
4488 (void)rsignal_restore(SIGINT, &ihand);
4489 (void)rsignal_restore(SIGQUIT, &qhand);
4491 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4497 while (n < sizeof(int)) {
4498 const SSize_t n1 = PerlLIO_read(pp[0],
4499 (void*)(((char*)&errkid)+n),
4505 PerlLIO_close(pp[0]);
4506 if (n) { /* Error */
4507 if (n != sizeof(int))
4508 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4509 errno = errkid; /* Propagate errno from kid */
4511 /* The pipe always has something in it
4512 * so n alone is not enough. */
4516 STATUS_NATIVE_CHILD_SET(-1);
4520 XPUSHi(STATUS_CURRENT);
4523 #ifndef __amigaos4__
4524 #ifdef HAS_SIGPROCMASK
4525 sigprocmask(SIG_SETMASK, &oldset, NULL);
4528 PerlLIO_close(pp[0]);
4529 if (PL_op->op_flags & OPf_STACKED) {
4530 SV * const really = *++MARK;
4531 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4533 else if (SP - MARK != 1)
4534 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4536 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4538 #endif /* __amigaos4__ */
4541 #else /* ! FORK or VMS or OS/2 */
4544 if (PL_op->op_flags & OPf_STACKED) {
4545 SV * const really = *++MARK;
4546 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4547 value = (I32)do_aspawn(really, MARK, SP);
4549 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4552 else if (SP - MARK != 1) {
4553 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4554 value = (I32)do_aspawn(NULL, MARK, SP);
4556 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4560 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4562 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4564 STATUS_NATIVE_CHILD_SET(value);
4566 XPUSHi(result ? value : STATUS_CURRENT);
4567 #endif /* !FORK or VMS or OS/2 */
4574 dSP; dMARK; dORIGMARK; dTARGET;
4579 while (++MARK <= SP) {
4580 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4585 TAINT_PROPER("exec");
4588 PERL_FLUSHALL_FOR_CHILD;
4589 if (PL_op->op_flags & OPf_STACKED) {
4590 SV * const really = *++MARK;
4591 value = (I32)do_aexec(really, MARK, SP);
4593 else if (SP - MARK != 1)
4595 value = (I32)vms_do_aexec(NULL, MARK, SP);
4597 value = (I32)do_aexec(NULL, MARK, SP);
4601 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4603 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4615 XPUSHi( getppid() );
4618 DIE(aTHX_ PL_no_func, "getppid");
4628 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4631 pgrp = (I32)BSD_GETPGRP(pid);
4633 if (pid != 0 && pid != PerlProc_getpid())
4634 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4640 DIE(aTHX_ PL_no_func, "getpgrp");
4650 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4651 if (MAXARG > 0) pid = TOPs ? TOPi : 0;
4658 TAINT_PROPER("setpgrp");
4660 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4662 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4663 || (pid != 0 && pid != PerlProc_getpid()))
4665 DIE(aTHX_ "setpgrp can't take arguments");
4667 SETi( setpgrp() >= 0 );
4668 #endif /* USE_BSDPGRP */
4671 DIE(aTHX_ PL_no_func, "setpgrp");
4675 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4676 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4678 # define PRIORITY_WHICH_T(which) which
4683 #ifdef HAS_GETPRIORITY
4685 const int who = POPi;
4686 const int which = TOPi;
4687 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4690 DIE(aTHX_ PL_no_func, "getpriority");
4696 #ifdef HAS_SETPRIORITY
4698 const int niceval = POPi;
4699 const int who = POPi;
4700 const int which = TOPi;
4701 TAINT_PROPER("setpriority");
4702 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4705 DIE(aTHX_ PL_no_func, "setpriority");
4709 #undef PRIORITY_WHICH_T
4717 XPUSHn( time(NULL) );
4719 XPUSHi( time(NULL) );
4728 struct tms timesbuf;
4731 (void)PerlProc_times(×buf);
4733 mPUSHn(((NV)timesbuf.tms_utime)/(NV)PL_clocktick);
4734 if (GIMME_V == G_ARRAY) {
4735 mPUSHn(((NV)timesbuf.tms_stime)/(NV)PL_clocktick);
4736 mPUSHn(((NV)timesbuf.tms_cutime)/(NV)PL_clocktick);
4737 mPUSHn(((NV)timesbuf.tms_cstime)/(NV)PL_clocktick);
4740 #elif defined(PERL_MICRO)
4744 if (GIMME_V == G_ARRAY) {
4751 DIE(aTHX_ "times not implemented");
4752 #endif /* HAS_TIMES */
4755 /* The 32 bit int year limits the times we can represent to these
4756 boundaries with a few days wiggle room to account for time zone
4759 /* Sat Jan 3 00:00:00 -2147481748 */
4760 #define TIME_LOWER_BOUND -67768100567755200.0
4761 /* Sun Dec 29 12:00:00 2147483647 */
4762 #define TIME_UPPER_BOUND 67767976233316800.0
4765 /* also used for: pp_localtime() */
4773 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4774 static const char * const dayname[] =
4775 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4776 static const char * const monname[] =
4777 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4778 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4780 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4783 when = (Time64_T)now;
4786 NV input = Perl_floor(POPn);
4787 const bool pl_isnan = Perl_isnan(input);
4788 when = (Time64_T)input;
4789 if (UNLIKELY(pl_isnan || when != input)) {
4790 /* diag_listed_as: gmtime(%f) too large */
4791 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4792 "%s(%.0" NVff ") too large", opname, input);
4800 if ( TIME_LOWER_BOUND > when ) {
4801 /* diag_listed_as: gmtime(%f) too small */
4802 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4803 "%s(%.0" NVff ") too small", opname, when);
4806 else if( when > TIME_UPPER_BOUND ) {
4807 /* diag_listed_as: gmtime(%f) too small */
4808 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4809 "%s(%.0" NVff ") too large", opname, when);
4813 if (PL_op->op_type == OP_LOCALTIME)
4814 err = Perl_localtime64_r(&when, &tmbuf);
4816 err = Perl_gmtime64_r(&when, &tmbuf);
4820 /* diag_listed_as: gmtime(%f) failed */
4821 /* XXX %lld broken for quads */
4823 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4824 "%s(%.0" NVff ") failed", opname, when);
4827 if (GIMME_V != G_ARRAY) { /* scalar context */
4834 Perl_sv_setpvf_mg(aTHX_ TARG, "%s %s %2d %02d:%02d:%02d %" IVdf,
4835 dayname[tmbuf.tm_wday],
4836 monname[tmbuf.tm_mon],
4841 (IV)tmbuf.tm_year + 1900);
4844 else { /* list context */
4850 mPUSHi(tmbuf.tm_sec);
4851 mPUSHi(tmbuf.tm_min);
4852 mPUSHi(tmbuf.tm_hour);
4853 mPUSHi(tmbuf.tm_mday);
4854 mPUSHi(tmbuf.tm_mon);
4855 mPUSHn(tmbuf.tm_year);
4856 mPUSHi(tmbuf.tm_wday);
4857 mPUSHi(tmbuf.tm_yday);
4858 mPUSHi(tmbuf.tm_isdst);
4867 /* alarm() takes an unsigned int number of seconds, and return the
4868 * unsigned int number of seconds remaining in the previous alarm
4869 * (alarms don't stack). Therefore negative return values are not
4873 /* Note that while the C library function alarm() as such has
4874 * no errors defined (or in other words, properly behaving client
4875 * code shouldn't expect any), alarm() being obsoleted by
4876 * setitimer() and often being implemented in terms of
4877 * setitimer(), can fail. */
4878 /* diag_listed_as: %s() with negative argument */
4879 Perl_ck_warner_d(aTHX_ packWARN(WARN_MISC),
4880 "alarm() with negative argument");
4881 SETERRNO(EINVAL, LIB_INVARG);
4885 unsigned int retval = alarm(anum);
4886 if ((int)retval < 0) /* Strictly speaking "cannot happen". */
4892 DIE(aTHX_ PL_no_func, "alarm");
4902 (void)time(&lasttime);
4903 if (MAXARG < 1 || (!TOPs && !POPs))
4906 const I32 duration = POPi;
4908 /* diag_listed_as: %s() with negative argument */
4909 Perl_ck_warner_d(aTHX_ packWARN(WARN_MISC),
4910 "sleep() with negative argument");
4911 SETERRNO(EINVAL, LIB_INVARG);
4912 XPUSHs(&PL_sv_zero);
4915 PerlProc_sleep((unsigned int)duration);
4919 XPUSHi(when - lasttime);
4923 /* Shared memory. */
4924 /* Merged with some message passing. */
4926 /* also used for: pp_msgrcv() pp_msgsnd() pp_semop() pp_shmread() */
4930 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4931 dSP; dMARK; dTARGET;
4932 const int op_type = PL_op->op_type;
4937 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4940 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4943 value = (I32)(do_semop(MARK, SP) >= 0);
4946 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4954 return Perl_pp_semget(aTHX);
4960 /* also used for: pp_msgget() pp_shmget() */
4964 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4965 dSP; dMARK; dTARGET;
4966 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4973 DIE(aTHX_ "System V IPC is not implemented on this machine");
4977 /* also used for: pp_msgctl() pp_shmctl() */
4981 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4982 dSP; dMARK; dTARGET;
4983 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4991 PUSHp(zero_but_true, ZBTLEN);
4995 return Perl_pp_semget(aTHX);
4999 /* I can't const this further without getting warnings about the types of
5000 various arrays passed in from structures. */
5002 S_space_join_names_mortal(pTHX_ char *const *array)
5006 if (array && *array) {
5007 target = newSVpvs_flags("", SVs_TEMP);
5009 sv_catpv(target, *array);
5012 sv_catpvs(target, " ");
5015 target = sv_mortalcopy(&PL_sv_no);
5020 /* Get system info. */
5022 /* also used for: pp_ghbyaddr() pp_ghbyname() */
5026 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
5028 I32 which = PL_op->op_type;
5031 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
5032 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
5033 struct hostent *gethostbyname(Netdb_name_t);
5034 struct hostent *gethostent(void);
5036 struct hostent *hent = NULL;
5040 if (which == OP_GHBYNAME) {
5041 #ifdef HAS_GETHOSTBYNAME
5042 const char* const name = POPpbytex;
5043 hent = PerlSock_gethostbyname(name);
5045 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
5048 else if (which == OP_GHBYADDR) {
5049 #ifdef HAS_GETHOSTBYADDR
5050 const int addrtype = POPi;
5051 SV * const addrsv = POPs;
5053 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
5055 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
5057 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
5061 #ifdef HAS_GETHOSTENT
5062 hent = PerlSock_gethostent();
5064 DIE(aTHX_ PL_no_sock_func, "gethostent");
5067 #ifdef HOST_NOT_FOUND
5069 #ifdef USE_REENTRANT_API
5070 # ifdef USE_GETHOSTENT_ERRNO
5071 h_errno = PL_reentrant_buffer->_gethostent_errno;
5074 STATUS_UNIX_SET(h_errno);
5078 if (GIMME_V != G_ARRAY) {
5079 PUSHs(sv = sv_newmortal());
5081 if (which == OP_GHBYNAME) {
5083 sv_setpvn(sv, hent->h_addr, hent->h_length);
5086 sv_setpv(sv, (char*)hent->h_name);
5092 mPUSHs(newSVpv((char*)hent->h_name, 0));
5093 PUSHs(space_join_names_mortal(hent->h_aliases));
5094 mPUSHi(hent->h_addrtype);
5095 len = hent->h_length;
5098 for (elem = hent->h_addr_list; elem && *elem; elem++) {
5099 mXPUSHp(*elem, len);
5103 mPUSHp(hent->h_addr, len);
5105 PUSHs(sv_mortalcopy(&PL_sv_no));
5110 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5114 /* also used for: pp_gnbyaddr() pp_gnbyname() */
5118 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
5120 I32 which = PL_op->op_type;
5122 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
5123 struct netent *getnetbyaddr(Netdb_net_t, int);
5124 struct netent *getnetbyname(Netdb_name_t);
5125 struct netent *getnetent(void);
5127 struct netent *nent;
5129 if (which == OP_GNBYNAME){
5130 #ifdef HAS_GETNETBYNAME
5131 const char * const name = POPpbytex;
5132 nent = PerlSock_getnetbyname(name);
5134 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
5137 else if (which == OP_GNBYADDR) {
5138 #ifdef HAS_GETNETBYADDR
5139 const int addrtype = POPi;
5140 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
5141 nent = PerlSock_getnetbyaddr(addr, addrtype);
5143 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
5147 #ifdef HAS_GETNETENT
5148 nent = PerlSock_getnetent();
5150 DIE(aTHX_ PL_no_sock_func, "getnetent");
5153 #ifdef HOST_NOT_FOUND
5155 #ifdef USE_REENTRANT_API
5156 # ifdef USE_GETNETENT_ERRNO
5157 h_errno = PL_reentrant_buffer->_getnetent_errno;
5160 STATUS_UNIX_SET(h_errno);
5165 if (GIMME_V != G_ARRAY) {
5166 PUSHs(sv = sv_newmortal());
5168 if (which == OP_GNBYNAME)
5169 sv_setiv(sv, (IV)nent->n_net);
5171 sv_setpv(sv, nent->n_name);
5177 mPUSHs(newSVpv(nent->n_name, 0));
5178 PUSHs(space_join_names_mortal(nent->n_aliases));
5179 mPUSHi(nent->n_addrtype);
5180 mPUSHi(nent->n_net);
5185 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5190 /* also used for: pp_gpbyname() pp_gpbynumber() */
5194 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
5196 I32 which = PL_op->op_type;
5198 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
5199 struct protoent *getprotobyname(Netdb_name_t);
5200 struct protoent *getprotobynumber(int);
5201 struct protoent *getprotoent(void);
5203 struct protoent *pent;
5205 if (which == OP_GPBYNAME) {
5206 #ifdef HAS_GETPROTOBYNAME
5207 const char* const name = POPpbytex;
5208 pent = PerlSock_getprotobyname(name);
5210 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
5213 else if (which == OP_GPBYNUMBER) {
5214 #ifdef HAS_GETPROTOBYNUMBER
5215 const int number = POPi;
5216 pent = PerlSock_getprotobynumber(number);
5218 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
5222 #ifdef HAS_GETPROTOENT
5223 pent = PerlSock_getprotoent();
5225 DIE(aTHX_ PL_no_sock_func, "getprotoent");
5229 if (GIMME_V != G_ARRAY) {
5230 PUSHs(sv = sv_newmortal());
5232 if (which == OP_GPBYNAME)
5233 sv_setiv(sv, (IV)pent->p_proto);
5235 sv_setpv(sv, pent->p_name);
5241 mPUSHs(newSVpv(pent->p_name, 0));
5242 PUSHs(space_join_names_mortal(pent->p_aliases));
5243 mPUSHi(pent->p_proto);
5248 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5253 /* also used for: pp_gsbyname() pp_gsbyport() */
5257 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
5259 I32 which = PL_op->op_type;
5261 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
5262 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
5263 struct servent *getservbyport(int, Netdb_name_t);
5264 struct servent *getservent(void);
5266 struct servent *sent;
5268 if (which == OP_GSBYNAME) {
5269 #ifdef HAS_GETSERVBYNAME
5270 const char * const proto = POPpbytex;
5271 const char * const name = POPpbytex;
5272 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
5274 DIE(aTHX_ PL_no_sock_func, "getservbyname");
5277 else if (which == OP_GSBYPORT) {
5278 #ifdef HAS_GETSERVBYPORT
5279 const char * const proto = POPpbytex;
5280 unsigned short port = (unsigned short)POPu;
5281 port = PerlSock_htons(port);
5282 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
5284 DIE(aTHX_ PL_no_sock_func, "getservbyport");
5288 #ifdef HAS_GETSERVENT
5289 sent = PerlSock_getservent();
5291 DIE(aTHX_ PL_no_sock_func, "getservent");
5295 if (GIMME_V != G_ARRAY) {
5296 PUSHs(sv = sv_newmortal());
5298 if (which == OP_GSBYNAME) {
5299 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5302 sv_setpv(sv, sent->s_name);
5308 mPUSHs(newSVpv(sent->s_name, 0));
5309 PUSHs(space_join_names_mortal(sent->s_aliases));
5310 mPUSHi(PerlSock_ntohs(sent->s_port));
5311 mPUSHs(newSVpv(sent->s_proto, 0));
5316 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5321 /* also used for: pp_snetent() pp_sprotoent() pp_sservent() */
5326 const int stayopen = TOPi;
5327 switch(PL_op->op_type) {
5329 #ifdef HAS_SETHOSTENT
5330 PerlSock_sethostent(stayopen);
5332 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5335 #ifdef HAS_SETNETENT
5337 PerlSock_setnetent(stayopen);
5339 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5343 #ifdef HAS_SETPROTOENT
5344 PerlSock_setprotoent(stayopen);
5346 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5350 #ifdef HAS_SETSERVENT
5351 PerlSock_setservent(stayopen);
5353 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5361 /* also used for: pp_egrent() pp_enetent() pp_eprotoent() pp_epwent()
5362 * pp_eservent() pp_sgrent() pp_spwent() */
5367 switch(PL_op->op_type) {
5369 #ifdef HAS_ENDHOSTENT
5370 PerlSock_endhostent();
5372 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5376 #ifdef HAS_ENDNETENT
5377 PerlSock_endnetent();
5379 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5383 #ifdef HAS_ENDPROTOENT
5384 PerlSock_endprotoent();
5386 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5390 #ifdef HAS_ENDSERVENT
5391 PerlSock_endservent();
5393 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5397 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5400 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5404 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5407 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5411 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5414 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5418 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5421 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5430 /* also used for: pp_gpwnam() pp_gpwuid() */
5436 I32 which = PL_op->op_type;
5438 struct passwd *pwent = NULL;
5440 * We currently support only the SysV getsp* shadow password interface.
5441 * The interface is declared in <shadow.h> and often one needs to link
5442 * with -lsecurity or some such.
5443 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5446 * AIX getpwnam() is clever enough to return the encrypted password
5447 * only if the caller (euid?) is root.
5449 * There are at least three other shadow password APIs. Many platforms
5450 * seem to contain more than one interface for accessing the shadow
5451 * password databases, possibly for compatibility reasons.
5452 * The getsp*() is by far he simplest one, the other two interfaces
5453 * are much more complicated, but also very similar to each other.
5458 * struct pr_passwd *getprpw*();
5459 * The password is in
5460 * char getprpw*(...).ufld.fd_encrypt[]
5461 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5466 * struct es_passwd *getespw*();
5467 * The password is in
5468 * char *(getespw*(...).ufld.fd_encrypt)
5469 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5472 * struct userpw *getuserpw();
5473 * The password is in
5474 * char *(getuserpw(...)).spw_upw_passwd
5475 * (but the de facto standard getpwnam() should work okay)
5477 * Mention I_PROT here so that Configure probes for it.
5479 * In HP-UX for getprpw*() the manual page claims that one should include
5480 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5481 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5482 * and pp_sys.c already includes <shadow.h> if there is such.
5484 * Note that <sys/security.h> is already probed for, but currently
5485 * it is only included in special cases.
5487 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5488 * be preferred interface, even though also the getprpw*() interface
5489 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5490 * One also needs to call set_auth_parameters() in main() before
5491 * doing anything else, whether one is using getespw*() or getprpw*().
5493 * Note that accessing the shadow databases can be magnitudes
5494 * slower than accessing the standard databases.
5499 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5500 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5501 * the pw_comment is left uninitialized. */
5502 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5508 const char* const name = POPpbytex;
5509 pwent = getpwnam(name);
5515 pwent = getpwuid(uid);
5519 # ifdef HAS_GETPWENT
5521 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5522 if (pwent) pwent = getpwnam(pwent->pw_name);
5525 DIE(aTHX_ PL_no_func, "getpwent");
5531 if (GIMME_V != G_ARRAY) {
5532 PUSHs(sv = sv_newmortal());
5534 if (which == OP_GPWNAM)
5535 sv_setuid(sv, pwent->pw_uid);
5537 sv_setpv(sv, pwent->pw_name);
5543 mPUSHs(newSVpv(pwent->pw_name, 0));
5547 /* If we have getspnam(), we try to dig up the shadow
5548 * password. If we are underprivileged, the shadow
5549 * interface will set the errno to EACCES or similar,
5550 * and return a null pointer. If this happens, we will
5551 * use the dummy password (usually "*" or "x") from the
5552 * standard password database.
5554 * In theory we could skip the shadow call completely
5555 * if euid != 0 but in practice we cannot know which
5556 * security measures are guarding the shadow databases
5557 * on a random platform.
5559 * Resist the urge to use additional shadow interfaces.
5560 * Divert the urge to writing an extension instead.
5563 /* Some AIX setups falsely(?) detect some getspnam(), which
5564 * has a different API than the Solaris/IRIX one. */
5565 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5568 const struct spwd * const spwent = getspnam(pwent->pw_name);
5569 /* Save and restore errno so that
5570 * underprivileged attempts seem
5571 * to have never made the unsuccessful
5572 * attempt to retrieve the shadow password. */
5574 if (spwent && spwent->sp_pwdp)
5575 sv_setpv(sv, spwent->sp_pwdp);
5579 if (!SvPOK(sv)) /* Use the standard password, then. */
5580 sv_setpv(sv, pwent->pw_passwd);
5583 /* passwd is tainted because user himself can diddle with it.
5584 * admittedly not much and in a very limited way, but nevertheless. */
5587 sv_setuid(PUSHmortal, pwent->pw_uid);
5588 sv_setgid(PUSHmortal, pwent->pw_gid);
5590 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5591 * because of the poor interface of the Perl getpw*(),
5592 * not because there's some standard/convention saying so.
5593 * A better interface would have been to return a hash,
5594 * but we are accursed by our history, alas. --jhi. */
5596 mPUSHi(pwent->pw_change);
5597 # elif defined(PWQUOTA)
5598 mPUSHi(pwent->pw_quota);
5599 # elif defined(PWAGE)
5600 mPUSHs(newSVpv(pwent->pw_age, 0));
5602 /* I think that you can never get this compiled, but just in case. */
5603 PUSHs(sv_mortalcopy(&PL_sv_no));
5606 /* pw_class and pw_comment are mutually exclusive--.
5607 * see the above note for pw_change, pw_quota, and pw_age. */
5609 mPUSHs(newSVpv(pwent->pw_class, 0));
5610 # elif defined(PWCOMMENT)
5611 mPUSHs(newSVpv(pwent->pw_comment, 0));
5613 /* I think that you can never get this compiled, but just in case. */
5614 PUSHs(sv_mortalcopy(&PL_sv_no));
5618 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5620 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5622 /* pw_gecos is tainted because user himself can diddle with it. */
5625 mPUSHs(newSVpv(pwent->pw_dir, 0));
5627 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5628 /* pw_shell is tainted because user himself can diddle with it. */
5632 mPUSHi(pwent->pw_expire);
5637 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5642 /* also used for: pp_ggrgid() pp_ggrnam() */
5648 const I32 which = PL_op->op_type;
5649 const struct group *grent;
5651 if (which == OP_GGRNAM) {
5652 const char* const name = POPpbytex;
5653 grent = (const struct group *)getgrnam(name);
5655 else if (which == OP_GGRGID) {
5657 const Gid_t gid = POPu;
5658 #elif Gid_t_sign == -1
5659 const Gid_t gid = POPi;
5661 # error "Unexpected Gid_t_sign"
5663 grent = (const struct group *)getgrgid(gid);
5667 grent = (struct group *)getgrent();
5669 DIE(aTHX_ PL_no_func, "getgrent");
5673 if (GIMME_V != G_ARRAY) {
5674 SV * const sv = sv_newmortal();
5678 if (which == OP_GGRNAM)
5679 sv_setgid(sv, grent->gr_gid);
5681 sv_setpv(sv, grent->gr_name);
5687 mPUSHs(newSVpv(grent->gr_name, 0));
5690 mPUSHs(newSVpv(grent->gr_passwd, 0));
5692 PUSHs(sv_mortalcopy(&PL_sv_no));
5695 sv_setgid(PUSHmortal, grent->gr_gid);
5697 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5698 /* In UNICOS/mk (_CRAYMPP) the multithreading
5699 * versions (getgrnam_r, getgrgid_r)
5700 * seem to return an illegal pointer
5701 * as the group members list, gr_mem.
5702 * getgrent() doesn't even have a _r version
5703 * but the gr_mem is poisonous anyway.
5704 * So yes, you cannot get the list of group
5705 * members if building multithreaded in UNICOS/mk. */
5706 PUSHs(space_join_names_mortal(grent->gr_mem));
5712 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5722 if (!(tmps = PerlProc_getlogin()))
5724 sv_setpv_mg(TARG, tmps);
5728 DIE(aTHX_ PL_no_func, "getlogin");
5732 /* Miscellaneous. */
5737 dSP; dMARK; dORIGMARK; dTARGET;
5738 I32 items = SP - MARK;
5739 unsigned long a[20];
5744 while (++MARK <= SP) {
5745 if (SvTAINTED(*MARK)) {
5751 TAINT_PROPER("syscall");
5754 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5755 * or where sizeof(long) != sizeof(char*). But such machines will
5756 * not likely have syscall implemented either, so who cares?
5758 while (++MARK <= SP) {
5759 if (SvNIOK(*MARK) || !i)
5760 a[i++] = SvIV(*MARK);
5761 else if (*MARK == &PL_sv_undef)
5764 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5770 DIE(aTHX_ "Too many args to syscall");
5772 DIE(aTHX_ "Too few args to syscall");
5774 retval = syscall(a[0]);
5777 retval = syscall(a[0],a[1]);
5780 retval = syscall(a[0],a[1],a[2]);
5783 retval = syscall(a[0],a[1],a[2],a[3]);
5786 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5789 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5792 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5795 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5802 DIE(aTHX_ PL_no_func, "syscall");
5806 #ifdef FCNTL_EMULATE_FLOCK
5808 /* XXX Emulate flock() with fcntl().
5809 What's really needed is a good file locking module.
5813 fcntl_emulate_flock(int fd, int operation)
5818 switch (operation & ~LOCK_NB) {
5820 flock.l_type = F_RDLCK;
5823 flock.l_type = F_WRLCK;
5826 flock.l_type = F_UNLCK;
5832 flock.l_whence = SEEK_SET;
5833 flock.l_start = flock.l_len = (Off_t)0;
5835 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5836 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5837 errno = EWOULDBLOCK;
5841 #endif /* FCNTL_EMULATE_FLOCK */
5843 #ifdef LOCKF_EMULATE_FLOCK
5845 /* XXX Emulate flock() with lockf(). This is just to increase
5846 portability of scripts. The calls are not completely
5847 interchangeable. What's really needed is a good file
5851 /* The lockf() constants might have been defined in <unistd.h>.
5852 Unfortunately, <unistd.h> causes troubles on some mixed
5853 (BSD/POSIX) systems, such as SunOS 4.1.3.
5855 Further, the lockf() constants aren't POSIX, so they might not be
5856 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5857 just stick in the SVID values and be done with it. Sigh.
5861 # define F_ULOCK 0 /* Unlock a previously locked region */
5864 # define F_LOCK 1 /* Lock a region for exclusive use */
5867 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5870 # define F_TEST 3 /* Test a region for other processes locks */
5874 lockf_emulate_flock(int fd, int operation)
5880 /* flock locks entire file so for lockf we need to do the same */
5881 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5882 if (pos > 0) /* is seekable and needs to be repositioned */
5883 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5884 pos = -1; /* seek failed, so don't seek back afterwards */
5887 switch (operation) {
5889 /* LOCK_SH - get a shared lock */
5891 /* LOCK_EX - get an exclusive lock */
5893 i = lockf (fd, F_LOCK, 0);
5896 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5897 case LOCK_SH|LOCK_NB:
5898 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5899 case LOCK_EX|LOCK_NB:
5900 i = lockf (fd, F_TLOCK, 0);
5902 if ((errno == EAGAIN) || (errno == EACCES))
5903 errno = EWOULDBLOCK;
5906 /* LOCK_UN - unlock (non-blocking is a no-op) */
5908 case LOCK_UN|LOCK_NB:
5909 i = lockf (fd, F_ULOCK, 0);
5912 /* Default - can't decipher operation */
5919 if (pos > 0) /* need to restore position of the handle */
5920 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5925 #endif /* LOCKF_EMULATE_FLOCK */
5928 * ex: set ts=8 sts=4 sw=4 et: