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)
361 tryAMAGICunTARGET(iter, -1);
363 /* Note that we only ever get here if File::Glob fails to load
364 * without at the same time croaking, for some reason, or if
365 * perl was built with PERL_EXTERNAL_GLOB */
367 ENTER_with_name("glob");
372 * The external globbing program may use things we can't control,
373 * so for security reasons we must assume the worst.
376 taint_proper(PL_no_security, "glob");
380 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
381 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
383 SAVESPTR(PL_rs); /* This is not permanent, either. */
384 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
387 *SvPVX(PL_rs) = '\n';
391 result = do_readline();
392 LEAVE_with_name("glob");
399 PL_last_in_gv = cGVOP_gv;
400 return do_readline();
411 do_join(TARG, &PL_sv_no, MARK, SP);
415 else if (SP == MARK) {
424 if (SvROK(exsv) || (pv = SvPV_const(exsv, len), len)) {
425 /* well-formed exception supplied */
427 else if (SvROK(ERRSV)) {
430 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
431 exsv = sv_mortalcopy(ERRSV);
432 sv_catpvs(exsv, "\t...caught");
435 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
448 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
450 if (SP - MARK != 1) {
452 do_join(TARG, &PL_sv_no, MARK, SP);
460 if (SvROK(exsv) || (pv = SvPV_const(exsv, len), len)) {
461 /* well-formed exception supplied */
463 else if (SvROK(ERRSV)) {
465 if (sv_isobject(exsv)) {
466 HV * const stash = SvSTASH(SvRV(exsv));
467 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
469 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
470 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
477 call_sv(MUTABLE_SV(GvCV(gv)),
478 G_SCALAR|G_EVAL|G_KEEPERR);
479 exsv = sv_mortalcopy(*PL_stack_sp--);
483 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
484 exsv = sv_mortalcopy(ERRSV);
485 sv_catpvs(exsv, "\t...propagated");
488 exsv = newSVpvs_flags("Died", SVs_TEMP);
506 GV * const gv = MUTABLE_GV(*++MARK);
508 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
509 DIE(aTHX_ PL_no_usym, "filehandle");
511 if ((io = GvIOp(gv))) {
513 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
516 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
517 "Opening dirhandle %s also as a file",
520 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
522 /* Method's args are same as ours ... */
523 /* ... except handle is replaced by the object */
524 *MARK-- = SvTIED_obj(MUTABLE_SV(io), mg);
527 ENTER_with_name("call_OPEN");
528 call_method("OPEN", G_SCALAR);
529 LEAVE_with_name("call_OPEN");
542 tmps = SvPV_const(sv, len);
543 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
546 PUSHi( (I32)PL_forkprocess );
547 else if (PL_forkprocess == 0) /* we are a new child */
554 /* These are private to this function, which is private to this file.
555 Use 0x04 rather than the next available bit, to help the compiler if the
556 architecture can generate more efficient instructions. */
557 #define MORTALIZE_NOT_NEEDED 0x04
558 #define TIED_HANDLE_ARGC_SHIFT 3
561 S_tied_handle_method(pTHX_ const char *const methname, SV **sp,
562 IO *const io, MAGIC *const mg, const U32 flags, ...)
564 U32 argc = flags >> TIED_HANDLE_ARGC_SHIFT;
566 PERL_ARGS_ASSERT_TIED_HANDLE_METHOD;
568 /* Ensure that our flag bits do not overlap. */
569 assert((MORTALIZE_NOT_NEEDED & G_WANT) == 0);
570 assert((G_WANT >> TIED_HANDLE_ARGC_SHIFT) == 0);
573 PUSHs(SvTIED_obj(MUTABLE_SV(io), mg));
575 const U32 mortalize_not_needed = flags & MORTALIZE_NOT_NEEDED;
577 va_start(args, flags);
579 SV *const arg = va_arg(args, SV *);
580 if(mortalize_not_needed)
589 ENTER_with_name("call_tied_handle_method");
590 call_method(methname, flags & G_WANT);
591 LEAVE_with_name("call_tied_handle_method");
595 #define tied_handle_method(a,b,c,d) \
596 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR)
597 #define tied_handle_method1(a,b,c,d,e) \
598 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR | (1 << TIED_HANDLE_ARGC_SHIFT),e)
599 #define tied_handle_method2(a,b,c,d,e,f) \
600 S_tied_handle_method(aTHX_ a,b,c,d,G_SCALAR | (2 << TIED_HANDLE_ARGC_SHIFT), e,f)
605 GV * const gv = (MAXARG == 0) ? PL_defoutgv : MUTABLE_GV(POPs);
611 IO * const io = GvIO(gv);
613 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
615 return tied_handle_method("CLOSE", SP, io, mg);
619 PUSHs(boolSV(do_close(gv, TRUE)));
632 GV * const wgv = MUTABLE_GV(POPs);
633 GV * const rgv = MUTABLE_GV(POPs);
638 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
639 DIE(aTHX_ PL_no_usym, "filehandle");
644 do_close(rgv, FALSE);
646 do_close(wgv, FALSE);
648 if (PerlProc_pipe(fd) < 0)
651 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
652 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
653 IoOFP(rstio) = IoIFP(rstio);
654 IoIFP(wstio) = IoOFP(wstio);
655 IoTYPE(rstio) = IoTYPE_RDONLY;
656 IoTYPE(wstio) = IoTYPE_WRONLY;
658 if (!IoIFP(rstio) || !IoOFP(wstio)) {
660 PerlIO_close(IoIFP(rstio));
662 PerlLIO_close(fd[0]);
664 PerlIO_close(IoOFP(wstio));
666 PerlLIO_close(fd[1]);
669 #if defined(HAS_FCNTL) && defined(F_SETFD)
670 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
671 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
678 DIE(aTHX_ PL_no_func, "pipe");
692 gv = MUTABLE_GV(POPs);
694 if (gv && (io = GvIO(gv))
695 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
697 return tied_handle_method("FILENO", SP, io, mg);
700 if (!gv || !(io = GvIO(gv)) || !(fp = IoIFP(io))) {
701 /* Can't do this because people seem to do things like
702 defined(fileno($foo)) to check whether $foo is a valid fh.
703 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
704 report_evil_fh(gv, io, PL_op->op_type);
709 PUSHi(PerlIO_fileno(fp));
722 anum = PerlLIO_umask(022);
723 /* setting it to 022 between the two calls to umask avoids
724 * to have a window where the umask is set to 0 -- meaning
725 * that another thread could create world-writeable files. */
727 (void)PerlLIO_umask(anum);
730 anum = PerlLIO_umask(POPi);
731 TAINT_PROPER("umask");
734 /* Only DIE if trying to restrict permissions on "user" (self).
735 * Otherwise it's harmless and more useful to just return undef
736 * since 'group' and 'other' concepts probably don't exist here. */
737 if (MAXARG >= 1 && (POPi & 0700))
738 DIE(aTHX_ "umask not implemented");
739 XPUSHs(&PL_sv_undef);
758 gv = MUTABLE_GV(POPs);
760 if (gv && (io = GvIO(gv))) {
761 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
763 /* This takes advantage of the implementation of the varargs
764 function, which I don't think that the optimiser will be able to
765 figure out. Although, as it's a static function, in theory it
767 return S_tied_handle_method(aTHX_ "BINMODE", SP, io, mg,
768 G_SCALAR|MORTALIZE_NOT_NEEDED
770 ? (1 << TIED_HANDLE_ARGC_SHIFT) : 0),
775 if (!(io = GvIO(gv)) || !(fp = IoIFP(io))) {
776 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
777 report_evil_fh(gv, io, PL_op->op_type);
778 SETERRNO(EBADF,RMS_IFI);
785 const char *d = NULL;
788 d = SvPV_const(discp, len);
789 mode = mode_from_discipline(d, len);
790 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
791 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
792 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
813 const I32 markoff = MARK - PL_stack_base;
814 const char *methname;
815 int how = PERL_MAGIC_tied;
819 switch(SvTYPE(varsv)) {
821 methname = "TIEHASH";
822 HvEITER_set(MUTABLE_HV(varsv), 0);
825 methname = "TIEARRAY";
829 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
830 methname = "TIEHANDLE";
831 how = PERL_MAGIC_tiedscalar;
832 /* For tied filehandles, we apply tiedscalar magic to the IO
833 slot of the GP rather than the GV itself. AMS 20010812 */
835 GvIOp(varsv) = newIO();
836 varsv = MUTABLE_SV(GvIOp(varsv));
841 methname = "TIESCALAR";
842 how = PERL_MAGIC_tiedscalar;
846 if (sv_isobject(*MARK)) { /* Calls GET magic. */
847 ENTER_with_name("call_TIE");
848 PUSHSTACKi(PERLSI_MAGIC);
850 EXTEND(SP,(I32)items);
854 call_method(methname, G_SCALAR);
857 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
858 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
859 * wrong error message, and worse case, supreme action at a distance.
860 * (Sorry obfuscation writers. You're not going to be given this one.)
863 const char *name = SvPV_nomg_const(*MARK, len);
864 stash = gv_stashpvn(name, len, 0);
865 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
866 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
867 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
869 ENTER_with_name("call_TIE");
870 PUSHSTACKi(PERLSI_MAGIC);
872 EXTEND(SP,(I32)items);
876 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
882 if (sv_isobject(sv)) {
883 sv_unmagic(varsv, how);
884 /* Croak if a self-tie on an aggregate is attempted. */
885 if (varsv == SvRV(sv) &&
886 (SvTYPE(varsv) == SVt_PVAV ||
887 SvTYPE(varsv) == SVt_PVHV))
889 "Self-ties of arrays and hashes are not supported");
890 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
892 LEAVE_with_name("call_TIE");
893 SP = PL_stack_base + markoff;
903 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
904 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
906 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
909 if ((mg = SvTIED_mg(sv, how))) {
910 SV * const obj = SvRV(SvTIED_obj(sv, mg));
912 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
914 if (gv && isGV(gv) && (cv = GvCV(gv))) {
916 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
917 mXPUSHi(SvREFCNT(obj) - 1);
919 ENTER_with_name("call_UNTIE");
920 call_sv(MUTABLE_SV(cv), G_VOID);
921 LEAVE_with_name("call_UNTIE");
924 else if (mg && SvREFCNT(obj) > 1) {
925 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
926 "untie attempted while %"UVuf" inner references still exist",
927 (UV)SvREFCNT(obj) - 1 ) ;
931 sv_unmagic(sv, how) ;
941 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
942 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
944 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
947 if ((mg = SvTIED_mg(sv, how))) {
948 SV *osv = SvTIED_obj(sv, mg);
949 if (osv == mg->mg_obj)
950 osv = sv_mortalcopy(osv);
964 HV * const hv = MUTABLE_HV(POPs);
965 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
966 stash = gv_stashsv(sv, 0);
967 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
969 require_pv("AnyDBM_File.pm");
971 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
972 DIE(aTHX_ "No dbm on this machine");
982 mPUSHu(O_RDWR|O_CREAT);
987 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
990 if (!sv_isobject(TOPs)) {
998 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1002 if (sv_isobject(TOPs)) {
1003 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1004 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1021 struct timeval timebuf;
1022 struct timeval *tbuf = &timebuf;
1025 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1030 # if BYTEORDER & 0xf0000
1031 # define ORDERBYTE (0x88888888 - BYTEORDER)
1033 # define ORDERBYTE (0x4444 - BYTEORDER)
1039 for (i = 1; i <= 3; i++) {
1040 SV * const sv = SP[i];
1043 if (SvREADONLY(sv)) {
1045 sv_force_normal_flags(sv, 0);
1046 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1047 Perl_croak_no_modify(aTHX);
1050 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Non-string passed as bitmask");
1051 SvPV_force_nolen(sv); /* force string conversion */
1058 /* little endians can use vecs directly */
1059 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1066 masksize = NFDBITS / NBBY;
1068 masksize = sizeof(long); /* documented int, everyone seems to use long */
1070 Zero(&fd_sets[0], 4, char*);
1073 # if SELECT_MIN_BITS == 1
1074 growsize = sizeof(fd_set);
1076 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1077 # undef SELECT_MIN_BITS
1078 # define SELECT_MIN_BITS __FD_SETSIZE
1080 /* If SELECT_MIN_BITS is greater than one we most probably will want
1081 * to align the sizes with SELECT_MIN_BITS/8 because for example
1082 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1083 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1084 * on (sets/tests/clears bits) is 32 bits. */
1085 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1093 timebuf.tv_sec = (long)value;
1094 value -= (NV)timebuf.tv_sec;
1095 timebuf.tv_usec = (long)(value * 1000000.0);
1100 for (i = 1; i <= 3; i++) {
1102 if (!SvOK(sv) || SvCUR(sv) == 0) {
1109 Sv_Grow(sv, growsize);
1113 while (++j <= growsize) {
1117 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1119 Newx(fd_sets[i], growsize, char);
1120 for (offset = 0; offset < growsize; offset += masksize) {
1121 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1122 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1125 fd_sets[i] = SvPVX(sv);
1129 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1130 /* Can't make just the (void*) conditional because that would be
1131 * cpp #if within cpp macro, and not all compilers like that. */
1132 nfound = PerlSock_select(
1134 (Select_fd_set_t) fd_sets[1],
1135 (Select_fd_set_t) fd_sets[2],
1136 (Select_fd_set_t) fd_sets[3],
1137 (void*) tbuf); /* Workaround for compiler bug. */
1139 nfound = PerlSock_select(
1141 (Select_fd_set_t) fd_sets[1],
1142 (Select_fd_set_t) fd_sets[2],
1143 (Select_fd_set_t) fd_sets[3],
1146 for (i = 1; i <= 3; i++) {
1149 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1151 for (offset = 0; offset < growsize; offset += masksize) {
1152 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1153 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1155 Safefree(fd_sets[i]);
1162 if (GIMME == G_ARRAY && tbuf) {
1163 value = (NV)(timebuf.tv_sec) +
1164 (NV)(timebuf.tv_usec) / 1000000.0;
1169 DIE(aTHX_ "select not implemented");
1174 =for apidoc setdefout
1176 Sets PL_defoutgv, the default file handle for output, to the passed in
1177 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1178 count of the passed in typeglob is increased by one, and the reference count
1179 of the typeglob that PL_defoutgv points to is decreased by one.
1185 Perl_setdefout(pTHX_ GV *gv)
1188 SvREFCNT_inc_simple_void(gv);
1189 SvREFCNT_dec(PL_defoutgv);
1197 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1198 GV * egv = GvEGVx(PL_defoutgv);
1202 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1204 XPUSHs(&PL_sv_undef);
1206 GV * const * const gvp = (GV**)hv_fetch(hv, GvNAME(egv), GvNAMELEN(egv), FALSE);
1207 if (gvp && *gvp == egv) {
1208 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1212 mXPUSHs(newRV(MUTABLE_SV(egv)));
1217 if (!GvIO(newdefout))
1218 gv_IOadd(newdefout);
1219 setdefout(newdefout);
1229 GV * const gv = (MAXARG==0) ? PL_stdingv : MUTABLE_GV(POPs);
1234 if (gv && (io = GvIO(gv))) {
1235 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1237 const U32 gimme = GIMME_V;
1238 S_tied_handle_method(aTHX_ "GETC", SP, io, mg, gimme);
1239 if (gimme == G_SCALAR) {
1241 SvSetMagicSV_nosteal(TARG, TOPs);
1246 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1247 if ((!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1248 && ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1249 report_evil_fh(gv, io, PL_op->op_type);
1250 SETERRNO(EBADF,RMS_IFI);
1254 sv_setpvs(TARG, " ");
1255 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1256 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1257 /* Find out how many bytes the char needs */
1258 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1261 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1262 SvCUR_set(TARG,1+len);
1271 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1274 register PERL_CONTEXT *cx;
1275 const I32 gimme = GIMME_V;
1277 PERL_ARGS_ASSERT_DOFORM;
1279 if (cv && CvCLONE(cv))
1280 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1285 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1286 PUSHFORMAT(cx, retop);
1288 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1290 setdefout(gv); /* locally select filehandle so $% et al work */
1309 gv = MUTABLE_GV(POPs);
1323 goto not_a_format_reference;
1328 tmpsv = sv_newmortal();
1329 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1330 name = SvPV_nolen_const(tmpsv);
1332 DIE(aTHX_ "Undefined format \"%s\" called", name);
1334 not_a_format_reference:
1335 DIE(aTHX_ "Not a format reference");
1337 IoFLAGS(io) &= ~IOf_DIDTOP;
1338 return doform(cv,gv,PL_op->op_next);
1344 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1345 register IO * const io = GvIOp(gv);
1350 register PERL_CONTEXT *cx;
1353 if (!io || !(ofp = IoOFP(io)))
1356 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1357 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1359 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1360 PL_formtarget != PL_toptarget)
1364 if (!IoTOP_GV(io)) {
1367 if (!IoTOP_NAME(io)) {
1369 if (!IoFMT_NAME(io))
1370 IoFMT_NAME(io) = savepv(GvNAME(gv));
1371 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%s_TOP", GvNAME(gv)));
1372 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1373 if ((topgv && GvFORM(topgv)) ||
1374 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1375 IoTOP_NAME(io) = savesvpv(topname);
1377 IoTOP_NAME(io) = savepvs("top");
1379 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1380 if (!topgv || !GvFORM(topgv)) {
1381 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1384 IoTOP_GV(io) = topgv;
1386 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1387 I32 lines = IoLINES_LEFT(io);
1388 const char *s = SvPVX_const(PL_formtarget);
1389 if (lines <= 0) /* Yow, header didn't even fit!!! */
1391 while (lines-- > 0) {
1392 s = strchr(s, '\n');
1398 const STRLEN save = SvCUR(PL_formtarget);
1399 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1400 do_print(PL_formtarget, ofp);
1401 SvCUR_set(PL_formtarget, save);
1402 sv_chop(PL_formtarget, s);
1403 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1406 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1407 do_print(PL_formfeed, ofp);
1408 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1410 PL_formtarget = PL_toptarget;
1411 IoFLAGS(io) |= IOf_DIDTOP;
1414 DIE(aTHX_ "bad top format reference");
1417 SV * const sv = sv_newmortal();
1419 gv_efullname4(sv, fgv, NULL, FALSE);
1420 name = SvPV_nolen_const(sv);
1422 DIE(aTHX_ "Undefined top format \"%s\" called", name);
1424 DIE(aTHX_ "Undefined top format called");
1426 return doform(cv, gv, PL_op);
1430 POPBLOCK(cx,PL_curpm);
1432 retop = cx->blk_sub.retop;
1437 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1439 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1440 else if (ckWARN(WARN_CLOSED))
1441 report_evil_fh(gv, io, PL_op->op_type);
1446 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1447 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1449 if (!do_print(PL_formtarget, fp))
1452 FmLINES(PL_formtarget) = 0;
1453 SvCUR_set(PL_formtarget, 0);
1454 *SvEND(PL_formtarget) = '\0';
1455 if (IoFLAGS(io) & IOf_FLUSH)
1456 (void)PerlIO_flush(fp);
1461 PL_formtarget = PL_bodytarget;
1463 PERL_UNUSED_VAR(newsp);
1464 PERL_UNUSED_VAR(gimme);
1470 dVAR; dSP; dMARK; dORIGMARK;
1476 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1478 if (gv && (io = GvIO(gv))) {
1479 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1481 if (MARK == ORIGMARK) {
1484 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1488 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1491 call_method("PRINTF", G_SCALAR);
1494 MARK = ORIGMARK + 1;
1502 if (!(io = GvIO(gv))) {
1503 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1504 report_evil_fh(gv, io, PL_op->op_type);
1505 SETERRNO(EBADF,RMS_IFI);
1508 else if (!(fp = IoOFP(io))) {
1509 if (ckWARN2(WARN_CLOSED,WARN_IO)) {
1511 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1512 else if (ckWARN(WARN_CLOSED))
1513 report_evil_fh(gv, io, PL_op->op_type);
1515 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1519 if (SvTAINTED(MARK[1]))
1520 TAINT_PROPER("printf");
1521 do_sprintf(sv, SP - MARK, MARK + 1);
1522 if (!do_print(sv, fp))
1525 if (IoFLAGS(io) & IOf_FLUSH)
1526 if (PerlIO_flush(fp) == EOF)
1537 PUSHs(&PL_sv_undef);
1545 const int perm = (MAXARG > 3) ? POPi : 0666;
1546 const int mode = POPi;
1547 SV * const sv = POPs;
1548 GV * const gv = MUTABLE_GV(POPs);
1551 /* Need TIEHANDLE method ? */
1552 const char * const tmps = SvPV_const(sv, len);
1553 /* FIXME? do_open should do const */
1554 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1555 IoLINES(GvIOp(gv)) = 0;
1559 PUSHs(&PL_sv_undef);
1566 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1572 Sock_size_t bufsize;
1580 bool charstart = FALSE;
1581 STRLEN charskip = 0;
1584 GV * const gv = MUTABLE_GV(*++MARK);
1585 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1586 && gv && (io = GvIO(gv)) )
1588 const MAGIC * mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1592 *MARK = SvTIED_obj(MUTABLE_SV(io), mg);
1594 call_method("READ", G_SCALAR);
1608 sv_setpvs(bufsv, "");
1609 length = SvIVx(*++MARK);
1612 offset = SvIVx(*++MARK);
1616 if (!io || !IoIFP(io)) {
1617 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1618 report_evil_fh(gv, io, PL_op->op_type);
1619 SETERRNO(EBADF,RMS_IFI);
1622 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1623 buffer = SvPVutf8_force(bufsv, blen);
1624 /* UTF-8 may not have been set if they are all low bytes */
1629 buffer = SvPV_force(bufsv, blen);
1630 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1633 DIE(aTHX_ "Negative length");
1641 if (PL_op->op_type == OP_RECV) {
1642 char namebuf[MAXPATHLEN];
1643 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1644 bufsize = sizeof (struct sockaddr_in);
1646 bufsize = sizeof namebuf;
1648 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1652 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1653 /* 'offset' means 'flags' here */
1654 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1655 (struct sockaddr *)namebuf, &bufsize);
1659 /* Bogus return without padding */
1660 bufsize = sizeof (struct sockaddr_in);
1662 SvCUR_set(bufsv, count);
1663 *SvEND(bufsv) = '\0';
1664 (void)SvPOK_only(bufsv);
1668 /* This should not be marked tainted if the fp is marked clean */
1669 if (!(IoFLAGS(io) & IOf_UNTAINT))
1670 SvTAINTED_on(bufsv);
1672 sv_setpvn(TARG, namebuf, bufsize);
1677 if (PL_op->op_type == OP_RECV)
1678 DIE(aTHX_ PL_no_sock_func, "recv");
1680 if (DO_UTF8(bufsv)) {
1681 /* offset adjust in characters not bytes */
1682 blen = sv_len_utf8(bufsv);
1685 if (-offset > (int)blen)
1686 DIE(aTHX_ "Offset outside string");
1689 if (DO_UTF8(bufsv)) {
1690 /* convert offset-as-chars to offset-as-bytes */
1691 if (offset >= (int)blen)
1692 offset += SvCUR(bufsv) - blen;
1694 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1697 bufsize = SvCUR(bufsv);
1698 /* Allocating length + offset + 1 isn't perfect in the case of reading
1699 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1701 (should be 2 * length + offset + 1, or possibly something longer if
1702 PL_encoding is true) */
1703 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1704 if (offset > 0 && (Sock_size_t)offset > bufsize) { /* Zero any newly allocated space */
1705 Zero(buffer+bufsize, offset-bufsize, char);
1707 buffer = buffer + offset;
1709 read_target = bufsv;
1711 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1712 concatenate it to the current buffer. */
1714 /* Truncate the existing buffer to the start of where we will be
1716 SvCUR_set(bufsv, offset);
1718 read_target = sv_newmortal();
1719 SvUPGRADE(read_target, SVt_PV);
1720 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1723 if (PL_op->op_type == OP_SYSREAD) {
1724 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1725 if (IoTYPE(io) == IoTYPE_SOCKET) {
1726 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1732 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1737 #ifdef HAS_SOCKET__bad_code_maybe
1738 if (IoTYPE(io) == IoTYPE_SOCKET) {
1739 char namebuf[MAXPATHLEN];
1740 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1741 bufsize = sizeof (struct sockaddr_in);
1743 bufsize = sizeof namebuf;
1745 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1746 (struct sockaddr *)namebuf, &bufsize);
1751 count = PerlIO_read(IoIFP(io), buffer, length);
1752 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1753 if (count == 0 && PerlIO_error(IoIFP(io)))
1757 if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO))
1758 report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY);
1761 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1762 *SvEND(read_target) = '\0';
1763 (void)SvPOK_only(read_target);
1764 if (fp_utf8 && !IN_BYTES) {
1765 /* Look at utf8 we got back and count the characters */
1766 const char *bend = buffer + count;
1767 while (buffer < bend) {
1769 skip = UTF8SKIP(buffer);
1772 if (buffer - charskip + skip > bend) {
1773 /* partial character - try for rest of it */
1774 length = skip - (bend-buffer);
1775 offset = bend - SvPVX_const(bufsv);
1787 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1788 provided amount read (count) was what was requested (length)
1790 if (got < wanted && count == length) {
1791 length = wanted - got;
1792 offset = bend - SvPVX_const(bufsv);
1795 /* return value is character count */
1799 else if (buffer_utf8) {
1800 /* Let svcatsv upgrade the bytes we read in to utf8.
1801 The buffer is a mortal so will be freed soon. */
1802 sv_catsv_nomg(bufsv, read_target);
1805 /* This should not be marked tainted if the fp is marked clean */
1806 if (!(IoFLAGS(io) & IOf_UNTAINT))
1807 SvTAINTED_on(bufsv);
1819 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1825 STRLEN orig_blen_bytes;
1826 const int op_type = PL_op->op_type;
1830 GV *const gv = MUTABLE_GV(*++MARK);
1831 if (PL_op->op_type == OP_SYSWRITE
1832 && gv && (io = GvIO(gv))) {
1833 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1837 if (MARK == SP - 1) {
1839 mXPUSHi(sv_len(sv));
1844 *(ORIGMARK+1) = SvTIED_obj(MUTABLE_SV(io), mg);
1846 call_method("WRITE", G_SCALAR);
1862 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1864 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
1865 if (io && IoIFP(io))
1866 report_evil_fh(gv, io, OP_phoney_INPUT_ONLY);
1868 report_evil_fh(gv, io, PL_op->op_type);
1870 SETERRNO(EBADF,RMS_IFI);
1874 /* Do this first to trigger any overloading. */
1875 buffer = SvPV_const(bufsv, blen);
1876 orig_blen_bytes = blen;
1877 doing_utf8 = DO_UTF8(bufsv);
1879 if (PerlIO_isutf8(IoIFP(io))) {
1880 if (!SvUTF8(bufsv)) {
1881 /* We don't modify the original scalar. */
1882 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1883 buffer = (char *) tmpbuf;
1887 else if (doing_utf8) {
1888 STRLEN tmplen = blen;
1889 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1892 buffer = (char *) tmpbuf;
1896 assert((char *)result == buffer);
1897 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1901 if (op_type == OP_SYSWRITE) {
1902 Size_t length = 0; /* This length is in characters. */
1908 /* The SV is bytes, and we've had to upgrade it. */
1909 blen_chars = orig_blen_bytes;
1911 /* The SV really is UTF-8. */
1912 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1913 /* Don't call sv_len_utf8 again because it will call magic
1914 or overloading a second time, and we might get back a
1915 different result. */
1916 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1918 /* It's safe, and it may well be cached. */
1919 blen_chars = sv_len_utf8(bufsv);
1927 length = blen_chars;
1929 #if Size_t_size > IVSIZE
1930 length = (Size_t)SvNVx(*++MARK);
1932 length = (Size_t)SvIVx(*++MARK);
1934 if ((SSize_t)length < 0) {
1936 DIE(aTHX_ "Negative length");
1941 offset = SvIVx(*++MARK);
1943 if (-offset > (IV)blen_chars) {
1945 DIE(aTHX_ "Offset outside string");
1947 offset += blen_chars;
1948 } else if (offset > (IV)blen_chars) {
1950 DIE(aTHX_ "Offset outside string");
1954 if (length > blen_chars - offset)
1955 length = blen_chars - offset;
1957 /* Here we convert length from characters to bytes. */
1958 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1959 /* Either we had to convert the SV, or the SV is magical, or
1960 the SV has overloading, in which case we can't or mustn't
1961 or mustn't call it again. */
1963 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1964 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1966 /* It's a real UTF-8 SV, and it's not going to change under
1967 us. Take advantage of any cache. */
1969 I32 len_I32 = length;
1971 /* Convert the start and end character positions to bytes.
1972 Remember that the second argument to sv_pos_u2b is relative
1974 sv_pos_u2b(bufsv, &start, &len_I32);
1981 buffer = buffer+offset;
1983 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
1984 if (IoTYPE(io) == IoTYPE_SOCKET) {
1985 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
1991 /* See the note at doio.c:do_print about filesize limits. --jhi */
1992 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
1998 const int flags = SvIVx(*++MARK);
2001 char * const sockbuf = SvPVx(*++MARK, mlen);
2002 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
2003 flags, (struct sockaddr *)sockbuf, mlen);
2007 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
2012 DIE(aTHX_ PL_no_sock_func, "send");
2019 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2022 #if Size_t_size > IVSIZE
2042 * in Perl 5.12 and later, the additional parameter is a bitmask:
2045 * 2 = eof() <- ARGV magic
2047 * I'll rely on the compiler's trace flow analysis to decide whether to
2048 * actually assign this out here, or punt it into the only block where it is
2049 * used. Doing it out here is DRY on the condition logic.
2054 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2060 if (PL_op->op_flags & OPf_SPECIAL) {
2061 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2065 gv = PL_last_in_gv; /* eof */
2073 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2074 return tied_handle_method1("EOF", SP, io, mg, newSVuv(which));
2077 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2078 if (io && !IoIFP(io)) {
2079 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2081 IoFLAGS(io) &= ~IOf_START;
2082 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2084 sv_setpvs(GvSV(gv), "-");
2086 GvSV(gv) = newSVpvs("-");
2087 SvSETMAGIC(GvSV(gv));
2089 else if (!nextargv(gv))
2094 PUSHs(boolSV(do_eof(gv)));
2105 PL_last_in_gv = MUTABLE_GV(POPs);
2110 if (gv && (io = GvIO(gv))) {
2111 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2113 return tied_handle_method("TELL", SP, io, mg);
2118 SETERRNO(EBADF,RMS_IFI);
2123 #if LSEEKSIZE > IVSIZE
2124 PUSHn( do_tell(gv) );
2126 PUSHi( do_tell(gv) );
2134 const int whence = POPi;
2135 #if LSEEKSIZE > IVSIZE
2136 const Off_t offset = (Off_t)SvNVx(POPs);
2138 const Off_t offset = (Off_t)SvIVx(POPs);
2141 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2144 if (gv && (io = GvIO(gv))) {
2145 MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2147 #if LSEEKSIZE > IVSIZE
2148 SV *const offset_sv = newSVnv((NV) offset);
2150 SV *const offset_sv = newSViv(offset);
2153 return tied_handle_method2("SEEK", SP, io, mg, offset_sv,
2158 if (PL_op->op_type == OP_SEEK)
2159 PUSHs(boolSV(do_seek(gv, offset, whence)));
2161 const Off_t sought = do_sysseek(gv, offset, whence);
2163 PUSHs(&PL_sv_undef);
2165 SV* const sv = sought ?
2166 #if LSEEKSIZE > IVSIZE
2171 : newSVpvn(zero_but_true, ZBTLEN);
2182 /* There seems to be no consensus on the length type of truncate()
2183 * and ftruncate(), both off_t and size_t have supporters. In
2184 * general one would think that when using large files, off_t is
2185 * at least as wide as size_t, so using an off_t should be okay. */
2186 /* XXX Configure probe for the length type of *truncate() needed XXX */
2189 #if Off_t_size > IVSIZE
2194 /* Checking for length < 0 is problematic as the type might or
2195 * might not be signed: if it is not, clever compilers will moan. */
2196 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2203 if (PL_op->op_flags & OPf_SPECIAL) {
2204 tmpgv = gv_fetchsv(POPs, 0, SVt_PVIO);
2213 TAINT_PROPER("truncate");
2214 if (!(fp = IoIFP(io))) {
2220 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2222 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2229 SV * const sv = POPs;
2232 if (isGV_with_GP(sv)) {
2233 tmpgv = MUTABLE_GV(sv); /* *main::FRED for example */
2234 goto do_ftruncate_gv;
2236 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2237 tmpgv = MUTABLE_GV(SvRV(sv)); /* \*main::FRED for example */
2238 goto do_ftruncate_gv;
2240 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2241 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2242 goto do_ftruncate_io;
2245 name = SvPV_nolen_const(sv);
2246 TAINT_PROPER("truncate");
2248 if (truncate(name, len) < 0)
2252 const int tmpfd = PerlLIO_open(name, O_RDWR);
2257 if (my_chsize(tmpfd, len) < 0)
2259 PerlLIO_close(tmpfd);
2268 SETERRNO(EBADF,RMS_IFI);
2276 SV * const argsv = POPs;
2277 const unsigned int func = POPu;
2278 const int optype = PL_op->op_type;
2279 GV * const gv = MUTABLE_GV(POPs);
2280 IO * const io = gv ? GvIOn(gv) : NULL;
2284 if (!io || !argsv || !IoIFP(io)) {
2285 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2286 report_evil_fh(gv, io, PL_op->op_type);
2287 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2291 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2294 s = SvPV_force(argsv, len);
2295 need = IOCPARM_LEN(func);
2297 s = Sv_Grow(argsv, need + 1);
2298 SvCUR_set(argsv, need);
2301 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2304 retval = SvIV(argsv);
2305 s = INT2PTR(char*,retval); /* ouch */
2308 TAINT_PROPER(PL_op_desc[optype]);
2310 if (optype == OP_IOCTL)
2312 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2314 DIE(aTHX_ "ioctl is not implemented");
2318 DIE(aTHX_ "fcntl is not implemented");
2320 #if defined(OS2) && defined(__EMX__)
2321 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2323 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2327 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2329 if (s[SvCUR(argsv)] != 17)
2330 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2332 s[SvCUR(argsv)] = 0; /* put our null back */
2333 SvSETMAGIC(argsv); /* Assume it has changed */
2342 PUSHp(zero_but_true, ZBTLEN);
2355 const int argtype = POPi;
2356 GV * const gv = (MAXARG == 0) ? PL_last_in_gv : MUTABLE_GV(POPs);
2358 if (gv && (io = GvIO(gv)))
2364 /* XXX Looks to me like io is always NULL at this point */
2366 (void)PerlIO_flush(fp);
2367 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2370 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2371 report_evil_fh(gv, io, PL_op->op_type);
2373 SETERRNO(EBADF,RMS_IFI);
2378 DIE(aTHX_ PL_no_func, "flock()");
2388 const int protocol = POPi;
2389 const int type = POPi;
2390 const int domain = POPi;
2391 GV * const gv = MUTABLE_GV(POPs);
2392 register IO * const io = gv ? GvIOn(gv) : NULL;
2396 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2397 report_evil_fh(gv, io, PL_op->op_type);
2398 if (io && IoIFP(io))
2399 do_close(gv, FALSE);
2400 SETERRNO(EBADF,LIB_INVARG);
2405 do_close(gv, FALSE);
2407 TAINT_PROPER("socket");
2408 fd = PerlSock_socket(domain, type, protocol);
2411 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2412 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2413 IoTYPE(io) = IoTYPE_SOCKET;
2414 if (!IoIFP(io) || !IoOFP(io)) {
2415 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2416 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2417 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2420 #if defined(HAS_FCNTL) && defined(F_SETFD)
2421 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2425 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2430 DIE(aTHX_ PL_no_sock_func, "socket");
2436 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2438 const int protocol = POPi;
2439 const int type = POPi;
2440 const int domain = POPi;
2441 GV * const gv2 = MUTABLE_GV(POPs);
2442 GV * const gv1 = MUTABLE_GV(POPs);
2443 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2444 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2447 if (!gv1 || !gv2 || !io1 || !io2) {
2448 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
2450 report_evil_fh(gv1, io1, PL_op->op_type);
2452 report_evil_fh(gv1, io2, PL_op->op_type);
2454 if (io1 && IoIFP(io1))
2455 do_close(gv1, FALSE);
2456 if (io2 && IoIFP(io2))
2457 do_close(gv2, FALSE);
2462 do_close(gv1, FALSE);
2464 do_close(gv2, FALSE);
2466 TAINT_PROPER("socketpair");
2467 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2469 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2470 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2471 IoTYPE(io1) = IoTYPE_SOCKET;
2472 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2473 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2474 IoTYPE(io2) = IoTYPE_SOCKET;
2475 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2476 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2477 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2478 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2479 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2480 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2481 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2484 #if defined(HAS_FCNTL) && defined(F_SETFD)
2485 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2486 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2491 DIE(aTHX_ PL_no_sock_func, "socketpair");
2499 SV * const addrsv = POPs;
2500 /* OK, so on what platform does bind modify addr? */
2502 GV * const gv = MUTABLE_GV(POPs);
2503 register IO * const io = GvIOn(gv);
2506 if (!io || !IoIFP(io))
2509 addr = SvPV_const(addrsv, len);
2510 TAINT_PROPER("bind");
2511 if (PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2517 if (ckWARN(WARN_CLOSED))
2518 report_evil_fh(gv, io, PL_op->op_type);
2519 SETERRNO(EBADF,SS_IVCHAN);
2522 DIE(aTHX_ PL_no_sock_func, "bind");
2530 SV * const addrsv = POPs;
2531 GV * const gv = MUTABLE_GV(POPs);
2532 register IO * const io = GvIOn(gv);
2536 if (!io || !IoIFP(io))
2539 addr = SvPV_const(addrsv, len);
2540 TAINT_PROPER("connect");
2541 if (PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len) >= 0)
2547 if (ckWARN(WARN_CLOSED))
2548 report_evil_fh(gv, io, PL_op->op_type);
2549 SETERRNO(EBADF,SS_IVCHAN);
2552 DIE(aTHX_ PL_no_sock_func, "connect");
2560 const int backlog = POPi;
2561 GV * const gv = MUTABLE_GV(POPs);
2562 register IO * const io = gv ? GvIOn(gv) : NULL;
2564 if (!gv || !io || !IoIFP(io))
2567 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2573 if (ckWARN(WARN_CLOSED))
2574 report_evil_fh(gv, io, PL_op->op_type);
2575 SETERRNO(EBADF,SS_IVCHAN);
2578 DIE(aTHX_ PL_no_sock_func, "listen");
2588 char namebuf[MAXPATHLEN];
2589 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2590 Sock_size_t len = sizeof (struct sockaddr_in);
2592 Sock_size_t len = sizeof namebuf;
2594 GV * const ggv = MUTABLE_GV(POPs);
2595 GV * const ngv = MUTABLE_GV(POPs);
2604 if (!gstio || !IoIFP(gstio))
2608 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2611 /* Some platforms indicate zero length when an AF_UNIX client is
2612 * not bound. Simulate a non-zero-length sockaddr structure in
2614 namebuf[0] = 0; /* sun_len */
2615 namebuf[1] = AF_UNIX; /* sun_family */
2623 do_close(ngv, FALSE);
2624 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2625 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2626 IoTYPE(nstio) = IoTYPE_SOCKET;
2627 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2628 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2629 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2630 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2633 #if defined(HAS_FCNTL) && defined(F_SETFD)
2634 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2638 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2639 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2641 #ifdef __SCO_VERSION__
2642 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2645 PUSHp(namebuf, len);
2649 if (ckWARN(WARN_CLOSED))
2650 report_evil_fh(ggv, ggv ? GvIO(ggv) : 0, PL_op->op_type);
2651 SETERRNO(EBADF,SS_IVCHAN);
2657 DIE(aTHX_ PL_no_sock_func, "accept");
2665 const int how = POPi;
2666 GV * const gv = MUTABLE_GV(POPs);
2667 register IO * const io = GvIOn(gv);
2669 if (!io || !IoIFP(io))
2672 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2676 if (ckWARN(WARN_CLOSED))
2677 report_evil_fh(gv, io, PL_op->op_type);
2678 SETERRNO(EBADF,SS_IVCHAN);
2681 DIE(aTHX_ PL_no_sock_func, "shutdown");
2689 const int optype = PL_op->op_type;
2690 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2691 const unsigned int optname = (unsigned int) POPi;
2692 const unsigned int lvl = (unsigned int) POPi;
2693 GV * const gv = MUTABLE_GV(POPs);
2694 register IO * const io = GvIOn(gv);
2698 if (!io || !IoIFP(io))
2701 fd = PerlIO_fileno(IoIFP(io));
2705 (void)SvPOK_only(sv);
2709 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2716 #if defined(__SYMBIAN32__)
2717 # define SETSOCKOPT_OPTION_VALUE_T void *
2719 # define SETSOCKOPT_OPTION_VALUE_T const char *
2721 /* XXX TODO: We need to have a proper type (a Configure probe,
2722 * etc.) for what the C headers think of the third argument of
2723 * setsockopt(), the option_value read-only buffer: is it
2724 * a "char *", or a "void *", const or not. Some compilers
2725 * don't take kindly to e.g. assuming that "char *" implicitly
2726 * promotes to a "void *", or to explicitly promoting/demoting
2727 * consts to non/vice versa. The "const void *" is the SUS
2728 * definition, but that does not fly everywhere for the above
2730 SETSOCKOPT_OPTION_VALUE_T buf;
2734 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2738 aint = (int)SvIV(sv);
2739 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2742 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2751 if (ckWARN(WARN_CLOSED))
2752 report_evil_fh(gv, io, optype);
2753 SETERRNO(EBADF,SS_IVCHAN);
2758 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2766 const int optype = PL_op->op_type;
2767 GV * const gv = MUTABLE_GV(POPs);
2768 register IO * const io = GvIOn(gv);
2773 if (!io || !IoIFP(io))
2776 sv = sv_2mortal(newSV(257));
2777 (void)SvPOK_only(sv);
2781 fd = PerlIO_fileno(IoIFP(io));
2783 case OP_GETSOCKNAME:
2784 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2787 case OP_GETPEERNAME:
2788 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2790 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2792 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";
2793 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2794 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2795 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2796 sizeof(u_short) + sizeof(struct in_addr))) {
2803 #ifdef BOGUS_GETNAME_RETURN
2804 /* Interactive Unix, getpeername() and getsockname()
2805 does not return valid namelen */
2806 if (len == BOGUS_GETNAME_RETURN)
2807 len = sizeof(struct sockaddr);
2815 if (ckWARN(WARN_CLOSED))
2816 report_evil_fh(gv, io, optype);
2817 SETERRNO(EBADF,SS_IVCHAN);
2822 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
2837 if (PL_op->op_flags & OPf_REF) {
2839 if (PL_op->op_type == OP_LSTAT) {
2840 if (gv != PL_defgv) {
2841 do_fstat_warning_check:
2842 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2843 "lstat() on filehandle %s", gv ? GvENAME(gv) : "");
2844 } else if (PL_laststype != OP_LSTAT)
2845 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2849 if (gv != PL_defgv) {
2850 PL_laststype = OP_STAT;
2852 sv_setpvs(PL_statname, "");
2859 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2860 } else if (IoDIRP(io)) {
2862 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2864 PL_laststatval = -1;
2870 if (PL_laststatval < 0) {
2871 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
2872 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
2877 SV* const sv = POPs;
2878 if (isGV_with_GP(sv)) {
2879 gv = MUTABLE_GV(sv);
2881 } else if(SvROK(sv) && isGV_with_GP(SvRV(sv))) {
2882 gv = MUTABLE_GV(SvRV(sv));
2883 if (PL_op->op_type == OP_LSTAT)
2884 goto do_fstat_warning_check;
2886 } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2887 io = MUTABLE_IO(SvRV(sv));
2888 if (PL_op->op_type == OP_LSTAT)
2889 goto do_fstat_warning_check;
2890 goto do_fstat_have_io;
2893 sv_setpv(PL_statname, SvPV_nolen_const(sv));
2895 PL_laststype = PL_op->op_type;
2896 if (PL_op->op_type == OP_LSTAT)
2897 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2899 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2900 if (PL_laststatval < 0) {
2901 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2902 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2908 if (gimme != G_ARRAY) {
2909 if (gimme != G_VOID)
2910 XPUSHs(boolSV(max));
2916 mPUSHi(PL_statcache.st_dev);
2917 mPUSHi(PL_statcache.st_ino);
2918 mPUSHu(PL_statcache.st_mode);
2919 mPUSHu(PL_statcache.st_nlink);
2920 #if Uid_t_size > IVSIZE
2921 mPUSHn(PL_statcache.st_uid);
2923 # if Uid_t_sign <= 0
2924 mPUSHi(PL_statcache.st_uid);
2926 mPUSHu(PL_statcache.st_uid);
2929 #if Gid_t_size > IVSIZE
2930 mPUSHn(PL_statcache.st_gid);
2932 # if Gid_t_sign <= 0
2933 mPUSHi(PL_statcache.st_gid);
2935 mPUSHu(PL_statcache.st_gid);
2938 #ifdef USE_STAT_RDEV
2939 mPUSHi(PL_statcache.st_rdev);
2941 PUSHs(newSVpvs_flags("", SVs_TEMP));
2943 #if Off_t_size > IVSIZE
2944 mPUSHn(PL_statcache.st_size);
2946 mPUSHi(PL_statcache.st_size);
2949 mPUSHn(PL_statcache.st_atime);
2950 mPUSHn(PL_statcache.st_mtime);
2951 mPUSHn(PL_statcache.st_ctime);
2953 mPUSHi(PL_statcache.st_atime);
2954 mPUSHi(PL_statcache.st_mtime);
2955 mPUSHi(PL_statcache.st_ctime);
2957 #ifdef USE_STAT_BLOCKS
2958 mPUSHu(PL_statcache.st_blksize);
2959 mPUSHu(PL_statcache.st_blocks);
2961 PUSHs(newSVpvs_flags("", SVs_TEMP));
2962 PUSHs(newSVpvs_flags("", SVs_TEMP));
2968 #define tryAMAGICftest_MG(chr) STMT_START { \
2969 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2970 && S_try_amagic_ftest(aTHX_ chr)) \
2975 S_try_amagic_ftest(pTHX_ char chr) {
2978 SV* const arg = TOPs;
2983 if ((PL_op->op_flags & OPf_KIDS)
2986 const char tmpchr = chr;
2988 SV * const tmpsv = amagic_call(arg,
2989 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2990 ftest_amg, AMGf_unary);
2997 next = PL_op->op_next;
2998 if (next->op_type >= OP_FTRREAD &&
2999 next->op_type <= OP_FTBINARY &&
3000 next->op_private & OPpFT_STACKED
3003 /* leave the object alone */
3015 /* This macro is used by the stacked filetest operators :
3016 * if the previous filetest failed, short-circuit and pass its value.
3017 * Else, discard it from the stack and continue. --rgs
3019 #define STACKED_FTEST_CHECK if (PL_op->op_private & OPpFT_STACKED) { \
3020 if (!SvTRUE(TOPs)) { RETURN; } \
3021 else { (void)POPs; PUTBACK; } \
3028 /* Not const, because things tweak this below. Not bool, because there's
3029 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
3030 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3031 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3032 /* Giving some sort of initial value silences compilers. */
3034 int access_mode = R_OK;
3036 int access_mode = 0;
3039 /* access_mode is never used, but leaving use_access in makes the
3040 conditional compiling below much clearer. */
3043 int stat_mode = S_IRUSR;
3045 bool effective = FALSE;
3049 switch (PL_op->op_type) {
3050 case OP_FTRREAD: opchar = 'R'; break;
3051 case OP_FTRWRITE: opchar = 'W'; break;
3052 case OP_FTREXEC: opchar = 'X'; break;
3053 case OP_FTEREAD: opchar = 'r'; break;
3054 case OP_FTEWRITE: opchar = 'w'; break;
3055 case OP_FTEEXEC: opchar = 'x'; break;
3057 tryAMAGICftest_MG(opchar);
3059 STACKED_FTEST_CHECK;
3061 switch (PL_op->op_type) {
3063 #if !(defined(HAS_ACCESS) && defined(R_OK))
3069 #if defined(HAS_ACCESS) && defined(W_OK)
3074 stat_mode = S_IWUSR;
3078 #if defined(HAS_ACCESS) && defined(X_OK)
3083 stat_mode = S_IXUSR;
3087 #ifdef PERL_EFF_ACCESS
3090 stat_mode = S_IWUSR;
3094 #ifndef PERL_EFF_ACCESS
3101 #ifdef PERL_EFF_ACCESS
3106 stat_mode = S_IXUSR;
3112 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3113 const char *name = POPpx;
3115 # ifdef PERL_EFF_ACCESS
3116 result = PERL_EFF_ACCESS(name, access_mode);
3118 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3124 result = access(name, access_mode);
3126 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3137 result = my_stat_flags(0);
3141 if (cando(stat_mode, effective, &PL_statcache))
3150 const int op_type = PL_op->op_type;
3155 case OP_FTIS: opchar = 'e'; break;
3156 case OP_FTSIZE: opchar = 's'; break;
3157 case OP_FTMTIME: opchar = 'M'; break;
3158 case OP_FTCTIME: opchar = 'C'; break;
3159 case OP_FTATIME: opchar = 'A'; break;
3161 tryAMAGICftest_MG(opchar);
3163 STACKED_FTEST_CHECK;
3165 result = my_stat_flags(0);
3169 if (op_type == OP_FTIS)
3172 /* You can't dTARGET inside OP_FTIS, because you'll get
3173 "panic: pad_sv po" - the op is not flagged to have a target. */
3177 #if Off_t_size > IVSIZE
3178 PUSHn(PL_statcache.st_size);
3180 PUSHi(PL_statcache.st_size);
3184 PUSHn( (((NV)PL_basetime - PL_statcache.st_mtime)) / 86400.0 );
3187 PUSHn( (((NV)PL_basetime - PL_statcache.st_atime)) / 86400.0 );
3190 PUSHn( (((NV)PL_basetime - PL_statcache.st_ctime)) / 86400.0 );
3204 switch (PL_op->op_type) {
3205 case OP_FTROWNED: opchar = 'O'; break;
3206 case OP_FTEOWNED: opchar = 'o'; break;
3207 case OP_FTZERO: opchar = 'z'; break;
3208 case OP_FTSOCK: opchar = 'S'; break;
3209 case OP_FTCHR: opchar = 'c'; break;
3210 case OP_FTBLK: opchar = 'b'; break;
3211 case OP_FTFILE: opchar = 'f'; break;
3212 case OP_FTDIR: opchar = 'd'; break;
3213 case OP_FTPIPE: opchar = 'p'; break;
3214 case OP_FTSUID: opchar = 'u'; break;
3215 case OP_FTSGID: opchar = 'g'; break;
3216 case OP_FTSVTX: opchar = 'k'; break;
3218 tryAMAGICftest_MG(opchar);
3220 STACKED_FTEST_CHECK;
3222 /* I believe that all these three are likely to be defined on most every
3223 system these days. */
3225 if(PL_op->op_type == OP_FTSUID) {
3226 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3232 if(PL_op->op_type == OP_FTSGID) {
3233 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3239 if(PL_op->op_type == OP_FTSVTX) {
3240 if ((PL_op->op_flags & OPf_REF) == 0 && (PL_op->op_private & OPpFT_STACKED) == 0)
3246 result = my_stat_flags(0);
3250 switch (PL_op->op_type) {
3252 if (PL_statcache.st_uid == PL_uid)
3256 if (PL_statcache.st_uid == PL_euid)
3260 if (PL_statcache.st_size == 0)
3264 if (S_ISSOCK(PL_statcache.st_mode))
3268 if (S_ISCHR(PL_statcache.st_mode))
3272 if (S_ISBLK(PL_statcache.st_mode))
3276 if (S_ISREG(PL_statcache.st_mode))
3280 if (S_ISDIR(PL_statcache.st_mode))
3284 if (S_ISFIFO(PL_statcache.st_mode))
3289 if (PL_statcache.st_mode & S_ISUID)
3295 if (PL_statcache.st_mode & S_ISGID)
3301 if (PL_statcache.st_mode & S_ISVTX)
3315 tryAMAGICftest_MG('l');
3316 result = my_lstat_flags(0);
3321 if (S_ISLNK(PL_statcache.st_mode))
3336 tryAMAGICftest_MG('t');
3338 STACKED_FTEST_CHECK;
3340 if (PL_op->op_flags & OPf_REF)
3342 else if (isGV_with_GP(TOPs))
3343 gv = MUTABLE_GV(POPs);
3344 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3345 gv = MUTABLE_GV(SvRV(POPs));
3348 name = SvPV_nomg(tmpsv, namelen);
3349 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3352 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3353 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3354 else if (tmpsv && SvOK(tmpsv)) {
3362 if (PerlLIO_isatty(fd))
3367 #if defined(atarist) /* this will work with atariST. Configure will
3368 make guesses for other systems. */
3369 # define FILE_base(f) ((f)->_base)
3370 # define FILE_ptr(f) ((f)->_ptr)
3371 # define FILE_cnt(f) ((f)->_cnt)
3372 # define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3383 register STDCHAR *s;
3389 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3391 STACKED_FTEST_CHECK;
3393 if (PL_op->op_flags & OPf_REF)
3395 else if (isGV_with_GP(TOPs))
3396 gv = MUTABLE_GV(POPs);
3397 else if (SvROK(TOPs) && isGV(SvRV(TOPs)))
3398 gv = MUTABLE_GV(SvRV(POPs));
3404 if (gv == PL_defgv) {
3406 io = GvIO(PL_statgv);
3409 goto really_filename;
3414 PL_laststatval = -1;
3415 sv_setpvs(PL_statname, "");
3416 io = GvIO(PL_statgv);
3418 if (io && IoIFP(io)) {
3419 if (! PerlIO_has_base(IoIFP(io)))
3420 DIE(aTHX_ "-T and -B not implemented on filehandles");
3421 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3422 if (PL_laststatval < 0)
3424 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3425 if (PL_op->op_type == OP_FTTEXT)
3430 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3431 i = PerlIO_getc(IoIFP(io));
3433 (void)PerlIO_ungetc(IoIFP(io),i);
3435 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3437 len = PerlIO_get_bufsiz(IoIFP(io));
3438 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3439 /* sfio can have large buffers - limit to 512 */
3444 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED)) {
3446 report_evil_fh(gv, GvIO(gv), PL_op->op_type);
3448 SETERRNO(EBADF,RMS_IFI);
3456 PL_laststype = OP_STAT;
3457 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3458 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3459 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3461 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3464 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3465 if (PL_laststatval < 0) {
3466 (void)PerlIO_close(fp);
3469 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3470 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3471 (void)PerlIO_close(fp);
3473 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3474 RETPUSHNO; /* special case NFS directories */
3475 RETPUSHYES; /* null file is anything */
3480 /* now scan s to look for textiness */
3481 /* XXX ASCII dependent code */
3483 #if defined(DOSISH) || defined(USEMYBINMODE)
3484 /* ignore trailing ^Z on short files */
3485 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3489 for (i = 0; i < len; i++, s++) {
3490 if (!*s) { /* null never allowed in text */
3495 else if (!(isPRINT(*s) || isSPACE(*s)))
3498 else if (*s & 128) {
3500 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3503 /* utf8 characters don't count as odd */
3504 if (UTF8_IS_START(*s)) {
3505 int ulen = UTF8SKIP(s);
3506 if (ulen < len - i) {
3508 for (j = 1; j < ulen; j++) {
3509 if (!UTF8_IS_CONTINUATION(s[j]))
3512 --ulen; /* loop does extra increment */
3522 *s != '\n' && *s != '\r' && *s != '\b' &&
3523 *s != '\t' && *s != '\f' && *s != 27)
3528 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3539 const char *tmps = NULL;
3543 SV * const sv = POPs;
3544 if (PL_op->op_flags & OPf_SPECIAL) {
3545 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3547 else if (isGV_with_GP(sv)) {
3548 gv = MUTABLE_GV(sv);
3550 else if (SvROK(sv) && isGV_with_GP(SvRV(sv))) {
3551 gv = MUTABLE_GV(SvRV(sv));
3554 tmps = SvPV_nolen_const(sv);
3558 if( !gv && (!tmps || !*tmps) ) {
3559 HV * const table = GvHVn(PL_envgv);
3562 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3563 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3565 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3570 deprecate("chdir('') or chdir(undef) as chdir()");
3571 tmps = SvPV_nolen_const(*svp);
3575 TAINT_PROPER("chdir");
3580 TAINT_PROPER("chdir");
3583 IO* const io = GvIO(gv);
3586 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3587 } else if (IoIFP(io)) {
3588 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3591 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3592 report_evil_fh(gv, io, PL_op->op_type);
3593 SETERRNO(EBADF, RMS_IFI);
3598 if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
3599 report_evil_fh(gv, io, PL_op->op_type);
3600 SETERRNO(EBADF,RMS_IFI);
3604 DIE(aTHX_ PL_no_func, "fchdir");
3608 PUSHi( PerlDir_chdir(tmps) >= 0 );
3610 /* Clear the DEFAULT element of ENV so we'll get the new value
3612 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3619 dVAR; dSP; dMARK; dTARGET;
3620 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3631 char * const tmps = POPpx;
3632 TAINT_PROPER("chroot");
3633 PUSHi( chroot(tmps) >= 0 );
3636 DIE(aTHX_ PL_no_func, "chroot");
3644 const char * const tmps2 = POPpconstx;
3645 const char * const tmps = SvPV_nolen_const(TOPs);
3646 TAINT_PROPER("rename");
3648 anum = PerlLIO_rename(tmps, tmps2);
3650 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3651 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3654 if (PL_euid || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3655 (void)UNLINK(tmps2);
3656 if (!(anum = link(tmps, tmps2)))
3657 anum = UNLINK(tmps);
3665 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3669 const int op_type = PL_op->op_type;
3673 if (op_type == OP_LINK)
3674 DIE(aTHX_ PL_no_func, "link");
3676 # ifndef HAS_SYMLINK
3677 if (op_type == OP_SYMLINK)
3678 DIE(aTHX_ PL_no_func, "symlink");
3682 const char * const tmps2 = POPpconstx;
3683 const char * const tmps = SvPV_nolen_const(TOPs);
3684 TAINT_PROPER(PL_op_desc[op_type]);
3686 # if defined(HAS_LINK)
3687 # if defined(HAS_SYMLINK)
3688 /* Both present - need to choose which. */
3689 (op_type == OP_LINK) ?
3690 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3692 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3693 PerlLIO_link(tmps, tmps2);
3696 # if defined(HAS_SYMLINK)
3697 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3698 symlink(tmps, tmps2);
3703 SETi( result >= 0 );
3710 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3721 char buf[MAXPATHLEN];
3724 #ifndef INCOMPLETE_TAINTS
3728 len = readlink(tmps, buf, sizeof(buf) - 1);
3735 RETSETUNDEF; /* just pretend it's a normal file */
3739 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3741 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3743 char * const save_filename = filename;
3748 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3750 PERL_ARGS_ASSERT_DOONELINER;
3752 Newx(cmdline, size, char);
3753 my_strlcpy(cmdline, cmd, size);
3754 my_strlcat(cmdline, " ", size);
3755 for (s = cmdline + strlen(cmdline); *filename; ) {
3759 if (s - cmdline < size)
3760 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3761 myfp = PerlProc_popen(cmdline, "r");
3765 SV * const tmpsv = sv_newmortal();
3766 /* Need to save/restore 'PL_rs' ?? */
3767 s = sv_gets(tmpsv, myfp, 0);
3768 (void)PerlProc_pclose(myfp);
3772 #ifdef HAS_SYS_ERRLIST
3777 /* you don't see this */
3778 const char * const errmsg =
3779 #ifdef HAS_SYS_ERRLIST
3787 if (instr(s, errmsg)) {
3794 #define EACCES EPERM
3796 if (instr(s, "cannot make"))
3797 SETERRNO(EEXIST,RMS_FEX);
3798 else if (instr(s, "existing file"))
3799 SETERRNO(EEXIST,RMS_FEX);
3800 else if (instr(s, "ile exists"))
3801 SETERRNO(EEXIST,RMS_FEX);
3802 else if (instr(s, "non-exist"))
3803 SETERRNO(ENOENT,RMS_FNF);
3804 else if (instr(s, "does not exist"))
3805 SETERRNO(ENOENT,RMS_FNF);
3806 else if (instr(s, "not empty"))
3807 SETERRNO(EBUSY,SS_DEVOFFLINE);
3808 else if (instr(s, "cannot access"))
3809 SETERRNO(EACCES,RMS_PRV);
3811 SETERRNO(EPERM,RMS_PRV);
3814 else { /* some mkdirs return no failure indication */
3815 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3816 if (PL_op->op_type == OP_RMDIR)
3821 SETERRNO(EACCES,RMS_PRV); /* a guess */
3830 /* This macro removes trailing slashes from a directory name.
3831 * Different operating and file systems take differently to
3832 * trailing slashes. According to POSIX 1003.1 1996 Edition
3833 * any number of trailing slashes should be allowed.
3834 * Thusly we snip them away so that even non-conforming
3835 * systems are happy.
3836 * We should probably do this "filtering" for all
3837 * the functions that expect (potentially) directory names:
3838 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3839 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3841 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3842 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3845 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3846 (tmps) = savepvn((tmps), (len)); \
3856 const int mode = (MAXARG > 1) ? POPi : 0777;
3858 TRIMSLASHES(tmps,len,copy);
3860 TAINT_PROPER("mkdir");
3862 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3866 SETi( dooneliner("mkdir", tmps) );
3867 oldumask = PerlLIO_umask(0);
3868 PerlLIO_umask(oldumask);
3869 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3884 TRIMSLASHES(tmps,len,copy);
3885 TAINT_PROPER("rmdir");
3887 SETi( PerlDir_rmdir(tmps) >= 0 );
3889 SETi( dooneliner("rmdir", tmps) );
3896 /* Directory calls. */
3900 #if defined(Direntry_t) && defined(HAS_READDIR)
3902 const char * const dirname = POPpconstx;
3903 GV * const gv = MUTABLE_GV(POPs);
3904 register IO * const io = GvIOn(gv);
3909 if ((IoIFP(io) || IoOFP(io)))
3910 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3911 "Opening filehandle %s also as a directory",
3914 PerlDir_close(IoDIRP(io));
3915 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3921 SETERRNO(EBADF,RMS_DIR);
3924 DIE(aTHX_ PL_no_dir_func, "opendir");
3930 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3931 DIE(aTHX_ PL_no_dir_func, "readdir");
3933 #if !defined(I_DIRENT) && !defined(VMS)
3934 Direntry_t *readdir (DIR *);
3940 const I32 gimme = GIMME;
3941 GV * const gv = MUTABLE_GV(POPs);
3942 register const Direntry_t *dp;
3943 register IO * const io = GvIOn(gv);
3945 if (!io || !IoDIRP(io)) {
3946 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3947 "readdir() attempted on invalid dirhandle %s", GvENAME(gv));
3952 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3956 sv = newSVpvn(dp->d_name, dp->d_namlen);
3958 sv = newSVpv(dp->d_name, 0);
3960 #ifndef INCOMPLETE_TAINTS
3961 if (!(IoFLAGS(io) & IOf_UNTAINT))
3965 } while (gimme == G_ARRAY);
3967 if (!dp && gimme != G_ARRAY)
3974 SETERRNO(EBADF,RMS_ISI);
3975 if (GIMME == G_ARRAY)
3984 #if defined(HAS_TELLDIR) || defined(telldir)
3986 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3987 /* XXX netbsd still seemed to.
3988 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3989 --JHI 1999-Feb-02 */
3990 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3991 long telldir (DIR *);
3993 GV * const gv = MUTABLE_GV(POPs);
3994 register IO * const io = GvIOn(gv);
3996 if (!io || !IoDIRP(io)) {
3997 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3998 "telldir() attempted on invalid dirhandle %s", GvENAME(gv));
4002 PUSHi( PerlDir_tell(IoDIRP(io)) );
4006 SETERRNO(EBADF,RMS_ISI);
4009 DIE(aTHX_ PL_no_dir_func, "telldir");
4015 #if defined(HAS_SEEKDIR) || defined(seekdir)
4017 const long along = POPl;
4018 GV * const gv = MUTABLE_GV(POPs);
4019 register IO * const io = GvIOn(gv);
4021 if (!io || !IoDIRP(io)) {
4022 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4023 "seekdir() attempted on invalid dirhandle %s", GvENAME(gv));
4026 (void)PerlDir_seek(IoDIRP(io), along);
4031 SETERRNO(EBADF,RMS_ISI);
4034 DIE(aTHX_ PL_no_dir_func, "seekdir");
4040 #if defined(HAS_REWINDDIR) || defined(rewinddir)
4042 GV * const gv = MUTABLE_GV(POPs);
4043 register IO * const io = GvIOn(gv);
4045 if (!io || !IoDIRP(io)) {
4046 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4047 "rewinddir() attempted on invalid dirhandle %s", GvENAME(gv));
4050 (void)PerlDir_rewind(IoDIRP(io));
4054 SETERRNO(EBADF,RMS_ISI);
4057 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4063 #if defined(Direntry_t) && defined(HAS_READDIR)
4065 GV * const gv = MUTABLE_GV(POPs);
4066 register IO * const io = GvIOn(gv);
4068 if (!io || !IoDIRP(io)) {
4069 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4070 "closedir() attempted on invalid dirhandle %s", GvENAME(gv));
4073 #ifdef VOID_CLOSEDIR
4074 PerlDir_close(IoDIRP(io));
4076 if (PerlDir_close(IoDIRP(io)) < 0) {
4077 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4086 SETERRNO(EBADF,RMS_IFI);
4089 DIE(aTHX_ PL_no_dir_func, "closedir");
4093 /* Process control. */
4102 PERL_FLUSHALL_FOR_CHILD;
4103 childpid = PerlProc_fork();
4107 GV * const tmpgv = gv_fetchpvs("$", GV_ADD|GV_NOTQUAL, SVt_PV);
4109 SvREADONLY_off(GvSV(tmpgv));
4110 sv_setiv(GvSV(tmpgv), (IV)PerlProc_getpid());
4111 SvREADONLY_on(GvSV(tmpgv));
4113 #ifdef THREADS_HAVE_PIDS
4114 PL_ppid = (IV)getppid();
4116 #ifdef PERL_USES_PL_PIDSTATUS
4117 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4123 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4128 PERL_FLUSHALL_FOR_CHILD;
4129 childpid = PerlProc_fork();
4135 DIE(aTHX_ PL_no_func, "fork");
4142 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4147 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4148 childpid = wait4pid(-1, &argflags, 0);
4150 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4155 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4156 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4157 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4159 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4164 DIE(aTHX_ PL_no_func, "wait");
4170 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4172 const int optype = POPi;
4173 const Pid_t pid = TOPi;
4177 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4178 result = wait4pid(pid, &argflags, optype);
4180 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4185 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4186 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4187 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4189 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4194 DIE(aTHX_ PL_no_func, "waitpid");
4200 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4201 #if defined(__LIBCATAMOUNT__)
4202 PL_statusvalue = -1;
4211 while (++MARK <= SP) {
4212 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4217 TAINT_PROPER("system");
4219 PERL_FLUSHALL_FOR_CHILD;
4220 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4226 if (PerlProc_pipe(pp) >= 0)
4228 while ((childpid = PerlProc_fork()) == -1) {
4229 if (errno != EAGAIN) {
4234 PerlLIO_close(pp[0]);
4235 PerlLIO_close(pp[1]);
4242 Sigsave_t ihand,qhand; /* place to save signals during system() */
4246 PerlLIO_close(pp[1]);
4248 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4249 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4252 result = wait4pid(childpid, &status, 0);
4253 } while (result == -1 && errno == EINTR);
4255 (void)rsignal_restore(SIGINT, &ihand);
4256 (void)rsignal_restore(SIGQUIT, &qhand);
4258 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4259 do_execfree(); /* free any memory child malloced on fork */
4266 while (n < sizeof(int)) {
4267 n1 = PerlLIO_read(pp[0],
4268 (void*)(((char*)&errkid)+n),
4274 PerlLIO_close(pp[0]);
4275 if (n) { /* Error */
4276 if (n != sizeof(int))
4277 DIE(aTHX_ "panic: kid popen errno read");
4278 errno = errkid; /* Propagate errno from kid */
4279 STATUS_NATIVE_CHILD_SET(-1);
4282 XPUSHi(STATUS_CURRENT);
4286 PerlLIO_close(pp[0]);
4287 #if defined(HAS_FCNTL) && defined(F_SETFD)
4288 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4291 if (PL_op->op_flags & OPf_STACKED) {
4292 SV * const really = *++MARK;
4293 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4295 else if (SP - MARK != 1)
4296 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4298 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4302 #else /* ! FORK or VMS or OS/2 */
4305 if (PL_op->op_flags & OPf_STACKED) {
4306 SV * const really = *++MARK;
4307 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4308 value = (I32)do_aspawn(really, MARK, SP);
4310 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4313 else if (SP - MARK != 1) {
4314 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4315 value = (I32)do_aspawn(NULL, MARK, SP);
4317 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4321 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4323 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4325 STATUS_NATIVE_CHILD_SET(value);
4328 XPUSHi(result ? value : STATUS_CURRENT);
4329 #endif /* !FORK or VMS or OS/2 */
4336 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4341 while (++MARK <= SP) {
4342 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4347 TAINT_PROPER("exec");
4349 PERL_FLUSHALL_FOR_CHILD;
4350 if (PL_op->op_flags & OPf_STACKED) {
4351 SV * const really = *++MARK;
4352 value = (I32)do_aexec(really, MARK, SP);
4354 else if (SP - MARK != 1)
4356 value = (I32)vms_do_aexec(NULL, MARK, SP);
4360 (void ) do_aspawn(NULL, MARK, SP);
4364 value = (I32)do_aexec(NULL, MARK, SP);
4369 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4372 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4375 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4389 # ifdef THREADS_HAVE_PIDS
4390 if (PL_ppid != 1 && getppid() == 1)
4391 /* maybe the parent process has died. Refresh ppid cache */
4395 XPUSHi( getppid() );
4399 DIE(aTHX_ PL_no_func, "getppid");
4408 const Pid_t pid = (MAXARG < 1) ? 0 : SvIVx(POPs);
4411 pgrp = (I32)BSD_GETPGRP(pid);
4413 if (pid != 0 && pid != PerlProc_getpid())
4414 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4420 DIE(aTHX_ PL_no_func, "getpgrp()");
4440 TAINT_PROPER("setpgrp");
4442 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4444 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4445 || (pid != 0 && pid != PerlProc_getpid()))
4447 DIE(aTHX_ "setpgrp can't take arguments");
4449 SETi( setpgrp() >= 0 );
4450 #endif /* USE_BSDPGRP */
4453 DIE(aTHX_ PL_no_func, "setpgrp()");
4458 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4460 # define PRIORITY_WHICH_T(which) which
4465 #ifdef HAS_GETPRIORITY
4467 const int who = POPi;
4468 const int which = TOPi;
4469 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4472 DIE(aTHX_ PL_no_func, "getpriority()");
4478 #ifdef HAS_SETPRIORITY
4480 const int niceval = POPi;
4481 const int who = POPi;
4482 const int which = TOPi;
4483 TAINT_PROPER("setpriority");
4484 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4487 DIE(aTHX_ PL_no_func, "setpriority()");
4491 #undef PRIORITY_WHICH_T
4499 XPUSHn( time(NULL) );
4501 XPUSHi( time(NULL) );
4513 (void)PerlProc_times(&PL_timesbuf);
4515 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4516 /* struct tms, though same data */
4520 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4521 if (GIMME == G_ARRAY) {
4522 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4523 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4524 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4532 if (GIMME == G_ARRAY) {
4539 DIE(aTHX_ "times not implemented");
4541 #endif /* HAS_TIMES */
4544 /* The 32 bit int year limits the times we can represent to these
4545 boundaries with a few days wiggle room to account for time zone
4548 /* Sat Jan 3 00:00:00 -2147481748 */
4549 #define TIME_LOWER_BOUND -67768100567755200.0
4550 /* Sun Dec 29 12:00:00 2147483647 */
4551 #define TIME_UPPER_BOUND 67767976233316800.0
4560 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4561 static const char * const dayname[] =
4562 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4563 static const char * const monname[] =
4564 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4565 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4570 when = (Time64_T)now;
4573 NV input = Perl_floor(POPn);
4574 when = (Time64_T)input;
4575 if (when != input) {
4576 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4577 "%s(%.0" NVff ") too large", opname, input);
4581 if ( TIME_LOWER_BOUND > when ) {
4582 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4583 "%s(%.0" NVff ") too small", opname, when);
4586 else if( when > TIME_UPPER_BOUND ) {
4587 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4588 "%s(%.0" NVff ") too large", opname, when);
4592 if (PL_op->op_type == OP_LOCALTIME)
4593 err = S_localtime64_r(&when, &tmbuf);
4595 err = S_gmtime64_r(&when, &tmbuf);
4599 /* XXX %lld broken for quads */
4600 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4601 "%s(%.0" NVff ") failed", opname, when);
4604 if (GIMME != G_ARRAY) { /* scalar context */
4606 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4607 double year = (double)tmbuf.tm_year + 1900;
4614 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4615 dayname[tmbuf.tm_wday],
4616 monname[tmbuf.tm_mon],
4624 else { /* list context */
4630 mPUSHi(tmbuf.tm_sec);
4631 mPUSHi(tmbuf.tm_min);
4632 mPUSHi(tmbuf.tm_hour);
4633 mPUSHi(tmbuf.tm_mday);
4634 mPUSHi(tmbuf.tm_mon);
4635 mPUSHn(tmbuf.tm_year);
4636 mPUSHi(tmbuf.tm_wday);
4637 mPUSHi(tmbuf.tm_yday);
4638 mPUSHi(tmbuf.tm_isdst);
4649 anum = alarm((unsigned int)anum);
4655 DIE(aTHX_ PL_no_func, "alarm");
4666 (void)time(&lasttime);
4671 PerlProc_sleep((unsigned int)duration);
4674 XPUSHi(when - lasttime);
4678 /* Shared memory. */
4679 /* Merged with some message passing. */
4683 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4684 dVAR; dSP; dMARK; dTARGET;
4685 const int op_type = PL_op->op_type;
4690 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4693 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4696 value = (I32)(do_semop(MARK, SP) >= 0);
4699 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4715 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4716 dVAR; dSP; dMARK; dTARGET;
4717 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4724 DIE(aTHX_ "System V IPC is not implemented on this machine");
4730 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4731 dVAR; dSP; dMARK; dTARGET;
4732 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4740 PUSHp(zero_but_true, ZBTLEN);
4748 /* I can't const this further without getting warnings about the types of
4749 various arrays passed in from structures. */
4751 S_space_join_names_mortal(pTHX_ char *const *array)
4755 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4757 if (array && *array) {
4758 target = newSVpvs_flags("", SVs_TEMP);
4760 sv_catpv(target, *array);
4763 sv_catpvs(target, " ");
4766 target = sv_mortalcopy(&PL_sv_no);
4771 /* Get system info. */
4775 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4777 I32 which = PL_op->op_type;
4778 register char **elem;
4780 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4781 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4782 struct hostent *gethostbyname(Netdb_name_t);
4783 struct hostent *gethostent(void);
4785 struct hostent *hent = NULL;
4789 if (which == OP_GHBYNAME) {
4790 #ifdef HAS_GETHOSTBYNAME
4791 const char* const name = POPpbytex;
4792 hent = PerlSock_gethostbyname(name);
4794 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4797 else if (which == OP_GHBYADDR) {
4798 #ifdef HAS_GETHOSTBYADDR
4799 const int addrtype = POPi;
4800 SV * const addrsv = POPs;
4802 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4804 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4806 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4810 #ifdef HAS_GETHOSTENT
4811 hent = PerlSock_gethostent();
4813 DIE(aTHX_ PL_no_sock_func, "gethostent");
4816 #ifdef HOST_NOT_FOUND
4818 #ifdef USE_REENTRANT_API
4819 # ifdef USE_GETHOSTENT_ERRNO
4820 h_errno = PL_reentrant_buffer->_gethostent_errno;
4823 STATUS_UNIX_SET(h_errno);
4827 if (GIMME != G_ARRAY) {
4828 PUSHs(sv = sv_newmortal());
4830 if (which == OP_GHBYNAME) {
4832 sv_setpvn(sv, hent->h_addr, hent->h_length);
4835 sv_setpv(sv, (char*)hent->h_name);
4841 mPUSHs(newSVpv((char*)hent->h_name, 0));
4842 PUSHs(space_join_names_mortal(hent->h_aliases));
4843 mPUSHi(hent->h_addrtype);
4844 len = hent->h_length;
4847 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4848 mXPUSHp(*elem, len);
4852 mPUSHp(hent->h_addr, len);
4854 PUSHs(sv_mortalcopy(&PL_sv_no));
4859 DIE(aTHX_ PL_no_sock_func, "gethostent");
4865 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4867 I32 which = PL_op->op_type;
4869 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4870 struct netent *getnetbyaddr(Netdb_net_t, int);
4871 struct netent *getnetbyname(Netdb_name_t);
4872 struct netent *getnetent(void);
4874 struct netent *nent;
4876 if (which == OP_GNBYNAME){
4877 #ifdef HAS_GETNETBYNAME
4878 const char * const name = POPpbytex;
4879 nent = PerlSock_getnetbyname(name);
4881 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4884 else if (which == OP_GNBYADDR) {
4885 #ifdef HAS_GETNETBYADDR
4886 const int addrtype = POPi;
4887 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4888 nent = PerlSock_getnetbyaddr(addr, addrtype);
4890 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4894 #ifdef HAS_GETNETENT
4895 nent = PerlSock_getnetent();
4897 DIE(aTHX_ PL_no_sock_func, "getnetent");
4900 #ifdef HOST_NOT_FOUND
4902 #ifdef USE_REENTRANT_API
4903 # ifdef USE_GETNETENT_ERRNO
4904 h_errno = PL_reentrant_buffer->_getnetent_errno;
4907 STATUS_UNIX_SET(h_errno);
4912 if (GIMME != G_ARRAY) {
4913 PUSHs(sv = sv_newmortal());
4915 if (which == OP_GNBYNAME)
4916 sv_setiv(sv, (IV)nent->n_net);
4918 sv_setpv(sv, nent->n_name);
4924 mPUSHs(newSVpv(nent->n_name, 0));
4925 PUSHs(space_join_names_mortal(nent->n_aliases));
4926 mPUSHi(nent->n_addrtype);
4927 mPUSHi(nent->n_net);
4932 DIE(aTHX_ PL_no_sock_func, "getnetent");
4938 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4940 I32 which = PL_op->op_type;
4942 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4943 struct protoent *getprotobyname(Netdb_name_t);
4944 struct protoent *getprotobynumber(int);
4945 struct protoent *getprotoent(void);
4947 struct protoent *pent;
4949 if (which == OP_GPBYNAME) {
4950 #ifdef HAS_GETPROTOBYNAME
4951 const char* const name = POPpbytex;
4952 pent = PerlSock_getprotobyname(name);
4954 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4957 else if (which == OP_GPBYNUMBER) {
4958 #ifdef HAS_GETPROTOBYNUMBER
4959 const int number = POPi;
4960 pent = PerlSock_getprotobynumber(number);
4962 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4966 #ifdef HAS_GETPROTOENT
4967 pent = PerlSock_getprotoent();
4969 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4973 if (GIMME != G_ARRAY) {
4974 PUSHs(sv = sv_newmortal());
4976 if (which == OP_GPBYNAME)
4977 sv_setiv(sv, (IV)pent->p_proto);
4979 sv_setpv(sv, pent->p_name);
4985 mPUSHs(newSVpv(pent->p_name, 0));
4986 PUSHs(space_join_names_mortal(pent->p_aliases));
4987 mPUSHi(pent->p_proto);
4992 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4998 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
5000 I32 which = PL_op->op_type;
5002 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
5003 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
5004 struct servent *getservbyport(int, Netdb_name_t);
5005 struct servent *getservent(void);
5007 struct servent *sent;
5009 if (which == OP_GSBYNAME) {
5010 #ifdef HAS_GETSERVBYNAME
5011 const char * const proto = POPpbytex;
5012 const char * const name = POPpbytex;
5013 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
5015 DIE(aTHX_ PL_no_sock_func, "getservbyname");
5018 else if (which == OP_GSBYPORT) {
5019 #ifdef HAS_GETSERVBYPORT
5020 const char * const proto = POPpbytex;
5021 unsigned short port = (unsigned short)POPu;
5023 port = PerlSock_htons(port);
5025 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
5027 DIE(aTHX_ PL_no_sock_func, "getservbyport");
5031 #ifdef HAS_GETSERVENT
5032 sent = PerlSock_getservent();
5034 DIE(aTHX_ PL_no_sock_func, "getservent");
5038 if (GIMME != G_ARRAY) {
5039 PUSHs(sv = sv_newmortal());
5041 if (which == OP_GSBYNAME) {
5043 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5045 sv_setiv(sv, (IV)(sent->s_port));
5049 sv_setpv(sv, sent->s_name);
5055 mPUSHs(newSVpv(sent->s_name, 0));
5056 PUSHs(space_join_names_mortal(sent->s_aliases));
5058 mPUSHi(PerlSock_ntohs(sent->s_port));
5060 mPUSHi(sent->s_port);
5062 mPUSHs(newSVpv(sent->s_proto, 0));
5067 DIE(aTHX_ PL_no_sock_func, "getservent");
5073 #ifdef HAS_SETHOSTENT
5075 PerlSock_sethostent(TOPi);
5078 DIE(aTHX_ PL_no_sock_func, "sethostent");
5084 #ifdef HAS_SETNETENT
5086 (void)PerlSock_setnetent(TOPi);
5089 DIE(aTHX_ PL_no_sock_func, "setnetent");
5095 #ifdef HAS_SETPROTOENT
5097 (void)PerlSock_setprotoent(TOPi);
5100 DIE(aTHX_ PL_no_sock_func, "setprotoent");
5106 #ifdef HAS_SETSERVENT
5108 (void)PerlSock_setservent(TOPi);
5111 DIE(aTHX_ PL_no_sock_func, "setservent");
5117 #ifdef HAS_ENDHOSTENT
5119 PerlSock_endhostent();
5123 DIE(aTHX_ PL_no_sock_func, "endhostent");
5129 #ifdef HAS_ENDNETENT
5131 PerlSock_endnetent();
5135 DIE(aTHX_ PL_no_sock_func, "endnetent");
5141 #ifdef HAS_ENDPROTOENT
5143 PerlSock_endprotoent();
5147 DIE(aTHX_ PL_no_sock_func, "endprotoent");
5153 #ifdef HAS_ENDSERVENT
5155 PerlSock_endservent();
5159 DIE(aTHX_ PL_no_sock_func, "endservent");
5167 I32 which = PL_op->op_type;
5169 struct passwd *pwent = NULL;
5171 * We currently support only the SysV getsp* shadow password interface.
5172 * The interface is declared in <shadow.h> and often one needs to link
5173 * with -lsecurity or some such.
5174 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5177 * AIX getpwnam() is clever enough to return the encrypted password
5178 * only if the caller (euid?) is root.
5180 * There are at least three other shadow password APIs. Many platforms
5181 * seem to contain more than one interface for accessing the shadow
5182 * password databases, possibly for compatibility reasons.
5183 * The getsp*() is by far he simplest one, the other two interfaces
5184 * are much more complicated, but also very similar to each other.
5189 * struct pr_passwd *getprpw*();
5190 * The password is in
5191 * char getprpw*(...).ufld.fd_encrypt[]
5192 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5197 * struct es_passwd *getespw*();
5198 * The password is in
5199 * char *(getespw*(...).ufld.fd_encrypt)
5200 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5203 * struct userpw *getuserpw();
5204 * The password is in
5205 * char *(getuserpw(...)).spw_upw_passwd
5206 * (but the de facto standard getpwnam() should work okay)
5208 * Mention I_PROT here so that Configure probes for it.
5210 * In HP-UX for getprpw*() the manual page claims that one should include
5211 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5212 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5213 * and pp_sys.c already includes <shadow.h> if there is such.
5215 * Note that <sys/security.h> is already probed for, but currently
5216 * it is only included in special cases.
5218 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5219 * be preferred interface, even though also the getprpw*() interface
5220 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5221 * One also needs to call set_auth_parameters() in main() before
5222 * doing anything else, whether one is using getespw*() or getprpw*().
5224 * Note that accessing the shadow databases can be magnitudes
5225 * slower than accessing the standard databases.
5230 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5231 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5232 * the pw_comment is left uninitialized. */
5233 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5239 const char* const name = POPpbytex;
5240 pwent = getpwnam(name);
5246 pwent = getpwuid(uid);
5250 # ifdef HAS_GETPWENT
5252 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5253 if (pwent) pwent = getpwnam(pwent->pw_name);
5256 DIE(aTHX_ PL_no_func, "getpwent");
5262 if (GIMME != G_ARRAY) {
5263 PUSHs(sv = sv_newmortal());
5265 if (which == OP_GPWNAM)
5266 # if Uid_t_sign <= 0
5267 sv_setiv(sv, (IV)pwent->pw_uid);
5269 sv_setuv(sv, (UV)pwent->pw_uid);
5272 sv_setpv(sv, pwent->pw_name);
5278 mPUSHs(newSVpv(pwent->pw_name, 0));
5282 /* If we have getspnam(), we try to dig up the shadow
5283 * password. If we are underprivileged, the shadow
5284 * interface will set the errno to EACCES or similar,
5285 * and return a null pointer. If this happens, we will
5286 * use the dummy password (usually "*" or "x") from the
5287 * standard password database.
5289 * In theory we could skip the shadow call completely
5290 * if euid != 0 but in practice we cannot know which
5291 * security measures are guarding the shadow databases
5292 * on a random platform.
5294 * Resist the urge to use additional shadow interfaces.
5295 * Divert the urge to writing an extension instead.
5298 /* Some AIX setups falsely(?) detect some getspnam(), which
5299 * has a different API than the Solaris/IRIX one. */
5300 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5303 const struct spwd * const spwent = getspnam(pwent->pw_name);
5304 /* Save and restore errno so that
5305 * underprivileged attempts seem
5306 * to have never made the unsccessful
5307 * attempt to retrieve the shadow password. */
5309 if (spwent && spwent->sp_pwdp)
5310 sv_setpv(sv, spwent->sp_pwdp);
5314 if (!SvPOK(sv)) /* Use the standard password, then. */
5315 sv_setpv(sv, pwent->pw_passwd);
5318 # ifndef INCOMPLETE_TAINTS
5319 /* passwd is tainted because user himself can diddle with it.
5320 * admittedly not much and in a very limited way, but nevertheless. */
5324 # if Uid_t_sign <= 0
5325 mPUSHi(pwent->pw_uid);
5327 mPUSHu(pwent->pw_uid);
5330 # if Uid_t_sign <= 0
5331 mPUSHi(pwent->pw_gid);
5333 mPUSHu(pwent->pw_gid);
5335 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5336 * because of the poor interface of the Perl getpw*(),
5337 * not because there's some standard/convention saying so.
5338 * A better interface would have been to return a hash,
5339 * but we are accursed by our history, alas. --jhi. */
5341 mPUSHi(pwent->pw_change);
5344 mPUSHi(pwent->pw_quota);
5347 mPUSHs(newSVpv(pwent->pw_age, 0));
5349 /* I think that you can never get this compiled, but just in case. */
5350 PUSHs(sv_mortalcopy(&PL_sv_no));
5355 /* pw_class and pw_comment are mutually exclusive--.
5356 * see the above note for pw_change, pw_quota, and pw_age. */
5358 mPUSHs(newSVpv(pwent->pw_class, 0));
5361 mPUSHs(newSVpv(pwent->pw_comment, 0));
5363 /* I think that you can never get this compiled, but just in case. */
5364 PUSHs(sv_mortalcopy(&PL_sv_no));
5369 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5371 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5373 # ifndef INCOMPLETE_TAINTS
5374 /* pw_gecos is tainted because user himself can diddle with it. */
5378 mPUSHs(newSVpv(pwent->pw_dir, 0));
5380 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5381 # ifndef INCOMPLETE_TAINTS
5382 /* pw_shell is tainted because user himself can diddle with it. */
5387 mPUSHi(pwent->pw_expire);
5392 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5398 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5403 DIE(aTHX_ PL_no_func, "setpwent");
5409 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5414 DIE(aTHX_ PL_no_func, "endpwent");
5422 const I32 which = PL_op->op_type;
5423 const struct group *grent;
5425 if (which == OP_GGRNAM) {
5426 const char* const name = POPpbytex;
5427 grent = (const struct group *)getgrnam(name);
5429 else if (which == OP_GGRGID) {
5430 const Gid_t gid = POPi;
5431 grent = (const struct group *)getgrgid(gid);
5435 grent = (struct group *)getgrent();
5437 DIE(aTHX_ PL_no_func, "getgrent");
5441 if (GIMME != G_ARRAY) {
5442 SV * const sv = sv_newmortal();
5446 if (which == OP_GGRNAM)
5448 sv_setiv(sv, (IV)grent->gr_gid);
5450 sv_setuv(sv, (UV)grent->gr_gid);
5453 sv_setpv(sv, grent->gr_name);
5459 mPUSHs(newSVpv(grent->gr_name, 0));
5462 mPUSHs(newSVpv(grent->gr_passwd, 0));
5464 PUSHs(sv_mortalcopy(&PL_sv_no));
5468 mPUSHi(grent->gr_gid);
5470 mPUSHu(grent->gr_gid);
5473 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5474 /* In UNICOS/mk (_CRAYMPP) the multithreading
5475 * versions (getgrnam_r, getgrgid_r)
5476 * seem to return an illegal pointer
5477 * as the group members list, gr_mem.
5478 * getgrent() doesn't even have a _r version
5479 * but the gr_mem is poisonous anyway.
5480 * So yes, you cannot get the list of group
5481 * members if building multithreaded in UNICOS/mk. */
5482 PUSHs(space_join_names_mortal(grent->gr_mem));
5488 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5494 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5499 DIE(aTHX_ PL_no_func, "setgrent");
5505 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5510 DIE(aTHX_ PL_no_func, "endgrent");
5520 if (!(tmps = PerlProc_getlogin()))
5522 sv_setpv_mg(TARG, tmps);
5526 DIE(aTHX_ PL_no_func, "getlogin");
5530 /* Miscellaneous. */
5535 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5536 register I32 items = SP - MARK;
5537 unsigned long a[20];
5542 while (++MARK <= SP) {
5543 if (SvTAINTED(*MARK)) {
5549 TAINT_PROPER("syscall");
5552 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5553 * or where sizeof(long) != sizeof(char*). But such machines will
5554 * not likely have syscall implemented either, so who cares?
5556 while (++MARK <= SP) {
5557 if (SvNIOK(*MARK) || !i)
5558 a[i++] = SvIV(*MARK);
5559 else if (*MARK == &PL_sv_undef)
5562 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5568 DIE(aTHX_ "Too many args to syscall");
5570 DIE(aTHX_ "Too few args to syscall");
5572 retval = syscall(a[0]);
5575 retval = syscall(a[0],a[1]);
5578 retval = syscall(a[0],a[1],a[2]);
5581 retval = syscall(a[0],a[1],a[2],a[3]);
5584 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5587 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5590 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5593 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5597 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5600 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5603 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5607 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5611 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5615 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5616 a[10],a[11],a[12],a[13]);
5618 #endif /* atarist */
5624 DIE(aTHX_ PL_no_func, "syscall");
5628 #ifdef FCNTL_EMULATE_FLOCK
5630 /* XXX Emulate flock() with fcntl().
5631 What's really needed is a good file locking module.
5635 fcntl_emulate_flock(int fd, int operation)
5640 switch (operation & ~LOCK_NB) {
5642 flock.l_type = F_RDLCK;
5645 flock.l_type = F_WRLCK;
5648 flock.l_type = F_UNLCK;
5654 flock.l_whence = SEEK_SET;
5655 flock.l_start = flock.l_len = (Off_t)0;
5657 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5658 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5659 errno = EWOULDBLOCK;
5663 #endif /* FCNTL_EMULATE_FLOCK */
5665 #ifdef LOCKF_EMULATE_FLOCK
5667 /* XXX Emulate flock() with lockf(). This is just to increase
5668 portability of scripts. The calls are not completely
5669 interchangeable. What's really needed is a good file
5673 /* The lockf() constants might have been defined in <unistd.h>.
5674 Unfortunately, <unistd.h> causes troubles on some mixed
5675 (BSD/POSIX) systems, such as SunOS 4.1.3.
5677 Further, the lockf() constants aren't POSIX, so they might not be
5678 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5679 just stick in the SVID values and be done with it. Sigh.
5683 # define F_ULOCK 0 /* Unlock a previously locked region */
5686 # define F_LOCK 1 /* Lock a region for exclusive use */
5689 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5692 # define F_TEST 3 /* Test a region for other processes locks */
5696 lockf_emulate_flock(int fd, int operation)
5702 /* flock locks entire file so for lockf we need to do the same */
5703 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5704 if (pos > 0) /* is seekable and needs to be repositioned */
5705 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5706 pos = -1; /* seek failed, so don't seek back afterwards */
5709 switch (operation) {
5711 /* LOCK_SH - get a shared lock */
5713 /* LOCK_EX - get an exclusive lock */
5715 i = lockf (fd, F_LOCK, 0);
5718 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5719 case LOCK_SH|LOCK_NB:
5720 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5721 case LOCK_EX|LOCK_NB:
5722 i = lockf (fd, F_TLOCK, 0);
5724 if ((errno == EAGAIN) || (errno == EACCES))
5725 errno = EWOULDBLOCK;
5728 /* LOCK_UN - unlock (non-blocking is a no-op) */
5730 case LOCK_UN|LOCK_NB:
5731 i = lockf (fd, F_ULOCK, 0);
5734 /* Default - can't decipher operation */
5741 if (pos > 0) /* need to restore position of the handle */
5742 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5747 #endif /* LOCKF_EMULATE_FLOCK */
5751 * c-indentation-style: bsd
5753 * indent-tabs-mode: t
5756 * ex: set ts=8 sts=4 sw=4 noet: