3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007 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.
18 /* This file contains system pp ("push/pop") functions that
19 * execute the opcodes that make up a perl program. A typical pp function
20 * expects to find its arguments on the stack, and usually pushes its
21 * results onto the stack, hence the 'pp' terminology. Each OP structure
22 * contains a pointer to the relevant pp_foo() function.
24 * By 'system', we mean ops which interact with the OS, such as pp_open().
28 #define PERL_IN_PP_SYS_C
32 /* Shadow password support for solaris - pdo@cs.umd.edu
33 * Not just Solaris: at least HP-UX, IRIX, Linux.
34 * The API is from SysV.
36 * There are at least two more shadow interfaces,
37 * see the comments in pp_gpwent().
41 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
42 * and another MAXINT from "perl.h" <- <sys/param.h>. */
49 # include <sys/wait.h>
53 # include <sys/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* AIX 5.2 and below use mktime for localtime, and defines the edge case
203 * for time 0x7fffffff to be valid only in UTC. AIX 5.3 provides localtime64
204 * available in the 32bit environment, which could warrant Configure
205 * checks in the future.
208 #define LOCALTIME_EDGECASE_BROKEN
211 /* F_OK unused: if stat() cannot find it... */
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
214 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
215 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
218 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
219 # ifdef I_SYS_SECURITY
220 # include <sys/security.h>
224 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
227 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
231 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
233 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
237 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
238 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
239 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
242 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
244 const Uid_t ruid = getuid();
245 const Uid_t euid = geteuid();
246 const Gid_t rgid = getgid();
247 const Gid_t egid = getegid();
251 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
252 Perl_croak(aTHX_ "switching effective uid is not implemented");
255 if (setreuid(euid, ruid))
258 if (setresuid(euid, ruid, (Uid_t)-1))
261 Perl_croak(aTHX_ "entering effective uid failed");
264 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
265 Perl_croak(aTHX_ "switching effective gid is not implemented");
268 if (setregid(egid, rgid))
271 if (setresgid(egid, rgid, (Gid_t)-1))
274 Perl_croak(aTHX_ "entering effective gid failed");
277 res = access(path, mode);
280 if (setreuid(ruid, euid))
283 if (setresuid(ruid, euid, (Uid_t)-1))
286 Perl_croak(aTHX_ "leaving effective uid failed");
289 if (setregid(rgid, egid))
292 if (setresgid(rgid, egid, (Gid_t)-1))
295 Perl_croak(aTHX_ "leaving effective gid failed");
300 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
307 const char * const tmps = POPpconstx;
308 const I32 gimme = GIMME_V;
309 const char *mode = "r";
312 if (PL_op->op_private & OPpOPEN_IN_RAW)
314 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
316 fp = PerlProc_popen(tmps, mode);
318 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
320 PerlIO_apply_layers(aTHX_ fp,mode,type);
322 if (gimme == G_VOID) {
324 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
327 else if (gimme == G_SCALAR) {
330 PL_rs = &PL_sv_undef;
331 sv_setpvn(TARG, "", 0); /* note that this preserves previous buffer */
332 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
340 SV * const sv = newSV(79);
341 if (sv_gets(sv, fp, 0) == NULL) {
346 if (SvLEN(sv) - SvCUR(sv) > 20) {
347 SvPV_shrink_to_cur(sv);
352 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
353 TAINT; /* "I believe that this is not gratuitous!" */
356 STATUS_NATIVE_CHILD_SET(-1);
357 if (gimme == G_SCALAR)
368 tryAMAGICunTARGET(iter, -1);
370 /* Note that we only ever get here if File::Glob fails to load
371 * without at the same time croaking, for some reason, or if
372 * perl was built with PERL_EXTERNAL_GLOB */
379 * The external globbing program may use things we can't control,
380 * so for security reasons we must assume the worst.
383 taint_proper(PL_no_security, "glob");
387 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
388 PL_last_in_gv = (GV*)*PL_stack_sp--;
390 SAVESPTR(PL_rs); /* This is not permanent, either. */
391 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
394 *SvPVX(PL_rs) = '\n';
398 result = do_readline();
406 PL_last_in_gv = cGVOP_gv;
407 return do_readline();
418 do_join(TARG, &PL_sv_no, MARK, SP);
422 else if (SP == MARK) {
430 tmps = SvPV_const(tmpsv, len);
431 if ((!tmps || !len) && PL_errgv) {
432 SV * const error = ERRSV;
433 SvUPGRADE(error, SVt_PV);
434 if (SvPOK(error) && SvCUR(error))
435 sv_catpvs(error, "\t...caught");
437 tmps = SvPV_const(tmpsv, len);
440 tmpsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
442 Perl_warn(aTHX_ "%"SVf, SVfARG(tmpsv));
454 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
456 if (SP - MARK != 1) {
458 do_join(TARG, &PL_sv_no, MARK, SP);
460 tmps = SvPV_const(tmpsv, len);
466 tmps = SvROK(tmpsv) ? (const char *)NULL : SvPV_const(tmpsv, len);
469 SV * const error = ERRSV;
470 SvUPGRADE(error, SVt_PV);
471 if (multiarg ? SvROK(error) : SvROK(tmpsv)) {
473 SvSetSV(error,tmpsv);
474 else if (sv_isobject(error)) {
475 HV * const stash = SvSTASH(SvRV(error));
476 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
478 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
479 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
486 call_sv((SV*)GvCV(gv),
487 G_SCALAR|G_EVAL|G_KEEPERR);
488 sv_setsv(error,*PL_stack_sp--);
494 if (SvPOK(error) && SvCUR(error))
495 sv_catpvs(error, "\t...propagated");
498 tmps = SvPV_const(tmpsv, len);
504 tmpsv = newSVpvs_flags("Died", SVs_TEMP);
506 DIE(aTHX_ "%"SVf, SVfARG(tmpsv));
522 GV * const gv = (GV *)*++MARK;
525 DIE(aTHX_ PL_no_usym, "filehandle");
527 if ((io = GvIOp(gv))) {
529 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
531 if (IoDIRP(io) && ckWARN2(WARN_IO, WARN_DEPRECATED))
532 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
533 "Opening dirhandle %s also as a file", GvENAME(gv));
535 mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
537 /* Method's args are same as ours ... */
538 /* ... except handle is replaced by the object */
539 *MARK-- = SvTIED_obj((SV*)io, mg);
543 call_method("OPEN", G_SCALAR);
557 tmps = SvPV_const(sv, len);
558 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
561 PUSHi( (I32)PL_forkprocess );
562 else if (PL_forkprocess == 0) /* we are a new child */
572 GV * const gv = (MAXARG == 0) ? PL_defoutgv : (GV*)POPs;
575 IO * const io = GvIO(gv);
577 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
580 XPUSHs(SvTIED_obj((SV*)io, mg));
583 call_method("CLOSE", G_SCALAR);
591 PUSHs(boolSV(do_close(gv, TRUE)));
604 GV * const wgv = (GV*)POPs;
605 GV * const rgv = (GV*)POPs;
610 if (SvTYPE(rgv) != SVt_PVGV || SvTYPE(wgv) != SVt_PVGV)
611 DIE(aTHX_ PL_no_usym, "filehandle");
616 do_close(rgv, FALSE);
618 do_close(wgv, FALSE);
620 if (PerlProc_pipe(fd) < 0)
623 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
624 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
625 IoOFP(rstio) = IoIFP(rstio);
626 IoIFP(wstio) = IoOFP(wstio);
627 IoTYPE(rstio) = IoTYPE_RDONLY;
628 IoTYPE(wstio) = IoTYPE_WRONLY;
630 if (!IoIFP(rstio) || !IoOFP(wstio)) {
632 PerlIO_close(IoIFP(rstio));
634 PerlLIO_close(fd[0]);
636 PerlIO_close(IoOFP(wstio));
638 PerlLIO_close(fd[1]);
641 #if defined(HAS_FCNTL) && defined(F_SETFD)
642 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
643 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
650 DIE(aTHX_ PL_no_func, "pipe");
666 if (gv && (io = GvIO(gv))
667 && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar)))
670 XPUSHs(SvTIED_obj((SV*)io, mg));
673 call_method("FILENO", G_SCALAR);
679 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
680 /* Can't do this because people seem to do things like
681 defined(fileno($foo)) to check whether $foo is a valid fh.
682 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
683 report_evil_fh(gv, io, PL_op->op_type);
688 PUSHi(PerlIO_fileno(fp));
701 anum = PerlLIO_umask(022);
702 /* setting it to 022 between the two calls to umask avoids
703 * to have a window where the umask is set to 0 -- meaning
704 * that another thread could create world-writeable files. */
706 (void)PerlLIO_umask(anum);
709 anum = PerlLIO_umask(POPi);
710 TAINT_PROPER("umask");
713 /* Only DIE if trying to restrict permissions on "user" (self).
714 * Otherwise it's harmless and more useful to just return undef
715 * since 'group' and 'other' concepts probably don't exist here. */
716 if (MAXARG >= 1 && (POPi & 0700))
717 DIE(aTHX_ "umask not implemented");
718 XPUSHs(&PL_sv_undef);
739 if (gv && (io = GvIO(gv))) {
740 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
743 XPUSHs(SvTIED_obj((SV*)io, mg));
748 call_method("BINMODE", G_SCALAR);
756 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
757 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
758 report_evil_fh(gv, io, PL_op->op_type);
759 SETERRNO(EBADF,RMS_IFI);
766 const char *d = NULL;
769 d = SvPV_const(discp, len);
770 mode = mode_from_discipline(d, len);
771 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
772 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
773 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
794 const I32 markoff = MARK - PL_stack_base;
795 const char *methname;
796 int how = PERL_MAGIC_tied;
800 switch(SvTYPE(varsv)) {
802 methname = "TIEHASH";
803 HvEITER_set((HV *)varsv, 0);
806 methname = "TIEARRAY";
809 #ifdef GV_UNIQUE_CHECK
810 if (GvUNIQUE((GV*)varsv)) {
811 Perl_croak(aTHX_ "Attempt to tie unique GV");
814 methname = "TIEHANDLE";
815 how = PERL_MAGIC_tiedscalar;
816 /* For tied filehandles, we apply tiedscalar magic to the IO
817 slot of the GP rather than the GV itself. AMS 20010812 */
819 GvIOp(varsv) = newIO();
820 varsv = (SV *)GvIOp(varsv);
823 methname = "TIESCALAR";
824 how = PERL_MAGIC_tiedscalar;
828 if (sv_isobject(*MARK)) {
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 ?
842 stash = gv_stashsv(*MARK, 0);
843 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
844 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
845 methname, SVfARG(*MARK));
848 PUSHSTACKi(PERLSI_MAGIC);
850 EXTEND(SP,(I32)items);
854 call_sv((SV*)GvCV(gv), G_SCALAR);
860 if (sv_isobject(sv)) {
861 sv_unmagic(varsv, how);
862 /* Croak if a self-tie on an aggregate is attempted. */
863 if (varsv == SvRV(sv) &&
864 (SvTYPE(varsv) == SVt_PVAV ||
865 SvTYPE(varsv) == SVt_PVHV))
867 "Self-ties of arrays and hashes are not supported");
868 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
871 SP = PL_stack_base + markoff;
881 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
882 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
884 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
887 if ((mg = SvTIED_mg(sv, how))) {
888 SV * const obj = SvRV(SvTIED_obj(sv, mg));
890 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
892 if (gv && isGV(gv) && (cv = GvCV(gv))) {
894 XPUSHs(SvTIED_obj((SV*)gv, mg));
895 mXPUSHi(SvREFCNT(obj) - 1);
898 call_sv((SV *)cv, G_VOID);
902 else if (mg && SvREFCNT(obj) > 1 && ckWARN(WARN_UNTIE)) {
903 Perl_warner(aTHX_ packWARN(WARN_UNTIE),
904 "untie attempted while %"UVuf" inner references still exist",
905 (UV)SvREFCNT(obj) - 1 ) ;
909 sv_unmagic(sv, how) ;
919 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
920 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
922 if (SvTYPE(sv) == SVt_PVGV && !(sv = (SV *)GvIOp(sv)))
925 if ((mg = SvTIED_mg(sv, how))) {
926 SV *osv = SvTIED_obj(sv, mg);
927 if (osv == mg->mg_obj)
928 osv = sv_mortalcopy(osv);
942 HV * const hv = (HV*)POPs;
943 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
944 stash = gv_stashsv(sv, 0);
945 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
947 require_pv("AnyDBM_File.pm");
949 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
950 DIE(aTHX_ "No dbm on this machine");
960 mPUSHu(O_RDWR|O_CREAT);
965 call_sv((SV*)GvCV(gv), G_SCALAR);
968 if (!sv_isobject(TOPs)) {
976 call_sv((SV*)GvCV(gv), G_SCALAR);
980 if (sv_isobject(TOPs)) {
981 sv_unmagic((SV *) hv, PERL_MAGIC_tied);
982 sv_magic((SV*)hv, TOPs, PERL_MAGIC_tied, NULL, 0);
999 struct timeval timebuf;
1000 struct timeval *tbuf = &timebuf;
1003 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1008 # if BYTEORDER & 0xf0000
1009 # define ORDERBYTE (0x88888888 - BYTEORDER)
1011 # define ORDERBYTE (0x4444 - BYTEORDER)
1017 for (i = 1; i <= 3; i++) {
1018 SV * const sv = SP[i];
1021 if (SvREADONLY(sv)) {
1023 sv_force_normal_flags(sv, 0);
1024 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1025 DIE(aTHX_ PL_no_modify);
1028 if (ckWARN(WARN_MISC))
1029 Perl_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1030 SvPV_force_nolen(sv); /* force string conversion */
1037 /* little endians can use vecs directly */
1038 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1045 masksize = NFDBITS / NBBY;
1047 masksize = sizeof(long); /* documented int, everyone seems to use long */
1049 Zero(&fd_sets[0], 4, char*);
1052 # if SELECT_MIN_BITS == 1
1053 growsize = sizeof(fd_set);
1055 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1056 # undef SELECT_MIN_BITS
1057 # define SELECT_MIN_BITS __FD_SETSIZE
1059 /* If SELECT_MIN_BITS is greater than one we most probably will want
1060 * to align the sizes with SELECT_MIN_BITS/8 because for example
1061 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1062 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1063 * on (sets/tests/clears bits) is 32 bits. */
1064 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1072 timebuf.tv_sec = (long)value;
1073 value -= (NV)timebuf.tv_sec;
1074 timebuf.tv_usec = (long)(value * 1000000.0);
1079 for (i = 1; i <= 3; i++) {
1081 if (!SvOK(sv) || SvCUR(sv) == 0) {
1088 Sv_Grow(sv, growsize);
1092 while (++j <= growsize) {
1096 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1098 Newx(fd_sets[i], growsize, char);
1099 for (offset = 0; offset < growsize; offset += masksize) {
1100 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1101 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1104 fd_sets[i] = SvPVX(sv);
1108 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1109 /* Can't make just the (void*) conditional because that would be
1110 * cpp #if within cpp macro, and not all compilers like that. */
1111 nfound = PerlSock_select(
1113 (Select_fd_set_t) fd_sets[1],
1114 (Select_fd_set_t) fd_sets[2],
1115 (Select_fd_set_t) fd_sets[3],
1116 (void*) tbuf); /* Workaround for compiler bug. */
1118 nfound = PerlSock_select(
1120 (Select_fd_set_t) fd_sets[1],
1121 (Select_fd_set_t) fd_sets[2],
1122 (Select_fd_set_t) fd_sets[3],
1125 for (i = 1; i <= 3; i++) {
1128 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1130 for (offset = 0; offset < growsize; offset += masksize) {
1131 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1132 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1134 Safefree(fd_sets[i]);
1141 if (GIMME == G_ARRAY && tbuf) {
1142 value = (NV)(timebuf.tv_sec) +
1143 (NV)(timebuf.tv_usec) / 1000000.0;
1148 DIE(aTHX_ "select not implemented");
1153 Perl_setdefout(pTHX_ GV *gv)
1156 SvREFCNT_inc_simple_void(gv);
1158 SvREFCNT_dec(PL_defoutgv);
1166 GV * const newdefout = (PL_op->op_private > 0) ? ((GV *) POPs) : NULL;
1167 GV * egv = GvEGV(PL_defoutgv);
1173 XPUSHs(&PL_sv_undef);
1175 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1176 if (gvp && *gvp == egv) {
1177 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1181 mXPUSHs(newRV((SV*)egv));
1186 if (!GvIO(newdefout))
1187 gv_IOadd(newdefout);
1188 setdefout(newdefout);
1198 GV * const gv = (MAXARG==0) ? PL_stdingv : (GV*)POPs;
1200 if (gv && (io = GvIO(gv))) {
1201 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1203 const I32 gimme = GIMME_V;
1205 XPUSHs(SvTIED_obj((SV*)io, mg));
1208 call_method("GETC", gimme);
1211 if (gimme == G_SCALAR)
1212 SvSetMagicSV_nosteal(TARG, TOPs);
1216 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1217 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1218 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1219 report_evil_fh(gv, io, PL_op->op_type);
1220 SETERRNO(EBADF,RMS_IFI);
1224 sv_setpvn(TARG, " ", 1);
1225 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1226 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1227 /* Find out how many bytes the char needs */
1228 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1231 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1232 SvCUR_set(TARG,1+len);
1241 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1244 register PERL_CONTEXT *cx;
1245 const I32 gimme = GIMME_V;
1247 PERL_ARGS_ASSERT_DOFORM;
1252 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1253 PUSHFORMAT(cx, retop);
1255 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1257 setdefout(gv); /* locally select filehandle so $% et al work */
1289 goto not_a_format_reference;
1294 tmpsv = sv_newmortal();
1295 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1296 name = SvPV_nolen_const(tmpsv);
1298 DIE(aTHX_ "Undefined format \"%s\" called", name);
1300 not_a_format_reference:
1301 DIE(aTHX_ "Not a format reference");
1304 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1306 IoFLAGS(io) &= ~IOf_DIDTOP;
1307 return doform(cv,gv,PL_op->op_next);
1313 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1314 register IO * const io = GvIOp(gv);
1319 register PERL_CONTEXT *cx;
1321 if (!io || !(ofp = IoOFP(io)))
1324 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1325 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1327 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1328 PL_formtarget != PL_toptarget)
1332 if (!IoTOP_GV(io)) {
1335 if (!IoTOP_NAME(io)) {
1337 if (!IoFMT_NAME(io))
1338 IoFMT_NAME(io) = savepv(GvNAME(gv));
1339 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1340 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1341 if ((topgv && GvFORM(topgv)) ||
1342 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1343 IoTOP_NAME(io) = savesvpv(topname);
1345 IoTOP_NAME(io) = savepvs("top");
1347 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1348 if (!topgv || !GvFORM(topgv)) {
1349 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1352 IoTOP_GV(io) = topgv;
1354 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1355 I32 lines = IoLINES_LEFT(io);
1356 const char *s = SvPVX_const(PL_formtarget);
1357 if (lines <= 0) /* Yow, header didn't even fit!!! */
1359 while (lines-- > 0) {
1360 s = strchr(s, '\n');
1366 const STRLEN save = SvCUR(PL_formtarget);
1367 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1368 do_print(PL_formtarget, ofp);
1369 SvCUR_set(PL_formtarget, save);
1370 sv_chop(PL_formtarget, s);
1371 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1374 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1375 do_print(PL_formfeed, ofp);
1376 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1378 PL_formtarget = PL_toptarget;
1379 IoFLAGS(io) |= IOf_DIDTOP;
1382 DIE(aTHX_ "bad top format reference");
1385 SV * const sv = sv_newmortal();
1387 gv_efullname4(sv, fgv, NULL, FALSE);
1388 name = SvPV_nolen_const(sv);
1390 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1392 DIE(aTHX_ "Undefined top format called");
1394 if (cv && CvCLONE(cv))
1395 cv = (CV*)sv_2mortal((SV*)cv_clone(cv));
1396 return doform(cv, gv, PL_op);
1400 POPBLOCK(cx,PL_curpm);
1406 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1408 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1409 else if (ckWARN(WARN_CLOSED))
1410 report_evil_fh(gv, io, PL_op->op_type);
1415 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1416 if (ckWARN(WARN_IO))
1417 Perl_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1419 if (!do_print(PL_formtarget, fp))
1422 FmLINES(PL_formtarget) = 0;
1423 SvCUR_set(PL_formtarget, 0);
1424 *SvEND(PL_formtarget) = '\0';
1425 if (IoFLAGS(io) & IOf_FLUSH)
1426 (void)PerlIO_flush(fp);
1431 PL_formtarget = PL_bodytarget;
1433 PERL_UNUSED_VAR(newsp);
1434 PERL_UNUSED_VAR(gimme);
1435 return cx->blk_sub.retop;
1440 dVAR; dSP; dMARK; dORIGMARK;
1445 GV * const gv = (PL_op->op_flags & OPf_STACKED) ? (GV*)*++MARK : PL_defoutgv;
1447 if (gv && (io = GvIO(gv))) {
1448 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1450 if (MARK == ORIGMARK) {
1453 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1457 *MARK = SvTIED_obj((SV*)io, mg);
1460 call_method("PRINTF", G_SCALAR);
1463 MARK = ORIGMARK + 1;
1471 if (!(io = GvIO(gv))) {
1472 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1473 report_evil_fh(gv, io, PL_op->op_type);
1474 SETERRNO(EBADF,RMS_IFI);
1477 else if (!(fp = IoOFP(io))) {
1478 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1480 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1481 else if (ckWARN(WARN_CLOSED))
1482 report_evil_fh(gv, io, PL_op->op_type);
1484 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1488 if (SvTAINTED(MARK[1]))
1489 TAINT_PROPER("printf");
1490 do_sprintf(sv, SP - MARK, MARK + 1);
1491 if (!do_print(sv, fp))
1494 if (IoFLAGS(io) & IOf_FLUSH)
1495 if (PerlIO_flush(fp) == EOF)
1506 PUSHs(&PL_sv_undef);
1514 const int perm = (MAXARG > 3) ? POPi : 0666;
1515 const int mode = POPi;
1516 SV * const sv = POPs;
1517 GV * const gv = (GV *)POPs;
1520 /* Need TIEHANDLE method ? */
1521 const char * const tmps = SvPV_const(sv, len);
1522 /* FIXME? do_open should do const */
1523 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1524 IoLINES(GvIOp(gv)) = 0;
1528 PUSHs(&PL_sv_undef);
1535 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1541 Sock_size_t bufsize;
1549 bool charstart = FALSE;
1550 STRLEN charskip = 0;
1553 GV * const gv = (GV*)*++MARK;
1554 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1555 && gv && (io = GvIO(gv)) )
1557 const MAGIC * mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1561 *MARK = SvTIED_obj((SV*)io, mg);
1563 call_method("READ", G_SCALAR);
1577 sv_setpvn(bufsv, "", 0);
1578 length = SvIVx(*++MARK);
1581 offset = SvIVx(*++MARK);
1585 if (!io || !IoIFP(io)) {
1586 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1587 report_evil_fh(gv, io, PL_op->op_type);
1588 SETERRNO(EBADF,RMS_IFI);
1591 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1592 buffer = SvPVutf8_force(bufsv, blen);
1593 /* UTF-8 may not have been set if they are all low bytes */
1598 buffer = SvPV_force(bufsv, blen);
1599 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1602 DIE(aTHX_ "Negative length");
1610 if (PL_op->op_type == OP_RECV) {
1611 char namebuf[MAXPATHLEN];
1612 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1613 bufsize = sizeof (struct sockaddr_in);
1615 bufsize = sizeof namebuf;
1617 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1621 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1622 /* 'offset' means 'flags' here */
1623 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1624 (struct sockaddr *)namebuf, &bufsize);
1628 /* Bogus return without padding */
1629 bufsize = sizeof (struct sockaddr_in);
1631 SvCUR_set(bufsv, count);
1632 *SvEND(bufsv) = '\0';
1633 (void)SvPOK_only(bufsv);
1637 /* This should not be marked tainted if the fp is marked clean */
1638 if (!(IoFLAGS(io) & IOf_UNTAINT))
1639 SvTAINTED_on(bufsv);
1641 sv_setpvn(TARG, namebuf, bufsize);
1646 if (PL_op->op_type == OP_RECV)
1647 DIE(aTHX_ PL_no_sock_func, "recv");
1649 if (DO_UTF8(bufsv)) {
1650 /* offset adjust in characters not bytes */
1651 blen = sv_len_utf8(bufsv);
1654 if (-offset > (int)blen)
1655 DIE(aTHX_ "Offset outside string");
1658 if (DO_UTF8(bufsv)) {
1659 /* convert offset-as-chars to offset-as-bytes */
1660 if (offset >= (int)blen)
1661 offset += SvCUR(bufsv) - blen;
1663 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1666 bufsize = SvCUR(bufsv);
1667 /* Allocating length + offset + 1 isn't perfect in the case of reading
1668 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1670 (should be 2 * length + offset + 1, or possibly something longer if
1671 PL_encoding is true) */
1672 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1673 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1674 Zero(buffer+bufsize, offset-bufsize, char);
1676 buffer = buffer + offset;
1678 read_target = bufsv;
1680 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1681 concatenate it to the current buffer. */
1683 /* Truncate the existing buffer to the start of where we will be
1685 SvCUR_set(bufsv, offset);
1687 read_target = sv_newmortal();
1688 SvUPGRADE(read_target, SVt_PV);
1689 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1692 if (PL_op->op_type == OP_SYSREAD) {
1693 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1694 if (IoTYPE(io) == IoTYPE_SOCKET) {
1695 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1701 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1706 #ifdef HAS_SOCKET__bad_code_maybe
1707 if (IoTYPE(io) == IoTYPE_SOCKET) {
1708 char namebuf[MAXPATHLEN];
1709 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1710 bufsize = sizeof (struct sockaddr_in);
1712 bufsize = sizeof namebuf;
1714 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1715 (struct sockaddr *)namebuf, &bufsize);
1720 count = PerlIO_read(IoIFP(io), buffer, length);
1721 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1722 if (count == 0 && PerlIO_error(IoIFP(io)))
1726 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1727 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1730 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1731 *SvEND(read_target) = '\0';
1732 (void)SvPOK_only(read_target);
1733 if (fp_utf8 && !IN_BYTES) {
1734 /* Look at utf8 we got back and count the characters */
1735 const char *bend = buffer + count;
1736 while (buffer < bend) {
1738 skip = UTF8SKIP(buffer);
1741 if (buffer - charskip + skip > bend) {
1742 /* partial character - try for rest of it */
1743 length = skip - (bend-buffer);
1744 offset = bend - SvPVX_const(bufsv);
1756 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1757 provided amount read (count) was what was requested (length)
1759 if (got < wanted && count == length) {
1760 length = wanted - got;
1761 offset = bend - SvPVX_const(bufsv);
1764 /* return value is character count */
1768 else if (buffer_utf8) {
1769 /* Let svcatsv upgrade the bytes we read in to utf8.
1770 The buffer is a mortal so will be freed soon. */
1771 sv_catsv_nomg(bufsv, read_target);
1774 /* This should not be marked tainted if the fp is marked clean */
1775 if (!(IoFLAGS(io) & IOf_UNTAINT))
1776 SvTAINTED_on(bufsv);
1788 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1794 STRLEN orig_blen_bytes;
1795 const int op_type = PL_op->op_type;
1799 GV *const gv = (GV*)*++MARK;
1800 if (PL_op->op_type == OP_SYSWRITE
1801 && gv && (io = GvIO(gv))) {
1802 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
1806 if (MARK == SP - 1) {
1808 sv = sv_2mortal(newSViv(sv_len(*SP)));
1814 *(ORIGMARK+1) = SvTIED_obj((SV*)io, mg);
1816 call_method("WRITE", G_SCALAR);
1832 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1834 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1835 if (io && IoIFP(io))
1836 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1838 report_evil_fh(gv, io, PL_op->op_type);
1840 SETERRNO(EBADF,RMS_IFI);
1844 /* Do this first to trigger any overloading. */
1845 buffer = SvPV_const(bufsv, blen);
1846 orig_blen_bytes = blen;
1847 doing_utf8 = DO_UTF8(bufsv);
1849 if (PerlIO_isutf8(IoIFP(io))) {
1850 if (!SvUTF8(bufsv)) {
1851 /* We don't modify the original scalar. */
1852 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1853 buffer = (char *) tmpbuf;
1857 else if (doing_utf8) {
1858 STRLEN tmplen = blen;
1859 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1862 buffer = (char *) tmpbuf;
1866 assert((char *)result == buffer);
1867 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1871 if (op_type == OP_SYSWRITE) {
1872 Size_t length = 0; /* This length is in characters. */
1878 /* The SV is bytes, and we've had to upgrade it. */
1879 blen_chars = orig_blen_bytes;
1881 /* The SV really is UTF-8. */
1882 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1883 /* Don't call sv_len_utf8 again because it will call magic
1884 or overloading a second time, and we might get back a
1885 different result. */
1886 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1888 /* It's safe, and it may well be cached. */
1889 blen_chars = sv_len_utf8(bufsv);
1897 length = blen_chars;
1899 #if Size_t_size > IVSIZE
1900 length = (Size_t)SvNVx(*++MARK);
1902 length = (Size_t)SvIVx(*++MARK);
1904 if ((SSize_t)length < 0) {
1906 DIE(aTHX_ "Negative length");
1911 offset = SvIVx(*++MARK);
1913 if (-offset > (IV)blen_chars) {
1915 DIE(aTHX_ "Offset outside string");
1917 offset += blen_chars;
1918 } else if (offset >= (IV)blen_chars && blen_chars > 0) {
1920 DIE(aTHX_ "Offset outside string");
1924 if (length > blen_chars - offset)
1925 length = blen_chars - offset;
1927 /* Here we convert length from characters to bytes. */
1928 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1929 /* Either we had to convert the SV, or the SV is magical, or
1930 the SV has overloading, in which case we can't or mustn't
1931 or mustn't call it again. */
1933 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1934 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1936 /* It's a real UTF-8 SV, and it's not going to change under
1937 us. Take advantage of any cache. */
1939 I32 len_I32 = length;
1941 /* Convert the start and end character positions to bytes.
1942 Remember that the second argument to sv_pos_u2b is relative
1944 sv_pos_u2b(bufsv, &start, &len_I32);
1951 buffer = buffer+offset;
1953 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1954 if (IoTYPE(io) == IoTYPE_SOCKET) {
1955 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1961 /* See the note at doio.c:do_print about filesize limits. --jhi */
1962 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1968 const int flags = SvIVx(*++MARK);
1971 char * const sockbuf = SvPVx(*++MARK, mlen);
1972 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1973 flags, (struct sockaddr *)sockbuf, mlen);
1977 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1982 DIE(aTHX_ PL_no_sock_func, "send");
1989 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
1992 #if Size_t_size > IVSIZE
2011 if (PL_op->op_flags & OPf_SPECIAL) { /* eof() */
2013 gv = PL_last_in_gv = GvEGV(PL_argvgv);
2015 if (io && !IoIFP(io)) {
2016 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2018 IoFLAGS(io) &= ~IOf_START;
2019 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2021 sv_setpvn(GvSV(gv), "-", 1);
2024 GvSV(gv) = newSVpvn("-", 1);
2026 SvSETMAGIC(GvSV(gv));
2028 else if (!nextargv(gv))
2033 gv = PL_last_in_gv; /* eof */
2036 gv = PL_last_in_gv = (GV*)POPs; /* eof(FH) */
2039 IO * const io = GvIO(gv);
2041 if (io && (mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar))) {
2043 XPUSHs(SvTIED_obj((SV*)io, mg));
2046 call_method("EOF", G_SCALAR);
2053 PUSHs(boolSV(!gv || do_eof(gv)));
2064 PL_last_in_gv = (GV*)POPs;
2067 if (gv && (io = GvIO(gv))) {
2068 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
2071 XPUSHs(SvTIED_obj((SV*)io, mg));
2074 call_method("TELL", G_SCALAR);
2081 #if LSEEKSIZE > IVSIZE
2082 PUSHn( do_tell(gv) );
2084 PUSHi( do_tell(gv) );
2092 const int whence = POPi;
2093 #if LSEEKSIZE > IVSIZE
2094 const Off_t offset = (Off_t)SvNVx(POPs);
2096 const Off_t offset = (Off_t)SvIVx(POPs);
2099 GV * const gv = PL_last_in_gv = (GV*)POPs;
2102 if (gv && (io = GvIO(gv))) {
2103 MAGIC * const mg = SvTIED_mg((SV*)io, PERL_MAGIC_tiedscalar);
2106 XPUSHs(SvTIED_obj((SV*)io, mg));
2107 #if LSEEKSIZE > IVSIZE
2108 mXPUSHn((NV) offset);
2115 call_method("SEEK", G_SCALAR);
2122 if (PL_op->op_type == OP_SEEK)
2123 PUSHs(boolSV(do_seek(gv, offset, whence)));
2125 const Off_t sought = do_sysseek(gv, offset, whence);
2127 PUSHs(&PL_sv_undef);
2129 SV* const sv = sought ?
2130 #if LSEEKSIZE > IVSIZE
2135 : newSVpvn(zero_but_true, ZBTLEN);
2146 /* There seems to be no consensus on the length type of truncate()
2147 * and ftruncate(), both off_t and size_t have supporters. In
2148 * general one would think that when using large files, off_t is
2149 * at least as wide as size_t, so using an off_t should be okay. */
2150 /* XXX Configure probe for the length type of *truncate() needed XXX */
2153 #if Off_t_size > IVSIZE
2158 /* Checking for length < 0 is problematic as the type might or
2159 * might not be signed: if it is not, clever compilers will moan. */
2160 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2167 if (PL_op->op_flags & OPf_SPECIAL) {
2168 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2177 TAINT_PROPER("truncate");
2178 if (!(fp = IoIFP(io))) {
2184 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2186 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2193 SV * const sv = POPs;
2196 if (SvTYPE(sv) == SVt_PVGV) {
2197 tmpgv = (GV*)sv; /* *main::FRED for example */
2198 goto do_ftruncate_gv;
2200 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2201 tmpgv = (GV*) SvRV(sv); /* \*main::FRED for example */
2202 goto do_ftruncate_gv;
2204 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2205 io = (IO*) SvRV(sv); /* *main::FRED{IO} for example */
2206 goto do_ftruncate_io;
2209 name = SvPV_nolen_const(sv);
2210 TAINT_PROPER("truncate");
2212 if (truncate(name, len) < 0)
2216 const int tmpfd = PerlLIO_open(name, O_RDWR);
2221 if (my_chsize(tmpfd, len) < 0)
2223 PerlLIO_close(tmpfd);
2232 SETERRNO(EBADF,RMS_IFI);
2240 SV * const argsv = POPs;
2241 const unsigned int func = POPu;
2242 const int optype = PL_op->op_type;
2243 GV * const gv = (GV*)POPs;
2244 IO * const io = gv ? GvIOn(gv) : NULL;
2248 if (!io || !argsv || !IoIFP(io)) {
2249 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2250 report_evil_fh(gv, io, PL_op->op_type);
2251 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2255 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2258 s = SvPV_force(argsv, len);
2259 need = IOCPARM_LEN(func);
2261 s = Sv_Grow(argsv, need + 1);
2262 SvCUR_set(argsv, need);
2265 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2268 retval = SvIV(argsv);
2269 s = INT2PTR(char*,retval); /* ouch */
2272 TAINT_PROPER(PL_op_desc[optype]);
2274 if (optype == OP_IOCTL)
2276 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2278 DIE(aTHX_ "ioctl is not implemented");
2282 DIE(aTHX_ "fcntl is not implemented");
2284 #if defined(OS2) && defined(__EMX__)
2285 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2287 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2291 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2293 if (s[SvCUR(argsv)] != 17)
2294 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2296 s[SvCUR(argsv)] = 0; /* put our null back */
2297 SvSETMAGIC(argsv); /* Assume it has changed */
2306 PUSHp(zero_but_true, ZBTLEN);
2319 const int argtype = POPi;
2320 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : (GV*)POPs;
2322 if (gv && (io = GvIO(gv)))
2328 /* XXX Looks to me like io is always NULL at this point */
2330 (void)PerlIO_flush(fp);
2331 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2334 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2335 report_evil_fh(gv, io, PL_op->op_type);
2337 SETERRNO(EBADF,RMS_IFI);
2342 DIE(aTHX_ PL_no_func, "flock()");
2352 const int protocol = POPi;
2353 const int type = POPi;
2354 const int domain = POPi;
2355 GV * const gv = (GV*)POPs;
2356 register IO * const io = gv ? GvIOn(gv) : NULL;
2360 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2361 report_evil_fh(gv, io, PL_op->op_type);
2362 if (io && IoIFP(io))
2363 do_close(gv, FALSE);
2364 SETERRNO(EBADF,LIB_INVARG);
2369 do_close(gv, FALSE);
2371 TAINT_PROPER("socket");
2372 fd = PerlSock_socket(domain, type, protocol);
2375 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2376 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2377 IoTYPE(io) = IoTYPE_SOCKET;
2378 if (!IoIFP(io) || !IoOFP(io)) {
2379 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2380 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2381 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2384 #if defined(HAS_FCNTL) && defined(F_SETFD)
2385 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2389 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2394 DIE(aTHX_ PL_no_sock_func, "socket");
2400 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2402 const int protocol = POPi;
2403 const int type = POPi;
2404 const int domain = POPi;
2405 GV * const gv2 = (GV*)POPs;
2406 GV * const gv1 = (GV*)POPs;
2407 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2408 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2411 if (!gv1 || !gv2 || !io1 || !io2) {
2412 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2414 report_evil_fh(gv1, io1, PL_op->op_type);
2416 report_evil_fh(gv1, io2, PL_op->op_type);
2418 if (io1 && IoIFP(io1))
2419 do_close(gv1, FALSE);
2420 if (io2 && IoIFP(io2))
2421 do_close(gv2, FALSE);
2426 do_close(gv1, FALSE);
2428 do_close(gv2, FALSE);
2430 TAINT_PROPER("socketpair");
2431 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2433 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2434 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2435 IoTYPE(io1) = IoTYPE_SOCKET;
2436 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2437 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2438 IoTYPE(io2) = IoTYPE_SOCKET;
2439 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2440 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2441 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2442 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2443 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2444 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2445 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2448 #if defined(HAS_FCNTL) && defined(F_SETFD)
2449 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2450 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2455 DIE(aTHX_ PL_no_sock_func, "socketpair");
2463 SV * const addrsv = POPs;
2464 /* OK, so on what platform does bind modify addr? */
2466 GV * const gv = (GV*)POPs;
2467 register IO * const io = GvIOn(gv);
2470 if (!io || !IoIFP(io))
2473 addr = SvPV_const(addrsv, len);
2474 TAINT_PROPER("bind");
2475 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2481 if (ckWARN(WARN_CLOSED))
2482 report_evil_fh(gv, io, PL_op->op_type);
2483 SETERRNO(EBADF,SS_IVCHAN);
2486 DIE(aTHX_ PL_no_sock_func, "bind");
2494 SV * const addrsv = POPs;
2495 GV * const gv = (GV*)POPs;
2496 register IO * const io = GvIOn(gv);
2500 if (!io || !IoIFP(io))
2503 addr = SvPV_const(addrsv, len);
2504 TAINT_PROPER("connect");
2505 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2511 if (ckWARN(WARN_CLOSED))
2512 report_evil_fh(gv, io, PL_op->op_type);
2513 SETERRNO(EBADF,SS_IVCHAN);
2516 DIE(aTHX_ PL_no_sock_func, "connect");
2524 const int backlog = POPi;
2525 GV * const gv = (GV*)POPs;
2526 register IO * const io = gv ? GvIOn(gv) : NULL;
2528 if (!gv || !io || !IoIFP(io))
2531 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2537 if (ckWARN(WARN_CLOSED))
2538 report_evil_fh(gv, io, PL_op->op_type);
2539 SETERRNO(EBADF,SS_IVCHAN);
2542 DIE(aTHX_ PL_no_sock_func, "listen");
2552 char namebuf[MAXPATHLEN];
2553 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2554 Sock_size_t len = sizeof (struct sockaddr_in);
2556 Sock_size_t len = sizeof namebuf;
2558 GV * const ggv = (GV*)POPs;
2559 GV * const ngv = (GV*)POPs;
2568 if (!gstio || !IoIFP(gstio))
2572 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2575 /* Some platforms indicate zero length when an AF_UNIX client is
2576 * not bound. Simulate a non-zero-length sockaddr structure in
2578 namebuf[0] = 0; /* sun_len */
2579 namebuf[1] = AF_UNIX; /* sun_family */
2587 do_close(ngv, FALSE);
2588 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2589 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2590 IoTYPE(nstio) = IoTYPE_SOCKET;
2591 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2592 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2593 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2594 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2597 #if defined(HAS_FCNTL) && defined(F_SETFD)
2598 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2602 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2603 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2605 #ifdef __SCO_VERSION__
2606 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2609 PUSHp(namebuf, len);
2613 if (ckWARN(WARN_CLOSED))
2614 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2615 SETERRNO(EBADF,SS_IVCHAN);
2621 DIE(aTHX_ PL_no_sock_func, "accept");
2629 const int how = POPi;
2630 GV * const gv = (GV*)POPs;
2631 register IO * const io = GvIOn(gv);
2633 if (!io || !IoIFP(io))
2636 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2640 if (ckWARN(WARN_CLOSED))
2641 report_evil_fh(gv, io, PL_op->op_type);
2642 SETERRNO(EBADF,SS_IVCHAN);
2645 DIE(aTHX_ PL_no_sock_func, "shutdown");
2653 const int optype = PL_op->op_type;
2654 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2655 const unsigned int optname = (unsigned int) POPi;
2656 const unsigned int lvl = (unsigned int) POPi;
2657 GV * const gv = (GV*)POPs;
2658 register IO * const io = GvIOn(gv);
2662 if (!io || !IoIFP(io))
2665 fd = PerlIO_fileno(IoIFP(io));
2669 (void)SvPOK_only(sv);
2673 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2680 #if defined(__SYMBIAN32__)
2681 # define SETSOCKOPT_OPTION_VALUE_T void *
2683 # define SETSOCKOPT_OPTION_VALUE_T const char *
2685 /* XXX TODO: We need to have a proper type (a Configure probe,
2686 * etc.) for what the C headers think of the third argument of
2687 * setsockopt(), the option_value read-only buffer: is it
2688 * a "char *", or a "void *", const or not. Some compilers
2689 * don't take kindly to e.g. assuming that "char *" implicitly
2690 * promotes to a "void *", or to explicitly promoting/demoting
2691 * consts to non/vice versa. The "const void *" is the SUS
2692 * definition, but that does not fly everywhere for the above
2694 SETSOCKOPT_OPTION_VALUE_T buf;
2698 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2702 aint = (int)SvIV(sv);
2703 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2706 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2715 if (ckWARN(WARN_CLOSED))
2716 report_evil_fh(gv, io, optype);
2717 SETERRNO(EBADF,SS_IVCHAN);
2722 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2730 const int optype = PL_op->op_type;
2731 GV * const gv = (GV*)POPs;
2732 register IO * const io = GvIOn(gv);
2737 if (!io || !IoIFP(io))
2740 sv = sv_2mortal(newSV(257));
2741 (void)SvPOK_only(sv);
2745 fd = PerlIO_fileno(IoIFP(io));
2747 case OP_GETSOCKNAME:
2748 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2751 case OP_GETPEERNAME:
2752 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2754 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2756 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";
2757 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2758 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2759 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2760 sizeof(u_short) + sizeof(struct in_addr))) {
2767 #ifdef BOGUS_GETNAME_RETURN
2768 /* Interactive Unix, getpeername() and getsockname()
2769 does not return valid namelen */
2770 if (len == BOGUS_GETNAME_RETURN)
2771 len = sizeof(struct sockaddr);
2779 if (ckWARN(WARN_CLOSED))
2780 report_evil_fh(gv, io, optype);
2781 SETERRNO(EBADF,SS_IVCHAN);
2786 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2801 if (PL_op->op_flags & OPf_REF) {
2803 if (PL_op->op_type == OP_LSTAT) {
2804 if (gv != PL_defgv) {
2805 do_fstat_warning_check:
2806 if (ckWARN(WARN_IO))
2807 Perl_warner(aTHX_ packWARN(WARN_IO),
2808 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2809 } else if (PL_laststype != OP_LSTAT)
2810 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2814 if (gv != PL_defgv) {
2815 PL_laststype = OP_STAT;
2817 sv_setpvn(PL_statname, "", 0);
2824 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2825 } else if (IoDIRP(io)) {
2827 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2829 PL_laststatval = -1;
2835 if (PL_laststatval < 0) {
2836 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2837 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2842 SV* const sv = POPs;
2843 if (SvTYPE(sv) == SVt_PVGV) {
2846 } else if(SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
2848 if (PL_op->op_type == OP_LSTAT)
2849 goto do_fstat_warning_check;
2851 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2853 if (PL_op->op_type == OP_LSTAT)
2854 goto do_fstat_warning_check;
2855 goto do_fstat_have_io;
2858 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2860 PL_laststype = PL_op->op_type;
2861 if (PL_op->op_type == OP_LSTAT)
2862 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2864 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2865 if (PL_laststatval < 0) {
2866 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2867 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2873 if (gimme != G_ARRAY) {
2874 if (gimme != G_VOID)
2875 XPUSHs(boolSV(max));
2881 mPUSHi(PL_statcache.st_dev);
2882 mPUSHi(PL_statcache.st_ino);
2883 mPUSHu(PL_statcache.st_mode);
2884 mPUSHu(PL_statcache.st_nlink);
2885 #if Uid_t_size > IVSIZE
2886 mPUSHn(PL_statcache.st_uid);
2888 # if Uid_t_sign <= 0
2889 mPUSHi(PL_statcache.st_uid);
2891 mPUSHu(PL_statcache.st_uid);
2894 #if Gid_t_size > IVSIZE
2895 mPUSHn(PL_statcache.st_gid);
2897 # if Gid_t_sign <= 0
2898 mPUSHi(PL_statcache.st_gid);
2900 mPUSHu(PL_statcache.st_gid);
2903 #ifdef USE_STAT_RDEV
2904 mPUSHi(PL_statcache.st_rdev);
2906 PUSHs(newSVpvs_flags("", SVs_TEMP));
2908 #if Off_t_size > IVSIZE
2909 mPUSHn(PL_statcache.st_size);
2911 mPUSHi(PL_statcache.st_size);
2914 mPUSHn(PL_statcache.st_atime);
2915 mPUSHn(PL_statcache.st_mtime);
2916 mPUSHn(PL_statcache.st_ctime);
2918 mPUSHi(PL_statcache.st_atime);
2919 mPUSHi(PL_statcache.st_mtime);
2920 mPUSHi(PL_statcache.st_ctime);
2922 #ifdef USE_STAT_BLOCKS
2923 mPUSHu(PL_statcache.st_blksize);
2924 mPUSHu(PL_statcache.st_blocks);
2926 PUSHs(newSVpvs_flags("", SVs_TEMP));
2927 PUSHs(newSVpvs_flags("", SVs_TEMP));
2933 /* This macro is used by the stacked filetest operators :
2934 * if the previous filetest failed, short-circuit and pass its value.
2935 * Else, discard it from the stack and continue. --rgs
2937 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2938 if (TOPs == &PL_sv_no || TOPs == &PL_sv_undef) { RETURN; } \
2939 else { (void)POPs; PUTBACK; } \
2946 /* Not const, because things tweak this below. Not bool, because there's
2947 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2948 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2949 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2950 /* Giving some sort of initial value silences compilers. */
2952 int access_mode = R_OK;
2954 int access_mode = 0;
2957 /* access_mode is never used, but leaving use_access in makes the
2958 conditional compiling below much clearer. */
2961 int stat_mode = S_IRUSR;
2963 bool effective = FALSE;
2966 STACKED_FTEST_CHECK;
2968 switch (PL_op->op_type) {
2970 #if !(defined(HAS_ACCESS) && defined(R_OK))
2976 #if defined(HAS_ACCESS) && defined(W_OK)
2981 stat_mode = S_IWUSR;
2985 #if defined(HAS_ACCESS) && defined(X_OK)
2990 stat_mode = S_IXUSR;
2994 #ifdef PERL_EFF_ACCESS
2997 stat_mode = S_IWUSR;
3001 #ifndef PERL_EFF_ACCESS
3008 #ifdef PERL_EFF_ACCESS
3013 stat_mode = S_IXUSR;
3019 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3020 const char *name = POPpx;
3022 # ifdef PERL_EFF_ACCESS
3023 result = PERL_EFF_ACCESS(name, access_mode);
3025 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3031 result = access(name, access_mode);
3033 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3048 if (cando(stat_mode, effective, &PL_statcache))
3057 const int op_type = PL_op->op_type;
3059 STACKED_FTEST_CHECK;
3064 if (op_type == OP_FTIS)
3067 /* You can't dTARGET inside OP_FTIS, because you'll get
3068 "panic: pad_sv po" - the op is not flagged to have a target. */
3072 #if Off_t_size > IVSIZE
3073 PUSHn(PL_statcache.st_size);
3075 PUSHi(PL_statcache.st_size);
3079 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3082 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3085 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3098 /* I believe that all these three are likely to be defined on most every
3099 system these days. */
3101 if(PL_op->op_type == OP_FTSUID)
3105 if(PL_op->op_type == OP_FTSGID)
3109 if(PL_op->op_type == OP_FTSVTX)
3113 STACKED_FTEST_CHECK;
3118 switch (PL_op->op_type) {
3120 if (PL_statcache.st_uid == PL_uid)
3124 if (PL_statcache.st_uid == PL_euid)
3128 if (PL_statcache.st_size == 0)
3132 if (S_ISSOCK(PL_statcache.st_mode))
3136 if (S_ISCHR(PL_statcache.st_mode))
3140 if (S_ISBLK(PL_statcache.st_mode))
3144 if (S_ISREG(PL_statcache.st_mode))
3148 if (S_ISDIR(PL_statcache.st_mode))
3152 if (S_ISFIFO(PL_statcache.st_mode))
3157 if (PL_statcache.st_mode & S_ISUID)
3163 if (PL_statcache.st_mode & S_ISGID)
3169 if (PL_statcache.st_mode & S_ISVTX)
3180 I32 result = my_lstat();
3184 if (S_ISLNK(PL_statcache.st_mode))
3197 STACKED_FTEST_CHECK;
3199 if (PL_op->op_flags & OPf_REF)
3201 else if (isGV(TOPs))
3203 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3204 gv = (GV*)SvRV(POPs);
3206 gv = gv_fetchsv(tmpsv = POPs, 0, SVt_PVIO);
3208 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3209 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3210 else if (tmpsv && SvOK(tmpsv)) {
3211 const char *tmps = SvPV_nolen_const(tmpsv);
3219 if (PerlLIO_isatty(fd))
3224 #if defined(atarist) /* this will work with atariST. Configure will
3225 make guesses for other systems. */
3226 # define FILE_base(f) ((f)->_base)
3227 # define FILE_ptr(f) ((f)->_ptr)
3228 # define FILE_cnt(f) ((f)->_cnt)
3229 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3240 register STDCHAR *s;
3246 STACKED_FTEST_CHECK;
3248 if (PL_op->op_flags & OPf_REF)
3250 else if (isGV(TOPs))
3252 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3253 gv = (GV*)SvRV(POPs);
3259 if (gv == PL_defgv) {
3261 io = GvIO(PL_statgv);
3264 goto really_filename;
3269 PL_laststatval = -1;
3270 sv_setpvn(PL_statname, "", 0);
3271 io = GvIO(PL_statgv);
3273 if (io && IoIFP(io)) {
3274 if (! PerlIO_has_base(IoIFP(io)))
3275 DIE(aTHX_ "-T and -B not implemented on filehandles");
3276 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3277 if (PL_laststatval < 0)
3279 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3280 if (PL_op->op_type == OP_FTTEXT)
3285 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3286 i = PerlIO_getc(IoIFP(io));
3288 (void)PerlIO_ungetc(IoIFP(io),i);
3290 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3292 len = PerlIO_get_bufsiz(IoIFP(io));
3293 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3294 /* sfio can have large buffers - limit to 512 */
3299 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3301 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3303 SETERRNO(EBADF,RMS_IFI);
3311 PL_laststype = OP_STAT;
3312 sv_setpv(PL_statname, SvPV_nolen_const(sv));
3313 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3314 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3316 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3319 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3320 if (PL_laststatval < 0) {
3321 (void)PerlIO_close(fp);
3324 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3325 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3326 (void)PerlIO_close(fp);
3328 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3329 RETPUSHNO; /* special case NFS directories */
3330 RETPUSHYES; /* null file is anything */
3335 /* now scan s to look for textiness */
3336 /* XXX ASCII dependent code */
3338 #if defined(DOSISH) || defined(USEMYBINMODE)
3339 /* ignore trailing ^Z on short files */
3340 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3344 for (i = 0; i < len; i++, s++) {
3345 if (!*s) { /* null never allowed in text */
3350 else if (!(isPRINT(*s) || isSPACE(*s)))
3353 else if (*s & 128) {
3355 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3358 /* utf8 characters don't count as odd */
3359 if (UTF8_IS_START(*s)) {
3360 int ulen = UTF8SKIP(s);
3361 if (ulen < len - i) {
3363 for (j = 1; j < ulen; j++) {
3364 if (!UTF8_IS_CONTINUATION(s[j]))
3367 --ulen; /* loop does extra increment */
3377 *s != '\n' && *s != '\r' && *s != '\b' &&
3378 *s != '\t' && *s != '\f' && *s != 27)
3383 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3394 const char *tmps = NULL;
3398 SV * const sv = POPs;
3399 if (PL_op->op_flags & OPf_SPECIAL) {
3400 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3402 else if (SvTYPE(sv) == SVt_PVGV) {
3405 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
3409 tmps = SvPV_nolen_const(sv);
3413 if( !gv && (!tmps || !*tmps) ) {
3414 HV * const table = GvHVn(PL_envgv);
3417 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3418 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3420 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3425 deprecate("chdir('') or chdir(undef) as chdir()");
3426 tmps = SvPV_nolen_const(*svp);
3430 TAINT_PROPER("chdir");
3435 TAINT_PROPER("chdir");
3438 IO* const io = GvIO(gv);
3441 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3442 } else if (IoIFP(io)) {
3443 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3446 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3447 report_evil_fh(gv, io, PL_op->op_type);
3448 SETERRNO(EBADF, RMS_IFI);
3453 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3454 report_evil_fh(gv, io, PL_op->op_type);
3455 SETERRNO(EBADF,RMS_IFI);
3459 DIE(aTHX_ PL_no_func, "fchdir");
3463 PUSHi( PerlDir_chdir(tmps) >= 0 );
3465 /* Clear the DEFAULT element of ENV so we'll get the new value
3467 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3474 dVAR; dSP; dMARK; dTARGET;
3475 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3486 char * const tmps = POPpx;
3487 TAINT_PROPER("chroot");
3488 PUSHi( chroot(tmps) >= 0 );
3491 DIE(aTHX_ PL_no_func, "chroot");
3499 const char * const tmps2 = POPpconstx;
3500 const char * const tmps = SvPV_nolen_const(TOPs);
3501 TAINT_PROPER("rename");
3503 anum = PerlLIO_rename(tmps, tmps2);
3505 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3506 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3509 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3510 (void)UNLINK(tmps2);
3511 if (!(anum = link(tmps, tmps2)))
3512 anum = UNLINK(tmps);
3520 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3524 const int op_type = PL_op->op_type;
3528 if (op_type == OP_LINK)
3529 DIE(aTHX_ PL_no_func, "link");
3531 # ifndef HAS_SYMLINK
3532 if (op_type == OP_SYMLINK)
3533 DIE(aTHX_ PL_no_func, "symlink");
3537 const char * const tmps2 = POPpconstx;
3538 const char * const tmps = SvPV_nolen_const(TOPs);
3539 TAINT_PROPER(PL_op_desc[op_type]);
3541 # if defined(HAS_LINK)
3542 # if defined(HAS_SYMLINK)
3543 /* Both present - need to choose which. */
3544 (op_type == OP_LINK) ?
3545 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3547 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3548 PerlLIO_link(tmps, tmps2);
3551 # if defined(HAS_SYMLINK)
3552 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3553 symlink(tmps, tmps2);
3558 SETi( result >= 0 );
3565 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3576 char buf[MAXPATHLEN];
3579 #ifndef INCOMPLETE_TAINTS
3583 len = readlink(tmps, buf, sizeof(buf) - 1);
3591 RETSETUNDEF; /* just pretend it's a normal file */
3595 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3597 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3599 char * const save_filename = filename;
3604 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3606 PERL_ARGS_ASSERT_DOONELINER;
3608 Newx(cmdline, size, char);
3609 my_strlcpy(cmdline, cmd, size);
3610 my_strlcat(cmdline, " ", size);
3611 for (s = cmdline + strlen(cmdline); *filename; ) {
3615 if (s - cmdline < size)
3616 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3617 myfp = PerlProc_popen(cmdline, "r");
3621 SV * const tmpsv = sv_newmortal();
3622 /* Need to save/restore 'PL_rs' ?? */
3623 s = sv_gets(tmpsv, myfp, 0);
3624 (void)PerlProc_pclose(myfp);
3628 #ifdef HAS_SYS_ERRLIST
3633 /* you don't see this */
3634 const char * const errmsg =
3635 #ifdef HAS_SYS_ERRLIST
3643 if (instr(s, errmsg)) {
3650 #define EACCES EPERM
3652 if (instr(s, "cannot make"))
3653 SETERRNO(EEXIST,RMS_FEX);
3654 else if (instr(s, "existing file"))
3655 SETERRNO(EEXIST,RMS_FEX);
3656 else if (instr(s, "ile exists"))
3657 SETERRNO(EEXIST,RMS_FEX);
3658 else if (instr(s, "non-exist"))
3659 SETERRNO(ENOENT,RMS_FNF);
3660 else if (instr(s, "does not exist"))
3661 SETERRNO(ENOENT,RMS_FNF);
3662 else if (instr(s, "not empty"))
3663 SETERRNO(EBUSY,SS_DEVOFFLINE);
3664 else if (instr(s, "cannot access"))
3665 SETERRNO(EACCES,RMS_PRV);
3667 SETERRNO(EPERM,RMS_PRV);
3670 else { /* some mkdirs return no failure indication */
3671 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3672 if (PL_op->op_type == OP_RMDIR)
3677 SETERRNO(EACCES,RMS_PRV); /* a guess */
3686 /* This macro removes trailing slashes from a directory name.
3687 * Different operating and file systems take differently to
3688 * trailing slashes. According to POSIX 1003.1 1996 Edition
3689 * any number of trailing slashes should be allowed.
3690 * Thusly we snip them away so that even non-conforming
3691 * systems are happy.
3692 * We should probably do this "filtering" for all
3693 * the functions that expect (potentially) directory names:
3694 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3695 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3697 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3698 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3701 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3702 (tmps) = savepvn((tmps), (len)); \
3712 const int mode = (MAXARG > 1) ? POPi : 0777;
3714 TRIMSLASHES(tmps,len,copy);
3716 TAINT_PROPER("mkdir");
3718 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3722 SETi( dooneliner("mkdir", tmps) );
3723 oldumask = PerlLIO_umask(0);
3724 PerlLIO_umask(oldumask);
3725 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3740 TRIMSLASHES(tmps,len,copy);
3741 TAINT_PROPER("rmdir");
3743 SETi( PerlDir_rmdir(tmps) >= 0 );
3745 SETi( dooneliner("rmdir", tmps) );
3752 /* Directory calls. */
3756 #if defined(Direntry_t) && defined(HAS_READDIR)
3758 const char * const dirname = POPpconstx;
3759 GV * const gv = (GV*)POPs;
3760 register IO * const io = GvIOn(gv);
3765 if ((IoIFP(io) || IoOFP(io)) && ckWARN2(WARN_IO, WARN_DEPRECATED))
3766 Perl_warner(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3767 "Opening filehandle %s also as a directory", GvENAME(gv));
3769 PerlDir_close(IoDIRP(io));
3770 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3776 SETERRNO(EBADF,RMS_DIR);
3779 DIE(aTHX_ PL_no_dir_func, "opendir");
3785 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3786 DIE(aTHX_ PL_no_dir_func, "readdir");
3788 #if !defined(I_DIRENT) && !defined(VMS)
3789 Direntry_t *readdir (DIR *);
3795 const I32 gimme = GIMME;
3796 GV * const gv = (GV *)POPs;
3797 register const Direntry_t *dp;
3798 register IO * const io = GvIOn(gv);
3800 if (!io || !IoDIRP(io)) {
3801 if(ckWARN(WARN_IO)) {
3802 Perl_warner(aTHX_ packWARN(WARN_IO),
3803 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3809 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3813 sv = newSVpvn(dp->d_name, dp->d_namlen);
3815 sv = newSVpv(dp->d_name, 0);
3817 #ifndef INCOMPLETE_TAINTS
3818 if (!(IoFLAGS(io) & IOf_UNTAINT))
3822 } while (gimme == G_ARRAY);
3824 if (!dp && gimme != G_ARRAY)
3831 SETERRNO(EBADF,RMS_ISI);
3832 if (GIMME == G_ARRAY)
3841 #if defined(HAS_TELLDIR) || defined(telldir)
3843 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3844 /* XXX netbsd still seemed to.
3845 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3846 --JHI 1999-Feb-02 */
3847 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3848 long telldir (DIR *);
3850 GV * const gv = (GV*)POPs;
3851 register IO * const io = GvIOn(gv);
3853 if (!io || !IoDIRP(io)) {
3854 if(ckWARN(WARN_IO)) {
3855 Perl_warner(aTHX_ packWARN(WARN_IO),
3856 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3861 PUSHi( PerlDir_tell(IoDIRP(io)) );
3865 SETERRNO(EBADF,RMS_ISI);
3868 DIE(aTHX_ PL_no_dir_func, "telldir");
3874 #if defined(HAS_SEEKDIR) || defined(seekdir)
3876 const long along = POPl;
3877 GV * const gv = (GV*)POPs;
3878 register IO * const io = GvIOn(gv);
3880 if (!io || !IoDIRP(io)) {
3881 if(ckWARN(WARN_IO)) {
3882 Perl_warner(aTHX_ packWARN(WARN_IO),
3883 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3887 (void)PerlDir_seek(IoDIRP(io), along);
3892 SETERRNO(EBADF,RMS_ISI);
3895 DIE(aTHX_ PL_no_dir_func, "seekdir");
3901 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3903 GV * const gv = (GV*)POPs;
3904 register IO * const io = GvIOn(gv);
3906 if (!io || !IoDIRP(io)) {
3907 if(ckWARN(WARN_IO)) {
3908 Perl_warner(aTHX_ packWARN(WARN_IO),
3909 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3913 (void)PerlDir_rewind(IoDIRP(io));
3917 SETERRNO(EBADF,RMS_ISI);
3920 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3926 #if defined(Direntry_t) && defined(HAS_READDIR)
3928 GV * const gv = (GV*)POPs;
3929 register IO * const io = GvIOn(gv);
3931 if (!io || !IoDIRP(io)) {
3932 if(ckWARN(WARN_IO)) {
3933 Perl_warner(aTHX_ packWARN(WARN_IO),
3934 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3938 #ifdef VOID_CLOSEDIR
3939 PerlDir_close(IoDIRP(io));
3941 if (PerlDir_close(IoDIRP(io)) < 0) {
3942 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3951 SETERRNO(EBADF,RMS_IFI);
3954 DIE(aTHX_ PL_no_dir_func, "closedir");
3958 /* Process control. */
3967 PERL_FLUSHALL_FOR_CHILD;
3968 childpid = PerlProc_fork();
3972 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
3974 SvREADONLY_off(GvSV(tmpgv));
3975 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
3976 SvREADONLY_on(GvSV(tmpgv));
3978 #ifdef THREADS_HAVE_PIDS
3979 PL_ppid = (IV)getppid();
3981 #ifdef PERL_USES_PL_PIDSTATUS
3982 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
3988 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
3993 PERL_FLUSHALL_FOR_CHILD;
3994 childpid = PerlProc_fork();
4000 DIE(aTHX_ PL_no_func, "fork");
4007 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4012 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4013 childpid = wait4pid(-1, &argflags, 0);
4015 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4020 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4021 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4022 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4024 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4029 DIE(aTHX_ PL_no_func, "wait");
4035 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
4037 const int optype = POPi;
4038 const Pid_t pid = TOPi;
4042 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4043 result = wait4pid(pid, &argflags, optype);
4045 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4050 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4051 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4052 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4054 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4059 DIE(aTHX_ PL_no_func, "waitpid");
4065 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4066 #if defined(__LIBCATAMOUNT__)
4067 PL_statusvalue = -1;
4076 while (++MARK <= SP) {
4077 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4082 TAINT_PROPER("system");
4084 PERL_FLUSHALL_FOR_CHILD;
4085 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4091 if (PerlProc_pipe(pp) >= 0)
4093 while ((childpid = PerlProc_fork()) == -1) {
4094 if (errno != EAGAIN) {
4099 PerlLIO_close(pp[0]);
4100 PerlLIO_close(pp[1]);
4107 Sigsave_t ihand,qhand; /* place to save signals during system() */
4111 PerlLIO_close(pp[1]);
4113 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4114 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4117 result = wait4pid(childpid, &status, 0);
4118 } while (result == -1 && errno == EINTR);
4120 (void)rsignal_restore(SIGINT, &ihand);
4121 (void)rsignal_restore(SIGQUIT, &qhand);
4123 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4124 do_execfree(); /* free any memory child malloced on fork */
4131 while (n < sizeof(int)) {
4132 n1 = PerlLIO_read(pp[0],
4133 (void*)(((char*)&errkid)+n),
4139 PerlLIO_close(pp[0]);
4140 if (n) { /* Error */
4141 if (n != sizeof(int))
4142 DIE(aTHX_ "panic: kid popen errno read");
4143 errno = errkid; /* Propagate errno from kid */
4144 STATUS_NATIVE_CHILD_SET(-1);
4147 XPUSHi(STATUS_CURRENT);
4151 PerlLIO_close(pp[0]);
4152 #if defined(HAS_FCNTL) && defined(F_SETFD)
4153 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4156 if (PL_op->op_flags & OPf_STACKED) {
4157 SV * const really = *++MARK;
4158 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4160 else if (SP - MARK != 1)
4161 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4163 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4167 #else /* ! FORK or VMS or OS/2 */
4170 if (PL_op->op_flags & OPf_STACKED) {
4171 SV * const really = *++MARK;
4172 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4173 value = (I32)do_aspawn(really, MARK, SP);
4175 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4178 else if (SP - MARK != 1) {
4179 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4180 value = (I32)do_aspawn(NULL, MARK, SP);
4182 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4186 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4188 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4190 STATUS_NATIVE_CHILD_SET(value);
4193 XPUSHi(result ? value : STATUS_CURRENT);
4194 #endif /* !FORK or VMS or OS/2 */
4201 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4206 while (++MARK <= SP) {
4207 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4212 TAINT_PROPER("exec");
4214 PERL_FLUSHALL_FOR_CHILD;
4215 if (PL_op->op_flags & OPf_STACKED) {
4216 SV * const really = *++MARK;
4217 value = (I32)do_aexec(really, MARK, SP);
4219 else if (SP - MARK != 1)
4221 value = (I32)vms_do_aexec(NULL, MARK, SP);
4225 (void ) do_aspawn(NULL, MARK, SP);
4229 value = (I32)do_aexec(NULL, MARK, SP);
4234 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4237 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4240 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4254 # ifdef THREADS_HAVE_PIDS
4255 if (PL_ppid != 1 && getppid() == 1)
4256 /* maybe the parent process has died. Refresh ppid cache */
4260 XPUSHi( getppid() );
4264 DIE(aTHX_ PL_no_func, "getppid");
4273 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4276 pgrp = (I32)BSD_GETPGRP(pid);
4278 if (pid != 0 && pid != PerlProc_getpid())
4279 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4285 DIE(aTHX_ PL_no_func, "getpgrp()");
4304 TAINT_PROPER("setpgrp");
4306 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4308 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4309 || (pid != 0 && pid != PerlProc_getpid()))
4311 DIE(aTHX_ "setpgrp can't take arguments");
4313 SETi( setpgrp() >= 0 );
4314 #endif /* USE_BSDPGRP */
4317 DIE(aTHX_ PL_no_func, "setpgrp()");
4323 #ifdef HAS_GETPRIORITY
4325 const int who = POPi;
4326 const int which = TOPi;
4327 SETi( getpriority(which, who) );
4330 DIE(aTHX_ PL_no_func, "getpriority()");
4336 #ifdef HAS_SETPRIORITY
4338 const int niceval = POPi;
4339 const int who = POPi;
4340 const int which = TOPi;
4341 TAINT_PROPER("setpriority");
4342 SETi( setpriority(which, who, niceval) >= 0 );
4345 DIE(aTHX_ PL_no_func, "setpriority()");
4355 XPUSHn( time(NULL) );
4357 XPUSHi( time(NULL) );
4369 (void)PerlProc_times(&PL_timesbuf);
4371 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4372 /* struct tms, though same data */
4376 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4377 if (GIMME == G_ARRAY) {
4378 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4379 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4380 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4388 if (GIMME == G_ARRAY) {
4395 DIE(aTHX_ "times not implemented");
4397 #endif /* HAS_TIMES */
4400 #ifdef LOCALTIME_EDGECASE_BROKEN
4401 static struct tm *S_my_localtime (pTHX_ Time_t *tp)
4406 /* No workarounds in the valid range */
4407 if (!tp || *tp < 0x7fff573f || *tp >= 0x80000000)
4408 return (localtime (tp));
4410 /* This edge case is to workaround the undefined behaviour, where the
4411 * TIMEZONE makes the time go beyond the defined range.
4412 * gmtime (0x7fffffff) => 2038-01-19 03:14:07
4413 * If there is a negative offset in TZ, like MET-1METDST, some broken
4414 * implementations of localtime () (like AIX 5.2) barf with bogus
4416 * 0x7fffffff gmtime 2038-01-19 03:14:07
4417 * 0x7fffffff localtime 1901-12-13 21:45:51
4418 * 0x7fffffff mylocaltime 2038-01-19 04:14:07
4419 * 0x3c19137f gmtime 2001-12-13 20:45:51
4420 * 0x3c19137f localtime 2001-12-13 21:45:51
4421 * 0x3c19137f mylocaltime 2001-12-13 21:45:51
4422 * Given that legal timezones are typically between GMT-12 and GMT+12
4423 * we turn back the clock 23 hours before calling the localtime
4424 * function, and add those to the return value. This will never cause
4425 * day wrapping problems, since the edge case is Tue Jan *19*
4427 T = *tp - 82800; /* 23 hour. allows up to GMT-23 */
4430 if (P->tm_hour >= 24) {
4432 P->tm_mday++; /* 18 -> 19 */
4433 P->tm_wday++; /* Mon -> Tue */
4434 P->tm_yday++; /* 18 -> 19 */
4437 } /* S_my_localtime */
4445 const struct tm *tmbuf;
4446 static const char * const dayname[] =
4447 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4448 static const char * const monname[] =
4449 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4450 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4456 when = (Time_t)SvNVx(POPs);
4458 when = (Time_t)SvIVx(POPs);
4461 if (PL_op->op_type == OP_LOCALTIME)
4462 #ifdef LOCALTIME_EDGECASE_BROKEN
4463 tmbuf = S_my_localtime(aTHX_ &when);
4465 tmbuf = localtime(&when);
4468 tmbuf = gmtime(&when);
4470 if (GIMME != G_ARRAY) {
4476 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %d",
4477 dayname[tmbuf->tm_wday],
4478 monname[tmbuf->tm_mon],
4483 tmbuf->tm_year + 1900);
4489 mPUSHi(tmbuf->tm_sec);
4490 mPUSHi(tmbuf->tm_min);
4491 mPUSHi(tmbuf->tm_hour);
4492 mPUSHi(tmbuf->tm_mday);
4493 mPUSHi(tmbuf->tm_mon);
4494 mPUSHi(tmbuf->tm_year);
4495 mPUSHi(tmbuf->tm_wday);
4496 mPUSHi(tmbuf->tm_yday);
4497 mPUSHi(tmbuf->tm_isdst);
4508 anum = alarm((unsigned int)anum);
4515 DIE(aTHX_ PL_no_func, "alarm");
4526 (void)time(&lasttime);
4531 PerlProc_sleep((unsigned int)duration);
4534 XPUSHi(when - lasttime);
4538 /* Shared memory. */
4539 /* Merged with some message passing. */
4543 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4544 dVAR; dSP; dMARK; dTARGET;
4545 const int op_type = PL_op->op_type;
4550 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4553 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4556 value = (I32)(do_semop(MARK, SP) >= 0);
4559 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4575 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4576 dVAR; dSP; dMARK; dTARGET;
4577 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4584 DIE(aTHX_ "System V IPC is not implemented on this machine");
4590 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4591 dVAR; dSP; dMARK; dTARGET;
4592 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4600 PUSHp(zero_but_true, ZBTLEN);
4608 /* I can't const this further without getting warnings about the types of
4609 various arrays passed in from structures. */
4611 S_space_join_names_mortal(pTHX_ char *const *array)
4615 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4617 if (array && *array) {
4618 target = newSVpvs_flags("", SVs_TEMP);
4620 sv_catpv(target, *array);
4623 sv_catpvs(target, " ");
4626 target = sv_mortalcopy(&PL_sv_no);
4631 /* Get system info. */
4635 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4637 I32 which = PL_op->op_type;
4638 register char **elem;
4640 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4641 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4642 struct hostent *gethostbyname(Netdb_name_t);
4643 struct hostent *gethostent(void);
4645 struct hostent *hent;
4649 if (which == OP_GHBYNAME) {
4650 #ifdef HAS_GETHOSTBYNAME
4651 const char* const name = POPpbytex;
4652 hent = PerlSock_gethostbyname(name);
4654 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4657 else if (which == OP_GHBYADDR) {
4658 #ifdef HAS_GETHOSTBYADDR
4659 const int addrtype = POPi;
4660 SV * const addrsv = POPs;
4662 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4664 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4666 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4670 #ifdef HAS_GETHOSTENT
4671 hent = PerlSock_gethostent();
4673 DIE(aTHX_ PL_no_sock_func, "gethostent");
4676 #ifdef HOST_NOT_FOUND
4678 #ifdef USE_REENTRANT_API
4679 # ifdef USE_GETHOSTENT_ERRNO
4680 h_errno = PL_reentrant_buffer->_gethostent_errno;
4683 STATUS_UNIX_SET(h_errno);
4687 if (GIMME != G_ARRAY) {
4688 PUSHs(sv = sv_newmortal());
4690 if (which == OP_GHBYNAME) {
4692 sv_setpvn(sv, hent->h_addr, hent->h_length);
4695 sv_setpv(sv, (char*)hent->h_name);
4701 mPUSHs(newSVpv((char*)hent->h_name, 0));
4702 PUSHs(space_join_names_mortal(hent->h_aliases));
4703 mPUSHi(hent->h_addrtype);
4704 len = hent->h_length;
4707 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4708 mXPUSHp(*elem, len);
4712 mPUSHp(hent->h_addr, len);
4714 PUSHs(sv_mortalcopy(&PL_sv_no));
4719 DIE(aTHX_ PL_no_sock_func, "gethostent");
4725 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4727 I32 which = PL_op->op_type;
4729 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4730 struct netent *getnetbyaddr(Netdb_net_t, int);
4731 struct netent *getnetbyname(Netdb_name_t);
4732 struct netent *getnetent(void);
4734 struct netent *nent;
4736 if (which == OP_GNBYNAME){
4737 #ifdef HAS_GETNETBYNAME
4738 const char * const name = POPpbytex;
4739 nent = PerlSock_getnetbyname(name);
4741 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4744 else if (which == OP_GNBYADDR) {
4745 #ifdef HAS_GETNETBYADDR
4746 const int addrtype = POPi;
4747 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4748 nent = PerlSock_getnetbyaddr(addr, addrtype);
4750 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4754 #ifdef HAS_GETNETENT
4755 nent = PerlSock_getnetent();
4757 DIE(aTHX_ PL_no_sock_func, "getnetent");
4760 #ifdef HOST_NOT_FOUND
4762 #ifdef USE_REENTRANT_API
4763 # ifdef USE_GETNETENT_ERRNO
4764 h_errno = PL_reentrant_buffer->_getnetent_errno;
4767 STATUS_UNIX_SET(h_errno);
4772 if (GIMME != G_ARRAY) {
4773 PUSHs(sv = sv_newmortal());
4775 if (which == OP_GNBYNAME)
4776 sv_setiv(sv, (IV)nent->n_net);
4778 sv_setpv(sv, nent->n_name);
4784 mPUSHs(newSVpv(nent->n_name, 0));
4785 PUSHs(space_join_names_mortal(nent->n_aliases));
4786 mPUSHi(nent->n_addrtype);
4787 mPUSHi(nent->n_net);
4792 DIE(aTHX_ PL_no_sock_func, "getnetent");
4798 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4800 I32 which = PL_op->op_type;
4802 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4803 struct protoent *getprotobyname(Netdb_name_t);
4804 struct protoent *getprotobynumber(int);
4805 struct protoent *getprotoent(void);
4807 struct protoent *pent;
4809 if (which == OP_GPBYNAME) {
4810 #ifdef HAS_GETPROTOBYNAME
4811 const char* const name = POPpbytex;
4812 pent = PerlSock_getprotobyname(name);
4814 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4817 else if (which == OP_GPBYNUMBER) {
4818 #ifdef HAS_GETPROTOBYNUMBER
4819 const int number = POPi;
4820 pent = PerlSock_getprotobynumber(number);
4822 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4826 #ifdef HAS_GETPROTOENT
4827 pent = PerlSock_getprotoent();
4829 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4833 if (GIMME != G_ARRAY) {
4834 PUSHs(sv = sv_newmortal());
4836 if (which == OP_GPBYNAME)
4837 sv_setiv(sv, (IV)pent->p_proto);
4839 sv_setpv(sv, pent->p_name);
4845 mPUSHs(newSVpv(pent->p_name, 0));
4846 PUSHs(space_join_names_mortal(pent->p_aliases));
4847 mPUSHi(pent->p_proto);
4852 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4858 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4860 I32 which = PL_op->op_type;
4862 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4863 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4864 struct servent *getservbyport(int, Netdb_name_t);
4865 struct servent *getservent(void);
4867 struct servent *sent;
4869 if (which == OP_GSBYNAME) {
4870 #ifdef HAS_GETSERVBYNAME
4871 const char * const proto = POPpbytex;
4872 const char * const name = POPpbytex;
4873 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4875 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4878 else if (which == OP_GSBYPORT) {
4879 #ifdef HAS_GETSERVBYPORT
4880 const char * const proto = POPpbytex;
4881 unsigned short port = (unsigned short)POPu;
4883 port = PerlSock_htons(port);
4885 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4887 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4891 #ifdef HAS_GETSERVENT
4892 sent = PerlSock_getservent();
4894 DIE(aTHX_ PL_no_sock_func, "getservent");
4898 if (GIMME != G_ARRAY) {
4899 PUSHs(sv = sv_newmortal());
4901 if (which == OP_GSBYNAME) {
4903 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4905 sv_setiv(sv, (IV)(sent->s_port));
4909 sv_setpv(sv, sent->s_name);
4915 mPUSHs(newSVpv(sent->s_name, 0));
4916 PUSHs(space_join_names_mortal(sent->s_aliases));
4918 mPUSHi(PerlSock_ntohs(sent->s_port));
4920 mPUSHi(sent->s_port);
4922 mPUSHs(newSVpv(sent->s_proto, 0));
4927 DIE(aTHX_ PL_no_sock_func, "getservent");
4933 #ifdef HAS_SETHOSTENT
4935 PerlSock_sethostent(TOPi);
4938 DIE(aTHX_ PL_no_sock_func, "sethostent");
4944 #ifdef HAS_SETNETENT
4946 (void)PerlSock_setnetent(TOPi);
4949 DIE(aTHX_ PL_no_sock_func, "setnetent");
4955 #ifdef HAS_SETPROTOENT
4957 (void)PerlSock_setprotoent(TOPi);
4960 DIE(aTHX_ PL_no_sock_func, "setprotoent");
4966 #ifdef HAS_SETSERVENT
4968 (void)PerlSock_setservent(TOPi);
4971 DIE(aTHX_ PL_no_sock_func, "setservent");
4977 #ifdef HAS_ENDHOSTENT
4979 PerlSock_endhostent();
4983 DIE(aTHX_ PL_no_sock_func, "endhostent");
4989 #ifdef HAS_ENDNETENT
4991 PerlSock_endnetent();
4995 DIE(aTHX_ PL_no_sock_func, "endnetent");
5001 #ifdef HAS_ENDPROTOENT
5003 PerlSock_endprotoent();
5007 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5013 #ifdef HAS_ENDSERVENT
5015 PerlSock_endservent();
5019 DIE(aTHX_ PL_no_sock_func, "endservent");
5027 I32 which = PL_op->op_type;
5029 struct passwd *pwent = NULL;
5031 * We currently support only the SysV getsp* shadow password interface.
5032 * The interface is declared in <shadow.h> and often one needs to link
5033 * with -lsecurity or some such.
5034 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5037 * AIX getpwnam() is clever enough to return the encrypted password
5038 * only if the caller (euid?) is root.
5040 * There are at least three other shadow password APIs. Many platforms
5041 * seem to contain more than one interface for accessing the shadow
5042 * password databases, possibly for compatibility reasons.
5043 * The getsp*() is by far he simplest one, the other two interfaces
5044 * are much more complicated, but also very similar to each other.
5049 * struct pr_passwd *getprpw*();
5050 * The password is in
5051 * char getprpw*(...).ufld.fd_encrypt[]
5052 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5057 * struct es_passwd *getespw*();
5058 * The password is in
5059 * char *(getespw*(...).ufld.fd_encrypt)
5060 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5063 * struct userpw *getuserpw();
5064 * The password is in
5065 * char *(getuserpw(...)).spw_upw_passwd
5066 * (but the de facto standard getpwnam() should work okay)
5068 * Mention I_PROT here so that Configure probes for it.
5070 * In HP-UX for getprpw*() the manual page claims that one should include
5071 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5072 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5073 * and pp_sys.c already includes <shadow.h> if there is such.
5075 * Note that <sys/security.h> is already probed for, but currently
5076 * it is only included in special cases.
5078 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5079 * be preferred interface, even though also the getprpw*() interface