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
36 /* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
45 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
53 # include <sys/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* F_OK unused: if stat() cannot find it... */
204 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
205 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
206 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
209 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
210 # ifdef I_SYS_SECURITY
211 # include <sys/security.h>
215 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
218 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
222 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
224 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
228 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
229 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
230 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
233 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
235 const Uid_t ruid = getuid();
236 const Uid_t euid = geteuid();
237 const Gid_t rgid = getgid();
238 const Gid_t egid = getegid();
241 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
242 Perl_croak(aTHX_ "switching effective uid is not implemented");
245 if (setreuid(euid, ruid))
248 if (setresuid(euid, ruid, (Uid_t)-1))
251 Perl_croak(aTHX_ "entering effective uid failed");
254 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
255 Perl_croak(aTHX_ "switching effective gid is not implemented");
258 if (setregid(egid, rgid))
261 if (setresgid(egid, rgid, (Gid_t)-1))
264 Perl_croak(aTHX_ "entering effective gid failed");
267 res = access(path, mode);
270 if (setreuid(ruid, euid))
273 if (setresuid(ruid, euid, (Uid_t)-1))
276 Perl_croak(aTHX_ "leaving effective uid failed");
279 if (setregid(rgid, egid))
282 if (setresgid(rgid, egid, (Gid_t)-1))
285 Perl_croak(aTHX_ "leaving effective gid failed");
289 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
296 const char * const tmps = POPpconstx;
297 const I32 gimme = GIMME_V;
298 const char *mode = "r";
301 if (PL_op->op_private & OPpOPEN_IN_RAW)
303 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
305 fp = PerlProc_popen(tmps, mode);
307 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
309 PerlIO_apply_layers(aTHX_ fp,mode,type);
311 if (gimme == G_VOID) {
313 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
316 else if (gimme == G_SCALAR) {
317 ENTER_with_name("backtick");
319 PL_rs = &PL_sv_undef;
320 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
321 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
323 LEAVE_with_name("backtick");
329 SV * const sv = newSV(79);
330 if (sv_gets(sv, fp, 0) == NULL) {
335 if (SvLEN(sv) - SvCUR(sv) > 20) {
336 SvPV_shrink_to_cur(sv);
341 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
342 TAINT; /* "I believe that this is not gratuitous!" */
345 STATUS_NATIVE_CHILD_SET(-1);
346 if (gimme == G_SCALAR)
358 /* make a copy of the pattern if it is gmagical, to ensure that magic
359 * is called once and only once */
360 if (SvGMAGICAL(TOPm1s)) TOPm1s = sv_2mortal(newSVsv(TOPm1s));
362 tryAMAGICunTARGET(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
364 if (PL_op->op_flags & OPf_SPECIAL) {
365 /* call Perl-level glob function instead. Stack args are:
366 * MARK, wildcard, csh_glob context index
367 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
371 /* stack args are: wildcard, gv(_GEN_n) */
379 /* Note that we only ever get here if File::Glob fails to load
380 * without at the same time croaking, for some reason, or if
381 * perl was built with PERL_EXTERNAL_GLOB */
383 ENTER_with_name("glob");
388 * The external globbing program may use things we can't control,
389 * so for security reasons we must assume the worst.
392 taint_proper(PL_no_security, "glob");
396 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
397 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
399 SAVESPTR(PL_rs); /* This is not permanent, either. */
400 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
403 *SvPVX(PL_rs) = '\n';
407 result = do_readline();
408 LEAVE_with_name("glob");
415 PL_last_in_gv = cGVOP_gv;
416 return do_readline();
426 do_join(TARG, &PL_sv_no, MARK, SP);
430 else if (SP == MARK) {
439 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
440 /* well-formed exception supplied */
442 else if (SvROK(ERRSV)) {
445 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
446 exsv = sv_mortalcopy(ERRSV);
447 sv_catpvs(exsv, "\t...caught");
450 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
452 if (SvROK(exsv) && !PL_warnhook)
453 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
464 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
466 if (SP - MARK != 1) {
468 do_join(TARG, &PL_sv_no, MARK, SP);
476 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
477 /* well-formed exception supplied */
479 else if (SvROK(ERRSV)) {
481 if (sv_isobject(exsv)) {
482 HV * const stash = SvSTASH(SvRV(exsv));
483 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
485 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
486 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
493 call_sv(MUTABLE_SV(GvCV(gv)),
494 G_SCALAR|G_EVAL|G_KEEPERR);
495 exsv = sv_mortalcopy(*PL_stack_sp--);
499 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
500 exsv = sv_mortalcopy(ERRSV);
501 sv_catpvs(exsv, "\t...propagated");
504 exsv = newSVpvs_flags("Died", SVs_TEMP);
512 Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv,
513 const MAGIC *const mg, const U32 flags, U32 argc, ...)
518 PERL_ARGS_ASSERT_TIED_METHOD;
520 /* Ensure that our flag bits do not overlap. */
521 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
522 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
523 assert((TIED_METHOD_SAY & G_WANT) == 0);
525 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
526 PUSHSTACKi(PERLSI_MAGIC);
527 EXTEND(SP, argc+1); /* object + args */
529 PUSHs(SvTIED_obj(sv, mg));
530 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
531 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
535 const U32 mortalize_not_needed
536 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
538 va_start(args, argc);
540 SV *const arg = va_arg(args, SV *);
541 if(mortalize_not_needed)
550 ENTER_with_name("call_tied_method");
551 if (flags & TIED_METHOD_SAY) {
552 /* local $\ = "\n" */
553 SAVEGENERICSV(PL_ors_sv);
554 PL_ors_sv = newSVpvs("\n");
556 ret_args = call_method(methname, flags & G_WANT);
561 if (ret_args) { /* copy results back to original stack */
562 EXTEND(sp, ret_args);
563 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
567 LEAVE_with_name("call_tied_method");
571 #define tied_method0(a,b,c,d) \
572 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
573 #define tied_method1(a,b,c,d,e) \
574 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
575 #define tied_method2(a,b,c,d,e,f) \
576 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
589 GV * const gv = MUTABLE_GV(*++MARK);
591 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
592 DIE(aTHX_ PL_no_usym, "filehandle");
594 if ((io = GvIOp(gv))) {
596 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
599 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
600 "Opening dirhandle %"HEKf" also as a file",
601 HEKfARG(GvENAME_HEK(gv)));
603 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
605 /* Method's args are same as ours ... */
606 /* ... except handle is replaced by the object */
607 return Perl_tied_method(aTHX_ "OPEN", mark - 1, MUTABLE_SV(io), mg,
608 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
620 tmps = SvPV_const(sv, len);
621 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
624 PUSHi( (I32)PL_forkprocess );
625 else if (PL_forkprocess == 0) /* we are a new child */
636 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
642 IO * const io = GvIO(gv);
644 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
646 return tied_method0("CLOSE", SP, MUTABLE_SV(io), mg);
650 PUSHs(boolSV(do_close(gv, TRUE)));
663 GV * const wgv = MUTABLE_GV(POPs);
664 GV * const rgv = MUTABLE_GV(POPs);
669 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
670 DIE(aTHX_ PL_no_usym, "filehandle");
675 do_close(rgv, FALSE);
677 do_close(wgv, FALSE);
679 if (PerlProc_pipe(fd) < 0)
682 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
683 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
684 IoOFP(rstio) = IoIFP(rstio);
685 IoIFP(wstio) = IoOFP(wstio);
686 IoTYPE(rstio) = IoTYPE_RDONLY;
687 IoTYPE(wstio) = IoTYPE_WRONLY;
689 if (!IoIFP(rstio) || !IoOFP(wstio)) {
691 PerlIO_close(IoIFP(rstio));
693 PerlLIO_close(fd[0]);
695 PerlIO_close(IoOFP(wstio));
697 PerlLIO_close(fd[1]);
700 #if defined(HAS_FCNTL) && defined(F_SETFD)
701 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
702 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
709 DIE(aTHX_ PL_no_func, "pipe");
723 gv = MUTABLE_GV(POPs);
727 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
729 return tied_method0("FILENO", SP, MUTABLE_SV(io), mg);
732 if (!io || !(fp = IoIFP(io))) {
733 /* Can't do this because people seem to do things like
734 defined(fileno($foo)) to check whether $foo is a valid fh.
741 PUSHi(PerlIO_fileno(fp));
753 if (MAXARG < 1 || (!TOPs && !POPs)) {
754 anum = PerlLIO_umask(022);
755 /* setting it to 022 between the two calls to umask avoids
756 * to have a window where the umask is set to 0 -- meaning
757 * that another thread could create world-writeable files. */
759 (void)PerlLIO_umask(anum);
762 anum = PerlLIO_umask(POPi);
763 TAINT_PROPER("umask");
766 /* Only DIE if trying to restrict permissions on "user" (self).
767 * Otherwise it's harmless and more useful to just return undef
768 * since 'group' and 'other' concepts probably don't exist here. */
769 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
770 DIE(aTHX_ "umask not implemented");
771 XPUSHs(&PL_sv_undef);
790 gv = MUTABLE_GV(POPs);
794 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
796 /* This takes advantage of the implementation of the varargs
797 function, which I don't think that the optimiser will be able to
798 figure out. Although, as it's a static function, in theory it
800 return Perl_tied_method(aTHX_ "BINMODE", SP, MUTABLE_SV(io), mg,
801 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
802 discp ? 1 : 0, discp);
806 if (!io || !(fp = IoIFP(io))) {
808 SETERRNO(EBADF,RMS_IFI);
815 const char *d = NULL;
818 d = SvPV_const(discp, len);
819 mode = mode_from_discipline(d, len);
820 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
821 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
822 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
843 const I32 markoff = MARK - PL_stack_base;
844 const char *methname;
845 int how = PERL_MAGIC_tied;
849 switch(SvTYPE(varsv)) {
851 methname = "TIEHASH";
852 HvEITER_set(MUTABLE_HV(varsv), 0);
855 methname = "TIEARRAY";
859 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
860 methname = "TIEHANDLE";
861 how = PERL_MAGIC_tiedscalar;
862 /* For tied filehandles, we apply tiedscalar magic to the IO
863 slot of the GP rather than the GV itself. AMS 20010812 */
865 GvIOp(varsv) = newIO();
866 varsv = MUTABLE_SV(GvIOp(varsv));
871 methname = "TIESCALAR";
872 how = PERL_MAGIC_tiedscalar;
876 if (sv_isobject(*MARK)) { /* Calls GET magic. */
877 ENTER_with_name("call_TIE");
878 PUSHSTACKi(PERLSI_MAGIC);
880 EXTEND(SP,(I32)items);
884 call_method(methname, G_SCALAR);
887 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
888 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
889 * wrong error message, and worse case, supreme action at a distance.
890 * (Sorry obfuscation writers. You're not going to be given this one.)
892 stash = gv_stashsv(*MARK, 0);
893 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
894 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
895 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
897 ENTER_with_name("call_TIE");
898 PUSHSTACKi(PERLSI_MAGIC);
900 EXTEND(SP,(I32)items);
904 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
910 if (sv_isobject(sv)) {
911 sv_unmagic(varsv, how);
912 /* Croak if a self-tie on an aggregate is attempted. */
913 if (varsv == SvRV(sv) &&
914 (SvTYPE(varsv) == SVt_PVAV ||
915 SvTYPE(varsv) == SVt_PVHV))
917 "Self-ties of arrays and hashes are not supported");
918 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
920 LEAVE_with_name("call_TIE");
921 SP = PL_stack_base + markoff;
931 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
932 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
934 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
937 if ((mg = SvTIED_mg(sv, how))) {
938 SV * const obj = SvRV(SvTIED_obj(sv, mg));
940 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
942 if (gv && isGV(gv) && (cv = GvCV(gv))) {
944 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
945 mXPUSHi(SvREFCNT(obj) - 1);
947 ENTER_with_name("call_UNTIE");
948 call_sv(MUTABLE_SV(cv), G_VOID);
949 LEAVE_with_name("call_UNTIE");
952 else if (mg && SvREFCNT(obj) > 1) {
953 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
954 "untie attempted while %"UVuf" inner references still exist",
955 (UV)SvREFCNT(obj) - 1 ) ;
959 sv_unmagic(sv, how) ;
969 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
970 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
972 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
975 if ((mg = SvTIED_mg(sv, how))) {
976 SV *osv = SvTIED_obj(sv, mg);
977 if (osv == mg->mg_obj)
978 osv = sv_mortalcopy(osv);
992 HV * const hv = MUTABLE_HV(POPs);
993 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
994 stash = gv_stashsv(sv, 0);
995 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
997 require_pv("AnyDBM_File.pm");
999 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1000 DIE(aTHX_ "No dbm on this machine");
1010 mPUSHu(O_RDWR|O_CREAT);
1015 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1018 if (!sv_isobject(TOPs)) {
1026 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1030 if (sv_isobject(TOPs)) {
1031 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1032 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1049 struct timeval timebuf;
1050 struct timeval *tbuf = &timebuf;
1053 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1058 # if BYTEORDER & 0xf0000
1059 # define ORDERBYTE (0x88888888 - BYTEORDER)
1061 # define ORDERBYTE (0x4444 - BYTEORDER)
1067 for (i = 1; i <= 3; i++) {
1068 SV * const sv = SP[i];
1071 if (SvREADONLY(sv)) {
1073 sv_force_normal_flags(sv, 0);
1074 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1075 Perl_croak_no_modify(aTHX);
1078 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1079 SvPV_force_nolen(sv); /* force string conversion */
1086 /* little endians can use vecs directly */
1087 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1094 masksize = NFDBITS / NBBY;
1096 masksize = sizeof(long); /* documented int, everyone seems to use long */
1098 Zero(&fd_sets[0], 4, char*);
1101 # if SELECT_MIN_BITS == 1
1102 growsize = sizeof(fd_set);
1104 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1105 # undef SELECT_MIN_BITS
1106 # define SELECT_MIN_BITS __FD_SETSIZE
1108 /* If SELECT_MIN_BITS is greater than one we most probably will want
1109 * to align the sizes with SELECT_MIN_BITS/8 because for example
1110 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1111 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1112 * on (sets/tests/clears bits) is 32 bits. */
1113 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1121 timebuf.tv_sec = (long)value;
1122 value -= (NV)timebuf.tv_sec;
1123 timebuf.tv_usec = (long)(value * 1000000.0);
1128 for (i = 1; i <= 3; i++) {
1130 if (!SvOK(sv) || SvCUR(sv) == 0) {
1137 Sv_Grow(sv, growsize);
1141 while (++j <= growsize) {
1145 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1147 Newx(fd_sets[i], growsize, char);
1148 for (offset = 0; offset < growsize; offset += masksize) {
1149 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1150 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1153 fd_sets[i] = SvPVX(sv);
1157 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1158 /* Can't make just the (void*) conditional because that would be
1159 * cpp #if within cpp macro, and not all compilers like that. */
1160 nfound = PerlSock_select(
1162 (Select_fd_set_t) fd_sets[1],
1163 (Select_fd_set_t) fd_sets[2],
1164 (Select_fd_set_t) fd_sets[3],
1165 (void*) tbuf); /* Workaround for compiler bug. */
1167 nfound = PerlSock_select(
1169 (Select_fd_set_t) fd_sets[1],
1170 (Select_fd_set_t) fd_sets[2],
1171 (Select_fd_set_t) fd_sets[3],
1174 for (i = 1; i <= 3; i++) {
1177 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1179 for (offset = 0; offset < growsize; offset += masksize) {
1180 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1181 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1183 Safefree(fd_sets[i]);
1190 if (GIMME == G_ARRAY && tbuf) {
1191 value = (NV)(timebuf.tv_sec) +
1192 (NV)(timebuf.tv_usec) / 1000000.0;
1197 DIE(aTHX_ "select not implemented");
1202 =for apidoc setdefout
1204 Sets PL_defoutgv, the default file handle for output, to the passed in
1205 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1206 count of the passed in typeglob is increased by one, and the reference count
1207 of the typeglob that PL_defoutgv points to is decreased by one.
1213 Perl_setdefout(pTHX_ GV *gv)
1216 SvREFCNT_inc_simple_void(gv);
1217 SvREFCNT_dec(PL_defoutgv);
1225 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1226 GV * egv = GvEGVx(PL_defoutgv);
1230 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1232 XPUSHs(&PL_sv_undef);
1234 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE);
1235 if (gvp && *gvp == egv) {
1236 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1240 mXPUSHs(newRV(MUTABLE_SV(egv)));
1245 if (!GvIO(newdefout))
1246 gv_IOadd(newdefout);
1247 setdefout(newdefout);
1257 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1258 IO *const io = GvIO(gv);
1264 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1266 const U32 gimme = GIMME_V;
1267 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1268 if (gimme == G_SCALAR) {
1270 SvSetMagicSV_nosteal(TARG, TOPs);
1275 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1276 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1278 SETERRNO(EBADF,RMS_IFI);
1282 sv_setpvs(TARG, " ");
1283 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1284 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1285 /* Find out how many bytes the char needs */
1286 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1289 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1290 SvCUR_set(TARG,1+len);
1299 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1302 register PERL_CONTEXT *cx;
1303 const I32 gimme = GIMME_V;
1305 PERL_ARGS_ASSERT_DOFORM;
1307 if (cv && CvCLONE(cv))
1308 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1313 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1314 PUSHFORMAT(cx, retop);
1316 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1318 setdefout(gv); /* locally select filehandle so $% et al work */
1337 gv = MUTABLE_GV(POPs);
1351 goto not_a_format_reference;
1355 tmpsv = sv_newmortal();
1356 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1357 if (SvPOK(tmpsv) && *SvPV_nolen_const(tmpsv))
1358 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1360 not_a_format_reference:
1361 DIE(aTHX_ "Not a format reference");
1363 IoFLAGS(io) &= ~IOf_DIDTOP;
1364 return doform(cv,gv,PL_op->op_next);
1370 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1371 register IO * const io = GvIOp(gv);
1376 register PERL_CONTEXT *cx;
1379 if (!io || !(ofp = IoOFP(io)))
1382 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1383 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1385 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1386 PL_formtarget != PL_toptarget)
1390 if (!IoTOP_GV(io)) {
1393 if (!IoTOP_NAME(io)) {
1395 if (!IoFMT_NAME(io))
1396 IoFMT_NAME(io) = savepv(GvNAME(gv));
1397 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1398 HEKfARG(GvNAME_HEK(gv))));
1399 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1400 if ((topgv && GvFORM(topgv)) ||
1401 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1402 IoTOP_NAME(io) = savesvpv(topname);
1404 IoTOP_NAME(io) = savepvs("top");
1406 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1407 if (!topgv || !GvFORM(topgv)) {
1408 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1411 IoTOP_GV(io) = topgv;
1413 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1414 I32 lines = IoLINES_LEFT(io);
1415 const char *s = SvPVX_const(PL_formtarget);
1416 if (lines <= 0) /* Yow, header didn't even fit!!! */
1418 while (lines-- > 0) {
1419 s = strchr(s, '\n');
1425 const STRLEN save = SvCUR(PL_formtarget);
1426 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1427 do_print(PL_formtarget, ofp);
1428 SvCUR_set(PL_formtarget, save);
1429 sv_chop(PL_formtarget, s);
1430 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1433 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1434 do_print(PL_formfeed, ofp);
1435 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1437 PL_formtarget = PL_toptarget;
1438 IoFLAGS(io) |= IOf_DIDTOP;
1441 DIE(aTHX_ "bad top format reference");
1444 SV * const sv = sv_newmortal();
1445 gv_efullname4(sv, fgv, NULL, FALSE);
1446 if (SvPOK(sv) && *SvPV_nolen_const(sv))
1447 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1449 DIE(aTHX_ "Undefined top format called");
1451 return doform(cv, gv, PL_op);
1455 POPBLOCK(cx,PL_curpm);
1457 retop = cx->blk_sub.retop;
1463 report_wrongway_fh(gv, '<');
1469 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1470 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1472 if (!do_print(PL_formtarget, fp))
1475 FmLINES(PL_formtarget) = 0;
1476 SvCUR_set(PL_formtarget, 0);
1477 *SvEND(PL_formtarget) = '\0';
1478 if (IoFLAGS(io) & IOf_FLUSH)
1479 (void)PerlIO_flush(fp);
1484 PL_formtarget = PL_bodytarget;
1486 PERL_UNUSED_VAR(newsp);
1487 PERL_UNUSED_VAR(gimme);
1493 dVAR; dSP; dMARK; dORIGMARK;
1498 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1499 IO *const io = GvIO(gv);
1502 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1504 if (MARK == ORIGMARK) {
1507 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1510 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1512 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1520 SETERRNO(EBADF,RMS_IFI);
1523 else if (!(fp = IoOFP(io))) {
1525 report_wrongway_fh(gv, '<');
1526 else if (ckWARN(WARN_CLOSED))
1528 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1532 do_sprintf(sv, SP - MARK, MARK + 1);
1533 if (!do_print(sv, fp))
1536 if (IoFLAGS(io) & IOf_FLUSH)
1537 if (PerlIO_flush(fp) == EOF)
1548 PUSHs(&PL_sv_undef);
1556 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1557 const int mode = POPi;
1558 SV * const sv = POPs;
1559 GV * const gv = MUTABLE_GV(POPs);
1562 /* Need TIEHANDLE method ? */
1563 const char * const tmps = SvPV_const(sv, len);
1564 /* FIXME? do_open should do const */
1565 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1566 IoLINES(GvIOp(gv)) = 0;
1570 PUSHs(&PL_sv_undef);
1577 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1591 bool charstart = FALSE;
1592 STRLEN charskip = 0;
1595 GV * const gv = MUTABLE_GV(*++MARK);
1596 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1597 && gv && (io = GvIO(gv)) )
1599 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1601 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1602 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1611 sv_setpvs(bufsv, "");
1612 length = SvIVx(*++MARK);
1615 offset = SvIVx(*++MARK);
1619 if (!io || !IoIFP(io)) {
1621 SETERRNO(EBADF,RMS_IFI);
1624 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1625 buffer = SvPVutf8_force(bufsv, blen);
1626 /* UTF-8 may not have been set if they are all low bytes */
1631 buffer = SvPV_force(bufsv, blen);
1632 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1635 DIE(aTHX_ "Negative length");
1643 if (PL_op->op_type == OP_RECV) {
1644 Sock_size_t bufsize;
1645 char namebuf[MAXPATHLEN];
1646 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1647 bufsize = sizeof (struct sockaddr_in);
1649 bufsize = sizeof namebuf;
1651 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1655 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1656 /* 'offset' means 'flags' here */
1657 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1658 (struct sockaddr *)namebuf, &bufsize);
1661 /* MSG_TRUNC can give oversized count; quietly lose it */
1665 /* Bogus return without padding */
1666 bufsize = sizeof (struct sockaddr_in);
1668 SvCUR_set(bufsv, count);
1669 *SvEND(bufsv) = '\0';
1670 (void)SvPOK_only(bufsv);
1674 /* This should not be marked tainted if the fp is marked clean */
1675 if (!(IoFLAGS(io) & IOf_UNTAINT))
1676 SvTAINTED_on(bufsv);
1678 sv_setpvn(TARG, namebuf, bufsize);
1683 if (DO_UTF8(bufsv)) {
1684 /* offset adjust in characters not bytes */
1685 blen = sv_len_utf8(bufsv);
1688 if (-offset > (SSize_t)blen)
1689 DIE(aTHX_ "Offset outside string");
1692 if (DO_UTF8(bufsv)) {
1693 /* convert offset-as-chars to offset-as-bytes */
1694 if (offset >= (int)blen)
1695 offset += SvCUR(bufsv) - blen;
1697 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1700 orig_size = SvCUR(bufsv);
1701 /* Allocating length + offset + 1 isn't perfect in the case of reading
1702 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1704 (should be 2 * length + offset + 1, or possibly something longer if
1705 PL_encoding is true) */
1706 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1707 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1708 Zero(buffer+orig_size, offset-orig_size, char);
1710 buffer = buffer + offset;
1712 read_target = bufsv;
1714 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1715 concatenate it to the current buffer. */
1717 /* Truncate the existing buffer to the start of where we will be
1719 SvCUR_set(bufsv, offset);
1721 read_target = sv_newmortal();
1722 SvUPGRADE(read_target, SVt_PV);
1723 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1726 if (PL_op->op_type == OP_SYSREAD) {
1727 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1728 if (IoTYPE(io) == IoTYPE_SOCKET) {
1729 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1735 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1740 #ifdef HAS_SOCKET__bad_code_maybe
1741 if (IoTYPE(io) == IoTYPE_SOCKET) {
1742 Sock_size_t bufsize;
1743 char namebuf[MAXPATHLEN];
1744 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1745 bufsize = sizeof (struct sockaddr_in);
1747 bufsize = sizeof namebuf;
1749 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1750 (struct sockaddr *)namebuf, &bufsize);
1755 count = PerlIO_read(IoIFP(io), buffer, length);
1756 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1757 if (count == 0 && PerlIO_error(IoIFP(io)))
1761 if (IoTYPE(io) == IoTYPE_WRONLY)
1762 report_wrongway_fh(gv, '>');
1765 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1766 *SvEND(read_target) = '\0';
1767 (void)SvPOK_only(read_target);
1768 if (fp_utf8 && !IN_BYTES) {
1769 /* Look at utf8 we got back and count the characters */
1770 const char *bend = buffer + count;
1771 while (buffer < bend) {
1773 skip = UTF8SKIP(buffer);
1776 if (buffer - charskip + skip > bend) {
1777 /* partial character - try for rest of it */
1778 length = skip - (bend-buffer);
1779 offset = bend - SvPVX_const(bufsv);
1791 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1792 provided amount read (count) was what was requested (length)
1794 if (got < wanted && count == length) {
1795 length = wanted - got;
1796 offset = bend - SvPVX_const(bufsv);
1799 /* return value is character count */
1803 else if (buffer_utf8) {
1804 /* Let svcatsv upgrade the bytes we read in to utf8.
1805 The buffer is a mortal so will be freed soon. */
1806 sv_catsv_nomg(bufsv, read_target);
1809 /* This should not be marked tainted if the fp is marked clean */
1810 if (!(IoFLAGS(io) & IOf_UNTAINT))
1811 SvTAINTED_on(bufsv);
1823 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1828 STRLEN orig_blen_bytes;
1829 const int op_type = PL_op->op_type;
1832 GV *const gv = MUTABLE_GV(*++MARK);
1833 IO *const io = GvIO(gv);
1835 if (op_type == OP_SYSWRITE && io) {
1836 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1838 if (MARK == SP - 1) {
1840 mXPUSHi(sv_len(sv));
1844 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1845 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1855 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1857 if (io && IoIFP(io))
1858 report_wrongway_fh(gv, '<');
1861 SETERRNO(EBADF,RMS_IFI);
1865 /* Do this first to trigger any overloading. */
1866 buffer = SvPV_const(bufsv, blen);
1867 orig_blen_bytes = blen;
1868 doing_utf8 = DO_UTF8(bufsv);
1870 if (PerlIO_isutf8(IoIFP(io))) {
1871 if (!SvUTF8(bufsv)) {
1872 /* We don't modify the original scalar. */
1873 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1874 buffer = (char *) tmpbuf;
1878 else if (doing_utf8) {
1879 STRLEN tmplen = blen;
1880 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1883 buffer = (char *) tmpbuf;
1887 assert((char *)result == buffer);
1888 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1893 if (op_type == OP_SEND) {
1894 const int flags = SvIVx(*++MARK);
1897 char * const sockbuf = SvPVx(*++MARK, mlen);
1898 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1899 flags, (struct sockaddr *)sockbuf, mlen);
1903 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1909 Size_t length = 0; /* This length is in characters. */
1915 /* The SV is bytes, and we've had to upgrade it. */
1916 blen_chars = orig_blen_bytes;
1918 /* The SV really is UTF-8. */
1919 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1920 /* Don't call sv_len_utf8 again because it will call magic
1921 or overloading a second time, and we might get back a
1922 different result. */
1923 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1925 /* It's safe, and it may well be cached. */
1926 blen_chars = sv_len_utf8(bufsv);
1934 length = blen_chars;
1936 #if Size_t_size > IVSIZE
1937 length = (Size_t)SvNVx(*++MARK);
1939 length = (Size_t)SvIVx(*++MARK);
1941 if ((SSize_t)length < 0) {
1943 DIE(aTHX_ "Negative length");
1948 offset = SvIVx(*++MARK);
1950 if (-offset > (IV)blen_chars) {
1952 DIE(aTHX_ "Offset outside string");
1954 offset += blen_chars;
1955 } else if (offset > (IV)blen_chars) {
1957 DIE(aTHX_ "Offset outside string");
1961 if (length > blen_chars - offset)
1962 length = blen_chars - offset;
1964 /* Here we convert length from characters to bytes. */
1965 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1966 /* Either we had to convert the SV, or the SV is magical, or
1967 the SV has overloading, in which case we can't or mustn't
1968 or mustn't call it again. */
1970 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1971 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1973 /* It's a real UTF-8 SV, and it's not going to change under
1974 us. Take advantage of any cache. */
1976 I32 len_I32 = length;
1978 /* Convert the start and end character positions to bytes.
1979 Remember that the second argument to sv_pos_u2b is relative
1981 sv_pos_u2b(bufsv, &start, &len_I32);
1988 buffer = buffer+offset;
1990 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1991 if (IoTYPE(io) == IoTYPE_SOCKET) {
1992 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1998 /* See the note at doio.c:do_print about filesize limits. --jhi */
1999 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2008 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2011 #if Size_t_size > IVSIZE
2031 * in Perl 5.12 and later, the additional parameter is a bitmask:
2034 * 2 = eof() <- ARGV magic
2036 * I'll rely on the compiler's trace flow analysis to decide whether to
2037 * actually assign this out here, or punt it into the only block where it is
2038 * used. Doing it out here is DRY on the condition logic.
2043 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2049 if (PL_op->op_flags & OPf_SPECIAL) {
2050 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2054 gv = PL_last_in_gv; /* eof */
2062 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2063 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2066 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2067 if (io && !IoIFP(io)) {
2068 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2070 IoFLAGS(io) &= ~IOf_START;
2071 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2073 sv_setpvs(GvSV(gv), "-");
2075 GvSV(gv) = newSVpvs("-");
2076 SvSETMAGIC(GvSV(gv));
2078 else if (!nextargv(gv))
2083 PUSHs(boolSV(do_eof(gv)));
2093 if (MAXARG != 0 && (TOPs || POPs))
2094 PL_last_in_gv = MUTABLE_GV(POPs);
2101 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2103 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2108 SETERRNO(EBADF,RMS_IFI);
2113 #if LSEEKSIZE > IVSIZE
2114 PUSHn( do_tell(gv) );
2116 PUSHi( do_tell(gv) );
2124 const int whence = POPi;
2125 #if LSEEKSIZE > IVSIZE
2126 const Off_t offset = (Off_t)SvNVx(POPs);
2128 const Off_t offset = (Off_t)SvIVx(POPs);
2131 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2132 IO *const io = GvIO(gv);
2135 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2137 #if LSEEKSIZE > IVSIZE
2138 SV *const offset_sv = newSVnv((NV) offset);
2140 SV *const offset_sv = newSViv(offset);
2143 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2148 if (PL_op->op_type == OP_SEEK)
2149 PUSHs(boolSV(do_seek(gv, offset, whence)));
2151 const Off_t sought = do_sysseek(gv, offset, whence);
2153 PUSHs(&PL_sv_undef);
2155 SV* const sv = sought ?
2156 #if LSEEKSIZE > IVSIZE
2161 : newSVpvn(zero_but_true, ZBTLEN);
2172 /* There seems to be no consensus on the length type of truncate()
2173 * and ftruncate(), both off_t and size_t have supporters. In
2174 * general one would think that when using large files, off_t is
2175 * at least as wide as size_t, so using an off_t should be okay. */
2176 /* XXX Configure probe for the length type of *truncate() needed XXX */
2179 #if Off_t_size > IVSIZE
2184 /* Checking for length < 0 is problematic as the type might or
2185 * might not be signed: if it is not, clever compilers will moan. */
2186 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2189 SV * const sv = POPs;
2194 if ((tmpgv = PL_op->op_flags & OPf_SPECIAL
2195 ? gv_fetchsv(sv, 0, SVt_PVIO)
2196 : MAYBE_DEREF_GV(sv) )) {
2203 TAINT_PROPER("truncate");
2204 if (!(fp = IoIFP(io))) {
2210 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2212 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2218 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2219 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2220 goto do_ftruncate_io;
2223 const char * const name = SvPV_nomg_const_nolen(sv);
2224 TAINT_PROPER("truncate");
2226 if (truncate(name, len) < 0)
2230 const int tmpfd = PerlLIO_open(name, O_RDWR);
2235 if (my_chsize(tmpfd, len) < 0)
2237 PerlLIO_close(tmpfd);
2246 SETERRNO(EBADF,RMS_IFI);
2254 SV * const argsv = POPs;
2255 const unsigned int func = POPu;
2256 const int optype = PL_op->op_type;
2257 GV * const gv = MUTABLE_GV(POPs);
2258 IO * const io = gv ? GvIOn(gv) : NULL;
2262 if (!io || !argsv || !IoIFP(io)) {
2264 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2268 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2271 s = SvPV_force(argsv, len);
2272 need = IOCPARM_LEN(func);
2274 s = Sv_Grow(argsv, need + 1);
2275 SvCUR_set(argsv, need);
2278 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2281 retval = SvIV(argsv);
2282 s = INT2PTR(char*,retval); /* ouch */
2285 TAINT_PROPER(PL_op_desc[optype]);
2287 if (optype == OP_IOCTL)
2289 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2291 DIE(aTHX_ "ioctl is not implemented");
2295 DIE(aTHX_ "fcntl is not implemented");
2297 #if defined(OS2) && defined(__EMX__)
2298 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2300 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2304 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2306 if (s[SvCUR(argsv)] != 17)
2307 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2309 s[SvCUR(argsv)] = 0; /* put our null back */
2310 SvSETMAGIC(argsv); /* Assume it has changed */
2319 PUSHp(zero_but_true, ZBTLEN);
2330 const int argtype = POPi;
2331 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2332 IO *const io = GvIO(gv);
2333 PerlIO *const fp = io ? IoIFP(io) : NULL;
2335 /* XXX Looks to me like io is always NULL at this point */
2337 (void)PerlIO_flush(fp);
2338 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2343 SETERRNO(EBADF,RMS_IFI);
2348 DIE(aTHX_ PL_no_func, "flock()");
2359 const int protocol = POPi;
2360 const int type = POPi;
2361 const int domain = POPi;
2362 GV * const gv = MUTABLE_GV(POPs);
2363 register IO * const io = gv ? GvIOn(gv) : NULL;
2368 if (io && IoIFP(io))
2369 do_close(gv, FALSE);
2370 SETERRNO(EBADF,LIB_INVARG);
2375 do_close(gv, FALSE);
2377 TAINT_PROPER("socket");
2378 fd = PerlSock_socket(domain, type, protocol);
2381 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2382 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2383 IoTYPE(io) = IoTYPE_SOCKET;
2384 if (!IoIFP(io) || !IoOFP(io)) {
2385 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2386 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2387 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2390 #if defined(HAS_FCNTL) && defined(F_SETFD)
2391 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2395 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2404 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2406 const int protocol = POPi;
2407 const int type = POPi;
2408 const int domain = POPi;
2409 GV * const gv2 = MUTABLE_GV(POPs);
2410 GV * const gv1 = MUTABLE_GV(POPs);
2411 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2412 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2416 report_evil_fh(gv1);
2418 report_evil_fh(gv2);
2420 if (io1 && IoIFP(io1))
2421 do_close(gv1, FALSE);
2422 if (io2 && IoIFP(io2))
2423 do_close(gv2, FALSE);
2428 TAINT_PROPER("socketpair");
2429 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2431 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2432 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2433 IoTYPE(io1) = IoTYPE_SOCKET;
2434 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2435 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2436 IoTYPE(io2) = IoTYPE_SOCKET;
2437 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2438 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2439 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2440 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2441 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2442 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2443 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2446 #if defined(HAS_FCNTL) && defined(F_SETFD)
2447 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2448 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2453 DIE(aTHX_ PL_no_sock_func, "socketpair");
2462 SV * const addrsv = POPs;
2463 /* OK, so on what platform does bind modify addr? */
2465 GV * const gv = MUTABLE_GV(POPs);
2466 register IO * const io = GvIOn(gv);
2468 const int op_type = PL_op->op_type;
2470 if (!io || !IoIFP(io))
2473 addr = SvPV_const(addrsv, len);
2474 TAINT_PROPER(PL_op_desc[op_type]);
2475 if ((op_type == OP_BIND
2476 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2477 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2485 SETERRNO(EBADF,SS_IVCHAN);
2492 const int backlog = POPi;
2493 GV * const gv = MUTABLE_GV(POPs);
2494 register IO * const io = gv ? GvIOn(gv) : NULL;
2496 if (!io || !IoIFP(io))
2499 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2506 SETERRNO(EBADF,SS_IVCHAN);
2515 char namebuf[MAXPATHLEN];
2516 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2517 Sock_size_t len = sizeof (struct sockaddr_in);
2519 Sock_size_t len = sizeof namebuf;
2521 GV * const ggv = MUTABLE_GV(POPs);
2522 GV * const ngv = MUTABLE_GV(POPs);
2531 if (!gstio || !IoIFP(gstio))
2535 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2538 /* Some platforms indicate zero length when an AF_UNIX client is
2539 * not bound. Simulate a non-zero-length sockaddr structure in
2541 namebuf[0] = 0; /* sun_len */
2542 namebuf[1] = AF_UNIX; /* sun_family */
2550 do_close(ngv, FALSE);
2551 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2552 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2553 IoTYPE(nstio) = IoTYPE_SOCKET;
2554 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2555 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2556 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2557 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2560 #if defined(HAS_FCNTL) && defined(F_SETFD)
2561 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2565 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2566 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2568 #ifdef __SCO_VERSION__
2569 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2572 PUSHp(namebuf, len);
2576 report_evil_fh(ggv);
2577 SETERRNO(EBADF,SS_IVCHAN);
2587 const int how = POPi;
2588 GV * const gv = MUTABLE_GV(POPs);
2589 register IO * const io = GvIOn(gv);
2591 if (!io || !IoIFP(io))
2594 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2599 SETERRNO(EBADF,SS_IVCHAN);
2606 const int optype = PL_op->op_type;
2607 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2608 const unsigned int optname = (unsigned int) POPi;
2609 const unsigned int lvl = (unsigned int) POPi;
2610 GV * const gv = MUTABLE_GV(POPs);
2611 register IO * const io = GvIOn(gv);
2615 if (!io || !IoIFP(io))
2618 fd = PerlIO_fileno(IoIFP(io));
2622 (void)SvPOK_only(sv);
2626 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2633 #if defined(__SYMBIAN32__)
2634 # define SETSOCKOPT_OPTION_VALUE_T void *
2636 # define SETSOCKOPT_OPTION_VALUE_T const char *
2638 /* XXX TODO: We need to have a proper type (a Configure probe,
2639 * etc.) for what the C headers think of the third argument of
2640 * setsockopt(), the option_value read-only buffer: is it
2641 * a "char *", or a "void *", const or not. Some compilers
2642 * don't take kindly to e.g. assuming that "char *" implicitly
2643 * promotes to a "void *", or to explicitly promoting/demoting
2644 * consts to non/vice versa. The "const void *" is the SUS
2645 * definition, but that does not fly everywhere for the above
2647 SETSOCKOPT_OPTION_VALUE_T buf;
2651 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2655 aint = (int)SvIV(sv);
2656 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2659 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2669 SETERRNO(EBADF,SS_IVCHAN);
2678 const int optype = PL_op->op_type;
2679 GV * const gv = MUTABLE_GV(POPs);
2680 register IO * const io = GvIOn(gv);
2685 if (!io || !IoIFP(io))
2688 sv = sv_2mortal(newSV(257));
2689 (void)SvPOK_only(sv);
2693 fd = PerlIO_fileno(IoIFP(io));
2695 case OP_GETSOCKNAME:
2696 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2699 case OP_GETPEERNAME:
2700 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2702 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2704 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";
2705 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2706 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2707 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2708 sizeof(u_short) + sizeof(struct in_addr))) {
2715 #ifdef BOGUS_GETNAME_RETURN
2716 /* Interactive Unix, getpeername() and getsockname()
2717 does not return valid namelen */
2718 if (len == BOGUS_GETNAME_RETURN)
2719 len = sizeof(struct sockaddr);
2728 SETERRNO(EBADF,SS_IVCHAN);
2747 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2748 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2749 if (PL_op->op_type == OP_LSTAT) {
2750 if (gv != PL_defgv) {
2751 do_fstat_warning_check:
2752 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2753 "lstat() on filehandle %"SVf, SVfARG(gv
2754 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2756 } else if (PL_laststype != OP_LSTAT)
2757 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2758 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2761 if (gv != PL_defgv) {
2762 PL_laststype = OP_STAT;
2764 sv_setpvs(PL_statname, "");
2771 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2772 } else if (IoDIRP(io)) {
2774 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2776 PL_laststatval = -1;
2782 if (PL_laststatval < 0) {
2788 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2789 io = MUTABLE_IO(SvRV(sv));
2790 if (PL_op->op_type == OP_LSTAT)
2791 goto do_fstat_warning_check;
2792 goto do_fstat_have_io;
2795 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2797 PL_laststype = PL_op->op_type;
2798 if (PL_op->op_type == OP_LSTAT)
2799 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2801 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2802 if (PL_laststatval < 0) {
2803 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2804 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2810 if (gimme != G_ARRAY) {
2811 if (gimme != G_VOID)
2812 XPUSHs(boolSV(max));
2818 mPUSHi(PL_statcache.st_dev);
2819 #if ST_INO_SIZE > IVSIZE
2820 mPUSHn(PL_statcache.st_ino);
2822 # if ST_INO_SIGN <= 0
2823 mPUSHi(PL_statcache.st_ino);
2825 mPUSHu(PL_statcache.st_ino);
2828 mPUSHu(PL_statcache.st_mode);
2829 mPUSHu(PL_statcache.st_nlink);
2830 #if Uid_t_size > IVSIZE
2831 mPUSHn(PL_statcache.st_uid);
2833 # if Uid_t_sign <= 0
2834 mPUSHi(PL_statcache.st_uid);
2836 mPUSHu(PL_statcache.st_uid);
2839 #if Gid_t_size > IVSIZE
2840 mPUSHn(PL_statcache.st_gid);
2842 # if Gid_t_sign <= 0
2843 mPUSHi(PL_statcache.st_gid);
2845 mPUSHu(PL_statcache.st_gid);
2848 #ifdef USE_STAT_RDEV
2849 mPUSHi(PL_statcache.st_rdev);
2851 PUSHs(newSVpvs_flags("", SVs_TEMP));
2853 #if Off_t_size > IVSIZE
2854 mPUSHn(PL_statcache.st_size);
2856 mPUSHi(PL_statcache.st_size);
2859 mPUSHn(PL_statcache.st_atime);
2860 mPUSHn(PL_statcache.st_mtime);
2861 mPUSHn(PL_statcache.st_ctime);
2863 mPUSHi(PL_statcache.st_atime);
2864 mPUSHi(PL_statcache.st_mtime);
2865 mPUSHi(PL_statcache.st_ctime);
2867 #ifdef USE_STAT_BLOCKS
2868 mPUSHu(PL_statcache.st_blksize);
2869 mPUSHu(PL_statcache.st_blocks);
2871 PUSHs(newSVpvs_flags("", SVs_TEMP));
2872 PUSHs(newSVpvs_flags("", SVs_TEMP));
2878 #define tryAMAGICftest_MG(chr) STMT_START { \
2879 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2880 && PL_op->op_flags & OPf_KIDS \
2881 && S_try_amagic_ftest(aTHX_ chr)) \
2886 S_try_amagic_ftest(pTHX_ char chr) {
2889 SV* const arg = TOPs;
2896 const char tmpchr = chr;
2897 SV * const tmpsv = amagic_call(arg,
2898 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2899 ftest_amg, AMGf_unary);
2906 if (PL_op->op_private & OPpFT_STACKING) {
2908 /* leave the object alone */
2920 /* This macro is used by the stacked filetest operators :
2921 * if the previous filetest failed, short-circuit and pass its value.
2922 * Else, discard it from the stack and continue. --rgs
2924 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2925 if (!SvTRUE(TOPs)) { RETURN; } \
2926 else { (void)POPs; PUTBACK; } \
2933 /* Not const, because things tweak this below. Not bool, because there's
2934 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2935 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2936 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2937 /* Giving some sort of initial value silences compilers. */
2939 int access_mode = R_OK;
2941 int access_mode = 0;
2944 /* access_mode is never used, but leaving use_access in makes the
2945 conditional compiling below much clearer. */
2948 Mode_t stat_mode = S_IRUSR;
2950 bool effective = FALSE;
2954 switch (PL_op->op_type) {
2955 case OP_FTRREAD: opchar = 'R'; break;
2956 case OP_FTRWRITE: opchar = 'W'; break;
2957 case OP_FTREXEC: opchar = 'X'; break;
2958 case OP_FTEREAD: opchar = 'r'; break;
2959 case OP_FTEWRITE: opchar = 'w'; break;
2960 case OP_FTEEXEC: opchar = 'x'; break;
2962 tryAMAGICftest_MG(opchar);
2964 STACKED_FTEST_CHECK;
2966 switch (PL_op->op_type) {
2968 #if !(defined(HAS_ACCESS) && defined(R_OK))
2974 #if defined(HAS_ACCESS) && defined(W_OK)
2979 stat_mode = S_IWUSR;
2983 #if defined(HAS_ACCESS) && defined(X_OK)
2988 stat_mode = S_IXUSR;
2992 #ifdef PERL_EFF_ACCESS
2995 stat_mode = S_IWUSR;
2999 #ifndef PERL_EFF_ACCESS
3006 #ifdef PERL_EFF_ACCESS
3011 stat_mode = S_IXUSR;
3017 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3018 const char *name = POPpx;
3020 # ifdef PERL_EFF_ACCESS
3021 result = PERL_EFF_ACCESS(name, access_mode);
3023 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3029 result = access(name, access_mode);
3031 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3042 result = my_stat_flags(0);
3046 if (cando(stat_mode, effective, &PL_statcache))
3055 const int op_type = PL_op->op_type;
3060 case OP_FTIS: opchar = 'e'; break;
3061 case OP_FTSIZE: opchar = 's'; break;
3062 case OP_FTMTIME: opchar = 'M'; break;
3063 case OP_FTCTIME: opchar = 'C'; break;
3064 case OP_FTATIME: opchar = 'A'; break;
3066 tryAMAGICftest_MG(opchar);
3068 STACKED_FTEST_CHECK;
3070 result = my_stat_flags(0);
3074 if (op_type == OP_FTIS)
3077 /* You can't dTARGET inside OP_FTIS, because you'll get
3078 "panic: pad_sv po" - the op is not flagged to have a target. */
3082 #if Off_t_size > IVSIZE
3083 PUSHn(PL_statcache.st_size);
3085 PUSHi(PL_statcache.st_size);
3089 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3092 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3095 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3109 switch (PL_op->op_type) {
3110 case OP_FTROWNED: opchar = 'O'; break;
3111 case OP_FTEOWNED: opchar = 'o'; break;
3112 case OP_FTZERO: opchar = 'z'; break;
3113 case OP_FTSOCK: opchar = 'S'; break;
3114 case OP_FTCHR: opchar = 'c'; break;
3115 case OP_FTBLK: opchar = 'b'; break;
3116 case OP_FTFILE: opchar = 'f'; break;
3117 case OP_FTDIR: opchar = 'd'; break;
3118 case OP_FTPIPE: opchar = 'p'; break;
3119 case OP_FTSUID: opchar = 'u'; break;
3120 case OP_FTSGID: opchar = 'g'; break;
3121 case OP_FTSVTX: opchar = 'k'; break;
3123 tryAMAGICftest_MG(opchar);
3125 STACKED_FTEST_CHECK;
3127 /* I believe that all these three are likely to be defined on most every
3128 system these days. */
3130 if(PL_op->op_type == OP_FTSUID) {
3131 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3137 if(PL_op->op_type == OP_FTSGID) {
3138 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3144 if(PL_op->op_type == OP_FTSVTX) {
3145 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3151 result = my_stat_flags(0);
3155 switch (PL_op->op_type) {
3157 if (PL_statcache.st_uid == PL_uid)
3161 if (PL_statcache.st_uid == PL_euid)
3165 if (PL_statcache.st_size == 0)
3169 if (S_ISSOCK(PL_statcache.st_mode))
3173 if (S_ISCHR(PL_statcache.st_mode))
3177 if (S_ISBLK(PL_statcache.st_mode))
3181 if (S_ISREG(PL_statcache.st_mode))
3185 if (S_ISDIR(PL_statcache.st_mode))
3189 if (S_ISFIFO(PL_statcache.st_mode))
3194 if (PL_statcache.st_mode & S_ISUID)
3200 if (PL_statcache.st_mode & S_ISGID)
3206 if (PL_statcache.st_mode & S_ISVTX)
3220 tryAMAGICftest_MG('l');
3221 STACKED_FTEST_CHECK;
3222 result = my_lstat_flags(0);
3227 if (S_ISLNK(PL_statcache.st_mode))
3242 tryAMAGICftest_MG('t');
3244 STACKED_FTEST_CHECK;
3246 if (PL_op->op_flags & OPf_REF)
3248 else if (!(gv = MAYBE_DEREF_GV_nomg(TOPs))) {
3250 name = SvPV_nomg(tmpsv, namelen);
3251 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3254 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3255 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3256 else if (tmpsv && SvOK(tmpsv)) {
3264 if (PerlLIO_isatty(fd))
3269 #if defined(atarist) /* this will work with atariST. Configure will
3270 make guesses for other systems. */
3271 # define FILE_base(f) ((f)->_base)
3272 # define FILE_ptr(f) ((f)->_ptr)
3273 # define FILE_cnt(f) ((f)->_cnt)
3274 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3285 register STDCHAR *s;
3291 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3293 STACKED_FTEST_CHECK;
3295 if (PL_op->op_flags & OPf_REF)
3297 else gv = MAYBE_DEREF_GV_nomg(TOPs);
3301 if (gv == PL_defgv) {
3303 io = GvIO(PL_statgv);
3306 goto really_filename;
3311 PL_laststatval = -1;
3312 sv_setpvs(PL_statname, "");
3313 io = GvIO(PL_statgv);
3315 if (io && IoIFP(io)) {
3316 if (! PerlIO_has_base(IoIFP(io)))
3317 DIE(aTHX_ "-T and -B not implemented on filehandles");
3318 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3319 if (PL_laststatval < 0)
3321 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3322 if (PL_op->op_type == OP_FTTEXT)
3327 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3328 i = PerlIO_getc(IoIFP(io));
3330 (void)PerlIO_ungetc(IoIFP(io),i);
3332 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3334 len = PerlIO_get_bufsiz(IoIFP(io));
3335 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3336 /* sfio can have large buffers - limit to 512 */
3341 report_evil_fh(cGVOP_gv);
3342 SETERRNO(EBADF,RMS_IFI);
3350 PL_laststype = OP_STAT;
3351 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3352 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3353 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3355 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3358 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3359 if (PL_laststatval < 0) {
3360 (void)PerlIO_close(fp);
3363 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3364 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3365 (void)PerlIO_close(fp);
3367 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3368 RETPUSHNO; /* special case NFS directories */
3369 RETPUSHYES; /* null file is anything */
3374 /* now scan s to look for textiness */
3375 /* XXX ASCII dependent code */
3377 #if defined(DOSISH) || defined(USEMYBINMODE)
3378 /* ignore trailing ^Z on short files */
3379 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3383 for (i = 0; i < len; i++, s++) {
3384 if (!*s) { /* null never allowed in text */
3389 else if (!(isPRINT(*s) || isSPACE(*s)))
3392 else if (*s & 128) {
3394 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3397 /* utf8 characters don't count as odd */
3398 if (UTF8_IS_START(*s)) {
3399 int ulen = UTF8SKIP(s);
3400 if (ulen < len - i) {
3402 for (j = 1; j < ulen; j++) {
3403 if (!UTF8_IS_CONTINUATION(s[j]))
3406 --ulen; /* loop does extra increment */
3416 *s != '\n' && *s != '\r' && *s != '\b' &&
3417 *s != '\t' && *s != '\f' && *s != 27)
3422 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3433 const char *tmps = NULL;
3437 SV * const sv = POPs;
3438 if (PL_op->op_flags & OPf_SPECIAL) {
3439 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3441 else if (!(gv = MAYBE_DEREF_GV(sv)))
3442 tmps = SvPV_nomg_const_nolen(sv);
3445 if( !gv && (!tmps || !*tmps) ) {
3446 HV * const table = GvHVn(PL_envgv);
3449 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3450 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3452 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3457 deprecate("chdir('') or chdir(undef) as chdir()");
3458 tmps = SvPV_nolen_const(*svp);
3462 TAINT_PROPER("chdir");
3467 TAINT_PROPER("chdir");
3470 IO* const io = GvIO(gv);
3473 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3474 } else if (IoIFP(io)) {
3475 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3479 SETERRNO(EBADF, RMS_IFI);
3485 SETERRNO(EBADF,RMS_IFI);
3489 DIE(aTHX_ PL_no_func, "fchdir");
3493 PUSHi( PerlDir_chdir(tmps) >= 0 );
3495 /* Clear the DEFAULT element of ENV so we'll get the new value
3497 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3504 dVAR; dSP; dMARK; dTARGET;
3505 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3516 char * const tmps = POPpx;
3517 TAINT_PROPER("chroot");
3518 PUSHi( chroot(tmps) >= 0 );
3521 DIE(aTHX_ PL_no_func, "chroot");
3529 const char * const tmps2 = POPpconstx;
3530 const char * const tmps = SvPV_nolen_const(TOPs);
3531 TAINT_PROPER("rename");
3533 anum = PerlLIO_rename(tmps, tmps2);
3535 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3536 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3539 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3540 (void)UNLINK(tmps2);
3541 if (!(anum = link(tmps, tmps2)))
3542 anum = UNLINK(tmps);
3550 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3554 const int op_type = PL_op->op_type;
3558 if (op_type == OP_LINK)
3559 DIE(aTHX_ PL_no_func, "link");
3561 # ifndef HAS_SYMLINK
3562 if (op_type == OP_SYMLINK)
3563 DIE(aTHX_ PL_no_func, "symlink");
3567 const char * const tmps2 = POPpconstx;
3568 const char * const tmps = SvPV_nolen_const(TOPs);
3569 TAINT_PROPER(PL_op_desc[op_type]);
3571 # if defined(HAS_LINK)
3572 # if defined(HAS_SYMLINK)
3573 /* Both present - need to choose which. */
3574 (op_type == OP_LINK) ?
3575 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3577 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3578 PerlLIO_link(tmps, tmps2);
3581 # if defined(HAS_SYMLINK)
3582 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3583 symlink(tmps, tmps2);
3588 SETi( result >= 0 );
3595 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3606 char buf[MAXPATHLEN];
3609 #ifndef INCOMPLETE_TAINTS
3613 len = readlink(tmps, buf, sizeof(buf) - 1);
3620 RETSETUNDEF; /* just pretend it's a normal file */
3624 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3626 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3628 char * const save_filename = filename;
3633 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3635 PERL_ARGS_ASSERT_DOONELINER;
3637 Newx(cmdline, size, char);
3638 my_strlcpy(cmdline, cmd, size);
3639 my_strlcat(cmdline, " ", size);
3640 for (s = cmdline + strlen(cmdline); *filename; ) {
3644 if (s - cmdline < size)
3645 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3646 myfp = PerlProc_popen(cmdline, "r");
3650 SV * const tmpsv = sv_newmortal();
3651 /* Need to save/restore 'PL_rs' ?? */
3652 s = sv_gets(tmpsv, myfp, 0);
3653 (void)PerlProc_pclose(myfp);
3657 #ifdef HAS_SYS_ERRLIST
3662 /* you don't see this */
3663 const char * const errmsg =
3664 #ifdef HAS_SYS_ERRLIST
3672 if (instr(s, errmsg)) {
3679 #define EACCES EPERM
3681 if (instr(s, "cannot make"))
3682 SETERRNO(EEXIST,RMS_FEX);
3683 else if (instr(s, "existing file"))
3684 SETERRNO(EEXIST,RMS_FEX);
3685 else if (instr(s, "ile exists"))
3686 SETERRNO(EEXIST,RMS_FEX);
3687 else if (instr(s, "non-exist"))
3688 SETERRNO(ENOENT,RMS_FNF);
3689 else if (instr(s, "does not exist"))
3690 SETERRNO(ENOENT,RMS_FNF);
3691 else if (instr(s, "not empty"))
3692 SETERRNO(EBUSY,SS_DEVOFFLINE);
3693 else if (instr(s, "cannot access"))
3694 SETERRNO(EACCES,RMS_PRV);
3696 SETERRNO(EPERM,RMS_PRV);
3699 else { /* some mkdirs return no failure indication */
3700 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3701 if (PL_op->op_type == OP_RMDIR)
3706 SETERRNO(EACCES,RMS_PRV); /* a guess */
3715 /* This macro removes trailing slashes from a directory name.
3716 * Different operating and file systems take differently to
3717 * trailing slashes. According to POSIX 1003.1 1996 Edition
3718 * any number of trailing slashes should be allowed.
3719 * Thusly we snip them away so that even non-conforming
3720 * systems are happy.
3721 * We should probably do this "filtering" for all
3722 * the functions that expect (potentially) directory names:
3723 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3724 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3726 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3727 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3730 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3731 (tmps) = savepvn((tmps), (len)); \
3741 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3743 TRIMSLASHES(tmps,len,copy);
3745 TAINT_PROPER("mkdir");
3747 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3751 SETi( dooneliner("mkdir", tmps) );
3752 oldumask = PerlLIO_umask(0);
3753 PerlLIO_umask(oldumask);
3754 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3769 TRIMSLASHES(tmps,len,copy);
3770 TAINT_PROPER("rmdir");
3772 SETi( PerlDir_rmdir(tmps) >= 0 );
3774 SETi( dooneliner("rmdir", tmps) );
3781 /* Directory calls. */
3785 #if defined(Direntry_t) && defined(HAS_READDIR)
3787 const char * const dirname = POPpconstx;
3788 GV * const gv = MUTABLE_GV(POPs);
3789 register IO * const io = GvIOn(gv);
3794 if ((IoIFP(io) || IoOFP(io)))
3795 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3796 "Opening filehandle %"HEKf" also as a directory",
3797 HEKfARG(GvENAME_HEK(gv)) );
3799 PerlDir_close(IoDIRP(io));
3800 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3806 SETERRNO(EBADF,RMS_DIR);
3809 DIE(aTHX_ PL_no_dir_func, "opendir");
3815 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3816 DIE(aTHX_ PL_no_dir_func, "readdir");
3818 #if !defined(I_DIRENT) && !defined(VMS)
3819 Direntry_t *readdir (DIR *);
3825 const I32 gimme = GIMME;
3826 GV * const gv = MUTABLE_GV(POPs);
3827 register const Direntry_t *dp;
3828 register IO * const io = GvIOn(gv);
3830 if (!io || !IoDIRP(io)) {
3831 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3832 "readdir() attempted on invalid dirhandle %"HEKf,
3833 HEKfARG(GvENAME_HEK(gv)));
3838 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3842 sv = newSVpvn(dp->d_name, dp->d_namlen);
3844 sv = newSVpv(dp->d_name, 0);
3846 #ifndef INCOMPLETE_TAINTS
3847 if (!(IoFLAGS(io) & IOf_UNTAINT))
3851 } while (gimme == G_ARRAY);
3853 if (!dp && gimme != G_ARRAY)
3860 SETERRNO(EBADF,RMS_ISI);
3861 if (GIMME == G_ARRAY)
3870 #if defined(HAS_TELLDIR) || defined(telldir)
3872 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3873 /* XXX netbsd still seemed to.
3874 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3875 --JHI 1999-Feb-02 */
3876 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3877 long telldir (DIR *);
3879 GV * const gv = MUTABLE_GV(POPs);
3880 register IO * const io = GvIOn(gv);
3882 if (!io || !IoDIRP(io)) {
3883 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3884 "telldir() attempted on invalid dirhandle %"HEKf,
3885 HEKfARG(GvENAME_HEK(gv)));
3889 PUSHi( PerlDir_tell(IoDIRP(io)) );
3893 SETERRNO(EBADF,RMS_ISI);
3896 DIE(aTHX_ PL_no_dir_func, "telldir");
3902 #if defined(HAS_SEEKDIR) || defined(seekdir)
3904 const long along = POPl;
3905 GV * const gv = MUTABLE_GV(POPs);
3906 register IO * const io = GvIOn(gv);
3908 if (!io || !IoDIRP(io)) {
3909 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3910 "seekdir() attempted on invalid dirhandle %"HEKf,
3911 HEKfARG(GvENAME_HEK(gv)));
3914 (void)PerlDir_seek(IoDIRP(io), along);
3919 SETERRNO(EBADF,RMS_ISI);
3922 DIE(aTHX_ PL_no_dir_func, "seekdir");
3928 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3930 GV * const gv = MUTABLE_GV(POPs);
3931 register IO * const io = GvIOn(gv);
3933 if (!io || !IoDIRP(io)) {
3934 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3935 "rewinddir() attempted on invalid dirhandle %"HEKf,
3936 HEKfARG(GvENAME_HEK(gv)));
3939 (void)PerlDir_rewind(IoDIRP(io));
3943 SETERRNO(EBADF,RMS_ISI);
3946 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3952 #if defined(Direntry_t) && defined(HAS_READDIR)
3954 GV * const gv = MUTABLE_GV(POPs);
3955 register IO * const io = GvIOn(gv);
3957 if (!io || !IoDIRP(io)) {
3958 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3959 "closedir() attempted on invalid dirhandle %"HEKf,
3960 HEKfARG(GvENAME_HEK(gv)));
3963 #ifdef VOID_CLOSEDIR
3964 PerlDir_close(IoDIRP(io));
3966 if (PerlDir_close(IoDIRP(io)) < 0) {
3967 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3976 SETERRNO(EBADF,RMS_IFI);
3979 DIE(aTHX_ PL_no_dir_func, "closedir");
3983 /* Process control. */
3992 PERL_FLUSHALL_FOR_CHILD;
3993 childpid = PerlProc_fork();
3997 #ifdef THREADS_HAVE_PIDS
3998 PL_ppid = (IV)getppid();
4000 #ifdef PERL_USES_PL_PIDSTATUS
4001 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4007 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4012 PERL_FLUSHALL_FOR_CHILD;
4013 childpid = PerlProc_fork();
4019 DIE(aTHX_ PL_no_func, "fork");
4026 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4031 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4032 childpid = wait4pid(-1, &argflags, 0);
4034 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4039 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4040 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4041 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4043 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4048 DIE(aTHX_ PL_no_func, "wait");
4054 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4056 const int optype = POPi;
4057 const Pid_t pid = TOPi;
4061 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4062 result = wait4pid(pid, &argflags, optype);
4064 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4069 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4070 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4071 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4073 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4078 DIE(aTHX_ PL_no_func, "waitpid");
4084 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4085 #if defined(__LIBCATAMOUNT__)
4086 PL_statusvalue = -1;
4095 while (++MARK <= SP) {
4096 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4101 TAINT_PROPER("system");
4103 PERL_FLUSHALL_FOR_CHILD;
4104 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4110 if (PerlProc_pipe(pp) >= 0)
4112 while ((childpid = PerlProc_fork()) == -1) {
4113 if (errno != EAGAIN) {
4118 PerlLIO_close(pp[0]);
4119 PerlLIO_close(pp[1]);
4126 Sigsave_t ihand,qhand; /* place to save signals during system() */
4130 PerlLIO_close(pp[1]);
4132 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4133 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4136 result = wait4pid(childpid, &status, 0);
4137 } while (result == -1 && errno == EINTR);
4139 (void)rsignal_restore(SIGINT, &ihand);
4140 (void)rsignal_restore(SIGQUIT, &qhand);
4142 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4143 do_execfree(); /* free any memory child malloced on fork */
4150 while (n < sizeof(int)) {
4151 n1 = PerlLIO_read(pp[0],
4152 (void*)(((char*)&errkid)+n),
4158 PerlLIO_close(pp[0]);
4159 if (n) { /* Error */
4160 if (n != sizeof(int))
4161 DIE(aTHX_ "panic: kid popen errno read");
4162 errno = errkid; /* Propagate errno from kid */
4163 STATUS_NATIVE_CHILD_SET(-1);
4166 XPUSHi(STATUS_CURRENT);
4170 PerlLIO_close(pp[0]);
4171 #if defined(HAS_FCNTL) && defined(F_SETFD)
4172 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4175 if (PL_op->op_flags & OPf_STACKED) {
4176 SV * const really = *++MARK;
4177 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4179 else if (SP - MARK != 1)
4180 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4182 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4186 #else /* ! FORK or VMS or OS/2 */
4189 if (PL_op->op_flags & OPf_STACKED) {
4190 SV * const really = *++MARK;
4191 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4192 value = (I32)do_aspawn(really, MARK, SP);
4194 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4197 else if (SP - MARK != 1) {
4198 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4199 value = (I32)do_aspawn(NULL, MARK, SP);
4201 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4205 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4207 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4209 STATUS_NATIVE_CHILD_SET(value);
4212 XPUSHi(result ? value : STATUS_CURRENT);
4213 #endif /* !FORK or VMS or OS/2 */
4220 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4225 while (++MARK <= SP) {
4226 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4231 TAINT_PROPER("exec");
4233 PERL_FLUSHALL_FOR_CHILD;
4234 if (PL_op->op_flags & OPf_STACKED) {
4235 SV * const really = *++MARK;
4236 value = (I32)do_aexec(really, MARK, SP);
4238 else if (SP - MARK != 1)
4240 value = (I32)vms_do_aexec(NULL, MARK, SP);
4244 (void ) do_aspawn(NULL, MARK, SP);
4248 value = (I32)do_aexec(NULL, MARK, SP);
4253 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4256 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4259 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4273 # ifdef THREADS_HAVE_PIDS
4274 if (PL_ppid != 1 && getppid() == 1)
4275 /* maybe the parent process has died. Refresh ppid cache */
4279 XPUSHi( getppid() );
4283 DIE(aTHX_ PL_no_func, "getppid");
4293 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4296 pgrp = (I32)BSD_GETPGRP(pid);
4298 if (pid != 0 && pid != PerlProc_getpid())
4299 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4305 DIE(aTHX_ PL_no_func, "getpgrp()");
4315 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4316 if (MAXARG > 0) pid = TOPs && TOPi;
4322 TAINT_PROPER("setpgrp");
4324 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4326 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4327 || (pid != 0 && pid != PerlProc_getpid()))
4329 DIE(aTHX_ "setpgrp can't take arguments");
4331 SETi( setpgrp() >= 0 );
4332 #endif /* USE_BSDPGRP */
4335 DIE(aTHX_ PL_no_func, "setpgrp()");
4339 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4340 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4342 # define PRIORITY_WHICH_T(which) which
4347 #ifdef HAS_GETPRIORITY
4349 const int who = POPi;
4350 const int which = TOPi;
4351 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4354 DIE(aTHX_ PL_no_func, "getpriority()");
4360 #ifdef HAS_SETPRIORITY
4362 const int niceval = POPi;
4363 const int who = POPi;
4364 const int which = TOPi;
4365 TAINT_PROPER("setpriority");
4366 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4369 DIE(aTHX_ PL_no_func, "setpriority()");
4373 #undef PRIORITY_WHICH_T
4381 XPUSHn( time(NULL) );
4383 XPUSHi( time(NULL) );
4395 (void)PerlProc_times(&PL_timesbuf);
4397 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4398 /* struct tms, though same data */
4402 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4403 if (GIMME == G_ARRAY) {
4404 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4405 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4406 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4414 if (GIMME == G_ARRAY) {
4421 DIE(aTHX_ "times not implemented");
4423 #endif /* HAS_TIMES */
4426 /* The 32 bit int year limits the times we can represent to these
4427 boundaries with a few days wiggle room to account for time zone
4430 /* Sat Jan 3 00:00:00 -2147481748 */
4431 #define TIME_LOWER_BOUND -67768100567755200.0
4432 /* Sun Dec 29 12:00:00 2147483647 */
4433 #define TIME_UPPER_BOUND 67767976233316800.0
4442 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4443 static const char * const dayname[] =
4444 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4445 static const char * const monname[] =
4446 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4447 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4449 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4452 when = (Time64_T)now;
4455 NV input = Perl_floor(POPn);
4456 when = (Time64_T)input;
4457 if (when != input) {
4458 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4459 "%s(%.0" NVff ") too large", opname, input);
4463 if ( TIME_LOWER_BOUND > when ) {
4464 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4465 "%s(%.0" NVff ") too small", opname, when);
4468 else if( when > TIME_UPPER_BOUND ) {
4469 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4470 "%s(%.0" NVff ") too large", opname, when);
4474 if (PL_op->op_type == OP_LOCALTIME)
4475 err = S_localtime64_r(&when, &tmbuf);
4477 err = S_gmtime64_r(&when, &tmbuf);
4481 /* XXX %lld broken for quads */
4482 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4483 "%s(%.0" NVff ") failed", opname, when);
4486 if (GIMME != G_ARRAY) { /* scalar context */
4488 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4489 double year = (double)tmbuf.tm_year + 1900;
4496 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4497 dayname[tmbuf.tm_wday],
4498 monname[tmbuf.tm_mon],
4506 else { /* list context */
4512 mPUSHi(tmbuf.tm_sec);
4513 mPUSHi(tmbuf.tm_min);
4514 mPUSHi(tmbuf.tm_hour);
4515 mPUSHi(tmbuf.tm_mday);
4516 mPUSHi(tmbuf.tm_mon);
4517 mPUSHn(tmbuf.tm_year);
4518 mPUSHi(tmbuf.tm_wday);
4519 mPUSHi(tmbuf.tm_yday);
4520 mPUSHi(tmbuf.tm_isdst);
4531 anum = alarm((unsigned int)anum);
4537 DIE(aTHX_ PL_no_func, "alarm");
4548 (void)time(&lasttime);
4549 if (MAXARG < 1 || (!TOPs && !POPs))
4553 PerlProc_sleep((unsigned int)duration);
4556 XPUSHi(when - lasttime);
4560 /* Shared memory. */
4561 /* Merged with some message passing. */
4565 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4566 dVAR; dSP; dMARK; dTARGET;
4567 const int op_type = PL_op->op_type;
4572 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4575 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4578 value = (I32)(do_semop(MARK, SP) >= 0);
4581 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4589 return Perl_pp_semget(aTHX);
4597 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4598 dVAR; dSP; dMARK; dTARGET;
4599 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4606 DIE(aTHX_ "System V IPC is not implemented on this machine");
4612 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4613 dVAR; dSP; dMARK; dTARGET;
4614 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4622 PUSHp(zero_but_true, ZBTLEN);
4626 return Perl_pp_semget(aTHX);
4630 /* I can't const this further without getting warnings about the types of
4631 various arrays passed in from structures. */
4633 S_space_join_names_mortal(pTHX_ char *const *array)
4637 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4639 if (array && *array) {
4640 target = newSVpvs_flags("", SVs_TEMP);
4642 sv_catpv(target, *array);
4645 sv_catpvs(target, " ");
4648 target = sv_mortalcopy(&PL_sv_no);
4653 /* Get system info. */
4657 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4659 I32 which = PL_op->op_type;
4660 register char **elem;
4662 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4663 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4664 struct hostent *gethostbyname(Netdb_name_t);
4665 struct hostent *gethostent(void);
4667 struct hostent *hent = NULL;
4671 if (which == OP_GHBYNAME) {
4672 #ifdef HAS_GETHOSTBYNAME
4673 const char* const name = POPpbytex;
4674 hent = PerlSock_gethostbyname(name);
4676 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4679 else if (which == OP_GHBYADDR) {
4680 #ifdef HAS_GETHOSTBYADDR
4681 const int addrtype = POPi;
4682 SV * const addrsv = POPs;
4684 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4686 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4688 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4692 #ifdef HAS_GETHOSTENT
4693 hent = PerlSock_gethostent();
4695 DIE(aTHX_ PL_no_sock_func, "gethostent");
4698 #ifdef HOST_NOT_FOUND
4700 #ifdef USE_REENTRANT_API
4701 # ifdef USE_GETHOSTENT_ERRNO
4702 h_errno = PL_reentrant_buffer->_gethostent_errno;
4705 STATUS_UNIX_SET(h_errno);
4709 if (GIMME != G_ARRAY) {
4710 PUSHs(sv = sv_newmortal());
4712 if (which == OP_GHBYNAME) {
4714 sv_setpvn(sv, hent->h_addr, hent->h_length);
4717 sv_setpv(sv, (char*)hent->h_name);
4723 mPUSHs(newSVpv((char*)hent->h_name, 0));
4724 PUSHs(space_join_names_mortal(hent->h_aliases));
4725 mPUSHi(hent->h_addrtype);
4726 len = hent->h_length;
4729 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4730 mXPUSHp(*elem, len);
4734 mPUSHp(hent->h_addr, len);
4736 PUSHs(sv_mortalcopy(&PL_sv_no));
4741 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4747 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4749 I32 which = PL_op->op_type;
4751 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4752 struct netent *getnetbyaddr(Netdb_net_t, int);
4753 struct netent *getnetbyname(Netdb_name_t);
4754 struct netent *getnetent(void);
4756 struct netent *nent;
4758 if (which == OP_GNBYNAME){
4759 #ifdef HAS_GETNETBYNAME
4760 const char * const name = POPpbytex;
4761 nent = PerlSock_getnetbyname(name);
4763 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4766 else if (which == OP_GNBYADDR) {
4767 #ifdef HAS_GETNETBYADDR
4768 const int addrtype = POPi;
4769 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4770 nent = PerlSock_getnetbyaddr(addr, addrtype);
4772 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4776 #ifdef HAS_GETNETENT
4777 nent = PerlSock_getnetent();
4779 DIE(aTHX_ PL_no_sock_func, "getnetent");
4782 #ifdef HOST_NOT_FOUND
4784 #ifdef USE_REENTRANT_API
4785 # ifdef USE_GETNETENT_ERRNO
4786 h_errno = PL_reentrant_buffer->_getnetent_errno;
4789 STATUS_UNIX_SET(h_errno);
4794 if (GIMME != G_ARRAY) {
4795 PUSHs(sv = sv_newmortal());
4797 if (which == OP_GNBYNAME)
4798 sv_setiv(sv, (IV)nent->n_net);
4800 sv_setpv(sv, nent->n_name);
4806 mPUSHs(newSVpv(nent->n_name, 0));
4807 PUSHs(space_join_names_mortal(nent->n_aliases));
4808 mPUSHi(nent->n_addrtype);
4809 mPUSHi(nent->n_net);
4814 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4820 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4822 I32 which = PL_op->op_type;
4824 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4825 struct protoent *getprotobyname(Netdb_name_t);
4826 struct protoent *getprotobynumber(int);
4827 struct protoent *getprotoent(void);
4829 struct protoent *pent;
4831 if (which == OP_GPBYNAME) {
4832 #ifdef HAS_GETPROTOBYNAME
4833 const char* const name = POPpbytex;
4834 pent = PerlSock_getprotobyname(name);
4836 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4839 else if (which == OP_GPBYNUMBER) {
4840 #ifdef HAS_GETPROTOBYNUMBER
4841 const int number = POPi;
4842 pent = PerlSock_getprotobynumber(number);
4844 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4848 #ifdef HAS_GETPROTOENT
4849 pent = PerlSock_getprotoent();
4851 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4855 if (GIMME != G_ARRAY) {
4856 PUSHs(sv = sv_newmortal());
4858 if (which == OP_GPBYNAME)
4859 sv_setiv(sv, (IV)pent->p_proto);
4861 sv_setpv(sv, pent->p_name);
4867 mPUSHs(newSVpv(pent->p_name, 0));
4868 PUSHs(space_join_names_mortal(pent->p_aliases));
4869 mPUSHi(pent->p_proto);
4874 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4880 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4882 I32 which = PL_op->op_type;
4884 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4885 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4886 struct servent *getservbyport(int, Netdb_name_t);
4887 struct servent *getservent(void);
4889 struct servent *sent;
4891 if (which == OP_GSBYNAME) {
4892 #ifdef HAS_GETSERVBYNAME
4893 const char * const proto = POPpbytex;
4894 const char * const name = POPpbytex;
4895 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4897 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4900 else if (which == OP_GSBYPORT) {
4901 #ifdef HAS_GETSERVBYPORT
4902 const char * const proto = POPpbytex;
4903 unsigned short port = (unsigned short)POPu;
4905 port = PerlSock_htons(port);
4907 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4909 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4913 #ifdef HAS_GETSERVENT
4914 sent = PerlSock_getservent();
4916 DIE(aTHX_ PL_no_sock_func, "getservent");
4920 if (GIMME != G_ARRAY) {
4921 PUSHs(sv = sv_newmortal());
4923 if (which == OP_GSBYNAME) {
4925 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4927 sv_setiv(sv, (IV)(sent->s_port));
4931 sv_setpv(sv, sent->s_name);
4937 mPUSHs(newSVpv(sent->s_name, 0));
4938 PUSHs(space_join_names_mortal(sent->s_aliases));
4940 mPUSHi(PerlSock_ntohs(sent->s_port));
4942 mPUSHi(sent->s_port);
4944 mPUSHs(newSVpv(sent->s_proto, 0));
4949 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4956 const int stayopen = TOPi;
4957 switch(PL_op->op_type) {
4959 #ifdef HAS_SETHOSTENT
4960 PerlSock_sethostent(stayopen);
4962 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4965 #ifdef HAS_SETNETENT
4967 PerlSock_setnetent(stayopen);
4969 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4973 #ifdef HAS_SETPROTOENT
4974 PerlSock_setprotoent(stayopen);
4976 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4980 #ifdef HAS_SETSERVENT
4981 PerlSock_setservent(stayopen);
4983 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4993 switch(PL_op->op_type) {
4995 #ifdef HAS_ENDHOSTENT
4996 PerlSock_endhostent();
4998 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5002 #ifdef HAS_ENDNETENT
5003 PerlSock_endnetent();
5005 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5009 #ifdef HAS_ENDPROTOENT
5010 PerlSock_endprotoent();
5012 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5016 #ifdef HAS_ENDSERVENT
5017 PerlSock_endservent();
5019 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5023 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5026 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5030 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5033 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5037 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5040 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5044 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5047 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5059 I32 which = PL_op->op_type;
5061 struct passwd *pwent = NULL;
5063 * We currently support only the SysV getsp* shadow password interface.
5064 * The interface is declared in <shadow.h> and often one needs to link
5065 * with -lsecurity or some such.
5066 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.