3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
20 /* This file contains system pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
30 #define PERL_IN_PP_SYS_C
36 /* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
45 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
53 # include <sys/wait.h>
57 # include <sys/resource.h>
66 # include <sys/select.h>
70 /* XXX Configure test needed.
71 h_errno might not be a simple 'int', especially for multi-threaded
72 applications, see "extern int errno in perl.h". Creating such
73 a test requires taking into account the differences between
74 compiling multithreaded and singlethreaded ($ccflags et al).
75 HOST_NOT_FOUND is typically defined in <netdb.h>.
77 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
86 struct passwd *getpwnam (char *);
87 struct passwd *getpwuid (Uid_t);
92 struct passwd *getpwent (void);
93 #elif defined (VMS) && defined (my_getpwent)
94 struct passwd *Perl_my_getpwent (pTHX);
103 struct group *getgrnam (char *);
104 struct group *getgrgid (Gid_t);
108 struct group *getgrent (void);
114 # if defined(_MSC_VER) || defined(__MINGW32__)
115 # include <sys/utime.h>
122 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
125 # define my_chsize PerlLIO_chsize
128 # define my_chsize PerlLIO_chsize
130 I32 my_chsize(int fd, Off_t length);
136 #else /* no flock() */
138 /* fcntl.h might not have been included, even if it exists, because
139 the current Configure only sets I_FCNTL if it's needed to pick up
140 the *_OK constants. Make sure it has been included before testing
141 the fcntl() locking constants. */
142 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
146 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
147 # define FLOCK fcntl_emulate_flock
148 # define FCNTL_EMULATE_FLOCK
149 # else /* no flock() or fcntl(F_SETLK,...) */
151 # define FLOCK lockf_emulate_flock
152 # define LOCKF_EMULATE_FLOCK
154 # endif /* no flock() or fcntl(F_SETLK,...) */
157 static int FLOCK (int, int);
160 * These are the flock() constants. Since this sytems doesn't have
161 * flock(), the values of the constants are probably not available.
175 # endif /* emulating flock() */
177 #endif /* no flock() */
180 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
182 #if defined(I_SYS_ACCESS) && !defined(R_OK)
183 # include <sys/access.h>
186 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
187 # define FD_CLOEXEC 1 /* NeXT needs this */
193 /* Missing protos on LynxOS */
194 void sethostent(int);
195 void endhostent(void);
197 void endnetent(void);
198 void setprotoent(int);
199 void endprotoent(void);
200 void setservent(int);
201 void endservent(void);
204 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
206 /* F_OK unused: if stat() cannot find it... */
208 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
209 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
210 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
213 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
214 # ifdef I_SYS_SECURITY
215 # include <sys/security.h>
219 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
222 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
226 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
228 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
232 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
233 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
234 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
237 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
239 const Uid_t ruid = getuid();
240 const Uid_t euid = geteuid();
241 const Gid_t rgid = getgid();
242 const Gid_t egid = getegid();
245 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
246 Perl_croak(aTHX_ "switching effective uid is not implemented");
249 if (setreuid(euid, ruid))
252 if (setresuid(euid, ruid, (Uid_t)-1))
255 Perl_croak(aTHX_ "entering effective uid failed");
258 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
259 Perl_croak(aTHX_ "switching effective gid is not implemented");
262 if (setregid(egid, rgid))
265 if (setresgid(egid, rgid, (Gid_t)-1))
268 Perl_croak(aTHX_ "entering effective gid failed");
271 res = access(path, mode);
274 if (setreuid(ruid, euid))
277 if (setresuid(ruid, euid, (Uid_t)-1))
280 Perl_croak(aTHX_ "leaving effective uid failed");
283 if (setregid(rgid, egid))
286 if (setresgid(rgid, egid, (Gid_t)-1))
289 Perl_croak(aTHX_ "leaving effective gid failed");
293 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
300 const char * const tmps = POPpconstx;
301 const I32 gimme = GIMME_V;
302 const char *mode = "r";
305 if (PL_op->op_private & OPpOPEN_IN_RAW)
307 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
309 fp = PerlProc_popen(tmps, mode);
311 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
313 PerlIO_apply_layers(aTHX_ fp,mode,type);
315 if (gimme == G_VOID) {
317 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
320 else if (gimme == G_SCALAR) {
321 ENTER_with_name("backtick");
323 PL_rs = &PL_sv_undef;
324 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
325 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
327 LEAVE_with_name("backtick");
333 SV * const sv = newSV(79);
334 if (sv_gets(sv, fp, 0) == NULL) {
339 if (SvLEN(sv) - SvCUR(sv) > 20) {
340 SvPV_shrink_to_cur(sv);
345 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
346 TAINT; /* "I believe that this is not gratuitous!" */
349 STATUS_NATIVE_CHILD_SET(-1);
350 if (gimme == G_SCALAR)
362 /* make a copy of the pattern, to ensure that magic is called once
364 TOPm1s = sv_2mortal(newSVsv(TOPm1s));
366 tryAMAGICunTARGET(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
368 if (PL_op->op_flags & OPf_SPECIAL) {
369 /* call Perl-level glob function instead. Stack args are:
370 * MARK, wildcard, csh_glob context index
371 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
375 /* stack args are: wildcard, gv(_GEN_n) */
378 /* Note that we only ever get here if File::Glob fails to load
379 * without at the same time croaking, for some reason, or if
380 * perl was built with PERL_EXTERNAL_GLOB */
382 ENTER_with_name("glob");
387 * The external globbing program may use things we can't control,
388 * so for security reasons we must assume the worst.
391 taint_proper(PL_no_security, "glob");
395 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
396 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
398 SAVESPTR(PL_rs); /* This is not permanent, either. */
399 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
402 *SvPVX(PL_rs) = '\n';
406 result = do_readline();
407 LEAVE_with_name("glob");
414 PL_last_in_gv = cGVOP_gv;
415 return do_readline();
425 do_join(TARG, &PL_sv_no, MARK, SP);
429 else if (SP == MARK) {
438 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
439 /* well-formed exception supplied */
441 else if (SvROK(ERRSV)) {
444 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
445 exsv = sv_mortalcopy(ERRSV);
446 sv_catpvs(exsv, "\t...caught");
449 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
451 if (SvROK(exsv) && !PL_warnhook)
452 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
463 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
465 if (SP - MARK != 1) {
467 do_join(TARG, &PL_sv_no, MARK, SP);
475 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
476 /* well-formed exception supplied */
478 else if (SvROK(ERRSV)) {
480 if (sv_isobject(exsv)) {
481 HV * const stash = SvSTASH(SvRV(exsv));
482 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
484 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
485 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
492 call_sv(MUTABLE_SV(GvCV(gv)),
493 G_SCALAR|G_EVAL|G_KEEPERR);
494 exsv = sv_mortalcopy(*PL_stack_sp--);
498 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
499 exsv = sv_mortalcopy(ERRSV);
500 sv_catpvs(exsv, "\t...propagated");
503 exsv = newSVpvs_flags("Died", SVs_TEMP);
511 Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv,
512 const MAGIC *const mg, const U32 flags, U32 argc, ...)
517 PERL_ARGS_ASSERT_TIED_METHOD;
519 /* Ensure that our flag bits do not overlap. */
520 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
521 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
522 assert((TIED_METHOD_SAY & G_WANT) == 0);
524 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
525 PUSHSTACKi(PERLSI_MAGIC);
526 EXTEND(SP, argc+1); /* object + args */
528 PUSHs(SvTIED_obj(sv, mg));
529 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
530 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
534 const U32 mortalize_not_needed
535 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
537 va_start(args, argc);
539 SV *const arg = va_arg(args, SV *);
540 if(mortalize_not_needed)
549 ENTER_with_name("call_tied_method");
550 if (flags & TIED_METHOD_SAY) {
551 /* local $\ = "\n" */
552 SAVEGENERICSV(PL_ors_sv);
553 PL_ors_sv = newSVpvs("\n");
555 ret_args = call_method(methname, flags & G_WANT);
560 if (ret_args) { /* copy results back to original stack */
561 EXTEND(sp, ret_args);
562 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
566 LEAVE_with_name("call_tied_method");
570 #define tied_method0(a,b,c,d) \
571 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
572 #define tied_method1(a,b,c,d,e) \
573 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
574 #define tied_method2(a,b,c,d,e,f) \
575 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
588 GV * const gv = MUTABLE_GV(*++MARK);
590 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
591 DIE(aTHX_ PL_no_usym, "filehandle");
593 if ((io = GvIOp(gv))) {
595 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
598 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
599 "Opening dirhandle %s also as a file",
602 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
604 /* Method's args are same as ours ... */
605 /* ... except handle is replaced by the object */
606 return Perl_tied_method(aTHX_ "OPEN", mark - 1, MUTABLE_SV(io), mg,
607 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
619 tmps = SvPV_const(sv, len);
620 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
623 PUSHi( (I32)PL_forkprocess );
624 else if (PL_forkprocess == 0) /* we are a new child */
635 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
641 IO * const io = GvIO(gv);
643 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
645 return tied_method0("CLOSE", SP, MUTABLE_SV(io), mg);
649 PUSHs(boolSV(do_close(gv, TRUE)));
662 GV * const wgv = MUTABLE_GV(POPs);
663 GV * const rgv = MUTABLE_GV(POPs);
668 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
669 DIE(aTHX_ PL_no_usym, "filehandle");
674 do_close(rgv, FALSE);
676 do_close(wgv, FALSE);
678 if (PerlProc_pipe(fd) < 0)
681 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
682 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
683 IoOFP(rstio) = IoIFP(rstio);
684 IoIFP(wstio) = IoOFP(wstio);
685 IoTYPE(rstio) = IoTYPE_RDONLY;
686 IoTYPE(wstio) = IoTYPE_WRONLY;
688 if (!IoIFP(rstio) || !IoOFP(wstio)) {
690 PerlIO_close(IoIFP(rstio));
692 PerlLIO_close(fd[0]);
694 PerlIO_close(IoOFP(wstio));
696 PerlLIO_close(fd[1]);
699 #if defined(HAS_FCNTL) && defined(F_SETFD)
700 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
701 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
708 DIE(aTHX_ PL_no_func, "pipe");
722 gv = MUTABLE_GV(POPs);
726 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
728 return tied_method0("FILENO", SP, MUTABLE_SV(io), mg);
731 if (!io || !(fp = IoIFP(io))) {
732 /* Can't do this because people seem to do things like
733 defined(fileno($foo)) to check whether $foo is a valid fh.
740 PUSHi(PerlIO_fileno(fp));
752 if (MAXARG < 1 || (!TOPs && !POPs)) {
753 anum = PerlLIO_umask(022);
754 /* setting it to 022 between the two calls to umask avoids
755 * to have a window where the umask is set to 0 -- meaning
756 * that another thread could create world-writeable files. */
758 (void)PerlLIO_umask(anum);
761 anum = PerlLIO_umask(POPi);
762 TAINT_PROPER("umask");
765 /* Only DIE if trying to restrict permissions on "user" (self).
766 * Otherwise it's harmless and more useful to just return undef
767 * since 'group' and 'other' concepts probably don't exist here. */
768 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
769 DIE(aTHX_ "umask not implemented");
770 XPUSHs(&PL_sv_undef);
789 gv = MUTABLE_GV(POPs);
793 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
795 /* This takes advantage of the implementation of the varargs
796 function, which I don't think that the optimiser will be able to
797 figure out. Although, as it's a static function, in theory it
799 return Perl_tied_method(aTHX_ "BINMODE", SP, MUTABLE_SV(io), mg,
800 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
801 discp ? 1 : 0, discp);
805 if (!io || !(fp = IoIFP(io))) {
807 SETERRNO(EBADF,RMS_IFI);
814 const char *d = NULL;
817 d = SvPV_const(discp, len);
818 mode = mode_from_discipline(d, len);
819 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
820 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
821 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
842 const I32 markoff = MARK - PL_stack_base;
843 const char *methname;
844 int how = PERL_MAGIC_tied;
848 switch(SvTYPE(varsv)) {
850 methname = "TIEHASH";
851 HvEITER_set(MUTABLE_HV(varsv), 0);
854 methname = "TIEARRAY";
858 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
859 methname = "TIEHANDLE";
860 how = PERL_MAGIC_tiedscalar;
861 /* For tied filehandles, we apply tiedscalar magic to the IO
862 slot of the GP rather than the GV itself. AMS 20010812 */
864 GvIOp(varsv) = newIO();
865 varsv = MUTABLE_SV(GvIOp(varsv));
870 methname = "TIESCALAR";
871 how = PERL_MAGIC_tiedscalar;
875 if (sv_isobject(*MARK)) { /* Calls GET magic. */
876 ENTER_with_name("call_TIE");
877 PUSHSTACKi(PERLSI_MAGIC);
879 EXTEND(SP,(I32)items);
883 call_method(methname, G_SCALAR);
886 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
887 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
888 * wrong error message, and worse case, supreme action at a distance.
889 * (Sorry obfuscation writers. You're not going to be given this one.)
892 const char *name = SvPV_nomg_const(*MARK, len);
893 stash = gv_stashpvn(name, len, 0);
894 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
895 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
896 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
898 ENTER_with_name("call_TIE");
899 PUSHSTACKi(PERLSI_MAGIC);
901 EXTEND(SP,(I32)items);
905 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
911 if (sv_isobject(sv)) {
912 sv_unmagic(varsv, how);
913 /* Croak if a self-tie on an aggregate is attempted. */
914 if (varsv == SvRV(sv) &&
915 (SvTYPE(varsv) == SVt_PVAV ||
916 SvTYPE(varsv) == SVt_PVHV))
918 "Self-ties of arrays and hashes are not supported");
919 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
921 LEAVE_with_name("call_TIE");
922 SP = PL_stack_base + markoff;
932 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
933 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
935 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
938 if ((mg = SvTIED_mg(sv, how))) {
939 SV * const obj = SvRV(SvTIED_obj(sv, mg));
941 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
943 if (gv && isGV(gv) && (cv = GvCV(gv))) {
945 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
946 mXPUSHi(SvREFCNT(obj) - 1);
948 ENTER_with_name("call_UNTIE");
949 call_sv(MUTABLE_SV(cv), G_VOID);
950 LEAVE_with_name("call_UNTIE");
953 else if (mg && SvREFCNT(obj) > 1) {
954 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
955 "untie attempted while %"UVuf" inner references still exist",
956 (UV)SvREFCNT(obj) - 1 ) ;
960 sv_unmagic(sv, how) ;
970 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
971 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
973 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
976 if ((mg = SvTIED_mg(sv, how))) {
977 SV *osv = SvTIED_obj(sv, mg);
978 if (osv == mg->mg_obj)
979 osv = sv_mortalcopy(osv);
993 HV * const hv = MUTABLE_HV(POPs);
994 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
995 stash = gv_stashsv(sv, 0);
996 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
998 require_pv("AnyDBM_File.pm");
1000 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1001 DIE(aTHX_ "No dbm on this machine");
1011 mPUSHu(O_RDWR|O_CREAT);
1016 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1019 if (!sv_isobject(TOPs)) {
1027 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1031 if (sv_isobject(TOPs)) {
1032 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1033 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1050 struct timeval timebuf;
1051 struct timeval *tbuf = &timebuf;
1054 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1059 # if BYTEORDER & 0xf0000
1060 # define ORDERBYTE (0x88888888 - BYTEORDER)
1062 # define ORDERBYTE (0x4444 - BYTEORDER)
1068 for (i = 1; i <= 3; i++) {
1069 SV * const sv = SP[i];
1072 if (SvREADONLY(sv)) {
1074 sv_force_normal_flags(sv, 0);
1075 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1076 Perl_croak_no_modify(aTHX);
1079 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1080 SvPV_force_nolen(sv); /* force string conversion */
1087 /* little endians can use vecs directly */
1088 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1095 masksize = NFDBITS / NBBY;
1097 masksize = sizeof(long); /* documented int, everyone seems to use long */
1099 Zero(&fd_sets[0], 4, char*);
1102 # if SELECT_MIN_BITS == 1
1103 growsize = sizeof(fd_set);
1105 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1106 # undef SELECT_MIN_BITS
1107 # define SELECT_MIN_BITS __FD_SETSIZE
1109 /* If SELECT_MIN_BITS is greater than one we most probably will want
1110 * to align the sizes with SELECT_MIN_BITS/8 because for example
1111 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1112 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1113 * on (sets/tests/clears bits) is 32 bits. */
1114 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1122 timebuf.tv_sec = (long)value;
1123 value -= (NV)timebuf.tv_sec;
1124 timebuf.tv_usec = (long)(value * 1000000.0);
1129 for (i = 1; i <= 3; i++) {
1131 if (!SvOK(sv) || SvCUR(sv) == 0) {
1138 Sv_Grow(sv, growsize);
1142 while (++j <= growsize) {
1146 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1148 Newx(fd_sets[i], growsize, char);
1149 for (offset = 0; offset < growsize; offset += masksize) {
1150 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1151 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1154 fd_sets[i] = SvPVX(sv);
1158 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1159 /* Can't make just the (void*) conditional because that would be
1160 * cpp #if within cpp macro, and not all compilers like that. */
1161 nfound = PerlSock_select(
1163 (Select_fd_set_t) fd_sets[1],
1164 (Select_fd_set_t) fd_sets[2],
1165 (Select_fd_set_t) fd_sets[3],
1166 (void*) tbuf); /* Workaround for compiler bug. */
1168 nfound = PerlSock_select(
1170 (Select_fd_set_t) fd_sets[1],
1171 (Select_fd_set_t) fd_sets[2],
1172 (Select_fd_set_t) fd_sets[3],
1175 for (i = 1; i <= 3; i++) {
1178 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1180 for (offset = 0; offset < growsize; offset += masksize) {
1181 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1182 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1184 Safefree(fd_sets[i]);
1191 if (GIMME == G_ARRAY && tbuf) {
1192 value = (NV)(timebuf.tv_sec) +
1193 (NV)(timebuf.tv_usec) / 1000000.0;
1198 DIE(aTHX_ "select not implemented");
1203 =for apidoc setdefout
1205 Sets PL_defoutgv, the default file handle for output, to the passed in
1206 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1207 count of the passed in typeglob is increased by one, and the reference count
1208 of the typeglob that PL_defoutgv points to is decreased by one.
1214 Perl_setdefout(pTHX_ GV *gv)
1217 SvREFCNT_inc_simple_void(gv);
1218 SvREFCNT_dec(PL_defoutgv);
1226 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1227 GV * egv = GvEGVx(PL_defoutgv);
1231 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1233 XPUSHs(&PL_sv_undef);
1235 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1236 if (gvp && *gvp == egv) {
1237 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1241 mXPUSHs(newRV(MUTABLE_SV(egv)));
1246 if (!GvIO(newdefout))
1247 gv_IOadd(newdefout);
1248 setdefout(newdefout);
1258 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1259 IO *const io = GvIO(gv);
1265 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1267 const U32 gimme = GIMME_V;
1268 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1269 if (gimme == G_SCALAR) {
1271 SvSetMagicSV_nosteal(TARG, TOPs);
1276 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1277 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1279 SETERRNO(EBADF,RMS_IFI);
1283 sv_setpvs(TARG, " ");
1284 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1285 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1286 /* Find out how many bytes the char needs */
1287 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1290 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1291 SvCUR_set(TARG,1+len);
1300 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1303 register PERL_CONTEXT *cx;
1304 const I32 gimme = GIMME_V;
1306 PERL_ARGS_ASSERT_DOFORM;
1308 if (cv && CvCLONE(cv))
1309 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1314 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1315 PUSHFORMAT(cx, retop);
1317 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1319 setdefout(gv); /* locally select filehandle so $% et al work */
1338 gv = MUTABLE_GV(POPs);
1352 goto not_a_format_reference;
1357 tmpsv = sv_newmortal();
1358 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1359 name = SvPV_nolen_const(tmpsv);
1361 DIE(aTHX_ "Undefined format \"%s\" called", name);
1363 not_a_format_reference:
1364 DIE(aTHX_ "Not a format reference");
1366 IoFLAGS(io) &= ~IOf_DIDTOP;
1367 return doform(cv,gv,PL_op->op_next);
1373 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1374 register IO * const io = GvIOp(gv);
1379 register PERL_CONTEXT *cx;
1382 if (!io || !(ofp = IoOFP(io)))
1385 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1386 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1388 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1389 PL_formtarget != PL_toptarget)
1393 if (!IoTOP_GV(io)) {
1396 if (!IoTOP_NAME(io)) {
1398 if (!IoFMT_NAME(io))
1399 IoFMT_NAME(io) = savepv(GvNAME(gv));
1400 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1401 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1402 if ((topgv && GvFORM(topgv)) ||
1403 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1404 IoTOP_NAME(io) = savesvpv(topname);
1406 IoTOP_NAME(io) = savepvs("top");
1408 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1409 if (!topgv || !GvFORM(topgv)) {
1410 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1413 IoTOP_GV(io) = topgv;
1415 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1416 I32 lines = IoLINES_LEFT(io);
1417 const char *s = SvPVX_const(PL_formtarget);
1418 if (lines <= 0) /* Yow, header didn't even fit!!! */
1420 while (lines-- > 0) {
1421 s = strchr(s, '\n');
1427 const STRLEN save = SvCUR(PL_formtarget);
1428 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1429 do_print(PL_formtarget, ofp);
1430 SvCUR_set(PL_formtarget, save);
1431 sv_chop(PL_formtarget, s);
1432 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1435 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1436 do_print(PL_formfeed, ofp);
1437 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1439 PL_formtarget = PL_toptarget;
1440 IoFLAGS(io) |= IOf_DIDTOP;
1443 DIE(aTHX_ "bad top format reference");
1446 SV * const sv = sv_newmortal();
1448 gv_efullname4(sv, fgv, NULL, FALSE);
1449 name = SvPV_nolen_const(sv);
1451 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1453 DIE(aTHX_ "Undefined top format called");
1455 return doform(cv, gv, PL_op);
1459 POPBLOCK(cx,PL_curpm);
1461 retop = cx->blk_sub.retop;
1467 report_wrongway_fh(gv, '<');
1473 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1474 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1476 if (!do_print(PL_formtarget, fp))
1479 FmLINES(PL_formtarget) = 0;
1480 SvCUR_set(PL_formtarget, 0);
1481 *SvEND(PL_formtarget) = '\0';
1482 if (IoFLAGS(io) & IOf_FLUSH)
1483 (void)PerlIO_flush(fp);
1488 PL_formtarget = PL_bodytarget;
1490 PERL_UNUSED_VAR(newsp);
1491 PERL_UNUSED_VAR(gimme);
1497 dVAR; dSP; dMARK; dORIGMARK;
1502 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1503 IO *const io = GvIO(gv);
1506 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1508 if (MARK == ORIGMARK) {
1511 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1514 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1516 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1524 SETERRNO(EBADF,RMS_IFI);
1527 else if (!(fp = IoOFP(io))) {
1529 report_wrongway_fh(gv, '<');
1530 else if (ckWARN(WARN_CLOSED))
1532 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1536 do_sprintf(sv, SP - MARK, MARK + 1);
1537 if (!do_print(sv, fp))
1540 if (IoFLAGS(io) & IOf_FLUSH)
1541 if (PerlIO_flush(fp) == EOF)
1552 PUSHs(&PL_sv_undef);
1560 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1561 const int mode = POPi;
1562 SV * const sv = POPs;
1563 GV * const gv = MUTABLE_GV(POPs);
1566 /* Need TIEHANDLE method ? */
1567 const char * const tmps = SvPV_const(sv, len);
1568 /* FIXME? do_open should do const */
1569 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1570 IoLINES(GvIOp(gv)) = 0;
1574 PUSHs(&PL_sv_undef);
1581 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1587 Sock_size_t bufsize;
1595 bool charstart = FALSE;
1596 STRLEN charskip = 0;
1599 GV * const gv = MUTABLE_GV(*++MARK);
1600 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1601 && gv && (io = GvIO(gv)) )
1603 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1605 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1606 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1615 sv_setpvs(bufsv, "");
1616 length = SvIVx(*++MARK);
1619 offset = SvIVx(*++MARK);
1623 if (!io || !IoIFP(io)) {
1625 SETERRNO(EBADF,RMS_IFI);
1628 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1629 buffer = SvPVutf8_force(bufsv, blen);
1630 /* UTF-8 may not have been set if they are all low bytes */
1635 buffer = SvPV_force(bufsv, blen);
1636 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1639 DIE(aTHX_ "Negative length");
1647 if (PL_op->op_type == OP_RECV) {
1648 char namebuf[MAXPATHLEN];
1649 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1650 bufsize = sizeof (struct sockaddr_in);
1652 bufsize = sizeof namebuf;
1654 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1658 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1659 /* 'offset' means 'flags' here */
1660 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1661 (struct sockaddr *)namebuf, &bufsize);
1664 /* MSG_TRUNC can give oversized count; quietly lose it */
1668 /* Bogus return without padding */
1669 bufsize = sizeof (struct sockaddr_in);
1671 SvCUR_set(bufsv, count);
1672 *SvEND(bufsv) = '\0';
1673 (void)SvPOK_only(bufsv);
1677 /* This should not be marked tainted if the fp is marked clean */
1678 if (!(IoFLAGS(io) & IOf_UNTAINT))
1679 SvTAINTED_on(bufsv);
1681 sv_setpvn(TARG, namebuf, bufsize);
1686 if (DO_UTF8(bufsv)) {
1687 /* offset adjust in characters not bytes */
1688 blen = sv_len_utf8(bufsv);
1691 if (-offset > (int)blen)
1692 DIE(aTHX_ "Offset outside string");
1695 if (DO_UTF8(bufsv)) {
1696 /* convert offset-as-chars to offset-as-bytes */
1697 if (offset >= (int)blen)
1698 offset += SvCUR(bufsv) - blen;
1700 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1703 bufsize = SvCUR(bufsv);
1704 /* Allocating length + offset + 1 isn't perfect in the case of reading
1705 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1707 (should be 2 * length + offset + 1, or possibly something longer if
1708 PL_encoding is true) */
1709 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1710 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1711 Zero(buffer+bufsize, offset-bufsize, char);
1713 buffer = buffer + offset;
1715 read_target = bufsv;
1717 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1718 concatenate it to the current buffer. */
1720 /* Truncate the existing buffer to the start of where we will be
1722 SvCUR_set(bufsv, offset);
1724 read_target = sv_newmortal();
1725 SvUPGRADE(read_target, SVt_PV);
1726 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1729 if (PL_op->op_type == OP_SYSREAD) {
1730 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1731 if (IoTYPE(io) == IoTYPE_SOCKET) {
1732 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1738 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1743 #ifdef HAS_SOCKET__bad_code_maybe
1744 if (IoTYPE(io) == IoTYPE_SOCKET) {
1745 char namebuf[MAXPATHLEN];
1746 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1747 bufsize = sizeof (struct sockaddr_in);
1749 bufsize = sizeof namebuf;
1751 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1752 (struct sockaddr *)namebuf, &bufsize);
1757 count = PerlIO_read(IoIFP(io), buffer, length);
1758 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1759 if (count == 0 && PerlIO_error(IoIFP(io)))
1763 if (IoTYPE(io) == IoTYPE_WRONLY)
1764 report_wrongway_fh(gv, '>');
1767 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1768 *SvEND(read_target) = '\0';
1769 (void)SvPOK_only(read_target);
1770 if (fp_utf8 && !IN_BYTES) {
1771 /* Look at utf8 we got back and count the characters */
1772 const char *bend = buffer + count;
1773 while (buffer < bend) {
1775 skip = UTF8SKIP(buffer);
1778 if (buffer - charskip + skip > bend) {
1779 /* partial character - try for rest of it */
1780 length = skip - (bend-buffer);
1781 offset = bend - SvPVX_const(bufsv);
1793 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1794 provided amount read (count) was what was requested (length)
1796 if (got < wanted && count == length) {
1797 length = wanted - got;
1798 offset = bend - SvPVX_const(bufsv);
1801 /* return value is character count */
1805 else if (buffer_utf8) {
1806 /* Let svcatsv upgrade the bytes we read in to utf8.
1807 The buffer is a mortal so will be freed soon. */
1808 sv_catsv_nomg(bufsv, read_target);
1811 /* This should not be marked tainted if the fp is marked clean */
1812 if (!(IoFLAGS(io) & IOf_UNTAINT))
1813 SvTAINTED_on(bufsv);
1825 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1830 STRLEN orig_blen_bytes;
1831 const int op_type = PL_op->op_type;
1834 GV *const gv = MUTABLE_GV(*++MARK);
1835 IO *const io = GvIO(gv);
1837 if (op_type == OP_SYSWRITE && io) {
1838 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1840 if (MARK == SP - 1) {
1842 mXPUSHi(sv_len(sv));
1846 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1847 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1857 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1859 if (io && IoIFP(io))
1860 report_wrongway_fh(gv, '<');
1863 SETERRNO(EBADF,RMS_IFI);
1867 /* Do this first to trigger any overloading. */
1868 buffer = SvPV_const(bufsv, blen);
1869 orig_blen_bytes = blen;
1870 doing_utf8 = DO_UTF8(bufsv);
1872 if (PerlIO_isutf8(IoIFP(io))) {
1873 if (!SvUTF8(bufsv)) {
1874 /* We don't modify the original scalar. */
1875 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1876 buffer = (char *) tmpbuf;
1880 else if (doing_utf8) {
1881 STRLEN tmplen = blen;
1882 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1885 buffer = (char *) tmpbuf;
1889 assert((char *)result == buffer);
1890 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1895 if (op_type == OP_SEND) {
1896 const int flags = SvIVx(*++MARK);
1899 char * const sockbuf = SvPVx(*++MARK, mlen);
1900 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1901 flags, (struct sockaddr *)sockbuf, mlen);
1905 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1911 Size_t length = 0; /* This length is in characters. */
1917 /* The SV is bytes, and we've had to upgrade it. */
1918 blen_chars = orig_blen_bytes;
1920 /* The SV really is UTF-8. */
1921 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1922 /* Don't call sv_len_utf8 again because it will call magic
1923 or overloading a second time, and we might get back a
1924 different result. */
1925 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1927 /* It's safe, and it may well be cached. */
1928 blen_chars = sv_len_utf8(bufsv);
1936 length = blen_chars;
1938 #if Size_t_size > IVSIZE
1939 length = (Size_t)SvNVx(*++MARK);
1941 length = (Size_t)SvIVx(*++MARK);
1943 if ((SSize_t)length < 0) {
1945 DIE(aTHX_ "Negative length");
1950 offset = SvIVx(*++MARK);
1952 if (-offset > (IV)blen_chars) {
1954 DIE(aTHX_ "Offset outside string");
1956 offset += blen_chars;
1957 } else if (offset > (IV)blen_chars) {
1959 DIE(aTHX_ "Offset outside string");
1963 if (length > blen_chars - offset)
1964 length = blen_chars - offset;
1966 /* Here we convert length from characters to bytes. */
1967 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1968 /* Either we had to convert the SV, or the SV is magical, or
1969 the SV has overloading, in which case we can't or mustn't
1970 or mustn't call it again. */
1972 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1973 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1975 /* It's a real UTF-8 SV, and it's not going to change under
1976 us. Take advantage of any cache. */
1978 I32 len_I32 = length;
1980 /* Convert the start and end character positions to bytes.
1981 Remember that the second argument to sv_pos_u2b is relative
1983 sv_pos_u2b(bufsv, &start, &len_I32);
1990 buffer = buffer+offset;
1992 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1993 if (IoTYPE(io) == IoTYPE_SOCKET) {
1994 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2000 /* See the note at doio.c:do_print about filesize limits. --jhi */
2001 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2010 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2013 #if Size_t_size > IVSIZE
2033 * in Perl 5.12 and later, the additional parameter is a bitmask:
2036 * 2 = eof() <- ARGV magic
2038 * I'll rely on the compiler's trace flow analysis to decide whether to
2039 * actually assign this out here, or punt it into the only block where it is
2040 * used. Doing it out here is DRY on the condition logic.
2045 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2051 if (PL_op->op_flags & OPf_SPECIAL) {
2052 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2056 gv = PL_last_in_gv; /* eof */
2064 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2065 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2068 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2069 if (io && !IoIFP(io)) {
2070 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2072 IoFLAGS(io) &= ~IOf_START;
2073 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2075 sv_setpvs(GvSV(gv), "-");
2077 GvSV(gv) = newSVpvs("-");
2078 SvSETMAGIC(GvSV(gv));
2080 else if (!nextargv(gv))
2085 PUSHs(boolSV(do_eof(gv)));
2095 if (MAXARG != 0 && (TOPs || POPs))
2096 PL_last_in_gv = MUTABLE_GV(POPs);
2103 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2105 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2110 SETERRNO(EBADF,RMS_IFI);
2115 #if LSEEKSIZE > IVSIZE
2116 PUSHn( do_tell(gv) );
2118 PUSHi( do_tell(gv) );
2126 const int whence = POPi;
2127 #if LSEEKSIZE > IVSIZE
2128 const Off_t offset = (Off_t)SvNVx(POPs);
2130 const Off_t offset = (Off_t)SvIVx(POPs);
2133 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2134 IO *const io = GvIO(gv);
2137 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2139 #if LSEEKSIZE > IVSIZE
2140 SV *const offset_sv = newSVnv((NV) offset);
2142 SV *const offset_sv = newSViv(offset);
2145 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2150 if (PL_op->op_type == OP_SEEK)
2151 PUSHs(boolSV(do_seek(gv, offset, whence)));
2153 const Off_t sought = do_sysseek(gv, offset, whence);
2155 PUSHs(&PL_sv_undef);
2157 SV* const sv = sought ?
2158 #if LSEEKSIZE > IVSIZE
2163 : newSVpvn(zero_but_true, ZBTLEN);
2174 /* There seems to be no consensus on the length type of truncate()
2175 * and ftruncate(), both off_t and size_t have supporters. In
2176 * general one would think that when using large files, off_t is
2177 * at least as wide as size_t, so using an off_t should be okay. */
2178 /* XXX Configure probe for the length type of *truncate() needed XXX */
2181 #if Off_t_size > IVSIZE
2186 /* Checking for length < 0 is problematic as the type might or
2187 * might not be signed: if it is not, clever compilers will moan. */
2188 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2195 if (PL_op->op_flags & OPf_SPECIAL) {
2196 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2205 TAINT_PROPER("truncate");
2206 if (!(fp = IoIFP(io))) {
2212 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2214 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2221 SV * const sv = POPs;
2224 if (isGV_with_GP(sv)) {
2225 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2226 goto do_ftruncate_gv;
2228 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2229 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2230 goto do_ftruncate_gv;
2232 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2233 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2234 goto do_ftruncate_io;
2237 name = SvPV_nolen_const(sv);
2238 TAINT_PROPER("truncate");
2240 if (truncate(name, len) < 0)
2244 const int tmpfd = PerlLIO_open(name, O_RDWR);
2249 if (my_chsize(tmpfd, len) < 0)
2251 PerlLIO_close(tmpfd);
2260 SETERRNO(EBADF,RMS_IFI);
2268 SV * const argsv = POPs;
2269 const unsigned int func = POPu;
2270 const int optype = PL_op->op_type;
2271 GV * const gv = MUTABLE_GV(POPs);
2272 IO * const io = gv ? GvIOn(gv) : NULL;
2276 if (!io || !argsv || !IoIFP(io)) {
2278 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2282 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2285 s = SvPV_force(argsv, len);
2286 need = IOCPARM_LEN(func);
2288 s = Sv_Grow(argsv, need + 1);
2289 SvCUR_set(argsv, need);
2292 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2295 retval = SvIV(argsv);
2296 s = INT2PTR(char*,retval); /* ouch */
2299 TAINT_PROPER(PL_op_desc[optype]);
2301 if (optype == OP_IOCTL)
2303 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2305 DIE(aTHX_ "ioctl is not implemented");
2309 DIE(aTHX_ "fcntl is not implemented");
2311 #if defined(OS2) && defined(__EMX__)
2312 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2314 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2318 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2320 if (s[SvCUR(argsv)] != 17)
2321 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2323 s[SvCUR(argsv)] = 0; /* put our null back */
2324 SvSETMAGIC(argsv); /* Assume it has changed */
2333 PUSHp(zero_but_true, ZBTLEN);
2344 const int argtype = POPi;
2345 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2346 IO *const io = GvIO(gv);
2347 PerlIO *const fp = io ? IoIFP(io) : NULL;
2349 /* XXX Looks to me like io is always NULL at this point */
2351 (void)PerlIO_flush(fp);
2352 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2357 SETERRNO(EBADF,RMS_IFI);
2362 DIE(aTHX_ PL_no_func, "flock()");
2373 const int protocol = POPi;
2374 const int type = POPi;
2375 const int domain = POPi;
2376 GV * const gv = MUTABLE_GV(POPs);
2377 register IO * const io = gv ? GvIOn(gv) : NULL;
2382 if (io && IoIFP(io))
2383 do_close(gv, FALSE);
2384 SETERRNO(EBADF,LIB_INVARG);
2389 do_close(gv, FALSE);
2391 TAINT_PROPER("socket");
2392 fd = PerlSock_socket(domain, type, protocol);
2395 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2396 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2397 IoTYPE(io) = IoTYPE_SOCKET;
2398 if (!IoIFP(io) || !IoOFP(io)) {
2399 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2400 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2401 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2404 #if defined(HAS_FCNTL) && defined(F_SETFD)
2405 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2409 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2418 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2420 const int protocol = POPi;
2421 const int type = POPi;
2422 const int domain = POPi;
2423 GV * const gv2 = MUTABLE_GV(POPs);
2424 GV * const gv1 = MUTABLE_GV(POPs);
2425 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2426 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2430 report_evil_fh(gv1);
2432 report_evil_fh(gv2);
2434 if (io1 && IoIFP(io1))
2435 do_close(gv1, FALSE);
2436 if (io2 && IoIFP(io2))
2437 do_close(gv2, FALSE);
2442 TAINT_PROPER("socketpair");
2443 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2445 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2446 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2447 IoTYPE(io1) = IoTYPE_SOCKET;
2448 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2449 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2450 IoTYPE(io2) = IoTYPE_SOCKET;
2451 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2452 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2453 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2454 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2455 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2456 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2457 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2460 #if defined(HAS_FCNTL) && defined(F_SETFD)
2461 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2462 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2467 DIE(aTHX_ PL_no_sock_func, "socketpair");
2476 SV * const addrsv = POPs;
2477 /* OK, so on what platform does bind modify addr? */
2479 GV * const gv = MUTABLE_GV(POPs);
2480 register IO * const io = GvIOn(gv);
2482 const int op_type = PL_op->op_type;
2484 if (!io || !IoIFP(io))
2487 addr = SvPV_const(addrsv, len);
2488 TAINT_PROPER(PL_op_desc[op_type]);
2489 if ((op_type == OP_BIND
2490 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2491 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2499 SETERRNO(EBADF,SS_IVCHAN);
2506 const int backlog = POPi;
2507 GV * const gv = MUTABLE_GV(POPs);
2508 register IO * const io = gv ? GvIOn(gv) : NULL;
2510 if (!io || !IoIFP(io))
2513 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2520 SETERRNO(EBADF,SS_IVCHAN);
2529 char namebuf[MAXPATHLEN];
2530 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2531 Sock_size_t len = sizeof (struct sockaddr_in);
2533 Sock_size_t len = sizeof namebuf;
2535 GV * const ggv = MUTABLE_GV(POPs);
2536 GV * const ngv = MUTABLE_GV(POPs);
2545 if (!gstio || !IoIFP(gstio))
2549 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2552 /* Some platforms indicate zero length when an AF_UNIX client is
2553 * not bound. Simulate a non-zero-length sockaddr structure in
2555 namebuf[0] = 0; /* sun_len */
2556 namebuf[1] = AF_UNIX; /* sun_family */
2564 do_close(ngv, FALSE);
2565 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2566 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2567 IoTYPE(nstio) = IoTYPE_SOCKET;
2568 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2569 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2570 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2571 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2574 #if defined(HAS_FCNTL) && defined(F_SETFD)
2575 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2579 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2580 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2582 #ifdef __SCO_VERSION__
2583 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2586 PUSHp(namebuf, len);
2590 report_evil_fh(ggv);
2591 SETERRNO(EBADF,SS_IVCHAN);
2601 const int how = POPi;
2602 GV * const gv = MUTABLE_GV(POPs);
2603 register IO * const io = GvIOn(gv);
2605 if (!io || !IoIFP(io))
2608 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2613 SETERRNO(EBADF,SS_IVCHAN);
2620 const int optype = PL_op->op_type;
2621 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2622 const unsigned int optname = (unsigned int) POPi;
2623 const unsigned int lvl = (unsigned int) POPi;
2624 GV * const gv = MUTABLE_GV(POPs);
2625 register IO * const io = GvIOn(gv);
2629 if (!io || !IoIFP(io))
2632 fd = PerlIO_fileno(IoIFP(io));
2636 (void)SvPOK_only(sv);
2640 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2647 #if defined(__SYMBIAN32__)
2648 # define SETSOCKOPT_OPTION_VALUE_T void *
2650 # define SETSOCKOPT_OPTION_VALUE_T const char *
2652 /* XXX TODO: We need to have a proper type (a Configure probe,
2653 * etc.) for what the C headers think of the third argument of
2654 * setsockopt(), the option_value read-only buffer: is it
2655 * a "char *", or a "void *", const or not. Some compilers
2656 * don't take kindly to e.g. assuming that "char *" implicitly
2657 * promotes to a "void *", or to explicitly promoting/demoting
2658 * consts to non/vice versa. The "const void *" is the SUS
2659 * definition, but that does not fly everywhere for the above
2661 SETSOCKOPT_OPTION_VALUE_T buf;
2665 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2669 aint = (int)SvIV(sv);
2670 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2673 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2683 SETERRNO(EBADF,SS_IVCHAN);
2692 const int optype = PL_op->op_type;
2693 GV * const gv = MUTABLE_GV(POPs);
2694 register IO * const io = GvIOn(gv);
2699 if (!io || !IoIFP(io))
2702 sv = sv_2mortal(newSV(257));
2703 (void)SvPOK_only(sv);
2707 fd = PerlIO_fileno(IoIFP(io));
2709 case OP_GETSOCKNAME:
2710 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2713 case OP_GETPEERNAME:
2714 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2716 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2718 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";
2719 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2720 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2721 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2722 sizeof(u_short) + sizeof(struct in_addr))) {
2729 #ifdef BOGUS_GETNAME_RETURN
2730 /* Interactive Unix, getpeername() and getsockname()
2731 does not return valid namelen */
2732 if (len == BOGUS_GETNAME_RETURN)
2733 len = sizeof(struct sockaddr);
2742 SETERRNO(EBADF,SS_IVCHAN);
2760 if (PL_op->op_flags & OPf_REF) {
2762 if (PL_op->op_type == OP_LSTAT) {
2763 if (gv != PL_defgv) {
2764 do_fstat_warning_check:
2765 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2766 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2767 } else if (PL_laststype != OP_LSTAT)
2768 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2772 if (gv != PL_defgv) {
2773 PL_laststype = OP_STAT;
2775 sv_setpvs(PL_statname, "");
2782 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2783 } else if (IoDIRP(io)) {
2785 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2787 PL_laststatval = -1;
2793 if (PL_laststatval < 0) {
2799 SV* const sv = POPs;
2800 if (isGV_with_GP(sv)) {
2801 gv = MUTABLE_GV(sv);
2803 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2804 gv = MUTABLE_GV(SvRV(sv));
2805 if (PL_op->op_type == OP_LSTAT)
2806 goto do_fstat_warning_check;
2808 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2809 io = MUTABLE_IO(SvRV(sv));
2810 if (PL_op->op_type == OP_LSTAT)
2811 goto do_fstat_warning_check;
2812 goto do_fstat_have_io;
2815 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2817 PL_laststype = PL_op->op_type;
2818 if (PL_op->op_type == OP_LSTAT)
2819 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2821 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2822 if (PL_laststatval < 0) {
2823 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2824 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2830 if (gimme != G_ARRAY) {
2831 if (gimme != G_VOID)
2832 XPUSHs(boolSV(max));
2838 mPUSHi(PL_statcache.st_dev);
2839 #if ST_INO_SIZE > IVSIZE
2840 mPUSHn(PL_statcache.st_ino);
2842 # if ST_INO_SIGN <= 0
2843 mPUSHi(PL_statcache.st_ino);
2845 mPUSHu(PL_statcache.st_ino);
2848 mPUSHu(PL_statcache.st_mode);
2849 mPUSHu(PL_statcache.st_nlink);
2850 #if Uid_t_size > IVSIZE
2851 mPUSHn(PL_statcache.st_uid);
2853 # if Uid_t_sign <= 0
2854 mPUSHi(PL_statcache.st_uid);
2856 mPUSHu(PL_statcache.st_uid);
2859 #if Gid_t_size > IVSIZE
2860 mPUSHn(PL_statcache.st_gid);
2862 # if Gid_t_sign <= 0
2863 mPUSHi(PL_statcache.st_gid);
2865 mPUSHu(PL_statcache.st_gid);
2868 #ifdef USE_STAT_RDEV
2869 mPUSHi(PL_statcache.st_rdev);
2871 PUSHs(newSVpvs_flags("", SVs_TEMP));
2873 #if Off_t_size > IVSIZE
2874 mPUSHn(PL_statcache.st_size);
2876 mPUSHi(PL_statcache.st_size);
2879 mPUSHn(PL_statcache.st_atime);
2880 mPUSHn(PL_statcache.st_mtime);
2881 mPUSHn(PL_statcache.st_ctime);
2883 mPUSHi(PL_statcache.st_atime);
2884 mPUSHi(PL_statcache.st_mtime);
2885 mPUSHi(PL_statcache.st_ctime);
2887 #ifdef USE_STAT_BLOCKS
2888 mPUSHu(PL_statcache.st_blksize);
2889 mPUSHu(PL_statcache.st_blocks);
2891 PUSHs(newSVpvs_flags("", SVs_TEMP));
2892 PUSHs(newSVpvs_flags("", SVs_TEMP));
2898 #define tryAMAGICftest_MG(chr) STMT_START { \
2899 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2900 && S_try_amagic_ftest(aTHX_ chr)) \
2905 S_try_amagic_ftest(pTHX_ char chr) {
2908 SV* const arg = TOPs;
2913 if ((PL_op->op_flags & OPf_KIDS)
2916 const char tmpchr = chr;
2917 SV * const tmpsv = amagic_call(arg,
2918 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2919 ftest_amg, AMGf_unary);
2926 if (PL_op->op_private & OPpFT_STACKING) {
2928 /* leave the object alone */
2940 /* This macro is used by the stacked filetest operators :
2941 * if the previous filetest failed, short-circuit and pass its value.
2942 * Else, discard it from the stack and continue. --rgs
2944 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
2945 if (!SvTRUE(TOPs)) { RETURN; } \
2946 else { (void)POPs; PUTBACK; } \
2953 /* Not const, because things tweak this below. Not bool, because there's
2954 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2955 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2956 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2957 /* Giving some sort of initial value silences compilers. */
2959 int access_mode = R_OK;
2961 int access_mode = 0;
2964 /* access_mode is never used, but leaving use_access in makes the
2965 conditional compiling below much clearer. */
2968 Mode_t stat_mode = S_IRUSR;
2970 bool effective = FALSE;
2974 switch (PL_op->op_type) {
2975 case OP_FTRREAD: opchar = 'R'; break;
2976 case OP_FTRWRITE: opchar = 'W'; break;
2977 case OP_FTREXEC: opchar = 'X'; break;
2978 case OP_FTEREAD: opchar = 'r'; break;
2979 case OP_FTEWRITE: opchar = 'w'; break;
2980 case OP_FTEEXEC: opchar = 'x'; break;
2982 tryAMAGICftest_MG(opchar);
2984 STACKED_FTEST_CHECK;
2986 switch (PL_op->op_type) {
2988 #if !(defined(HAS_ACCESS) && defined(R_OK))
2994 #if defined(HAS_ACCESS) && defined(W_OK)
2999 stat_mode = S_IWUSR;
3003 #if defined(HAS_ACCESS) && defined(X_OK)
3008 stat_mode = S_IXUSR;
3012 #ifdef PERL_EFF_ACCESS
3015 stat_mode = S_IWUSR;
3019 #ifndef PERL_EFF_ACCESS
3026 #ifdef PERL_EFF_ACCESS
3031 stat_mode = S_IXUSR;
3037 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3038 const char *name = POPpx;
3040 # ifdef PERL_EFF_ACCESS
3041 result = PERL_EFF_ACCESS(name, access_mode);
3043 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3049 result = access(name, access_mode);
3051 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3062 result = my_stat_flags(0);
3066 if (cando(stat_mode, effective, &PL_statcache))
3075 const int op_type = PL_op->op_type;
3080 case OP_FTIS: opchar = 'e'; break;
3081 case OP_FTSIZE: opchar = 's'; break;
3082 case OP_FTMTIME: opchar = 'M'; break;
3083 case OP_FTCTIME: opchar = 'C'; break;
3084 case OP_FTATIME: opchar = 'A'; break;
3086 tryAMAGICftest_MG(opchar);
3088 STACKED_FTEST_CHECK;
3090 result = my_stat_flags(0);
3094 if (op_type == OP_FTIS)
3097 /* You can't dTARGET inside OP_FTIS, because you'll get
3098 "panic: pad_sv po" - the op is not flagged to have a target. */
3102 #if Off_t_size > IVSIZE
3103 PUSHn(PL_statcache.st_size);
3105 PUSHi(PL_statcache.st_size);
3109 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3112 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3115 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3129 switch (PL_op->op_type) {
3130 case OP_FTROWNED: opchar = 'O'; break;
3131 case OP_FTEOWNED: opchar = 'o'; break;
3132 case OP_FTZERO: opchar = 'z'; break;
3133 case OP_FTSOCK: opchar = 'S'; break;
3134 case OP_FTCHR: opchar = 'c'; break;
3135 case OP_FTBLK: opchar = 'b'; break;
3136 case OP_FTFILE: opchar = 'f'; break;
3137 case OP_FTDIR: opchar = 'd'; break;
3138 case OP_FTPIPE: opchar = 'p'; break;
3139 case OP_FTSUID: opchar = 'u'; break;
3140 case OP_FTSGID: opchar = 'g'; break;
3141 case OP_FTSVTX: opchar = 'k'; break;
3143 tryAMAGICftest_MG(opchar);
3145 STACKED_FTEST_CHECK;
3147 /* I believe that all these three are likely to be defined on most every
3148 system these days. */
3150 if(PL_op->op_type == OP_FTSUID) {
3151 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3157 if(PL_op->op_type == OP_FTSGID) {
3158 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3164 if(PL_op->op_type == OP_FTSVTX) {
3165 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3171 result = my_stat_flags(0);
3175 switch (PL_op->op_type) {
3177 if (PL_statcache.st_uid == PL_uid)
3181 if (PL_statcache.st_uid == PL_euid)
3185 if (PL_statcache.st_size == 0)
3189 if (S_ISSOCK(PL_statcache.st_mode))
3193 if (S_ISCHR(PL_statcache.st_mode))
3197 if (S_ISBLK(PL_statcache.st_mode))
3201 if (S_ISREG(PL_statcache.st_mode))
3205 if (S_ISDIR(PL_statcache.st_mode))
3209 if (S_ISFIFO(PL_statcache.st_mode))
3214 if (PL_statcache.st_mode & S_ISUID)
3220 if (PL_statcache.st_mode & S_ISGID)
3226 if (PL_statcache.st_mode & S_ISVTX)
3240 tryAMAGICftest_MG('l');
3241 result = my_lstat_flags(0);
3246 if (S_ISLNK(PL_statcache.st_mode))
3261 tryAMAGICftest_MG('t');
3263 STACKED_FTEST_CHECK;
3265 if (PL_op->op_flags & OPf_REF)
3267 else if (isGV_with_GP(TOPs))
3268 gv = MUTABLE_GV(POPs);
3269 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3270 gv = MUTABLE_GV(SvRV(POPs));
3273 name = SvPV_nomg(tmpsv, namelen);
3274 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3277 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3278 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3279 else if (tmpsv && SvOK(tmpsv)) {
3287 if (PerlLIO_isatty(fd))
3292 #if defined(atarist) /* this will work with atariST. Configure will
3293 make guesses for other systems. */
3294 # define FILE_base(f) ((f)->_base)
3295 # define FILE_ptr(f) ((f)->_ptr)
3296 # define FILE_cnt(f) ((f)->_cnt)
3297 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3308 register STDCHAR *s;
3314 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3316 STACKED_FTEST_CHECK;
3318 if (PL_op->op_flags & OPf_REF)
3320 else if (isGV_with_GP(TOPs))
3321 gv = MUTABLE_GV(POPs);
3322 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3323 gv = MUTABLE_GV(SvRV(POPs));
3329 if (gv == PL_defgv) {
3331 io = GvIO(PL_statgv);
3334 goto really_filename;
3339 PL_laststatval = -1;
3340 sv_setpvs(PL_statname, "");
3341 io = GvIO(PL_statgv);
3343 if (io && IoIFP(io)) {
3344 if (! PerlIO_has_base(IoIFP(io)))
3345 DIE(aTHX_ "-T and -B not implemented on filehandles");
3346 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3347 if (PL_laststatval < 0)
3349 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3350 if (PL_op->op_type == OP_FTTEXT)
3355 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3356 i = PerlIO_getc(IoIFP(io));
3358 (void)PerlIO_ungetc(IoIFP(io),i);
3360 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3362 len = PerlIO_get_bufsiz(IoIFP(io));
3363 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3364 /* sfio can have large buffers - limit to 512 */
3369 report_evil_fh(cGVOP_gv);
3370 SETERRNO(EBADF,RMS_IFI);
3378 PL_laststype = OP_STAT;
3379 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3380 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3381 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3383 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3386 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3387 if (PL_laststatval < 0) {
3388 (void)PerlIO_close(fp);
3391 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3392 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3393 (void)PerlIO_close(fp);
3395 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3396 RETPUSHNO; /* special case NFS directories */
3397 RETPUSHYES; /* null file is anything */
3402 /* now scan s to look for textiness */
3403 /* XXX ASCII dependent code */
3405 #if defined(DOSISH) || defined(USEMYBINMODE)
3406 /* ignore trailing ^Z on short files */
3407 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3411 for (i = 0; i < len; i++, s++) {
3412 if (!*s) { /* null never allowed in text */
3417 else if (!(isPRINT(*s) || isSPACE(*s)))
3420 else if (*s & 128) {
3422 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3425 /* utf8 characters don't count as odd */
3426 if (UTF8_IS_START(*s)) {
3427 int ulen = UTF8SKIP(s);
3428 if (ulen < len - i) {
3430 for (j = 1; j < ulen; j++) {
3431 if (!UTF8_IS_CONTINUATION(s[j]))
3434 --ulen; /* loop does extra increment */
3444 *s != '\n' && *s != '\r' && *s != '\b' &&
3445 *s != '\t' && *s != '\f' && *s != 27)
3450 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3461 const char *tmps = NULL;
3465 SV * const sv = POPs;
3466 if (PL_op->op_flags & OPf_SPECIAL) {
3467 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3469 else if (SvGETMAGIC(sv), isGV_with_GP(sv)) {
3470 gv = MUTABLE_GV(sv);
3472 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3473 gv = MUTABLE_GV(SvRV(sv));
3476 tmps = SvPV_nomg_const_nolen(sv);
3480 if( !gv && (!tmps || !*tmps) ) {
3481 HV * const table = GvHVn(PL_envgv);
3484 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3485 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3487 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3492 deprecate("chdir('') or chdir(undef) as chdir()");
3493 tmps = SvPV_nolen_const(*svp);
3497 TAINT_PROPER("chdir");
3502 TAINT_PROPER("chdir");
3505 IO* const io = GvIO(gv);
3508 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3509 } else if (IoIFP(io)) {
3510 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3514 SETERRNO(EBADF, RMS_IFI);
3520 SETERRNO(EBADF,RMS_IFI);
3524 DIE(aTHX_ PL_no_func, "fchdir");
3528 PUSHi( PerlDir_chdir(tmps) >= 0 );
3530 /* Clear the DEFAULT element of ENV so we'll get the new value
3532 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3539 dVAR; dSP; dMARK; dTARGET;
3540 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3551 char * const tmps = POPpx;
3552 TAINT_PROPER("chroot");
3553 PUSHi( chroot(tmps) >= 0 );
3556 DIE(aTHX_ PL_no_func, "chroot");
3564 const char * const tmps2 = POPpconstx;
3565 const char * const tmps = SvPV_nolen_const(TOPs);
3566 TAINT_PROPER("rename");
3568 anum = PerlLIO_rename(tmps, tmps2);
3570 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3571 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3574 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3575 (void)UNLINK(tmps2);
3576 if (!(anum = link(tmps, tmps2)))
3577 anum = UNLINK(tmps);
3585 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3589 const int op_type = PL_op->op_type;
3593 if (op_type == OP_LINK)
3594 DIE(aTHX_ PL_no_func, "link");
3596 # ifndef HAS_SYMLINK
3597 if (op_type == OP_SYMLINK)
3598 DIE(aTHX_ PL_no_func, "symlink");
3602 const char * const tmps2 = POPpconstx;
3603 const char * const tmps = SvPV_nolen_const(TOPs);
3604 TAINT_PROPER(PL_op_desc[op_type]);
3606 # if defined(HAS_LINK)
3607 # if defined(HAS_SYMLINK)
3608 /* Both present - need to choose which. */
3609 (op_type == OP_LINK) ?
3610 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3612 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3613 PerlLIO_link(tmps, tmps2);
3616 # if defined(HAS_SYMLINK)
3617 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3618 symlink(tmps, tmps2);
3623 SETi( result >= 0 );
3630 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3641 char buf[MAXPATHLEN];
3644 #ifndef INCOMPLETE_TAINTS
3648 len = readlink(tmps, buf, sizeof(buf) - 1);
3655 RETSETUNDEF; /* just pretend it's a normal file */
3659 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3661 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3663 char * const save_filename = filename;
3668 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3670 PERL_ARGS_ASSERT_DOONELINER;
3672 Newx(cmdline, size, char);
3673 my_strlcpy(cmdline, cmd, size);
3674 my_strlcat(cmdline, " ", size);
3675 for (s = cmdline + strlen(cmdline); *filename; ) {
3679 if (s - cmdline < size)
3680 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3681 myfp = PerlProc_popen(cmdline, "r");
3685 SV * const tmpsv = sv_newmortal();
3686 /* Need to save/restore 'PL_rs' ?? */
3687 s = sv_gets(tmpsv, myfp, 0);
3688 (void)PerlProc_pclose(myfp);
3692 #ifdef HAS_SYS_ERRLIST
3697 /* you don't see this */
3698 const char * const errmsg =
3699 #ifdef HAS_SYS_ERRLIST
3707 if (instr(s, errmsg)) {
3714 #define EACCES EPERM
3716 if (instr(s, "cannot make"))
3717 SETERRNO(EEXIST,RMS_FEX);
3718 else if (instr(s, "existing file"))
3719 SETERRNO(EEXIST,RMS_FEX);
3720 else if (instr(s, "ile exists"))
3721 SETERRNO(EEXIST,RMS_FEX);
3722 else if (instr(s, "non-exist"))
3723 SETERRNO(ENOENT,RMS_FNF);
3724 else if (instr(s, "does not exist"))
3725 SETERRNO(ENOENT,RMS_FNF);
3726 else if (instr(s, "not empty"))
3727 SETERRNO(EBUSY,SS_DEVOFFLINE);
3728 else if (instr(s, "cannot access"))
3729 SETERRNO(EACCES,RMS_PRV);
3731 SETERRNO(EPERM,RMS_PRV);
3734 else { /* some mkdirs return no failure indication */
3735 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3736 if (PL_op->op_type == OP_RMDIR)
3741 SETERRNO(EACCES,RMS_PRV); /* a guess */
3750 /* This macro removes trailing slashes from a directory name.
3751 * Different operating and file systems take differently to
3752 * trailing slashes. According to POSIX 1003.1 1996 Edition
3753 * any number of trailing slashes should be allowed.
3754 * Thusly we snip them away so that even non-conforming
3755 * systems are happy.
3756 * We should probably do this "filtering" for all
3757 * the functions that expect (potentially) directory names:
3758 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3759 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3761 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3762 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3765 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3766 (tmps) = savepvn((tmps), (len)); \
3776 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3778 TRIMSLASHES(tmps,len,copy);
3780 TAINT_PROPER("mkdir");
3782 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3786 SETi( dooneliner("mkdir", tmps) );
3787 oldumask = PerlLIO_umask(0);
3788 PerlLIO_umask(oldumask);
3789 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3804 TRIMSLASHES(tmps,len,copy);
3805 TAINT_PROPER("rmdir");
3807 SETi( PerlDir_rmdir(tmps) >= 0 );
3809 SETi( dooneliner("rmdir", tmps) );
3816 /* Directory calls. */
3820 #if defined(Direntry_t) && defined(HAS_READDIR)
3822 const char * const dirname = POPpconstx;
3823 GV * const gv = MUTABLE_GV(POPs);
3824 register IO * const io = GvIOn(gv);
3829 if ((IoIFP(io) || IoOFP(io)))
3830 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3831 "Opening filehandle %s also as a directory",
3834 PerlDir_close(IoDIRP(io));
3835 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3841 SETERRNO(EBADF,RMS_DIR);
3844 DIE(aTHX_ PL_no_dir_func, "opendir");
3850 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3851 DIE(aTHX_ PL_no_dir_func, "readdir");
3853 #if !defined(I_DIRENT) && !defined(VMS)
3854 Direntry_t *readdir (DIR *);
3860 const I32 gimme = GIMME;
3861 GV * const gv = MUTABLE_GV(POPs);
3862 register const Direntry_t *dp;
3863 register IO * const io = GvIOn(gv);
3865 if (!io || !IoDIRP(io)) {
3866 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3867 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3872 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3876 sv = newSVpvn(dp->d_name, dp->d_namlen);
3878 sv = newSVpv(dp->d_name, 0);
3880 #ifndef INCOMPLETE_TAINTS
3881 if (!(IoFLAGS(io) & IOf_UNTAINT))
3885 } while (gimme == G_ARRAY);
3887 if (!dp && gimme != G_ARRAY)
3894 SETERRNO(EBADF,RMS_ISI);
3895 if (GIMME == G_ARRAY)
3904 #if defined(HAS_TELLDIR) || defined(telldir)
3906 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3907 /* XXX netbsd still seemed to.
3908 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3909 --JHI 1999-Feb-02 */
3910 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3911 long telldir (DIR *);
3913 GV * const gv = MUTABLE_GV(POPs);
3914 register IO * const io = GvIOn(gv);
3916 if (!io || !IoDIRP(io)) {
3917 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3918 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
3922 PUSHi( PerlDir_tell(IoDIRP(io)) );
3926 SETERRNO(EBADF,RMS_ISI);
3929 DIE(aTHX_ PL_no_dir_func, "telldir");
3935 #if defined(HAS_SEEKDIR) || defined(seekdir)
3937 const long along = POPl;
3938 GV * const gv = MUTABLE_GV(POPs);
3939 register IO * const io = GvIOn(gv);
3941 if (!io || !IoDIRP(io)) {
3942 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3943 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
3946 (void)PerlDir_seek(IoDIRP(io), along);
3951 SETERRNO(EBADF,RMS_ISI);
3954 DIE(aTHX_ PL_no_dir_func, "seekdir");
3960 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3962 GV * const gv = MUTABLE_GV(POPs);
3963 register IO * const io = GvIOn(gv);
3965 if (!io || !IoDIRP(io)) {
3966 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3967 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
3970 (void)PerlDir_rewind(IoDIRP(io));
3974 SETERRNO(EBADF,RMS_ISI);
3977 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3983 #if defined(Direntry_t) && defined(HAS_READDIR)
3985 GV * const gv = MUTABLE_GV(POPs);
3986 register IO * const io = GvIOn(gv);
3988 if (!io || !IoDIRP(io)) {
3989 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3990 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
3993 #ifdef VOID_CLOSEDIR
3994 PerlDir_close(IoDIRP(io));
3996 if (PerlDir_close(IoDIRP(io)) < 0) {
3997 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4006 SETERRNO(EBADF,RMS_IFI);
4009 DIE(aTHX_ PL_no_dir_func, "closedir");
4013 /* Process control. */
4022 PERL_FLUSHALL_FOR_CHILD;
4023 childpid = PerlProc_fork();
4027 #ifdef THREADS_HAVE_PIDS
4028 PL_ppid = (IV)getppid();
4030 #ifdef PERL_USES_PL_PIDSTATUS
4031 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4037 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4042 PERL_FLUSHALL_FOR_CHILD;
4043 childpid = PerlProc_fork();
4049 DIE(aTHX_ PL_no_func, "fork");
4056 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4061 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4062 childpid = wait4pid(-1, &argflags, 0);
4064 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4069 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4070 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4071 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4073 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4078 DIE(aTHX_ PL_no_func, "wait");
4084 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4086 const int optype = POPi;
4087 const Pid_t pid = TOPi;
4091 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4092 result = wait4pid(pid, &argflags, optype);
4094 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4099 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4100 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4101 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4103 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4108 DIE(aTHX_ PL_no_func, "waitpid");
4114 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4115 #if defined(__LIBCATAMOUNT__)
4116 PL_statusvalue = -1;
4125 while (++MARK <= SP) {
4126 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4131 TAINT_PROPER("system");
4133 PERL_FLUSHALL_FOR_CHILD;
4134 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4140 if (PerlProc_pipe(pp) >= 0)
4142 while ((childpid = PerlProc_fork()) == -1) {
4143 if (errno != EAGAIN) {
4148 PerlLIO_close(pp[0]);
4149 PerlLIO_close(pp[1]);
4156 Sigsave_t ihand,qhand; /* place to save signals during system() */
4160 PerlLIO_close(pp[1]);
4162 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4163 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4166 result = wait4pid(childpid, &status, 0);
4167 } while (result == -1 && errno == EINTR);
4169 (void)rsignal_restore(SIGINT, &ihand);
4170 (void)rsignal_restore(SIGQUIT, &qhand);
4172 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4173 do_execfree(); /* free any memory child malloced on fork */
4180 while (n < sizeof(int)) {
4181 n1 = PerlLIO_read(pp[0],
4182 (void*)(((char*)&errkid)+n),
4188 PerlLIO_close(pp[0]);
4189 if (n) { /* Error */
4190 if (n != sizeof(int))
4191 DIE(aTHX_ "panic: kid popen errno read");
4192 errno = errkid; /* Propagate errno from kid */
4193 STATUS_NATIVE_CHILD_SET(-1);
4196 XPUSHi(STATUS_CURRENT);
4200 PerlLIO_close(pp[0]);
4201 #if defined(HAS_FCNTL) && defined(F_SETFD)
4202 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4205 if (PL_op->op_flags & OPf_STACKED) {
4206 SV * const really = *++MARK;
4207 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4209 else if (SP - MARK != 1)
4210 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4212 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4216 #else /* ! FORK or VMS or OS/2 */
4219 if (PL_op->op_flags & OPf_STACKED) {
4220 SV * const really = *++MARK;
4221 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4222 value = (I32)do_aspawn(really, MARK, SP);
4224 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4227 else if (SP - MARK != 1) {
4228 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4229 value = (I32)do_aspawn(NULL, MARK, SP);
4231 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4235 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4237 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4239 STATUS_NATIVE_CHILD_SET(value);
4242 XPUSHi(result ? value : STATUS_CURRENT);
4243 #endif /* !FORK or VMS or OS/2 */
4250 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4255 while (++MARK <= SP) {
4256 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4261 TAINT_PROPER("exec");
4263 PERL_FLUSHALL_FOR_CHILD;
4264 if (PL_op->op_flags & OPf_STACKED) {
4265 SV * const really = *++MARK;
4266 value = (I32)do_aexec(really, MARK, SP);
4268 else if (SP - MARK != 1)
4270 value = (I32)vms_do_aexec(NULL, MARK, SP);
4274 (void ) do_aspawn(NULL, MARK, SP);
4278 value = (I32)do_aexec(NULL, MARK, SP);
4283 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4286 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4289 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4303 # ifdef THREADS_HAVE_PIDS
4304 if (PL_ppid != 1 && getppid() == 1)
4305 /* maybe the parent process has died. Refresh ppid cache */
4309 XPUSHi( getppid() );
4313 DIE(aTHX_ PL_no_func, "getppid");
4323 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4326 pgrp = (I32)BSD_GETPGRP(pid);
4328 if (pid != 0 && pid != PerlProc_getpid())
4329 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4335 DIE(aTHX_ PL_no_func, "getpgrp()");
4345 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4346 if (MAXARG > 0) pid = TOPs && TOPi;
4352 TAINT_PROPER("setpgrp");
4354 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4356 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4357 || (pid != 0 && pid != PerlProc_getpid()))
4359 DIE(aTHX_ "setpgrp can't take arguments");
4361 SETi( setpgrp() >= 0 );
4362 #endif /* USE_BSDPGRP */
4365 DIE(aTHX_ PL_no_func, "setpgrp()");
4369 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4370 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4372 # define PRIORITY_WHICH_T(which) which
4377 #ifdef HAS_GETPRIORITY
4379 const int who = POPi;
4380 const int which = TOPi;
4381 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4384 DIE(aTHX_ PL_no_func, "getpriority()");
4390 #ifdef HAS_SETPRIORITY
4392 const int niceval = POPi;
4393 const int who = POPi;
4394 const int which = TOPi;
4395 TAINT_PROPER("setpriority");
4396 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4399 DIE(aTHX_ PL_no_func, "setpriority()");
4403 #undef PRIORITY_WHICH_T
4411 XPUSHn( time(NULL) );
4413 XPUSHi( time(NULL) );
4425 (void)PerlProc_times(&PL_timesbuf);
4427 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4428 /* struct tms, though same data */
4432 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4433 if (GIMME == G_ARRAY) {
4434 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4435 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4436 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4444 if (GIMME == G_ARRAY) {
4451 DIE(aTHX_ "times not implemented");
4453 #endif /* HAS_TIMES */
4456 /* The 32 bit int year limits the times we can represent to these
4457 boundaries with a few days wiggle room to account for time zone
4460 /* Sat Jan 3 00:00:00 -2147481748 */
4461 #define TIME_LOWER_BOUND -67768100567755200.0
4462 /* Sun Dec 29 12:00:00 2147483647 */
4463 #define TIME_UPPER_BOUND 67767976233316800.0
4472 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4473 static const char * const dayname[] =
4474 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4475 static const char * const monname[] =
4476 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4477 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4479 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4482 when = (Time64_T)now;
4485 NV input = Perl_floor(POPn);
4486 when = (Time64_T)input;
4487 if (when != input) {
4488 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4489 "%s(%.0" NVff ") too large", opname, input);
4493 if ( TIME_LOWER_BOUND > when ) {
4494 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4495 "%s(%.0" NVff ") too small", opname, when);
4498 else if( when > TIME_UPPER_BOUND ) {
4499 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4500 "%s(%.0" NVff ") too large", opname, when);
4504 if (PL_op->op_type == OP_LOCALTIME)
4505 err = S_localtime64_r(&when, &tmbuf);
4507 err = S_gmtime64_r(&when, &tmbuf);
4511 /* XXX %lld broken for quads */
4512 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4513 "%s(%.0" NVff ") failed", opname, when);
4516 if (GIMME != G_ARRAY) { /* scalar context */
4518 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4519 double year = (double)tmbuf.tm_year + 1900;
4526 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4527 dayname[tmbuf.tm_wday],
4528 monname[tmbuf.tm_mon],
4536 else { /* list context */
4542 mPUSHi(tmbuf.tm_sec);
4543 mPUSHi(tmbuf.tm_min);
4544 mPUSHi(tmbuf.tm_hour);
4545 mPUSHi(tmbuf.tm_mday);
4546 mPUSHi(tmbuf.tm_mon);
4547 mPUSHn(tmbuf.tm_year);
4548 mPUSHi(tmbuf.tm_wday);
4549 mPUSHi(tmbuf.tm_yday);
4550 mPUSHi(tmbuf.tm_isdst);
4561 anum = alarm((unsigned int)anum);
4567 DIE(aTHX_ PL_no_func, "alarm");
4578 (void)time(&lasttime);
4579 if (MAXARG < 1 || (!TOPs && !POPs))
4583 PerlProc_sleep((unsigned int)duration);
4586 XPUSHi(when - lasttime);
4590 /* Shared memory. */
4591 /* Merged with some message passing. */
4595 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4596 dVAR; dSP; dMARK; dTARGET;
4597 const int op_type = PL_op->op_type;
4602 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4605 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4608 value = (I32)(do_semop(MARK, SP) >= 0);
4611 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4619 return Perl_pp_semget(aTHX);
4627 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4628 dVAR; dSP; dMARK; dTARGET;
4629 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4636 DIE(aTHX_ "System V IPC is not implemented on this machine");
4642 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4643 dVAR; dSP; dMARK; dTARGET;
4644 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4652 PUSHp(zero_but_true, ZBTLEN);
4656 return Perl_pp_semget(aTHX);
4660 /* I can't const this further without getting warnings about the types of
4661 various arrays passed in from structures. */
4663 S_space_join_names_mortal(pTHX_ char *const *array)
4667 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4669 if (array && *array) {
4670 target = newSVpvs_flags("", SVs_TEMP);
4672 sv_catpv(target, *array);
4675 sv_catpvs(target, " ");
4678 target = sv_mortalcopy(&PL_sv_no);
4683 /* Get system info. */
4687 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4689 I32 which = PL_op->op_type;
4690 register char **elem;
4692 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4693 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4694 struct hostent *gethostbyname(Netdb_name_t);
4695 struct hostent *gethostent(void);
4697 struct hostent *hent = NULL;
4701 if (which == OP_GHBYNAME) {
4702 #ifdef HAS_GETHOSTBYNAME
4703 const char* const name = POPpbytex;
4704 hent = PerlSock_gethostbyname(name);
4706 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4709 else if (which == OP_GHBYADDR) {
4710 #ifdef HAS_GETHOSTBYADDR
4711 const int addrtype = POPi;
4712 SV * const addrsv = POPs;
4714 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4716 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4718 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4722 #ifdef HAS_GETHOSTENT
4723 hent = PerlSock_gethostent();
4725 DIE(aTHX_ PL_no_sock_func, "gethostent");
4728 #ifdef HOST_NOT_FOUND
4730 #ifdef USE_REENTRANT_API
4731 # ifdef USE_GETHOSTENT_ERRNO
4732 h_errno = PL_reentrant_buffer->_gethostent_errno;
4735 STATUS_UNIX_SET(h_errno);
4739 if (GIMME != G_ARRAY) {
4740 PUSHs(sv = sv_newmortal());
4742 if (which == OP_GHBYNAME) {
4744 sv_setpvn(sv, hent->h_addr, hent->h_length);
4747 sv_setpv(sv, (char*)hent->h_name);
4753 mPUSHs(newSVpv((char*)hent->h_name, 0));
4754 PUSHs(space_join_names_mortal(hent->h_aliases));
4755 mPUSHi(hent->h_addrtype);
4756 len = hent->h_length;
4759 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4760 mXPUSHp(*elem, len);
4764 mPUSHp(hent->h_addr, len);
4766 PUSHs(sv_mortalcopy(&PL_sv_no));
4771 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4777 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4779 I32 which = PL_op->op_type;
4781 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4782 struct netent *getnetbyaddr(Netdb_net_t, int);
4783 struct netent *getnetbyname(Netdb_name_t);
4784 struct netent *getnetent(void);
4786 struct netent *nent;
4788 if (which == OP_GNBYNAME){
4789 #ifdef HAS_GETNETBYNAME
4790 const char * const name = POPpbytex;
4791 nent = PerlSock_getnetbyname(name);
4793 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4796 else if (which == OP_GNBYADDR) {
4797 #ifdef HAS_GETNETBYADDR
4798 const int addrtype = POPi;
4799 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4800 nent = PerlSock_getnetbyaddr(addr, addrtype);
4802 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4806 #ifdef HAS_GETNETENT
4807 nent = PerlSock_getnetent();
4809 DIE(aTHX_ PL_no_sock_func, "getnetent");
4812 #ifdef HOST_NOT_FOUND
4814 #ifdef USE_REENTRANT_API
4815 # ifdef USE_GETNETENT_ERRNO
4816 h_errno = PL_reentrant_buffer->_getnetent_errno;
4819 STATUS_UNIX_SET(h_errno);
4824 if (GIMME != G_ARRAY) {
4825 PUSHs(sv = sv_newmortal());
4827 if (which == OP_GNBYNAME)
4828 sv_setiv(sv, (IV)nent->n_net);
4830 sv_setpv(sv, nent->n_name);
4836 mPUSHs(newSVpv(nent->n_name, 0));
4837 PUSHs(space_join_names_mortal(nent->n_aliases));
4838 mPUSHi(nent->n_addrtype);
4839 mPUSHi(nent->n_net);
4844 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4850 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4852 I32 which = PL_op->op_type;
4854 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4855 struct protoent *getprotobyname(Netdb_name_t);
4856 struct protoent *getprotobynumber(int);
4857 struct protoent *getprotoent(void);
4859 struct protoent *pent;
4861 if (which == OP_GPBYNAME) {
4862 #ifdef HAS_GETPROTOBYNAME
4863 const char* const name = POPpbytex;
4864 pent = PerlSock_getprotobyname(name);
4866 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4869 else if (which == OP_GPBYNUMBER) {
4870 #ifdef HAS_GETPROTOBYNUMBER
4871 const int number = POPi;
4872 pent = PerlSock_getprotobynumber(number);
4874 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4878 #ifdef HAS_GETPROTOENT
4879 pent = PerlSock_getprotoent();
4881 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4885 if (GIMME != G_ARRAY) {
4886 PUSHs(sv = sv_newmortal());
4888 if (which == OP_GPBYNAME)
4889 sv_setiv(sv, (IV)pent->p_proto);
4891 sv_setpv(sv, pent->p_name);
4897 mPUSHs(newSVpv(pent->p_name, 0));
4898 PUSHs(space_join_names_mortal(pent->p_aliases));
4899 mPUSHi(pent->p_proto);
4904 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4910 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4912 I32 which = PL_op->op_type;
4914 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4915 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4916 struct servent *getservbyport(int, Netdb_name_t);
4917 struct servent *getservent(void);
4919 struct servent *sent;
4921 if (which == OP_GSBYNAME) {
4922 #ifdef HAS_GETSERVBYNAME
4923 const char * const proto = POPpbytex;
4924 const char * const name = POPpbytex;
4925 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4927 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4930 else if (which == OP_GSBYPORT) {
4931 #ifdef HAS_GETSERVBYPORT
4932 const char * const proto = POPpbytex;
4933 unsigned short port = (unsigned short)POPu;
4935 port = PerlSock_htons(port);
4937 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4939 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4943 #ifdef HAS_GETSERVENT
4944 sent = PerlSock_getservent();
4946 DIE(aTHX_ PL_no_sock_func, "getservent");
4950 if (GIMME != G_ARRAY) {
4951 PUSHs(sv = sv_newmortal());
4953 if (which == OP_GSBYNAME) {
4955 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4957 sv_setiv(sv, (IV)(sent->s_port));
4961 sv_setpv(sv, sent->s_name);
4967 mPUSHs(newSVpv(sent->s_name, 0));
4968 PUSHs(space_join_names_mortal(sent->s_aliases));
4970 mPUSHi(PerlSock_ntohs(sent->s_port));
4972 mPUSHi(sent->s_port);
4974 mPUSHs(newSVpv(sent->s_proto, 0));
4979 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4986 const int stayopen = TOPi;
4987 switch(PL_op->op_type) {
4989 #ifdef HAS_SETHOSTENT
4990 PerlSock_sethostent(stayopen);
4992 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4995 #ifdef HAS_SETNETENT
4997 PerlSock_setnetent(stayopen);
4999 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5003 #ifdef HAS_SETPROTOENT
5004 PerlSock_setprotoent(stayopen);
5006 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5010 #ifdef HAS_SETSERVENT
5011 PerlSock_setservent(stayopen);
5013 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5023 switch(PL_op->op_type) {
5025 #ifdef HAS_ENDHOSTENT
5026 PerlSock_endhostent();
5028 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5032 #ifdef HAS_ENDNETENT
5033 PerlSock_endnetent();
5035 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5039 #ifdef HAS_ENDPROTOENT
5040 PerlSock_endprotoent();
5042 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5046 #ifdef HAS_ENDSERVENT
5047 PerlSock_endservent();
5049 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5053 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5056 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5060 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5063 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5067 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5070 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5074 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5077 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5089 I32 which = PL_op->op_type;
5091 struct passwd *pwent = NULL;
5093 * We currently support only the SysV getsp* shadow password interface.
5094 * The interface is declared in <shadow.h> and often one needs to link
5095 * with -lsecurity or some such.
5096 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5099 * AIX getpwnam() is clever enough to return the encrypted password
5100 * only if the caller (euid?) is root.
5102 * There are at least three other shadow password APIs. Many platforms
5103 * seem to contain more than one interface for accessing the shadow
5104 * password databases, possibly for compatibility reasons.
5105 * The getsp*() is by far he simplest one, the other two interfaces
5106 * are much more complicated, but also very similar to each other.
5111 * struct pr_passwd *getprpw*();
5112 * The password is in
5113 * char getprpw*(...).ufld.fd_encrypt[]
5114 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5119 * struct es_passwd *getespw*();
5120 * The password is in
5121 * char *(getespw*(...).ufld.fd_encrypt)
5122 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5125 * struct userpw *getuserpw();
5126 * The password is in
5127 * char *(getuserpw(...)).spw_upw_passwd
5128 * (but the de facto standard getpwnam() should work okay)
5130 * Mention I_PROT here so that Configure probes for it.
5132 * In HP-UX for getprpw*() the manual page claims that one should include
5133 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5134 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5135 * and pp_sys.c already includes <shadow.h> if there is such.
5137 * Note that <sys/security.h> is already probed for, but currently
5138 * it is only included in special cases.
5140 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5141 * be preferred interface, even though also the getprpw*() interface
5142 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5143 * One also needs to call set_auth_parameters() in main() before
5144 * doing anything else, whether one is using getespw*() or getprpw*().
5146 * Note that accessing the shadow databases can be magnitudes
5147 * slower than accessing the standard databases.
5152 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5153 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5154 * the pw_comment is left uninitialized. */
5155 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5161 const char* const name = POPpbytex;
5162 pwent = getpwnam(name);
5168 pwent = getpwuid(uid);
5172 # ifdef HAS_GETPWENT
5174 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5175 if (pwent) pwent = getpwnam(pwent->pw_name);
5178 DIE(aTHX_ PL_no_func, "getpwent");
5184 if (GIMME != G_ARRAY) {
5185 PUSHs(sv = sv_newmortal());
5187 if (which == OP_GPWNAM)
5188 # if Uid_t_sign <= 0
5189 sv_setiv(sv, (IV)pwent->pw_uid);
5191 sv_setuv(sv, (UV)pwent->pw_uid);
5194 sv_setpv(sv, pwent->pw_name);
5200 mPUSHs(newSVpv(pwent->pw_name, 0));
5204 /* If we have getspnam(), we try to dig up the shadow
5205 * password. If we are underprivileged, the shadow
5206 * interface will set the errno to EACCES or similar,
5207 * and return a null pointer. If this happens, we will
5208 * use the dummy password (usually "*" or "x") from the
5209 * standard password database.
5211 * In theory we could skip the shadow call completely
5212 * if euid != 0 but in practice we cannot know which
5213 * security measures are guarding the shadow databases
5214 * on a random platform.
5216 * Resist the urge to use additional shadow interfaces.
5217 * Divert the urge to writing an extension instead.
5220 /* Some AIX setups falsely(?) detect some getspnam(), which
5221 * has a different API than the Solaris/IRIX one. */
5222 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5225 const struct spwd * const spwent = getspnam(pwent->pw_name);
5226 /* Save and restore errno so that
5227 * underprivileged attempts seem
5228 * to have never made the unsuccessful
5229 * attempt to retrieve the shadow password. */
5231 if (spwent && spwent->sp_pwdp)
5232 sv_setpv(sv, spwent->sp_pwdp);
5236 if (!SvPOK(sv)) /* Use the standard password, then. */
5237 sv_setpv(sv, pwent->pw_passwd);
5240 # ifndef INCOMPLETE_TAINTS
5241 /* passwd is tainted because user himself can diddle with it.
5242 * admittedly not much and in a very limited way, but nevertheless. */
5246 # if Uid_t_sign <= 0
5247 mPUSHi(pwent->pw_uid);
5249 mPUSHu(pwent->pw_uid);
5252 # if Uid_t_sign <= 0
5253 mPUSHi(pwent->pw_gid);
5255 mPUSHu(pwent->pw_gid);
5257 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5258 * because of the poor interface of the Perl getpw*(),
5259 * not because there's some standard/convention saying so.
5260 * A better interface would have been to return a hash,
5261 * but we are accursed by our history, alas. --jhi. */
5263 mPUSHi(pwent->pw_change);
5266 mPUSHi(pwent->pw_quota);
5269 mPUSHs(newSVpv(pwent->pw_age, 0));
5271 /* I think that you can never get this compiled, but just in case. */
5272 PUSHs(sv_mortalcopy(&PL_sv_no));
5277 /* pw_class and pw_comment are mutually exclusive--.
5278 * see the above note for pw_change, pw_quota, and pw_age. */
5280 mPUSHs(newSVpv(pwent->pw_class, 0));
5283 mPUSHs(newSVpv(pwent->pw_comment, 0));
5285 /* I think that you can never get this compiled, but just in case. */
5286 PUSHs(sv_mortalcopy(&PL_sv_no));
5291 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5293 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5295 # ifndef INCOMPLETE_TAINTS
5296 /* pw_gecos is tainted because user himself can diddle with it. */
5300 mPUSHs(newSVpv(pwent->pw_dir, 0));
5302 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5303 # ifndef INCOMPLETE_TAINTS
5304 /* pw_shell is tainted because user himself can diddle with it. */
5309 mPUSHi(pwent->pw_expire);
5314 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5322 const I32 which = PL_op->op_type;
5323 const struct group *grent;
5325 if (which == OP_GGRNAM) {
5326 const char* const name = POPpbytex;
5327 grent = (const struct group *)getgrnam(name);
5329 else if (which == OP_GGRGID) {
5330 const Gid_t gid = POPi;
5331 grent = (const struct group *)getgrgid(gid);
5335 grent = (struct group *)getgrent();
5337 DIE(aTHX_ PL_no_func, "getgrent");
5341 if (GIMME != G_ARRAY) {
5342 SV * const sv = sv_newmortal();
5346 if (which == OP_GGRNAM)
5348 sv_setiv(sv, (IV)grent->gr_gid);
5350 sv_setuv(sv, (UV)grent->gr_gid);
5353 sv_setpv(sv, grent->gr_name);
5359 mPUSHs(newSVpv(grent->gr_name, 0));
5362 mPUSHs(newSVpv(grent->gr_passwd, 0));
5364 PUSHs(sv_mortalcopy(&PL_sv_no));
5368 mPUSHi(grent->gr_gid);
5370 mPUSHu(grent->gr_gid);
5373 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5374 /* In UNICOS/mk (_CRAYMPP) the multithreading
5375 * versions (getgrnam_r, getgrgid_r)
5376 * seem to return an illegal pointer
5377 * as the group members list, gr_mem.
5378 * getgrent() doesn't even have a _r version
5379 * but the gr_mem is poisonous anyway.
5380 * So yes, you cannot get the list of group
5381 * members if building multithreaded in UNICOS/mk. */
5382 PUSHs(space_join_names_mortal(grent->gr_mem));
5388 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5398 if (!(tmps = PerlProc_getlogin()))
5400 sv_setpv_mg(TARG, tmps);
5404 DIE(aTHX_ PL_no_func, "getlogin");
5408 /* Miscellaneous. */
5413 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5414 register I32 items = SP - MARK;
5415 unsigned long a[20];
5420 while (++MARK <= SP) {
5421 if (SvTAINTED(*MARK)) {
5427 TAINT_PROPER("syscall");
5430 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5431 * or where sizeof(long) != sizeof(char*). But such machines will
5432 * not likely have syscall implemented either, so who cares?
5434 while (++MARK <= SP) {
5435 if (SvNIOK(*MARK) || !i)
5436 a[i++] = SvIV(*MARK);
5437 else if (*MARK == &PL_sv_undef)
5440 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5446 DIE(aTHX_ "Too many args to syscall");
5448 DIE(aTHX_ "Too few args to syscall");
5450 retval = syscall(a[0]);
5453 retval = syscall(a[0],a[1]);
5456 retval = syscall(a[0],a[1],a[2]);
5459 retval = syscall(a[0],a[1],a[2],a[3]);
5462 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5465 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5468 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5471 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5475 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5478 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5481 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5485 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5489 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5493 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5494 a[10],a[11],a[12],a[13]);
5496 #endif /* atarist */
5502 DIE(aTHX_ PL_no_func, "syscall");
5506 #ifdef FCNTL_EMULATE_FLOCK
5508 /* XXX Emulate flock() with fcntl().
5509 What's really needed is a good file locking module.
5513 fcntl_emulate_flock(int fd, int operation)
5518 switch (operation & ~LOCK_NB) {
5520 flock.l_type = F_RDLCK;
5523 flock.l_type = F_WRLCK;
5526 flock.l_type = F_UNLCK;
5532 flock.l_whence = SEEK_SET;
5533 flock.l_start = flock.l_len = (Off_t)0;
5535 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5536 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5537 errno = EWOULDBLOCK;
5541 #endif /* FCNTL_EMULATE_FLOCK */
5543 #ifdef LOCKF_EMULATE_FLOCK
5545 /* XXX Emulate flock() with lockf(). This is just to increase
5546 portability of scripts. The calls are not completely
5547 interchangeable. What's really needed is a good file
5551 /* The lockf() constants might have been defined in <unistd.h>.
5552 Unfortunately, <unistd.h> causes troubles on some mixed
5553 (BSD/POSIX) systems, such as SunOS 4.1.3.
5555 Further, the lockf() constants aren't POSIX, so they might not be
5556 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5557 just stick in the SVID values and be done with it. Sigh.
5561 # define F_ULOCK 0 /* Unlock a previously locked region */
5564 # define F_LOCK 1 /* Lock a region for exclusive use */
5567 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5570 # define F_TEST 3 /* Test a region for other processes locks */
5574 lockf_emulate_flock(int fd, int operation)
5580 /* flock locks entire file so for lockf we need to do the same */
5581 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5582 if (pos > 0) /* is seekable and needs to be repositioned */
5583 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5584 pos = -1; /* seek failed, so don't seek back afterwards */
5587 switch (operation) {
5589 /* LOCK_SH - get a shared lock */
5591 /* LOCK_EX - get an exclusive lock */
5593 i = lockf (fd, F_LOCK, 0);
5596 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5597 case LOCK_SH|LOCK_NB:
5598 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5599 case LOCK_EX|LOCK_NB:
5600 i = lockf (fd, F_TLOCK, 0);
5602 if ((errno == EAGAIN) || (errno == EACCES))
5603 errno = EWOULDBLOCK;
5606 /* LOCK_UN - unlock (non-blocking is a no-op) */
5608 case LOCK_UN|LOCK_NB:
5609 i = lockf (fd, F_ULOCK, 0);
5612 /* Default - can't decipher operation */
5619 if (pos > 0) /* need to restore position of the handle */
5620 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5625 #endif /* LOCKF_EMULATE_FLOCK */
5629 * c-indentation-style: bsd
5631 * indent-tabs-mode: t
5634 * ex: set ts=8 sts=4 sw=4 noet: