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
38 /* Shadow password support for solaris - pdo@cs.umd.edu
39 * Not just Solaris: at least HP-UX, IRIX, Linux.
40 * The API is from SysV.
42 * There are at least two more shadow interfaces,
43 * see the comments in pp_gpwent().
47 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
48 * and another MAXINT from "perl.h" <- <sys/param.h>. */
55 # include <sys/wait.h>
59 # include <sys/resource.h>
68 # include <sys/select.h>
72 /* XXX Configure test needed.
73 h_errno might not be a simple 'int', especially for multi-threaded
74 applications, see "extern int errno in perl.h". Creating such
75 a test requires taking into account the differences between
76 compiling multithreaded and singlethreaded ($ccflags et al).
77 HOST_NOT_FOUND is typically defined in <netdb.h>.
79 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
88 struct passwd *getpwnam (char *);
89 struct passwd *getpwuid (Uid_t);
94 struct passwd *getpwent (void);
95 #elif defined (VMS) && defined (my_getpwent)
96 struct passwd *Perl_my_getpwent (pTHX);
105 struct group *getgrnam (char *);
106 struct group *getgrgid (Gid_t);
110 struct group *getgrent (void);
116 # if defined(_MSC_VER) || defined(__MINGW32__)
117 # include <sys/utime.h>
124 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
127 # define my_chsize PerlLIO_chsize
130 # define my_chsize PerlLIO_chsize
132 I32 my_chsize(int fd, Off_t length);
138 #else /* no flock() */
140 /* fcntl.h might not have been included, even if it exists, because
141 the current Configure only sets I_FCNTL if it's needed to pick up
142 the *_OK constants. Make sure it has been included before testing
143 the fcntl() locking constants. */
144 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
148 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
149 # define FLOCK fcntl_emulate_flock
150 # define FCNTL_EMULATE_FLOCK
151 # else /* no flock() or fcntl(F_SETLK,...) */
153 # define FLOCK lockf_emulate_flock
154 # define LOCKF_EMULATE_FLOCK
156 # endif /* no flock() or fcntl(F_SETLK,...) */
159 static int FLOCK (int, int);
162 * These are the flock() constants. Since this sytems doesn't have
163 * flock(), the values of the constants are probably not available.
177 # endif /* emulating flock() */
179 #endif /* no flock() */
182 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
184 #if defined(I_SYS_ACCESS) && !defined(R_OK)
185 # include <sys/access.h>
188 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
189 # define FD_CLOEXEC 1 /* NeXT needs this */
195 /* Missing protos on LynxOS */
196 void sethostent(int);
197 void endhostent(void);
199 void endnetent(void);
200 void setprotoent(int);
201 void endprotoent(void);
202 void setservent(int);
203 void endservent(void);
206 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
208 /* F_OK unused: if stat() cannot find it... */
210 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
211 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
212 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
215 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
216 # ifdef I_SYS_SECURITY
217 # include <sys/security.h>
221 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
224 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
228 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
230 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
234 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
235 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
236 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
239 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
241 const Uid_t ruid = getuid();
242 const Uid_t euid = geteuid();
243 const Gid_t rgid = getgid();
244 const Gid_t egid = getegid();
248 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
249 Perl_croak(aTHX_ "switching effective uid is not implemented");
252 if (setreuid(euid, ruid))
255 if (setresuid(euid, ruid, (Uid_t)-1))
258 Perl_croak(aTHX_ "entering effective uid failed");
261 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
262 Perl_croak(aTHX_ "switching effective gid is not implemented");
265 if (setregid(egid, rgid))
268 if (setresgid(egid, rgid, (Gid_t)-1))
271 Perl_croak(aTHX_ "entering effective gid failed");
274 res = access(path, mode);
277 if (setreuid(ruid, euid))
280 if (setresuid(ruid, euid, (Uid_t)-1))
283 Perl_croak(aTHX_ "leaving effective uid failed");
286 if (setregid(rgid, egid))
289 if (setresgid(rgid, egid, (Gid_t)-1))
292 Perl_croak(aTHX_ "leaving effective gid failed");
297 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
304 const char * const tmps = POPpconstx;
305 const I32 gimme = GIMME_V;
306 const char *mode = "r";
309 if (PL_op->op_private & OPpOPEN_IN_RAW)
311 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
313 fp = PerlProc_popen(tmps, mode);
315 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
317 PerlIO_apply_layers(aTHX_ fp,mode,type);
319 if (gimme == G_VOID) {
321 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
324 else if (gimme == G_SCALAR) {
327 PL_rs = &PL_sv_undef;
328 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
329 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
337 SV * const sv = newSV(79);
338 if (sv_gets(sv, fp, 0) == NULL) {
343 if (SvLEN(sv) - SvCUR(sv) > 20) {
344 SvPV_shrink_to_cur(sv);
349 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
350 TAINT; /* "I believe that this is not gratuitous!" */
353 STATUS_NATIVE_CHILD_SET(-1);
354 if (gimme == G_SCALAR)
365 tryAMAGICunTARGET(iter, -1);
367 /* Note that we only ever get here if File::Glob fails to load
368 * without at the same time croaking, for some reason, or if
369 * perl was built with PERL_EXTERNAL_GLOB */
376 * The external globbing program may use things we can't control,
377 * so for security reasons we must assume the worst.
380 taint_proper(PL_no_security, "glob");
384 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
385 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
387 SAVESPTR(PL_rs); /* This is not permanent, either. */
388 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
391 *SvPVX(PL_rs) = '\n';
395 result = do_readline();
403 PL_last_in_gv = cGVOP_gv;
404 return do_readline();
415 do_join(TARG, &PL_sv_no, MARK, SP);
419 else if (SP == MARK) {
427 tmps = SvPV_const(tmpsv, len);
428 if ((!tmps || !len) && PL_errgv) {
429 SV * const error = ERRSV;
430 SvUPGRADE(error, SVt_PV);
431 if (SvPOK(error) && SvCUR(error))
432 sv_catpvs(error, "\t...caught");
434 tmps = SvPV_const(tmpsv, len);
437 tmpsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
439 Perl_warn(aTHX_ "%"SVf, SVfARG(tmpsv));
451 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
453 if (SP - MARK != 1) {
455 do_join(TARG, &PL_sv_no, MARK, SP);
457 tmps = SvPV_const(tmpsv, len);
463 tmps = SvROK(tmpsv) ? (const char *)NULL : SvPV_const(tmpsv, len);
466 SV * const error = ERRSV;
467 SvUPGRADE(error, SVt_PV);
468 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
470 SvSetSV(error,tmpsv);
471 else if (sv_isobject(error)) {
472 HV * const stash = SvSTASH(SvRV(error));
473 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
475 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
476 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
483 call_sv(MUTABLE_SV(GvCV(gv)),
484 G_SCALAR|G_EVAL|G_KEEPERR);
485 sv_setsv(error,*PL_stack_sp--);
491 if (SvPOK(error) && SvCUR(error))
492 sv_catpvs(error, "\t...propagated");
495 tmps = SvPV_const(tmpsv, len);
501 tmpsv = newSVpvs_flags("Died", SVs_TEMP);
503 DIE(aTHX_ "%"SVf, SVfARG(tmpsv));
519 GV * const gv = MUTABLE_GV(*++MARK);
522 DIE(aTHX_ PL_no_usym, "filehandle");
524 if ((io = GvIOp(gv))) {
526 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
528 if (IoDIRP(io) && ckWARN2(WARN_IO, WARN_DEPRECATED))
529 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
530 "Opening dirhandle %s also as a file", GvENAME(gv));
532 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
534 /* Method's args are same as ours ... */
535 /* ... except handle is replaced by the object */
536 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
540 call_method("OPEN", G_SCALAR);
554 tmps = SvPV_const(sv, len);
555 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
558 PUSHi( (I32)PL_forkprocess );
559 else if (PL_forkprocess == 0) /* we are a new child */
569 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
572 IO * const io = GvIO(gv);
574 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
577 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
580 call_method("CLOSE", G_SCALAR);
588 PUSHs(boolSV(do_close(gv, TRUE)));
601 GV * const wgv = MUTABLE_GV(POPs);
602 GV * const rgv = MUTABLE_GV(POPs);
607 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
608 DIE(aTHX_ PL_no_usym, "filehandle");
613 do_close(rgv, FALSE);
615 do_close(wgv, FALSE);
617 if (PerlProc_pipe(fd) < 0)
620 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
621 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
622 IoOFP(rstio) = IoIFP(rstio);
623 IoIFP(wstio) = IoOFP(wstio);
624 IoTYPE(rstio) = IoTYPE_RDONLY;
625 IoTYPE(wstio) = IoTYPE_WRONLY;
627 if (!IoIFP(rstio) || !IoOFP(wstio)) {
629 PerlIO_close(IoIFP(rstio));
631 PerlLIO_close(fd[0]);
633 PerlIO_close(IoOFP(wstio));
635 PerlLIO_close(fd[1]);
638 #if defined(HAS_FCNTL) && defined(F_SETFD)
639 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
640 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
647 DIE(aTHX_ PL_no_func, "pipe");
661 gv = MUTABLE_GV(POPs);
663 if (gv && (io = GvIO(gv))
664 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
667 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
670 call_method("FILENO", G_SCALAR);
676 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
677 /* Can't do this because people seem to do things like
678 defined(fileno($foo)) to check whether $foo is a valid fh.
679 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
680 report_evil_fh(gv, io, PL_op->op_type);
685 PUSHi(PerlIO_fileno(fp));
698 anum = PerlLIO_umask(022);
699 /* setting it to 022 between the two calls to umask avoids
700 * to have a window where the umask is set to 0 -- meaning
701 * that another thread could create world-writeable files. */
703 (void)PerlLIO_umask(anum);
706 anum = PerlLIO_umask(POPi);
707 TAINT_PROPER("umask");
710 /* Only DIE if trying to restrict permissions on "user" (self).
711 * Otherwise it's harmless and more useful to just return undef
712 * since 'group' and 'other' concepts probably don't exist here. */
713 if (MAXARG >= 1 && (POPi & 0700))
714 DIE(aTHX_ "umask not implemented");
715 XPUSHs(&PL_sv_undef);
734 gv = MUTABLE_GV(POPs);
736 if (gv && (io = GvIO(gv))) {
737 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
740 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
745 call_method("BINMODE", G_SCALAR);
753 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
754 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
755 report_evil_fh(gv, io, PL_op->op_type);
756 SETERRNO(EBADF,RMS_IFI);
763 const char *d = NULL;
766 d = SvPV_const(discp, len);
767 mode = mode_from_discipline(d, len);
768 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
769 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
770 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
791 const I32 markoff = MARK - PL_stack_base;
792 const char *methname;
793 int how = PERL_MAGIC_tied;
797 switch(SvTYPE(varsv)) {
799 methname = "TIEHASH";
800 HvEITER_set(MUTABLE_HV(varsv), 0);
803 methname = "TIEARRAY";
806 if (isGV_with_GP(varsv)) {
807 #ifdef GV_UNIQUE_CHECK
808 if (GvUNIQUE((const GV *)varsv)) {
809 Perl_croak(aTHX_ "Attempt to tie unique GV");
812 methname = "TIEHANDLE";
813 how = PERL_MAGIC_tiedscalar;
814 /* For tied filehandles, we apply tiedscalar magic to the IO
815 slot of the GP rather than the GV itself. AMS 20010812 */
817 GvIOp(varsv) = newIO();
818 varsv = MUTABLE_SV(GvIOp(varsv));
823 methname = "TIESCALAR";
824 how = PERL_MAGIC_tiedscalar;
828 if (sv_isobject(*MARK)) { /* Calls GET magic. */
830 PUSHSTACKi(PERLSI_MAGIC);
832 EXTEND(SP,(I32)items);
836 call_method(methname, G_SCALAR);
839 /* Not clear why we don't call call_method here too.
840 * perhaps to get different error message ?
843 const char *name = SvPV_nomg_const(*MARK, len);
844 stash = gv_stashpvn(name, len, 0);
845 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
846 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
847 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
850 PUSHSTACKi(PERLSI_MAGIC);
852 EXTEND(SP,(I32)items);
856 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
862 if (sv_isobject(sv)) {
863 sv_unmagic(varsv, how);
864 /* Croak if a self-tie on an aggregate is attempted. */
865 if (varsv == SvRV(sv) &&
866 (SvTYPE(varsv) == SVt_PVAV ||
867 SvTYPE(varsv) == SVt_PVHV))
869 "Self-ties of arrays and hashes are not supported");
870 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
873 SP = PL_stack_base + markoff;
883 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
884 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
886 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
889 if ((mg = SvTIED_mg(sv, how))) {
890 SV * const obj = SvRV(SvTIED_obj(sv, mg));
892 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
894 if (gv && isGV(gv) && (cv = GvCV(gv))) {
896 XPUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
897 mXPUSHi(SvREFCNT(obj) - 1);
900 call_sv(MUTABLE_SV(cv), G_VOID);
904 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
905 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
906 "untie attempted while %"UVuf" inner references still exist",
907 (UV)SvREFCNT(obj) - 1 ) ;
911 sv_unmagic(sv, how) ;
921 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
922 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
924 if (isGV_with_GP(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
927 if ((mg = SvTIED_mg(sv, how))) {
928 SV *osv = SvTIED_obj(sv, mg);
929 if (osv == mg->mg_obj)
930 osv = sv_mortalcopy(osv);
944 HV * const hv = MUTABLE_HV(POPs);
945 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
946 stash = gv_stashsv(sv, 0);
947 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
949 require_pv("AnyDBM_File.pm");
951 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
952 DIE(aTHX_ "No dbm on this machine");
962 mPUSHu(O_RDWR|O_CREAT);
967 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
970 if (!sv_isobject(TOPs)) {
978 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
982 if (sv_isobject(TOPs)) {
983 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
984 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1001 struct timeval timebuf;
1002 struct timeval *tbuf = &timebuf;
1005 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1010 # if BYTEORDER & 0xf0000
1011 # define ORDERBYTE (0x88888888 - BYTEORDER)
1013 # define ORDERBYTE (0x4444 - BYTEORDER)
1019 for (i = 1; i <= 3; i++) {
1020 SV * const sv = SP[i];
1023 if (SvREADONLY(sv)) {
1025 sv_force_normal_flags(sv, 0);
1026 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1027 DIE(aTHX_ "%s", PL_no_modify);
1030 if (ckWARN(WARN_MISC))
1031 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1032 SvPV_force_nolen(sv); /* force string conversion */
1039 /* little endians can use vecs directly */
1040 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1047 masksize = NFDBITS / NBBY;
1049 masksize = sizeof(long); /* documented int, everyone seems to use long */
1051 Zero(&fd_sets[0], 4, char*);
1054 # if SELECT_MIN_BITS == 1
1055 growsize = sizeof(fd_set);
1057 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1058 # undef SELECT_MIN_BITS
1059 # define SELECT_MIN_BITS __FD_SETSIZE
1061 /* If SELECT_MIN_BITS is greater than one we most probably will want
1062 * to align the sizes with SELECT_MIN_BITS/8 because for example
1063 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1064 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1065 * on (sets/tests/clears bits) is 32 bits. */
1066 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1074 timebuf.tv_sec = (long)value;
1075 value -= (NV)timebuf.tv_sec;
1076 timebuf.tv_usec = (long)(value * 1000000.0);
1081 for (i = 1; i <= 3; i++) {
1083 if (!SvOK(sv) || SvCUR(sv) == 0) {
1090 Sv_Grow(sv, growsize);
1094 while (++j <= growsize) {
1098 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1100 Newx(fd_sets[i], growsize, char);
1101 for (offset = 0; offset < growsize; offset += masksize) {
1102 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1103 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1106 fd_sets[i] = SvPVX(sv);
1110 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1111 /* Can't make just the (void*) conditional because that would be
1112 * cpp #if within cpp macro, and not all compilers like that. */
1113 nfound = PerlSock_select(
1115 (Select_fd_set_t) fd_sets[1],
1116 (Select_fd_set_t) fd_sets[2],
1117 (Select_fd_set_t) fd_sets[3],
1118 (void*) tbuf); /* Workaround for compiler bug. */
1120 nfound = PerlSock_select(
1122 (Select_fd_set_t) fd_sets[1],
1123 (Select_fd_set_t) fd_sets[2],
1124 (Select_fd_set_t) fd_sets[3],
1127 for (i = 1; i <= 3; i++) {
1130 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1132 for (offset = 0; offset < growsize; offset += masksize) {
1133 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1134 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1136 Safefree(fd_sets[i]);
1143 if (GIMME == G_ARRAY && tbuf) {
1144 value = (NV)(timebuf.tv_sec) +
1145 (NV)(timebuf.tv_usec) / 1000000.0;
1150 DIE(aTHX_ "select not implemented");
1155 =for apidoc setdefout
1157 Sets PL_defoutgv, the default file handle for output, to the passed in
1158 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1159 count of the passed in typeglob is increased by one, and the reference count
1160 of the typeglob that PL_defoutgv points to is decreased by one.
1166 Perl_setdefout(pTHX_ GV *gv)
1169 SvREFCNT_inc_simple_void(gv);
1171 SvREFCNT_dec(PL_defoutgv);
1179 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1180 GV * egv = GvEGV(PL_defoutgv);
1186 XPUSHs(&PL_sv_undef);
1188 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1189 if (gvp && *gvp == egv) {
1190 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1194 mXPUSHs(newRV(MUTABLE_SV(egv)));
1199 if (!GvIO(newdefout))
1200 gv_IOadd(newdefout);
1201 setdefout(newdefout);
1211 GV * const gv = (MAXARG==0) ? PL_stdingv : MUTABLE_GV(POPs);
1213 if (gv && (io = GvIO(gv))) {
1214 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1216 const I32 gimme = GIMME_V;
1218 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
1221 call_method("GETC", gimme);
1224 if (gimme == G_SCALAR)
1225 SvSetMagicSV_nosteal(TARG, TOPs);
1229 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1230 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1231 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1232 report_evil_fh(gv, io, PL_op->op_type);
1233 SETERRNO(EBADF,RMS_IFI);
1237 sv_setpvs(TARG, " ");
1238 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1239 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1240 /* Find out how many bytes the char needs */
1241 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1244 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1245 SvCUR_set(TARG,1+len);
1254 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1257 register PERL_CONTEXT *cx;
1258 const I32 gimme = GIMME_V;
1260 PERL_ARGS_ASSERT_DOFORM;
1265 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1266 PUSHFORMAT(cx, retop);
1268 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1270 setdefout(gv); /* locally select filehandle so $% et al work */
1287 gv = MUTABLE_GV(POPs);
1302 goto not_a_format_reference;
1307 tmpsv = sv_newmortal();
1308 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1309 name = SvPV_nolen_const(tmpsv);
1311 DIE(aTHX_ "Undefined format \"%s\" called", name);
1313 not_a_format_reference:
1314 DIE(aTHX_ "Not a format reference");
1317 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1319 IoFLAGS(io) &= ~IOf_DIDTOP;
1320 return doform(cv,gv,PL_op->op_next);
1326 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1327 register IO * const io = GvIOp(gv);
1332 register PERL_CONTEXT *cx;
1334 if (!io || !(ofp = IoOFP(io)))
1337 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1338 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1340 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1341 PL_formtarget != PL_toptarget)
1345 if (!IoTOP_GV(io)) {
1348 if (!IoTOP_NAME(io)) {
1350 if (!IoFMT_NAME(io))
1351 IoFMT_NAME(io) = savepv(GvNAME(gv));
1352 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1353 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1354 if ((topgv && GvFORM(topgv)) ||
1355 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1356 IoTOP_NAME(io) = savesvpv(topname);
1358 IoTOP_NAME(io) = savepvs("top");
1360 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1361 if (!topgv || !GvFORM(topgv)) {
1362 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1365 IoTOP_GV(io) = topgv;
1367 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1368 I32 lines = IoLINES_LEFT(io);
1369 const char *s = SvPVX_const(PL_formtarget);
1370 if (lines <= 0) /* Yow, header didn't even fit!!! */
1372 while (lines-- > 0) {
1373 s = strchr(s, '\n');
1379 const STRLEN save = SvCUR(PL_formtarget);
1380 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1381 do_print(PL_formtarget, ofp);
1382 SvCUR_set(PL_formtarget, save);
1383 sv_chop(PL_formtarget, s);
1384 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1387 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1388 do_print(PL_formfeed, ofp);
1389 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1391 PL_formtarget = PL_toptarget;
1392 IoFLAGS(io) |= IOf_DIDTOP;
1395 DIE(aTHX_ "bad top format reference");
1398 SV * const sv = sv_newmortal();
1400 gv_efullname4(sv, fgv, NULL, FALSE);
1401 name = SvPV_nolen_const(sv);
1403 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1405 DIE(aTHX_ "Undefined top format called");
1407 if (cv && CvCLONE(cv))
1408 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1409 return doform(cv, gv, PL_op);
1413 POPBLOCK(cx,PL_curpm);
1419 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1421 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1422 else if (ckWARN(WARN_CLOSED))
1423 report_evil_fh(gv, io, PL_op->op_type);
1428 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1429 if (ckWARN(WARN_IO))
1430 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1432 if (!do_print(PL_formtarget, fp))
1435 FmLINES(PL_formtarget) = 0;
1436 SvCUR_set(PL_formtarget, 0);
1437 *SvEND(PL_formtarget) = '\0';
1438 if (IoFLAGS(io) & IOf_FLUSH)
1439 (void)PerlIO_flush(fp);
1444 PL_formtarget = PL_bodytarget;
1446 PERL_UNUSED_VAR(newsp);
1447 PERL_UNUSED_VAR(gimme);
1448 return cx->blk_sub.retop;
1453 dVAR; dSP; dMARK; dORIGMARK;
1459 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1461 if (gv && (io = GvIO(gv))) {
1462 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1464 if (MARK == ORIGMARK) {
1467 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1471 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1474 call_method("PRINTF", G_SCALAR);
1477 MARK = ORIGMARK + 1;
1485 if (!(io = GvIO(gv))) {
1486 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1487 report_evil_fh(gv, io, PL_op->op_type);
1488 SETERRNO(EBADF,RMS_IFI);
1491 else if (!(fp = IoOFP(io))) {
1492 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1494 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1495 else if (ckWARN(WARN_CLOSED))
1496 report_evil_fh(gv, io, PL_op->op_type);
1498 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1502 if (SvTAINTED(MARK[1]))
1503 TAINT_PROPER("printf");
1504 do_sprintf(sv, SP - MARK, MARK + 1);
1505 if (!do_print(sv, fp))
1508 if (IoFLAGS(io) & IOf_FLUSH)
1509 if (PerlIO_flush(fp) == EOF)
1520 PUSHs(&PL_sv_undef);
1528 const int perm = (MAXARG > 3) ? POPi : 0666;
1529 const int mode = POPi;
1530 SV * const sv = POPs;
1531 GV * const gv = MUTABLE_GV(POPs);
1534 /* Need TIEHANDLE method ? */
1535 const char * const tmps = SvPV_const(sv, len);
1536 /* FIXME? do_open should do const */
1537 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1538 IoLINES(GvIOp(gv)) = 0;
1542 PUSHs(&PL_sv_undef);
1549 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1555 Sock_size_t bufsize;
1563 bool charstart = FALSE;
1564 STRLEN charskip = 0;
1567 GV * const gv = MUTABLE_GV(*++MARK);
1568 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1569 && gv && (io = GvIO(gv)) )
1571 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1575 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1577 call_method("READ", G_SCALAR);
1591 sv_setpvs(bufsv, "");
1592 length = SvIVx(*++MARK);
1595 offset = SvIVx(*++MARK);
1599 if (!io || !IoIFP(io)) {
1600 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1601 report_evil_fh(gv, io, PL_op->op_type);
1602 SETERRNO(EBADF,RMS_IFI);
1605 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1606 buffer = SvPVutf8_force(bufsv, blen);
1607 /* UTF-8 may not have been set if they are all low bytes */
1612 buffer = SvPV_force(bufsv, blen);
1613 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1616 DIE(aTHX_ "Negative length");
1624 if (PL_op->op_type == OP_RECV) {
1625 char namebuf[MAXPATHLEN];
1626 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1627 bufsize = sizeof (struct sockaddr_in);
1629 bufsize = sizeof namebuf;
1631 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1635 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1636 /* 'offset' means 'flags' here */
1637 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1638 (struct sockaddr *)namebuf, &bufsize);
1642 /* Bogus return without padding */
1643 bufsize = sizeof (struct sockaddr_in);
1645 SvCUR_set(bufsv, count);
1646 *SvEND(bufsv) = '\0';
1647 (void)SvPOK_only(bufsv);
1651 /* This should not be marked tainted if the fp is marked clean */
1652 if (!(IoFLAGS(io) & IOf_UNTAINT))
1653 SvTAINTED_on(bufsv);
1655 sv_setpvn(TARG, namebuf, bufsize);
1660 if (PL_op->op_type == OP_RECV)
1661 DIE(aTHX_ PL_no_sock_func, "recv");
1663 if (DO_UTF8(bufsv)) {
1664 /* offset adjust in characters not bytes */
1665 blen = sv_len_utf8(bufsv);
1668 if (-offset > (int)blen)
1669 DIE(aTHX_ "Offset outside string");
1672 if (DO_UTF8(bufsv)) {
1673 /* convert offset-as-chars to offset-as-bytes */
1674 if (offset >= (int)blen)
1675 offset += SvCUR(bufsv) - blen;
1677 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1680 bufsize = SvCUR(bufsv);
1681 /* Allocating length + offset + 1 isn't perfect in the case of reading
1682 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1684 (should be 2 * length + offset + 1, or possibly something longer if
1685 PL_encoding is true) */
1686 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1687 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1688 Zero(buffer+bufsize, offset-bufsize, char);
1690 buffer = buffer + offset;
1692 read_target = bufsv;
1694 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1695 concatenate it to the current buffer. */
1697 /* Truncate the existing buffer to the start of where we will be
1699 SvCUR_set(bufsv, offset);
1701 read_target = sv_newmortal();
1702 SvUPGRADE(read_target, SVt_PV);
1703 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1706 if (PL_op->op_type == OP_SYSREAD) {
1707 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1708 if (IoTYPE(io) == IoTYPE_SOCKET) {
1709 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1715 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1720 #ifdef HAS_SOCKET__bad_code_maybe
1721 if (IoTYPE(io) == IoTYPE_SOCKET) {
1722 char namebuf[MAXPATHLEN];
1723 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1724 bufsize = sizeof (struct sockaddr_in);
1726 bufsize = sizeof namebuf;
1728 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1729 (struct sockaddr *)namebuf, &bufsize);
1734 count = PerlIO_read(IoIFP(io), buffer, length);
1735 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1736 if (count == 0 && PerlIO_error(IoIFP(io)))
1740 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1741 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1744 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1745 *SvEND(read_target) = '\0';
1746 (void)SvPOK_only(read_target);
1747 if (fp_utf8 && !IN_BYTES) {
1748 /* Look at utf8 we got back and count the characters */
1749 const char *bend = buffer + count;
1750 while (buffer < bend) {
1752 skip = UTF8SKIP(buffer);
1755 if (buffer - charskip + skip > bend) {
1756 /* partial character - try for rest of it */
1757 length = skip - (bend-buffer);
1758 offset = bend - SvPVX_const(bufsv);
1770 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1771 provided amount read (count) was what was requested (length)
1773 if (got < wanted && count == length) {
1774 length = wanted - got;
1775 offset = bend - SvPVX_const(bufsv);
1778 /* return value is character count */
1782 else if (buffer_utf8) {
1783 /* Let svcatsv upgrade the bytes we read in to utf8.
1784 The buffer is a mortal so will be freed soon. */
1785 sv_catsv_nomg(bufsv, read_target);
1788 /* This should not be marked tainted if the fp is marked clean */
1789 if (!(IoFLAGS(io) & IOf_UNTAINT))
1790 SvTAINTED_on(bufsv);
1802 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1808 STRLEN orig_blen_bytes;
1809 const int op_type = PL_op->op_type;
1813 GV *const gv = MUTABLE_GV(*++MARK);
1814 if (PL_op->op_type == OP_SYSWRITE
1815 && gv && (io = GvIO(gv))) {
1816 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1820 if (MARK == SP - 1) {
1822 sv = sv_2mortal(newSViv(sv_len(*SP)));
1828 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1830 call_method("WRITE", G_SCALAR);
1846 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1848 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1849 if (io && IoIFP(io))
1850 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1852 report_evil_fh(gv, io, PL_op->op_type);
1854 SETERRNO(EBADF,RMS_IFI);
1858 /* Do this first to trigger any overloading. */
1859 buffer = SvPV_const(bufsv, blen);
1860 orig_blen_bytes = blen;
1861 doing_utf8 = DO_UTF8(bufsv);
1863 if (PerlIO_isutf8(IoIFP(io))) {
1864 if (!SvUTF8(bufsv)) {
1865 /* We don't modify the original scalar. */
1866 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1867 buffer = (char *) tmpbuf;
1871 else if (doing_utf8) {
1872 STRLEN tmplen = blen;
1873 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1876 buffer = (char *) tmpbuf;
1880 assert((char *)result == buffer);
1881 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1885 if (op_type == OP_SYSWRITE) {
1886 Size_t length = 0; /* This length is in characters. */
1892 /* The SV is bytes, and we've had to upgrade it. */
1893 blen_chars = orig_blen_bytes;
1895 /* The SV really is UTF-8. */
1896 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1897 /* Don't call sv_len_utf8 again because it will call magic
1898 or overloading a second time, and we might get back a
1899 different result. */
1900 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1902 /* It's safe, and it may well be cached. */
1903 blen_chars = sv_len_utf8(bufsv);
1911 length = blen_chars;
1913 #if Size_t_size > IVSIZE
1914 length = (Size_t)SvNVx(*++MARK);
1916 length = (Size_t)SvIVx(*++MARK);
1918 if ((SSize_t)length < 0) {
1920 DIE(aTHX_ "Negative length");
1925 offset = SvIVx(*++MARK);
1927 if (-offset > (IV)blen_chars) {
1929 DIE(aTHX_ "Offset outside string");
1931 offset += blen_chars;
1932 } else if (offset >= (IV)blen_chars && blen_chars > 0) {
1934 DIE(aTHX_ "Offset outside string");
1938 if (length > blen_chars - offset)
1939 length = blen_chars - offset;
1941 /* Here we convert length from characters to bytes. */
1942 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1943 /* Either we had to convert the SV, or the SV is magical, or
1944 the SV has overloading, in which case we can't or mustn't
1945 or mustn't call it again. */
1947 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1948 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1950 /* It's a real UTF-8 SV, and it's not going to change under
1951 us. Take advantage of any cache. */
1953 I32 len_I32 = length;
1955 /* Convert the start and end character positions to bytes.
1956 Remember that the second argument to sv_pos_u2b is relative
1958 sv_pos_u2b(bufsv, &start, &len_I32);
1965 buffer = buffer+offset;
1967 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1968 if (IoTYPE(io) == IoTYPE_SOCKET) {
1969 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1975 /* See the note at doio.c:do_print about filesize limits. --jhi */
1976 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1982 const int flags = SvIVx(*++MARK);
1985 char * const sockbuf = SvPVx(*++MARK, mlen);
1986 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1987 flags, (struct sockaddr *)sockbuf, mlen);
1991 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1996 DIE(aTHX_ PL_no_sock_func, "send");
2003 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2006 #if Size_t_size > IVSIZE
2027 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2028 else if (PL_op->op_flags & OPf_SPECIAL)
2029 gv = PL_last_in_gv = GvEGV(PL_argvgv); /* eof() - ARGV magic */
2031 gv = PL_last_in_gv; /* eof */
2036 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2038 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2040 * in Perl 5.12 and later, the additional paramter is a bitmask:
2043 * 2 = eof() <- ARGV magic
2046 mPUSHi(1); /* 1 = eof(FH) - simple, explicit FH */
2047 else if (PL_op->op_flags & OPf_SPECIAL)
2048 mPUSHi(2); /* 2 = eof() - ARGV magic */
2050 mPUSHi(0); /* 0 = eof - simple, implicit FH */
2053 call_method("EOF", G_SCALAR);
2059 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2060 if (io && !IoIFP(io)) {
2061 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2063 IoFLAGS(io) &= ~IOf_START;
2064 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2066 sv_setpvs(GvSV(gv), "-");
2068 GvSV(gv) = newSVpvs("-");
2069 SvSETMAGIC(GvSV(gv));
2071 else if (!nextargv(gv))
2076 PUSHs(boolSV(do_eof(gv)));
2087 PL_last_in_gv = MUTABLE_GV(POPs);
2090 if (gv && (io = GvIO(gv))) {
2091 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2094 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2097 call_method("TELL", G_SCALAR);
2104 #if LSEEKSIZE > IVSIZE
2105 PUSHn( do_tell(gv) );
2107 PUSHi( do_tell(gv) );
2115 const int whence = POPi;
2116 #if LSEEKSIZE > IVSIZE
2117 const Off_t offset = (Off_t)SvNVx(POPs);
2119 const Off_t offset = (Off_t)SvIVx(POPs);
2122 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2125 if (gv && (io = GvIO(gv))) {
2126 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2129 XPUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
2130 #if LSEEKSIZE > IVSIZE
2131 mXPUSHn((NV) offset);
2138 call_method("SEEK", G_SCALAR);
2145 if (PL_op->op_type == OP_SEEK)
2146 PUSHs(boolSV(do_seek(gv, offset, whence)));
2148 const Off_t sought = do_sysseek(gv, offset, whence);
2150 PUSHs(&PL_sv_undef);
2152 SV* const sv = sought ?
2153 #if LSEEKSIZE > IVSIZE
2158 : newSVpvn(zero_but_true, ZBTLEN);
2169 /* There seems to be no consensus on the length type of truncate()
2170 * and ftruncate(), both off_t and size_t have supporters. In
2171 * general one would think that when using large files, off_t is
2172 * at least as wide as size_t, so using an off_t should be okay. */
2173 /* XXX Configure probe for the length type of *truncate() needed XXX */
2176 #if Off_t_size > IVSIZE
2181 /* Checking for length < 0 is problematic as the type might or
2182 * might not be signed: if it is not, clever compilers will moan. */
2183 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2190 if (PL_op->op_flags & OPf_SPECIAL) {
2191 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2200 TAINT_PROPER("truncate");
2201 if (!(fp = IoIFP(io))) {
2207 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2209 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2216 SV * const sv = POPs;
2219 if (isGV_with_GP(sv)) {
2220 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2221 goto do_ftruncate_gv;
2223 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2224 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2225 goto do_ftruncate_gv;
2227 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2228 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2229 goto do_ftruncate_io;
2232 name = SvPV_nolen_const(sv);
2233 TAINT_PROPER("truncate");
2235 if (truncate(name, len) < 0)
2239 const int tmpfd = PerlLIO_open(name, O_RDWR);
2244 if (my_chsize(tmpfd, len) < 0)
2246 PerlLIO_close(tmpfd);
2255 SETERRNO(EBADF,RMS_IFI);
2263 SV * const argsv = POPs;
2264 const unsigned int func = POPu;
2265 const int optype = PL_op->op_type;
2266 GV * const gv = MUTABLE_GV(POPs);
2267 IO * const io = gv ? GvIOn(gv) : NULL;
2271 if (!io || !argsv || !IoIFP(io)) {
2272 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2273 report_evil_fh(gv, io, PL_op->op_type);
2274 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2278 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2281 s = SvPV_force(argsv, len);
2282 need = IOCPARM_LEN(func);
2284 s = Sv_Grow(argsv, need + 1);
2285 SvCUR_set(argsv, need);
2288 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2291 retval = SvIV(argsv);
2292 s = INT2PTR(char*,retval); /* ouch */
2295 TAINT_PROPER(PL_op_desc[optype]);
2297 if (optype == OP_IOCTL)
2299 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2301 DIE(aTHX_ "ioctl is not implemented");
2305 DIE(aTHX_ "fcntl is not implemented");
2307 #if defined(OS2) && defined(__EMX__)
2308 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2310 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2314 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2316 if (s[SvCUR(argsv)] != 17)
2317 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2319 s[SvCUR(argsv)] = 0; /* put our null back */
2320 SvSETMAGIC(argsv); /* Assume it has changed */
2329 PUSHp(zero_but_true, ZBTLEN);
2342 const int argtype = POPi;
2343 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2345 if (gv && (io = GvIO(gv)))
2351 /* XXX Looks to me like io is always NULL at this point */
2353 (void)PerlIO_flush(fp);
2354 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2357 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2358 report_evil_fh(gv, io, PL_op->op_type);
2360 SETERRNO(EBADF,RMS_IFI);
2365 DIE(aTHX_ PL_no_func, "flock()");
2375 const int protocol = POPi;
2376 const int type = POPi;
2377 const int domain = POPi;
2378 GV * const gv = MUTABLE_GV(POPs);
2379 register IO * const io = gv ? GvIOn(gv) : NULL;
2383 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2384 report_evil_fh(gv, io, PL_op->op_type);
2385 if (io && IoIFP(io))
2386 do_close(gv, FALSE);
2387 SETERRNO(EBADF,LIB_INVARG);
2392 do_close(gv, FALSE);
2394 TAINT_PROPER("socket");
2395 fd = PerlSock_socket(domain, type, protocol);
2398 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2399 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2400 IoTYPE(io) = IoTYPE_SOCKET;
2401 if (!IoIFP(io) || !IoOFP(io)) {
2402 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2403 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2404 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2407 #if defined(HAS_FCNTL) && defined(F_SETFD)
2408 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2412 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2417 DIE(aTHX_ PL_no_sock_func, "socket");
2423 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2425 const int protocol = POPi;
2426 const int type = POPi;
2427 const int domain = POPi;
2428 GV * const gv2 = MUTABLE_GV(POPs);
2429 GV * const gv1 = MUTABLE_GV(POPs);
2430 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2431 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2434 if (!gv1 || !gv2 || !io1 || !io2) {
2435 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2437 report_evil_fh(gv1, io1, PL_op->op_type);
2439 report_evil_fh(gv1, io2, PL_op->op_type);
2441 if (io1 && IoIFP(io1))
2442 do_close(gv1, FALSE);
2443 if (io2 && IoIFP(io2))
2444 do_close(gv2, FALSE);
2449 do_close(gv1, FALSE);
2451 do_close(gv2, FALSE);
2453 TAINT_PROPER("socketpair");
2454 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2456 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2457 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2458 IoTYPE(io1) = IoTYPE_SOCKET;
2459 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2460 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2461 IoTYPE(io2) = IoTYPE_SOCKET;
2462 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2463 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2464 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2465 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2466 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2467 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2468 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2471 #if defined(HAS_FCNTL) && defined(F_SETFD)
2472 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2473 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2478 DIE(aTHX_ PL_no_sock_func, "socketpair");
2486 SV * const addrsv = POPs;
2487 /* OK, so on what platform does bind modify addr? */
2489 GV * const gv = MUTABLE_GV(POPs);
2490 register IO * const io = GvIOn(gv);
2493 if (!io || !IoIFP(io))
2496 addr = SvPV_const(addrsv, len);
2497 TAINT_PROPER("bind");
2498 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2504 if (ckWARN(WARN_CLOSED))
2505 report_evil_fh(gv, io, PL_op->op_type);
2506 SETERRNO(EBADF,SS_IVCHAN);
2509 DIE(aTHX_ PL_no_sock_func, "bind");
2517 SV * const addrsv = POPs;
2518 GV * const gv = MUTABLE_GV(POPs);
2519 register IO * const io = GvIOn(gv);
2523 if (!io || !IoIFP(io))
2526 addr = SvPV_const(addrsv, len);
2527 TAINT_PROPER("connect");
2528 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2534 if (ckWARN(WARN_CLOSED))
2535 report_evil_fh(gv, io, PL_op->op_type);
2536 SETERRNO(EBADF,SS_IVCHAN);
2539 DIE(aTHX_ PL_no_sock_func, "connect");
2547 const int backlog = POPi;
2548 GV * const gv = MUTABLE_GV(POPs);
2549 register IO * const io = gv ? GvIOn(gv) : NULL;
2551 if (!gv || !io || !IoIFP(io))
2554 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2560 if (ckWARN(WARN_CLOSED))
2561 report_evil_fh(gv, io, PL_op->op_type);
2562 SETERRNO(EBADF,SS_IVCHAN);
2565 DIE(aTHX_ PL_no_sock_func, "listen");
2575 char namebuf[MAXPATHLEN];
2576 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2577 Sock_size_t len = sizeof (struct sockaddr_in);
2579 Sock_size_t len = sizeof namebuf;
2581 GV * const ggv = MUTABLE_GV(POPs);
2582 GV * const ngv = MUTABLE_GV(POPs);
2591 if (!gstio || !IoIFP(gstio))
2595 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2598 /* Some platforms indicate zero length when an AF_UNIX client is
2599 * not bound. Simulate a non-zero-length sockaddr structure in
2601 namebuf[0] = 0; /* sun_len */
2602 namebuf[1] = AF_UNIX; /* sun_family */
2610 do_close(ngv, FALSE);
2611 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2612 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2613 IoTYPE(nstio) = IoTYPE_SOCKET;
2614 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2615 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2616 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2617 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2620 #if defined(HAS_FCNTL) && defined(F_SETFD)
2621 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2625 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2626 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2628 #ifdef __SCO_VERSION__
2629 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2632 PUSHp(namebuf, len);
2636 if (ckWARN(WARN_CLOSED))
2637 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2638 SETERRNO(EBADF,SS_IVCHAN);
2644 DIE(aTHX_ PL_no_sock_func, "accept");
2652 const int how = POPi;
2653 GV * const gv = MUTABLE_GV(POPs);
2654 register IO * const io = GvIOn(gv);
2656 if (!io || !IoIFP(io))
2659 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2663 if (ckWARN(WARN_CLOSED))
2664 report_evil_fh(gv, io, PL_op->op_type);
2665 SETERRNO(EBADF,SS_IVCHAN);
2668 DIE(aTHX_ PL_no_sock_func, "shutdown");
2676 const int optype = PL_op->op_type;
2677 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2678 const unsigned int optname = (unsigned int) POPi;
2679 const unsigned int lvl = (unsigned int) POPi;
2680 GV * const gv = MUTABLE_GV(POPs);
2681 register IO * const io = GvIOn(gv);
2685 if (!io || !IoIFP(io))
2688 fd = PerlIO_fileno(IoIFP(io));
2692 (void)SvPOK_only(sv);
2696 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2703 #if defined(__SYMBIAN32__)
2704 # define SETSOCKOPT_OPTION_VALUE_T void *
2706 # define SETSOCKOPT_OPTION_VALUE_T const char *
2708 /* XXX TODO: We need to have a proper type (a Configure probe,
2709 * etc.) for what the C headers think of the third argument of
2710 * setsockopt(), the option_value read-only buffer: is it
2711 * a "char *", or a "void *", const or not. Some compilers
2712 * don't take kindly to e.g. assuming that "char *" implicitly
2713 * promotes to a "void *", or to explicitly promoting/demoting
2714 * consts to non/vice versa. The "const void *" is the SUS
2715 * definition, but that does not fly everywhere for the above
2717 SETSOCKOPT_OPTION_VALUE_T buf;
2721 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2725 aint = (int)SvIV(sv);
2726 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2729 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2738 if (ckWARN(WARN_CLOSED))
2739 report_evil_fh(gv, io, optype);
2740 SETERRNO(EBADF,SS_IVCHAN);
2745 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2753 const int optype = PL_op->op_type;
2754 GV * const gv = MUTABLE_GV(POPs);
2755 register IO * const io = GvIOn(gv);
2760 if (!io || !IoIFP(io))
2763 sv = sv_2mortal(newSV(257));
2764 (void)SvPOK_only(sv);
2768 fd = PerlIO_fileno(IoIFP(io));
2770 case OP_GETSOCKNAME:
2771 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2774 case OP_GETPEERNAME:
2775 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2777 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2779 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";
2780 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2781 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2782 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2783 sizeof(u_short) + sizeof(struct in_addr))) {
2790 #ifdef BOGUS_GETNAME_RETURN
2791 /* Interactive Unix, getpeername() and getsockname()
2792 does not return valid namelen */
2793 if (len == BOGUS_GETNAME_RETURN)
2794 len = sizeof(struct sockaddr);
2802 if (ckWARN(WARN_CLOSED))
2803 report_evil_fh(gv, io, optype);
2804 SETERRNO(EBADF,SS_IVCHAN);
2809 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2824 if (PL_op->op_flags & OPf_REF) {
2826 if (PL_op->op_type == OP_LSTAT) {
2827 if (gv != PL_defgv) {
2828 do_fstat_warning_check:
2829 if (ckWARN(WARN_IO))
2830 Perl_warner(aTHX_ packWARN(WARN_IO),
2831 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2832 } else if (PL_laststype != OP_LSTAT)
2833 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2837 if (gv != PL_defgv) {
2838 PL_laststype = OP_STAT;
2840 sv_setpvs(PL_statname, "");
2847 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2848 } else if (IoDIRP(io)) {
2850 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2852 PL_laststatval = -1;
2858 if (PL_laststatval < 0) {
2859 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2860 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2865 SV* const sv = POPs;
2866 if (isGV_with_GP(sv)) {
2867 gv = MUTABLE_GV(sv);
2869 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2870 gv = MUTABLE_GV(SvRV(sv));
2871 if (PL_op->op_type == OP_LSTAT)
2872 goto do_fstat_warning_check;
2874 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2875 io = MUTABLE_IO(SvRV(sv));
2876 if (PL_op->op_type == OP_LSTAT)
2877 goto do_fstat_warning_check;
2878 goto do_fstat_have_io;
2881 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2883 PL_laststype = PL_op->op_type;
2884 if (PL_op->op_type == OP_LSTAT)
2885 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2887 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2888 if (PL_laststatval < 0) {
2889 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2890 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2896 if (gimme != G_ARRAY) {
2897 if (gimme != G_VOID)
2898 XPUSHs(boolSV(max));
2904 mPUSHi(PL_statcache.st_dev);
2905 mPUSHi(PL_statcache.st_ino);
2906 mPUSHu(PL_statcache.st_mode);
2907 mPUSHu(PL_statcache.st_nlink);
2908 #if Uid_t_size > IVSIZE
2909 mPUSHn(PL_statcache.st_uid);
2911 # if Uid_t_sign <= 0
2912 mPUSHi(PL_statcache.st_uid);
2914 mPUSHu(PL_statcache.st_uid);
2917 #if Gid_t_size > IVSIZE
2918 mPUSHn(PL_statcache.st_gid);
2920 # if Gid_t_sign <= 0
2921 mPUSHi(PL_statcache.st_gid);
2923 mPUSHu(PL_statcache.st_gid);
2926 #ifdef USE_STAT_RDEV
2927 mPUSHi(PL_statcache.st_rdev);
2929 PUSHs(newSVpvs_flags("", SVs_TEMP));
2931 #if Off_t_size > IVSIZE
2932 mPUSHn(PL_statcache.st_size);
2934 mPUSHi(PL_statcache.st_size);
2937 mPUSHn(PL_statcache.st_atime);
2938 mPUSHn(PL_statcache.st_mtime);
2939 mPUSHn(PL_statcache.st_ctime);
2941 mPUSHi(PL_statcache.st_atime);
2942 mPUSHi(PL_statcache.st_mtime);
2943 mPUSHi(PL_statcache.st_ctime);
2945 #ifdef USE_STAT_BLOCKS
2946 mPUSHu(PL_statcache.st_blksize);
2947 mPUSHu(PL_statcache.st_blocks);
2949 PUSHs(newSVpvs_flags("", SVs_TEMP));
2950 PUSHs(newSVpvs_flags("", SVs_TEMP));
2956 /* This macro is used by the stacked filetest operators :
2957 * if the previous filetest failed, short-circuit and pass its value.
2958 * Else, discard it from the stack and continue. --rgs
2960 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2961 if (!SvTRUE(TOPs)) { RETURN; } \
2962 else { (void)POPs; PUTBACK; } \
2969 /* Not const, because things tweak this below. Not bool, because there's
2970 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2971 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2972 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2973 /* Giving some sort of initial value silences compilers. */
2975 int access_mode = R_OK;
2977 int access_mode = 0;
2980 /* access_mode is never used, but leaving use_access in makes the
2981 conditional compiling below much clearer. */
2984 int stat_mode = S_IRUSR;
2986 bool effective = FALSE;
2989 STACKED_FTEST_CHECK;
2991 switch (PL_op->op_type) {
2993 #if !(defined(HAS_ACCESS) && defined(R_OK))
2999 #if defined(HAS_ACCESS) && defined(W_OK)
3004 stat_mode = S_IWUSR;
3008 #if defined(HAS_ACCESS) && defined(X_OK)
3013 stat_mode = S_IXUSR;
3017 #ifdef PERL_EFF_ACCESS
3020 stat_mode = S_IWUSR;
3024 #ifndef PERL_EFF_ACCESS
3031 #ifdef PERL_EFF_ACCESS
3036 stat_mode = S_IXUSR;
3042 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3043 const char *name = POPpx;
3045 # ifdef PERL_EFF_ACCESS
3046 result = PERL_EFF_ACCESS(name, access_mode);
3048 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3054 result = access(name, access_mode);
3056 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3071 if (cando(stat_mode, effective, &PL_statcache))
3080 const int op_type = PL_op->op_type;
3082 STACKED_FTEST_CHECK;
3087 if (op_type == OP_FTIS)
3090 /* You can't dTARGET inside OP_FTIS, because you'll get
3091 "panic: pad_sv po" - the op is not flagged to have a target. */
3095 #if Off_t_size > IVSIZE
3096 PUSHn(PL_statcache.st_size);
3098 PUSHi(PL_statcache.st_size);
3102 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3105 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3108 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3121 /* I believe that all these three are likely to be defined on most every
3122 system these days. */
3124 if(PL_op->op_type == OP_FTSUID)
3128 if(PL_op->op_type == OP_FTSGID)
3132 if(PL_op->op_type == OP_FTSVTX)
3136 STACKED_FTEST_CHECK;
3141 switch (PL_op->op_type) {
3143 if (PL_statcache.st_uid == PL_uid)
3147 if (PL_statcache.st_uid == PL_euid)
3151 if (PL_statcache.st_size == 0)
3155 if (S_ISSOCK(PL_statcache.st_mode))
3159 if (S_ISCHR(PL_statcache.st_mode))
3163 if (S_ISBLK(PL_statcache.st_mode))
3167 if (S_ISREG(PL_statcache.st_mode))
3171 if (S_ISDIR(PL_statcache.st_mode))
3175 if (S_ISFIFO(PL_statcache.st_mode))
3180 if (PL_statcache.st_mode & S_ISUID)
3186 if (PL_statcache.st_mode & S_ISGID)
3192 if (PL_statcache.st_mode & S_ISVTX)
3203 I32 result = my_lstat();
3207 if (S_ISLNK(PL_statcache.st_mode))
3220 STACKED_FTEST_CHECK;
3222 if (PL_op->op_flags & OPf_REF)
3224 else if (isGV(TOPs))
3225 gv = MUTABLE_GV(POPs);
3226 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3227 gv = MUTABLE_GV(SvRV(POPs));
3229 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3231 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3232 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3233 else if (tmpsv && SvOK(tmpsv)) {
3234 const char *tmps = SvPV_nolen_const(tmpsv);
3242 if (PerlLIO_isatty(fd))
3247 #if defined(atarist) /* this will work with atariST. Configure will
3248 make guesses for other systems. */
3249 # define FILE_base(f) ((f)->_base)
3250 # define FILE_ptr(f) ((f)->_ptr)
3251 # define FILE_cnt(f) ((f)->_cnt)
3252 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3263 register STDCHAR *s;
3269 STACKED_FTEST_CHECK;
3271 if (PL_op->op_flags & OPf_REF)
3273 else if (isGV(TOPs))
3274 gv = MUTABLE_GV(POPs);
3275 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3276 gv = MUTABLE_GV(SvRV(POPs));
3282 if (gv == PL_defgv) {
3284 io = GvIO(PL_statgv);
3287 goto really_filename;
3292 PL_laststatval = -1;
3293 sv_setpvs(PL_statname, "");
3294 io = GvIO(PL_statgv);
3296 if (io && IoIFP(io)) {
3297 if (! PerlIO_has_base(IoIFP(io)))
3298 DIE(aTHX_ "-T and -B not implemented on filehandles");
3299 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3300 if (PL_laststatval < 0)
3302 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3303 if (PL_op->op_type == OP_FTTEXT)
3308 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3309 i = PerlIO_getc(IoIFP(io));
3311 (void)PerlIO_ungetc(IoIFP(io),i);
3313 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3315 len = PerlIO_get_bufsiz(IoIFP(io));
3316 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3317 /* sfio can have large buffers - limit to 512 */
3322 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3324 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3326 SETERRNO(EBADF,RMS_IFI);
3334 PL_laststype = OP_STAT;
3335 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3336 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3337 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3339 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3342 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3343 if (PL_laststatval < 0) {
3344 (void)PerlIO_close(fp);
3347 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3348 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3349 (void)PerlIO_close(fp);
3351 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3352 RETPUSHNO; /* special case NFS directories */
3353 RETPUSHYES; /* null file is anything */
3358 /* now scan s to look for textiness */
3359 /* XXX ASCII dependent code */
3361 #if defined(DOSISH) || defined(USEMYBINMODE)
3362 /* ignore trailing ^Z on short files */
3363 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3367 for (i = 0; i < len; i++, s++) {
3368 if (!*s) { /* null never allowed in text */
3373 else if (!(isPRINT(*s) || isSPACE(*s)))
3376 else if (*s & 128) {
3378 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3381 /* utf8 characters don't count as odd */
3382 if (UTF8_IS_START(*s)) {
3383 int ulen = UTF8SKIP(s);
3384 if (ulen < len - i) {
3386 for (j = 1; j < ulen; j++) {
3387 if (!UTF8_IS_CONTINUATION(s[j]))
3390 --ulen; /* loop does extra increment */
3400 *s != '\n' && *s != '\r' && *s != '\b' &&
3401 *s != '\t' && *s != '\f' && *s != 27)
3406 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3417 const char *tmps = NULL;
3421 SV * const sv = POPs;
3422 if (PL_op->op_flags & OPf_SPECIAL) {
3423 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3425 else if (isGV_with_GP(sv)) {
3426 gv = MUTABLE_GV(sv);
3428 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3429 gv = MUTABLE_GV(SvRV(sv));
3432 tmps = SvPV_nolen_const(sv);
3436 if( !gv && (!tmps || !*tmps) ) {
3437 HV * const table = GvHVn(PL_envgv);
3440 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3441 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3443 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3448 deprecate("chdir('') or chdir(undef) as chdir()");
3449 tmps = SvPV_nolen_const(*svp);
3453 TAINT_PROPER("chdir");
3458 TAINT_PROPER("chdir");
3461 IO* const io = GvIO(gv);
3464 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3465 } else if (IoIFP(io)) {
3466 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3469 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3470 report_evil_fh(gv, io, PL_op->op_type);
3471 SETERRNO(EBADF, RMS_IFI);
3476 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3477 report_evil_fh(gv, io, PL_op->op_type);
3478 SETERRNO(EBADF,RMS_IFI);
3482 DIE(aTHX_ PL_no_func, "fchdir");
3486 PUSHi( PerlDir_chdir(tmps) >= 0 );
3488 /* Clear the DEFAULT element of ENV so we'll get the new value
3490 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3497 dVAR; dSP; dMARK; dTARGET;
3498 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3509 char * const tmps = POPpx;
3510 TAINT_PROPER("chroot");
3511 PUSHi( chroot(tmps) >= 0 );
3514 DIE(aTHX_ PL_no_func, "chroot");
3522 const char * const tmps2 = POPpconstx;
3523 const char * const tmps = SvPV_nolen_const(TOPs);
3524 TAINT_PROPER("rename");
3526 anum = PerlLIO_rename(tmps, tmps2);
3528 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3529 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3532 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3533 (void)UNLINK(tmps2);
3534 if (!(anum = link(tmps, tmps2)))
3535 anum = UNLINK(tmps);
3543 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3547 const int op_type = PL_op->op_type;
3551 if (op_type == OP_LINK)
3552 DIE(aTHX_ PL_no_func, "link");
3554 # ifndef HAS_SYMLINK
3555 if (op_type == OP_SYMLINK)
3556 DIE(aTHX_ PL_no_func, "symlink");
3560 const char * const tmps2 = POPpconstx;
3561 const char * const tmps = SvPV_nolen_const(TOPs);
3562 TAINT_PROPER(PL_op_desc[op_type]);
3564 # if defined(HAS_LINK)
3565 # if defined(HAS_SYMLINK)
3566 /* Both present - need to choose which. */
3567 (op_type == OP_LINK) ?
3568 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3570 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3571 PerlLIO_link(tmps, tmps2);
3574 # if defined(HAS_SYMLINK)
3575 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3576 symlink(tmps, tmps2);
3581 SETi( result >= 0 );
3588 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3599 char buf[MAXPATHLEN];
3602 #ifndef INCOMPLETE_TAINTS
3606 len = readlink(tmps, buf, sizeof(buf) - 1);
3614 RETSETUNDEF; /* just pretend it's a normal file */
3618 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3620 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3622 char * const save_filename = filename;
3627 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3629 PERL_ARGS_ASSERT_DOONELINER;
3631 Newx(cmdline, size, char);
3632 my_strlcpy(cmdline, cmd, size);
3633 my_strlcat(cmdline, " ", size);
3634 for (s = cmdline + strlen(cmdline); *filename; ) {
3638 if (s - cmdline < size)
3639 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3640 myfp = PerlProc_popen(cmdline, "r");
3644 SV * const tmpsv = sv_newmortal();
3645 /* Need to save/restore 'PL_rs' ?? */
3646 s = sv_gets(tmpsv, myfp, 0);
3647 (void)PerlProc_pclose(myfp);
3651 #ifdef HAS_SYS_ERRLIST
3656 /* you don't see this */
3657 const char * const errmsg =
3658 #ifdef HAS_SYS_ERRLIST
3666 if (instr(s, errmsg)) {
3673 #define EACCES EPERM
3675 if (instr(s, "cannot make"))
3676 SETERRNO(EEXIST,RMS_FEX);
3677 else if (instr(s, "existing file"))
3678 SETERRNO(EEXIST,RMS_FEX);
3679 else if (instr(s, "ile exists"))
3680 SETERRNO(EEXIST,RMS_FEX);
3681 else if (instr(s, "non-exist"))
3682 SETERRNO(ENOENT,RMS_FNF);
3683 else if (instr(s, "does not exist"))
3684 SETERRNO(ENOENT,RMS_FNF);
3685 else if (instr(s, "not empty"))
3686 SETERRNO(EBUSY,SS_DEVOFFLINE);
3687 else if (instr(s, "cannot access"))
3688 SETERRNO(EACCES,RMS_PRV);
3690 SETERRNO(EPERM,RMS_PRV);
3693 else { /* some mkdirs return no failure indication */
3694 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3695 if (PL_op->op_type == OP_RMDIR)
3700 SETERRNO(EACCES,RMS_PRV); /* a guess */
3709 /* This macro removes trailing slashes from a directory name.
3710 * Different operating and file systems take differently to
3711 * trailing slashes. According to POSIX 1003.1 1996 Edition
3712 * any number of trailing slashes should be allowed.
3713 * Thusly we snip them away so that even non-conforming
3714 * systems are happy.
3715 * We should probably do this "filtering" for all
3716 * the functions that expect (potentially) directory names:
3717 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3718 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3720 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3721 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3724 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3725 (tmps) = savepvn((tmps), (len)); \
3735 const int mode = (MAXARG > 1) ? POPi : 0777;
3737 TRIMSLASHES(tmps,len,copy);
3739 TAINT_PROPER("mkdir");
3741 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3745 SETi( dooneliner("mkdir", tmps) );
3746 oldumask = PerlLIO_umask(0);
3747 PerlLIO_umask(oldumask);
3748 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3763 TRIMSLASHES(tmps,len,copy);
3764 TAINT_PROPER("rmdir");
3766 SETi( PerlDir_rmdir(tmps) >= 0 );
3768 SETi( dooneliner("rmdir", tmps) );
3775 /* Directory calls. */
3779 #if defined(Direntry_t) && defined(HAS_READDIR)
3781 const char * const dirname = POPpconstx;
3782 GV * const gv = MUTABLE_GV(POPs);
3783 register IO * const io = GvIOn(gv);
3788 if ((IoIFP(io) || IoOFP(io)) && ckWARN2(WARN_IO, WARN_DEPRECATED))
3789 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3790 "Opening filehandle %s also as a directory", GvENAME(gv));
3792 PerlDir_close(IoDIRP(io));
3793 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3799 SETERRNO(EBADF,RMS_DIR);
3802 DIE(aTHX_ PL_no_dir_func, "opendir");
3808 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3809 DIE(aTHX_ PL_no_dir_func, "readdir");
3811 #if !defined(I_DIRENT) && !defined(VMS)
3812 Direntry_t *readdir (DIR *);
3818 const I32 gimme = GIMME;
3819 GV * const gv = MUTABLE_GV(POPs);
3820 register const Direntry_t *dp;
3821 register IO * const io = GvIOn(gv);
3823 if (!io || !IoDIRP(io)) {
3824 if(ckWARN(WARN_IO)) {
3825 Perl_warner(aTHX_ packWARN(WARN_IO),
3826 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3832 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3836 sv = newSVpvn(dp->d_name, dp->d_namlen);
3838 sv = newSVpv(dp->d_name, 0);
3840 #ifndef INCOMPLETE_TAINTS
3841 if (!(IoFLAGS(io) & IOf_UNTAINT))
3845 } while (gimme == G_ARRAY);
3847 if (!dp && gimme != G_ARRAY)
3854 SETERRNO(EBADF,RMS_ISI);
3855 if (GIMME == G_ARRAY)
3864 #if defined(HAS_TELLDIR) || defined(telldir)
3866 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3867 /* XXX netbsd still seemed to.
3868 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3869 --JHI 1999-Feb-02 */
3870 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3871 long telldir (DIR *);
3873 GV * const gv = MUTABLE_GV(POPs);
3874 register IO * const io = GvIOn(gv);
3876 if (!io || !IoDIRP(io)) {
3877 if(ckWARN(WARN_IO)) {
3878 Perl_warner(aTHX_ packWARN(WARN_IO),
3879 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3884 PUSHi( PerlDir_tell(IoDIRP(io)) );
3888 SETERRNO(EBADF,RMS_ISI);
3891 DIE(aTHX_ PL_no_dir_func, "telldir");
3897 #if defined(HAS_SEEKDIR) || defined(seekdir)
3899 const long along = POPl;
3900 GV * const gv = MUTABLE_GV(POPs);
3901 register IO * const io = GvIOn(gv);
3903 if (!io || !IoDIRP(io)) {
3904 if(ckWARN(WARN_IO)) {
3905 Perl_warner(aTHX_ packWARN(WARN_IO),
3906 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3910 (void)PerlDir_seek(IoDIRP(io), along);
3915 SETERRNO(EBADF,RMS_ISI);
3918 DIE(aTHX_ PL_no_dir_func, "seekdir");
3924 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3926 GV * const gv = MUTABLE_GV(POPs);
3927 register IO * const io = GvIOn(gv);
3929 if (!io || !IoDIRP(io)) {
3930 if(ckWARN(WARN_IO)) {
3931 Perl_warner(aTHX_ packWARN(WARN_IO),
3932 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3936 (void)PerlDir_rewind(IoDIRP(io));
3940 SETERRNO(EBADF,RMS_ISI);
3943 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3949 #if defined(Direntry_t) && defined(HAS_READDIR)
3951 GV * const gv = MUTABLE_GV(POPs);
3952 register IO * const io = GvIOn(gv);
3954 if (!io || !IoDIRP(io)) {
3955 if(ckWARN(WARN_IO)) {
3956 Perl_warner(aTHX_ packWARN(WARN_IO),
3957 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3961 #ifdef VOID_CLOSEDIR
3962 PerlDir_close(IoDIRP(io));
3964 if (PerlDir_close(IoDIRP(io)) < 0) {
3965 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3974 SETERRNO(EBADF,RMS_IFI);
3977 DIE(aTHX_ PL_no_dir_func, "closedir");
3981 /* Process control. */
3990 PERL_FLUSHALL_FOR_CHILD;
3991 childpid = PerlProc_fork();
3995 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
3997 SvREADONLY_off(GvSV(tmpgv));
3998 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3999 SvREADONLY_on(GvSV(tmpgv));
4001 #ifdef THREADS_HAVE_PIDS
4002 PL_ppid = (IV)getppid();
4004 #ifdef PERL_USES_PL_PIDSTATUS
4005 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4011 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4016 PERL_FLUSHALL_FOR_CHILD;
4017 childpid = PerlProc_fork();
4023 DIE(aTHX_ PL_no_func, "fork");
4030 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4035 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4036 childpid = wait4pid(-1, &argflags, 0);
4038 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4043 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4044 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4045 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4047 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4052 DIE(aTHX_ PL_no_func, "wait");
4058 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4060 const int optype = POPi;
4061 const Pid_t pid = TOPi;
4065 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4066 result = wait4pid(pid, &argflags, optype);
4068 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4073 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4074 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4075 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4077 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4082 DIE(aTHX_ PL_no_func, "waitpid");
4088 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4089 #if defined(__LIBCATAMOUNT__)
4090 PL_statusvalue = -1;
4099 while (++MARK <= SP) {
4100 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4105 TAINT_PROPER("system");
4107 PERL_FLUSHALL_FOR_CHILD;
4108 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4114 if (PerlProc_pipe(pp) >= 0)
4116 while ((childpid = PerlProc_fork()) == -1) {
4117 if (errno != EAGAIN) {
4122 PerlLIO_close(pp[0]);
4123 PerlLIO_close(pp[1]);
4130 Sigsave_t ihand,qhand; /* place to save signals during system() */
4134 PerlLIO_close(pp[1]);
4136 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4137 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4140 result = wait4pid(childpid, &status, 0);
4141 } while (result == -1 && errno == EINTR);
4143 (void)rsignal_restore(SIGINT, &ihand);
4144 (void)rsignal_restore(SIGQUIT, &qhand);
4146 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4147 do_execfree(); /* free any memory child malloced on fork */
4154 while (n < sizeof(int)) {
4155 n1 = PerlLIO_read(pp[0],
4156 (void*)(((char*)&errkid)+n),
4162 PerlLIO_close(pp[0]);
4163 if (n) { /* Error */
4164 if (n != sizeof(int))
4165 DIE(aTHX_ "panic: kid popen errno read");
4166 errno = errkid; /* Propagate errno from kid */
4167 STATUS_NATIVE_CHILD_SET(-1);
4170 XPUSHi(STATUS_CURRENT);
4174 PerlLIO_close(pp[0]);
4175 #if defined(HAS_FCNTL) && defined(F_SETFD)
4176 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4179 if (PL_op->op_flags & OPf_STACKED) {
4180 SV * const really = *++MARK;
4181 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4183 else if (SP - MARK != 1)
4184 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4186 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4190 #else /* ! FORK or VMS or OS/2 */
4193 if (PL_op->op_flags & OPf_STACKED) {
4194 SV * const really = *++MARK;
4195 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4196 value = (I32)do_aspawn(really, MARK, SP);
4198 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4201 else if (SP - MARK != 1) {
4202 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4203 value = (I32)do_aspawn(NULL, MARK, SP);
4205 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4209 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4211 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4213 STATUS_NATIVE_CHILD_SET(value);
4216 XPUSHi(result ? value : STATUS_CURRENT);
4217 #endif /* !FORK or VMS or OS/2 */
4224 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4229 while (++MARK <= SP) {
4230 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4235 TAINT_PROPER("exec");
4237 PERL_FLUSHALL_FOR_CHILD;
4238 if (PL_op->op_flags & OPf_STACKED) {
4239 SV * const really = *++MARK;
4240 value = (I32)do_aexec(really, MARK, SP);
4242 else if (SP - MARK != 1)
4244 value = (I32)vms_do_aexec(NULL, MARK, SP);
4248 (void ) do_aspawn(NULL, MARK, SP);
4252 value = (I32)do_aexec(NULL, MARK, SP);
4257 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4260 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4263 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4277 # ifdef THREADS_HAVE_PIDS
4278 if (PL_ppid != 1 && getppid() == 1)
4279 /* maybe the parent process has died. Refresh ppid cache */
4283 XPUSHi( getppid() );
4287 DIE(aTHX_ PL_no_func, "getppid");
4296 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4299 pgrp = (I32)BSD_GETPGRP(pid);
4301 if (pid != 0 && pid != PerlProc_getpid())
4302 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4308 DIE(aTHX_ PL_no_func, "getpgrp()");
4328 TAINT_PROPER("setpgrp");
4330 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4332 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4333 || (pid != 0 && pid != PerlProc_getpid()))
4335 DIE(aTHX_ "setpgrp can't take arguments");
4337 SETi( setpgrp() >= 0 );
4338 #endif /* USE_BSDPGRP */
4341 DIE(aTHX_ PL_no_func, "setpgrp()");
4347 #ifdef HAS_GETPRIORITY
4349 const int who = POPi;
4350 const int which = TOPi;
4351 SETi( getpriority(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(which, who, niceval) >= 0 );
4369 DIE(aTHX_ PL_no_func, "setpriority()");
4379 XPUSHn( time(NULL) );
4381 XPUSHi( time(NULL) );
4393 (void)PerlProc_times(&PL_timesbuf);
4395 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4396 /* struct tms, though same data */
4400 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4401 if (GIMME == G_ARRAY) {
4402 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4403 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4404 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4412 if (GIMME == G_ARRAY) {
4419 DIE(aTHX_ "times not implemented");
4421 #endif /* HAS_TIMES */
4430 const struct tm *err;
4437 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4438 static const char * const dayname[] =
4439 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4440 static const char * const monname[] =
4441 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4442 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4448 when = (Time_t)SvIVx(POPs);
4450 if (PL_op->op_type == OP_LOCALTIME)
4451 err = localtime(&when);
4453 err = gmtime(&when);
4461 when = (Time64_T)now;
4464 /* XXX POPq uses an SvIV so it won't work with 32 bit integer scalars
4465 using a double causes an unfortunate loss of accuracy on high numbers.
4466 What we really need is an SvQV.
4468 double input = POPn;
4469 when = (Time64_T)input;
4470 if( when != input ) {
4471 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
4472 "%s(%.0f) too large", opname, input);
4476 if (PL_op->op_type == OP_LOCALTIME)
4477 err = localtime64_r(&when, &tmbuf);
4479 err = gmtime64_r(&when, &tmbuf);
4483 /* XXX %lld broken for quads */
4484 Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
4485 "%s(%.0f) failed", opname, (double)when);
4488 if (GIMME != G_ARRAY) { /* scalar context */
4490 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4491 double year = (double)tmbuf.tm_year + 1900;
4498 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4499 dayname[tmbuf.tm_wday],
4500 monname[tmbuf.tm_mon],
4508 else { /* list context */
4514 mPUSHi(tmbuf.tm_sec);
4515 mPUSHi(tmbuf.tm_min);
4516 mPUSHi(tmbuf.tm_hour);
4517 mPUSHi(tmbuf.tm_mday);
4518 mPUSHi(tmbuf.tm_mon);
4519 mPUSHn(tmbuf.tm_year);
4520 mPUSHi(tmbuf.tm_wday);
4521 mPUSHi(tmbuf.tm_yday);
4522 mPUSHi(tmbuf.tm_isdst);
4533 anum = alarm((unsigned int)anum);
4540 DIE(aTHX_ PL_no_func, "alarm");
4551 (void)time(&lasttime);
4556 PerlProc_sleep((unsigned int)duration);
4559 XPUSHi(when - lasttime);
4563 /* Shared memory. */
4564 /* Merged with some message passing. */
4568 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4569 dVAR; dSP; dMARK; dTARGET;
4570 const int op_type = PL_op->op_type;
4575 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4578 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4581 value = (I32)(do_semop(MARK, SP) >= 0);
4584 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4600 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4601 dVAR; dSP; dMARK; dTARGET;
4602 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4609 DIE(aTHX_ "System V IPC is not implemented on this machine");
4615 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4616 dVAR; dSP; dMARK; dTARGET;
4617 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4625 PUSHp(zero_but_true, ZBTLEN);
4633 /* I can't const this further without getting warnings about the types of
4634 various arrays passed in from structures. */
4636 S_space_join_names_mortal(pTHX_ char *const *array)
4640 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4642 if (array && *array) {
4643 target = newSVpvs_flags("", SVs_TEMP);
4645 sv_catpv(target, *array);
4648 sv_catpvs(target, " ");
4651 target = sv_mortalcopy(&PL_sv_no);
4656 /* Get system info. */
4660 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4662 I32 which = PL_op->op_type;
4663 register char **elem;
4665 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4666 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4667 struct hostent *gethostbyname(Netdb_name_t);
4668 struct hostent *gethostent(void);
4670 struct hostent *hent;
4674 if (which == OP_GHBYNAME) {
4675 #ifdef HAS_GETHOSTBYNAME
4676 const char* const name = POPpbytex;
4677 hent = PerlSock_gethostbyname(name);
4679 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4682 else if (which == OP_GHBYADDR) {
4683 #ifdef HAS_GETHOSTBYADDR
4684 const int addrtype = POPi;
4685 SV * const addrsv = POPs;
4687 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4689 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4691 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4695 #ifdef HAS_GETHOSTENT
4696 hent = PerlSock_gethostent();
4698 DIE(aTHX_ PL_no_sock_func, "gethostent");
4701 #ifdef HOST_NOT_FOUND
4703 #ifdef USE_REENTRANT_API
4704 # ifdef USE_GETHOSTENT_ERRNO
4705 h_errno = PL_reentrant_buffer->_gethostent_errno;
4708 STATUS_UNIX_SET(h_errno);
4712 if (GIMME != G_ARRAY) {
4713 PUSHs(sv = sv_newmortal());
4715 if (which == OP_GHBYNAME) {
4717 sv_setpvn(sv, hent->h_addr, hent->h_length);
4720 sv_setpv(sv, (char*)hent->h_name);
4726 mPUSHs(newSVpv((char*)hent->h_name, 0));
4727 PUSHs(space_join_names_mortal(hent->h_aliases));
4728 mPUSHi(hent->h_addrtype);
4729 len = hent->h_length;
4732 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4733 mXPUSHp(*elem, len);
4737 mPUSHp(hent->h_addr, len);
4739 PUSHs(sv_mortalcopy(&PL_sv_no));
4744 DIE(aTHX_ PL_no_sock_func, "gethostent");
4750 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4752 I32 which = PL_op->op_type;
4754 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4755 struct netent *getnetbyaddr(Netdb_net_t, int);
4756 struct netent *getnetbyname(Netdb_name_t);
4757 struct netent *getnetent(void);
4759 struct netent *nent;
4761 if (which == OP_GNBYNAME){
4762 #ifdef HAS_GETNETBYNAME
4763 const char * const name = POPpbytex;
4764 nent = PerlSock_getnetbyname(name);
4766 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4769 else if (which == OP_GNBYADDR) {
4770 #ifdef HAS_GETNETBYADDR
4771 const int addrtype = POPi;
4772 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4773 nent = PerlSock_getnetbyaddr(addr, addrtype);
4775 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4779 #ifdef HAS_GETNETENT
4780 nent = PerlSock_getnetent();
4782 DIE(aTHX_ PL_no_sock_func, "getnetent");
4785 #ifdef HOST_NOT_FOUND
4787 #ifdef USE_REENTRANT_API
4788 # ifdef USE_GETNETENT_ERRNO
4789 h_errno = PL_reentrant_buffer->_getnetent_errno;
4792 STATUS_UNIX_SET(h_errno);
4797 if (GIMME != G_ARRAY) {
4798 PUSHs(sv = sv_newmortal());
4800 if (which == OP_GNBYNAME)
4801 sv_setiv(sv, (IV)nent->n_net);
4803 sv_setpv(sv, nent->n_name);
4809 mPUSHs(newSVpv(nent->n_name, 0));
4810 PUSHs(space_join_names_mortal(nent->n_aliases));
4811 mPUSHi(nent->n_addrtype);
4812 mPUSHi(nent->n_net);
4817 DIE(aTHX_ PL_no_sock_func, "getnetent");
4823 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4825 I32 which = PL_op->op_type;
4827 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4828 struct protoent *getprotobyname(Netdb_name_t);
4829 struct protoent *getprotobynumber(int);
4830 struct protoent *getprotoent(void);
4832 struct protoent *pent;
4834 if (which == OP_GPBYNAME) {
4835 #ifdef HAS_GETPROTOBYNAME
4836 const char* const name = POPpbytex;
4837 pent = PerlSock_getprotobyname(name);
4839 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4842 else if (which == OP_GPBYNUMBER) {
4843 #ifdef HAS_GETPROTOBYNUMBER
4844 const int number = POPi;
4845 pent = PerlSock_getprotobynumber(number);
4847 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4851 #ifdef HAS_GETPROTOENT
4852 pent = PerlSock_getprotoent();
4854 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4858 if (GIMME != G_ARRAY) {
4859 PUSHs(sv = sv_newmortal());
4861 if (which == OP_GPBYNAME)
4862 sv_setiv(sv, (IV)pent->p_proto);
4864 sv_setpv(sv, pent->p_name);
4870 mPUSHs(newSVpv(pent->p_name, 0));
4871 PUSHs(space_join_names_mortal(pent->p_aliases));
4872 mPUSHi(pent->p_proto);
4877 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4883 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4885 I32 which = PL_op->op_type;
4887 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4888 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4889 struct servent *getservbyport(int, Netdb_name_t);
4890 struct servent *getservent(void);
4892 struct servent *sent;
4894 if (which == OP_GSBYNAME) {
4895 #ifdef HAS_GETSERVBYNAME
4896 const char * const proto = POPpbytex;
4897 const char * const name = POPpbytex;
4898 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4900 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4903 else if (which == OP_GSBYPORT) {
4904 #ifdef HAS_GETSERVBYPORT
4905 const char * const proto = POPpbytex;
4906 unsigned short port = (unsigned short)POPu;
4908 port = PerlSock_htons(port);
4910 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4912 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4916 #ifdef HAS_GETSERVENT
4917 sent = PerlSock_getservent();
4919 DIE(aTHX_ PL_no_sock_func, "getservent");
4923 if (GIMME != G_ARRAY) {
4924 PUSHs(sv = sv_newmortal());
4926 if (which == OP_GSBYNAME) {
4928 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4930 sv_setiv(sv, (IV)(sent->s_port));
4934 sv_setpv(sv, sent->s_name);
4940 mPUSHs(newSVpv(sent->s_name, 0));
4941 PUSHs(space_join_names_mortal(sent->s_aliases));
4943 mPUSHi(PerlSock_ntohs(sent->s_port));
4945 mPUSHi(sent->s_port);
4947 mPUSHs(newSVpv(sent->s_proto, 0));
4952 DIE(aTHX_ PL_no_sock_func, "getservent");
4958 #ifdef HAS_SETHOSTENT
4960 PerlSock_sethostent(TOPi);
4963 DIE(aTHX_ PL_no_sock_func, "sethostent");
4969 #ifdef HAS_SETNETENT
4971 (void)PerlSock_setnetent(TOPi);
4974 DIE(aTHX_ PL_no_sock_func, "setnetent");
4980 #ifdef HAS_SETPROTOENT
4982 (void)PerlSock_setprotoent(TOPi);
4985 DIE(aTHX_ PL_no_sock_func, "setprotoent");
4991 #ifdef HAS_SETSERVENT
4993 (void)PerlSock_setservent(TOPi);
4996 DIE(aTHX_ PL_no_sock_func, "setservent");
5002 #ifdef HAS_ENDHOSTENT
5004 PerlSock_endhostent();
5008 DIE(aTHX_ PL_no_sock_func, "endhostent");
5014 #ifdef HAS_ENDNETENT
5016 PerlSock_endnetent();
5020 DIE(aTHX_ PL_no_sock_func, "endnetent");
5026 #ifdef HAS_ENDPROTOENT
5028 PerlSock_endprotoent();
5032 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5038 #ifdef HAS_ENDSERVENT
5040 PerlSock_endservent();
5044 DIE(aTHX_ PL_no_sock_func, "endservent");
5052 I32 which = PL_op->op_type;
5054 struct passwd *pwent = NULL;
5056 * We currently support only the SysV getsp* shadow password interface.
5057 * The interface is declared in <shadow.h> and often one needs to link
5058 * with -lsecurity or some such.
5059 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5062 * AIX getpwnam() is clever enough to return the encrypted password
5063 * only if the caller (euid?) is root.
5065 * There are at least three other shadow password APIs. Many platforms
5066 * seem to contain more than one interface for accessing the shadow
5067 * password databases, possibly for compatibility reasons.
5068 * The getsp*() is by far he simplest one, the other two interfaces
5069 * are much more complicated, but also very similar to each other.
5074 * struct pr_passwd *getprpw*();
5075 * The password is in
5076 * char getprpw*(...).ufld.fd_encrypt[]
5077 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5082 * struct es_passwd *getespw*();
5083 * The password is in
5084 * char *(getespw*(...).ufld.fd_encrypt)
5085 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5088 * struct userpw *getuserpw();
5089 * The password is in
5090 * char *(getuserpw(...)).spw_upw_passwd
5091 * (but the de facto standard getpwnam() should work okay)
5093 * Mention I_PROT here so that Configure probes for it.
5095 * In HP-UX for getprpw*() the manual page claims that one should include
5096 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5097 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5098 * and pp_sys.c already includes <shadow.h> if there is such.
5100 * Note that <sys/security.h> is already probed for, but currently
5101 * it is only included in special cases.
5103 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5104 * be preferred interface, even though also the getprpw*() interface
5105 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5106 * One also needs to call set_auth_parameters() in main() before
5107 * doing anything else, whether one is using getespw*() or getprpw*().
5109 * Note that accessing the shadow databases can be magnitudes
5110 * slower than accessing the standard databases.
5115 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5116 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5117 * the pw_comment is left uninitialized. */
5118 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5124 const char* const name = POPpbytex;
5125 pwent = getpwnam(name);
5131 pwent = getpwuid(uid);
5135 # ifdef HAS_GETPWENT
5137 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5138 if (pwent) pwent = getpwnam(pwent->pw_name);
5141 DIE(aTHX_ PL_no_func, "getpwent");
5147 if (GIMME != G_ARRAY) {
5148 PUSHs(sv = sv_newmortal());
5150 if (which == OP_GPWNAM)
5151 # if Uid_t_sign <= 0
5152 sv_setiv(sv, (IV)pwent->pw_uid);
5154 sv_setuv(sv, (UV)pwent->pw_uid);
5157 sv_setpv(sv, pwent->pw_name);
5163 mPUSHs(newSVpv(pwent->pw_name, 0));
5167 /* If we have getspnam(), we try to dig up the shadow
5168 * password. If we are underprivileged, the shadow
5169 * interface will set the errno to EACCES or similar,
5170 * and return a null pointer. If this happens, we will
5171 * use the dummy password (usually "*" or "x") from the
5172 * standard password database.
5174 * In theory we could skip the shadow call completely
5175 * if euid != 0 but in practice we cannot know which
5176 * security measures are guarding the shadow databases
5177 * on a random platform.
5179 * Resist the urge to use additional shadow interfaces.
5180 * Divert the urge to writing an extension instead.
5183 /* Some AIX setups falsely(?) detect some getspnam(), which
5184 * has a different API than the Solaris/IRIX one. */
5185 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5188 const struct spwd * const spwent = getspnam(pwent->pw_name);
5189 /* Save and restore errno so that
5190 * underprivileged attempts seem
5191 * to have never made the unsccessful
5192 * attempt to retrieve the shadow password. */
5194 if (spwent && spwent->sp_pwdp)
5195 sv_setpv(sv, spwent->sp_pwdp);
5199 if (!SvPOK(sv)) /* Use the standard password, then. */
5200 sv_setpv(sv, pwent->pw_passwd);
5203 # ifndef INCOMPLETE_TAINTS
5204 /* passwd is tainted because user himself can diddle with it.
5205 * admittedly not much and in a very limited way, but nevertheless. */
5209 # if Uid_t_sign <= 0
5210 mPUSHi(pwent->pw_uid);
5212 mPUSHu(pwent->pw_uid);
5215 # if Uid_t_sign <= 0
5216 mPUSHi(pwent->pw_gid);
5218 mPUSHu(pwent->pw_gid);
5220 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5221 * because of the poor interface of the Perl getpw*(),
5222 * not because there's some standard/convention saying so.
5223 * A better interface would have been to return a hash,
5224 * but we are accursed by our history, alas. --jhi. */
5226 mPUSHi(pwent->pw_change);
5229 mPUSHi(pwent->pw_quota);
5232 mPUSHs(newSVpv(pwent->pw_age, 0));
5234 /* I think that you can never get this compiled, but just in case. */
5235 PUSHs(sv_mortalcopy(&PL_sv_no));
5240 /* pw_class and pw_comment are mutually exclusive--.
5241 * see the above note for pw_change, pw_quota, and pw_age. */
5243 mPUSHs(newSVpv(pwent->pw_class, 0));
5246 mPUSHs(newSVpv(pwent->pw_comment, 0));
5248 /* I think that you can never get this compiled, but just in case. */
5249 PUSHs(sv_mortalcopy(&PL_sv_no));
5254 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5256 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5258 # ifndef INCOMPLETE_TAINTS
5259 /* pw_gecos is tainted because user himself can diddle with it. */
5263 mPUSHs(newSVpv(pwent->pw_dir, 0));
5265 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5266 # ifndef INCOMPLETE_TAINTS
5267 /* pw_shell is tainted because user himself can diddle with it. */
5272 mPUSHi(pwent->pw_expire);
5277 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5283 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5288 DIE(aTHX_ PL_no_func, "setpwent");
5294 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5299 DIE(aTHX_ PL_no_func, "endpwent");
5307 const I32 which = PL_op->op_type;
5308 const struct group *grent;
5310 if (which == OP_GGRNAM) {
5311 const char* const name = POPpbytex;
5312 grent = (const struct group *)getgrnam(name);
5314 else if (which == OP_GGRGID) {
5315 const Gid_t gid = POPi;
5316 grent = (const struct group *)getgrgid(gid);
5320 grent = (struct group *)getgrent();
5322 DIE(aTHX_ PL_no_func, "getgrent");
5326 if (GIMME != G_ARRAY) {
5327 SV * const sv = sv_newmortal();
5331 if (which == OP_GGRNAM)
5332 sv_setiv(sv, (IV)grent->gr_gid);
5334 sv_setpv(sv, grent->gr_name);
5340 mPUSHs(newSVpv(grent->gr_name, 0));
5343 mPUSHs(newSVpv(grent->gr_passwd, 0));
5345 PUSHs(sv_mortalcopy(&PL_sv_no));
5348 mPUSHi(grent->gr_gid);
5350 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5351 /* In UNICOS/mk (_CRAYMPP) the multithreading
5352 * versions (getgrnam_r, getgrgid_r)
5353 * seem to return an illegal pointer
5354 * as the group members list, gr_mem.
5355 * getgrent() doesn't even have a _r version
5356 * but the gr_mem is poisonous anyway.
5357 * So yes, you cannot get the list of group
5358 * members if building multithreaded in UNICOS/mk. */
5359 PUSHs(space_join_names_mortal(grent->gr_mem));
5365 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5371 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5376 DIE(aTHX_ PL_no_func, "setgrent");
5382 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5387 DIE(aTHX_ PL_no_func, "endgrent");
5397 if (!(tmps = PerlProc_getlogin()))
5399 PUSHp(tmps, strlen(tmps));
5402 DIE(aTHX_ PL_no_func, "getlogin");
5406 /* Miscellaneous. */
5411 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5412 register I32 items = SP - MARK;
5413 unsigned long a[20];
5418 while (++MARK <= SP) {
5419 if (SvTAINTED(*MARK)) {
5425 TAINT_PROPER("syscall");
5428 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5429 * or where sizeof(long) != sizeof(char*). But such machines will
5430 * not likely have syscall implemented either, so who cares?
5432 while (++MARK <= SP) {
5433 if (SvNIOK(*MARK) || !i)
5434 a[i++] = SvIV(*MARK);
5435 else if (*MARK == &PL_sv_undef)
5438 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5444 DIE(aTHX_ "Too many args to syscall");
5446 DIE(aTHX_ "Too few args to syscall");
5448 retval = syscall(a[0]);
5451 retval = syscall(a[0],a[1]);
5454 retval = syscall(a[0],a[1],a[2]);
5457 retval = syscall(a[0],a[1],a[2],a[3]);
5460 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5463 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5466 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5469 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5473 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5476 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5479 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5483 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5487 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5491 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5492 a[10],a[11],a[12],a[13]);
5494 #endif /* atarist */
5500 DIE(aTHX_ PL_no_func, "syscall");
5504 #ifdef FCNTL_EMULATE_FLOCK
5506 /* XXX Emulate flock() with fcntl().
5507 What's really needed is a good file locking module.
5511 fcntl_emulate_flock(int fd, int operation)
5515 switch (operation & ~LOCK_NB) {
5517 flock.l_type = F_RDLCK;
5520 flock.l_type = F_WRLCK;
5523 flock.l_type = F_UNLCK;
5529 flock.l_whence = SEEK_SET;
5530 flock.l_start = flock.l_len = (Off_t)0;
5532 return fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5535 #endif /* FCNTL_EMULATE_FLOCK */
5537 #ifdef LOCKF_EMULATE_FLOCK
5539 /* XXX Emulate flock() with lockf(). This is just to increase
5540 portability of scripts. The calls are not completely
5541 interchangeable. What's really needed is a good file
5545 /* The lockf() constants might have been defined in <unistd.h>.
5546 Unfortunately, <unistd.h> causes troubles on some mixed
5547 (BSD/POSIX) systems, such as SunOS 4.1.3.
5549 Further, the lockf() constants aren't POSIX, so they might not be
5550 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5551 just stick in the SVID values and be done with it. Sigh.
5555 # define F_ULOCK 0 /* Unlock a previously locked region */
5558 # define F_LOCK 1 /* Lock a region for exclusive use */
5561 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5564 # define F_TEST 3 /* Test a region for other processes locks */
5568 lockf_emulate_flock(int fd, int operation)
5574 /* flock locks entire file so for lockf we need to do the same */
5575 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5576 if (pos > 0) /* is seekable and needs to be repositioned */
5577 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5578 pos = -1; /* seek failed, so don't seek back afterwards */
5581 switch (operation) {
5583 /* LOCK_SH - get a shared lock */
5585 /* LOCK_EX - get an exclusive lock */
5587 i = lockf (fd, F_LOCK, 0);
5590 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5591 case LOCK_SH|LOCK_NB:
5592 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5593 case LOCK_EX|LOCK_NB:
5594 i = lockf (fd, F_TLOCK, 0);
5596 if ((errno == EAGAIN) || (errno == EACCES))
5597 errno = EWOULDBLOCK;
5600 /* LOCK_UN - unlock (non-blocking is a no-op) */
5602 case LOCK_UN|LOCK_NB:
5603 i = lockf (fd, F_ULOCK, 0);
5606 /* Default - can't decipher operation */
5613 if (pos > 0) /* need to restore position of the handle */
5614 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5619 #endif /* LOCKF_EMULATE_FLOCK */
5623 * c-indentation-style: bsd
5625 * indent-tabs-mode: t
5628 * ex: set ts=8 sts=4 sw=4 noet: