3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * But only a short way ahead its floor and the walls on either side were
13 * cloven by a great fissure, out of which the red glare came, now leaping
14 * up, now dying down into darkness; and all the while far below there was
15 * a rumour and a trouble as of great engines throbbing and labouring.
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
20 /* This file contains system pp ("push/pop") functions that
21 * execute the opcodes that make up a perl program. A typical pp function
22 * expects to find its arguments on the stack, and usually pushes its
23 * results onto the stack, hence the 'pp' terminology. Each OP structure
24 * contains a pointer to the relevant pp_foo() function.
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
30 #define PERL_IN_PP_SYS_C
36 /* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
45 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
53 # include <sys/resource.h>
62 # include <sys/select.h>
66 /* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
73 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
88 struct passwd *getpwent (void);
89 #elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
104 struct group *getgrent (void);
110 # if defined(_MSC_VER) || defined(__MINGW32__)
111 # include <sys/utime.h>
118 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
121 # define my_chsize PerlLIO_chsize
124 # define my_chsize PerlLIO_chsize
126 I32 my_chsize(int fd, Off_t length);
132 #else /* no flock() */
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
142 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143 # define FLOCK fcntl_emulate_flock
144 # define FCNTL_EMULATE_FLOCK
145 # else /* no flock() or fcntl(F_SETLK,...) */
147 # define FLOCK lockf_emulate_flock
148 # define LOCKF_EMULATE_FLOCK
150 # endif /* no flock() or fcntl(F_SETLK,...) */
153 static int FLOCK (int, int);
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
171 # endif /* emulating flock() */
173 #endif /* no flock() */
176 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
178 #if defined(I_SYS_ACCESS) && !defined(R_OK)
179 # include <sys/access.h>
182 #if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183 # define FD_CLOEXEC 1 /* NeXT needs this */
189 /* Missing protos on LynxOS */
190 void sethostent(int);
191 void endhostent(void);
193 void endnetent(void);
194 void setprotoent(int);
195 void endprotoent(void);
196 void setservent(int);
197 void endservent(void);
200 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
202 /* F_OK unused: if stat() cannot find it... */
204 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
205 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
206 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
209 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
210 # ifdef I_SYS_SECURITY
211 # include <sys/security.h>
215 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
218 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
222 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
224 # define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
228 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
229 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
230 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
233 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
235 const Uid_t ruid = getuid();
236 const Uid_t euid = geteuid();
237 const Gid_t rgid = getgid();
238 const Gid_t egid = getegid();
241 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
242 Perl_croak(aTHX_ "switching effective uid is not implemented");
245 if (setreuid(euid, ruid))
248 if (setresuid(euid, ruid, (Uid_t)-1))
251 /* diag_listed_as: entering effective %s failed */
252 Perl_croak(aTHX_ "entering effective uid failed");
255 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
256 Perl_croak(aTHX_ "switching effective gid is not implemented");
259 if (setregid(egid, rgid))
262 if (setresgid(egid, rgid, (Gid_t)-1))
265 /* diag_listed_as: entering effective %s failed */
266 Perl_croak(aTHX_ "entering effective gid failed");
269 res = access(path, mode);
272 if (setreuid(ruid, euid))
275 if (setresuid(ruid, euid, (Uid_t)-1))
278 /* diag_listed_as: leaving effective %s failed */
279 Perl_croak(aTHX_ "leaving effective uid failed");
282 if (setregid(rgid, egid))
285 if (setresgid(rgid, egid, (Gid_t)-1))
288 /* diag_listed_as: leaving effective %s failed */
289 Perl_croak(aTHX_ "leaving effective gid failed");
293 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
300 const char * const tmps = POPpconstx;
301 const I32 gimme = GIMME_V;
302 const char *mode = "r";
305 if (PL_op->op_private & OPpOPEN_IN_RAW)
307 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
309 fp = PerlProc_popen(tmps, mode);
311 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
313 PerlIO_apply_layers(aTHX_ fp,mode,type);
315 if (gimme == G_VOID) {
317 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
320 else if (gimme == G_SCALAR) {
321 ENTER_with_name("backtick");
323 PL_rs = &PL_sv_undef;
324 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
325 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
327 LEAVE_with_name("backtick");
333 SV * const sv = newSV(79);
334 if (sv_gets(sv, fp, 0) == NULL) {
339 if (SvLEN(sv) - SvCUR(sv) > 20) {
340 SvPV_shrink_to_cur(sv);
345 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
346 TAINT; /* "I believe that this is not gratuitous!" */
349 STATUS_NATIVE_CHILD_SET(-1);
350 if (gimme == G_SCALAR)
362 GV * const gv = (PL_op->op_flags & OPf_SPECIAL) ? NULL : (GV *)POPs;
366 /* make a copy of the pattern if it is gmagical, to ensure that magic
367 * is called once and only once */
368 if (SvGMAGICAL(TOPs)) TOPs = sv_2mortal(newSVsv(TOPs));
370 tryAMAGICunTARGETlist(iter_amg, (PL_op->op_flags & OPf_SPECIAL));
372 if (PL_op->op_flags & OPf_SPECIAL) {
373 /* call Perl-level glob function instead. Stack args are:
375 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
384 /* Note that we only ever get here if File::Glob fails to load
385 * without at the same time croaking, for some reason, or if
386 * perl was built with PERL_EXTERNAL_GLOB */
388 ENTER_with_name("glob");
393 * The external globbing program may use things we can't control,
394 * so for security reasons we must assume the worst.
397 taint_proper(PL_no_security, "glob");
401 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
404 SAVESPTR(PL_rs); /* This is not permanent, either. */
405 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
408 *SvPVX(PL_rs) = '\n';
412 result = do_readline();
413 LEAVE_with_name("glob");
420 PL_last_in_gv = cGVOP_gv;
421 return do_readline();
431 do_join(TARG, &PL_sv_no, MARK, SP);
435 else if (SP == MARK) {
442 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
445 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
446 /* well-formed exception supplied */
449 SV * const errsv = ERRSV;
452 if (SvGMAGICAL(errsv)) {
453 exsv = sv_newmortal();
454 sv_setsv_nomg(exsv, errsv);
458 else if (SvPOKp(errsv) ? SvCUR(errsv) : SvNIOKp(errsv)) {
459 exsv = sv_newmortal();
460 sv_setsv_nomg(exsv, errsv);
461 sv_catpvs(exsv, "\t...caught");
464 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
467 if (SvROK(exsv) && !PL_warnhook)
468 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
480 VMSISH_HUSHED || (PL_curcop->op_private & OPpHUSH_VMSISH);
482 if (SP - MARK != 1) {
484 do_join(TARG, &PL_sv_no, MARK, SP);
492 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
493 /* well-formed exception supplied */
496 SV * const errsv = ERRSV;
500 if (sv_isobject(exsv)) {
501 HV * const stash = SvSTASH(SvRV(exsv));
502 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
504 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
505 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
512 call_sv(MUTABLE_SV(GvCV(gv)),
513 G_SCALAR|G_EVAL|G_KEEPERR);
514 exsv = sv_mortalcopy(*PL_stack_sp--);
518 else if (SvPOK(errsv) && SvCUR(errsv)) {
519 exsv = sv_mortalcopy(errsv);
520 sv_catpvs(exsv, "\t...propagated");
523 exsv = newSVpvs_flags("Died", SVs_TEMP);
532 Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv,
533 const MAGIC *const mg, const U32 flags, U32 argc, ...)
538 PERL_ARGS_ASSERT_TIED_METHOD;
540 /* Ensure that our flag bits do not overlap. */
541 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
542 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
543 assert((TIED_METHOD_SAY & G_WANT) == 0);
545 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
546 PUSHSTACKi(PERLSI_MAGIC);
547 EXTEND(SP, argc+1); /* object + args */
549 PUSHs(SvTIED_obj(sv, mg));
550 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
551 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
555 const U32 mortalize_not_needed
556 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
558 va_start(args, argc);
560 SV *const arg = va_arg(args, SV *);
561 if(mortalize_not_needed)
570 ENTER_with_name("call_tied_method");
571 if (flags & TIED_METHOD_SAY) {
572 /* local $\ = "\n" */
573 SAVEGENERICSV(PL_ors_sv);
574 PL_ors_sv = newSVpvs("\n");
576 ret_args = call_sv(methname, (flags & G_WANT)|G_METHOD_NAMED);
581 if (ret_args) { /* copy results back to original stack */
582 EXTEND(sp, ret_args);
583 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
587 LEAVE_with_name("call_tied_method");
591 #define tied_method0(a,b,c,d) \
592 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
593 #define tied_method1(a,b,c,d,e) \
594 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
595 #define tied_method2(a,b,c,d,e,f) \
596 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
609 GV * const gv = MUTABLE_GV(*++MARK);
611 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
612 DIE(aTHX_ PL_no_usym, "filehandle");
614 if ((io = GvIOp(gv))) {
616 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
619 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
620 "Opening dirhandle %"HEKf" also as a file",
621 HEKfARG(GvENAME_HEK(gv)));
623 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
625 /* Method's args are same as ours ... */
626 /* ... except handle is replaced by the object */
627 return Perl_tied_method(aTHX_ SV_CONST(OPEN), mark - 1, MUTABLE_SV(io), mg,
628 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
640 tmps = SvPV_const(sv, len);
641 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
644 PUSHi( (I32)PL_forkprocess );
645 else if (PL_forkprocess == 0) /* we are a new child */
656 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
662 IO * const io = GvIO(gv);
664 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
666 return tied_method0(SV_CONST(CLOSE), SP, MUTABLE_SV(io), mg);
670 PUSHs(boolSV(do_close(gv, TRUE)));
683 GV * const wgv = MUTABLE_GV(POPs);
684 GV * const rgv = MUTABLE_GV(POPs);
689 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
690 DIE(aTHX_ PL_no_usym, "filehandle");
695 do_close(rgv, FALSE);
697 do_close(wgv, FALSE);
699 if (PerlProc_pipe(fd) < 0)
702 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
703 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
704 IoOFP(rstio) = IoIFP(rstio);
705 IoIFP(wstio) = IoOFP(wstio);
706 IoTYPE(rstio) = IoTYPE_RDONLY;
707 IoTYPE(wstio) = IoTYPE_WRONLY;
709 if (!IoIFP(rstio) || !IoOFP(wstio)) {
711 PerlIO_close(IoIFP(rstio));
713 PerlLIO_close(fd[0]);
715 PerlIO_close(IoOFP(wstio));
717 PerlLIO_close(fd[1]);
720 #if defined(HAS_FCNTL) && defined(F_SETFD)
721 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
722 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
729 DIE(aTHX_ PL_no_func, "pipe");
743 gv = MUTABLE_GV(POPs);
747 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
749 return tied_method0(SV_CONST(FILENO), SP, MUTABLE_SV(io), mg);
752 if (!io || !(fp = IoIFP(io))) {
753 /* Can't do this because people seem to do things like
754 defined(fileno($foo)) to check whether $foo is a valid fh.
761 PUSHi(PerlIO_fileno(fp));
773 if (MAXARG < 1 || (!TOPs && !POPs)) {
774 anum = PerlLIO_umask(022);
775 /* setting it to 022 between the two calls to umask avoids
776 * to have a window where the umask is set to 0 -- meaning
777 * that another thread could create world-writeable files. */
779 (void)PerlLIO_umask(anum);
782 anum = PerlLIO_umask(POPi);
783 TAINT_PROPER("umask");
786 /* Only DIE if trying to restrict permissions on "user" (self).
787 * Otherwise it's harmless and more useful to just return undef
788 * since 'group' and 'other' concepts probably don't exist here. */
789 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
790 DIE(aTHX_ "umask not implemented");
791 XPUSHs(&PL_sv_undef);
810 gv = MUTABLE_GV(POPs);
814 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
816 /* This takes advantage of the implementation of the varargs
817 function, which I don't think that the optimiser will be able to
818 figure out. Although, as it's a static function, in theory it
820 return Perl_tied_method(aTHX_ SV_CONST(BINMODE), SP, MUTABLE_SV(io), mg,
821 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
822 discp ? 1 : 0, discp);
826 if (!io || !(fp = IoIFP(io))) {
828 SETERRNO(EBADF,RMS_IFI);
835 const char *d = NULL;
838 d = SvPV_const(discp, len);
839 mode = mode_from_discipline(d, len);
840 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
841 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
842 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
863 const I32 markoff = MARK - PL_stack_base;
864 const char *methname;
865 int how = PERL_MAGIC_tied;
869 switch(SvTYPE(varsv)) {
873 methname = "TIEHASH";
874 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
875 HvLAZYDEL_off(varsv);
876 hv_free_ent((HV *)varsv, entry);
878 HvEITER_set(MUTABLE_HV(varsv), 0);
882 methname = "TIEARRAY";
883 if (!AvREAL(varsv)) {
885 Perl_croak(aTHX_ "Cannot tie unreifiable array");
886 av_clear((AV *)varsv);
893 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
894 methname = "TIEHANDLE";
895 how = PERL_MAGIC_tiedscalar;
896 /* For tied filehandles, we apply tiedscalar magic to the IO
897 slot of the GP rather than the GV itself. AMS 20010812 */
899 GvIOp(varsv) = newIO();
900 varsv = MUTABLE_SV(GvIOp(varsv));
903 if (SvTYPE(varsv) == SVt_PVLV && LvTYPE(varsv) == 'y') {
904 vivify_defelem(varsv);
905 varsv = LvTARG(varsv);
909 methname = "TIESCALAR";
910 how = PERL_MAGIC_tiedscalar;
914 if (sv_isobject(*MARK)) { /* Calls GET magic. */
915 ENTER_with_name("call_TIE");
916 PUSHSTACKi(PERLSI_MAGIC);
918 EXTEND(SP,(I32)items);
922 call_method(methname, G_SCALAR);
925 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
926 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
927 * wrong error message, and worse case, supreme action at a distance.
928 * (Sorry obfuscation writers. You're not going to be given this one.)
930 stash = gv_stashsv(*MARK, 0);
931 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
932 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
933 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
935 ENTER_with_name("call_TIE");
936 PUSHSTACKi(PERLSI_MAGIC);
938 EXTEND(SP,(I32)items);
942 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
948 if (sv_isobject(sv)) {
949 sv_unmagic(varsv, how);
950 /* Croak if a self-tie on an aggregate is attempted. */
951 if (varsv == SvRV(sv) &&
952 (SvTYPE(varsv) == SVt_PVAV ||
953 SvTYPE(varsv) == SVt_PVHV))
955 "Self-ties of arrays and hashes are not supported");
956 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
958 LEAVE_with_name("call_TIE");
959 SP = PL_stack_base + markoff;
969 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
970 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
972 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
975 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
976 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
978 if ((mg = SvTIED_mg(sv, how))) {
979 SV * const obj = SvRV(SvTIED_obj(sv, mg));
981 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
983 if (gv && isGV(gv) && (cv = GvCV(gv))) {
985 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
986 mXPUSHi(SvREFCNT(obj) - 1);
988 ENTER_with_name("call_UNTIE");
989 call_sv(MUTABLE_SV(cv), G_VOID);
990 LEAVE_with_name("call_UNTIE");
993 else if (mg && SvREFCNT(obj) > 1) {
994 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
995 "untie attempted while %"UVuf" inner references still exist",
996 (UV)SvREFCNT(obj) - 1 ) ;
1000 sv_unmagic(sv, how) ;
1010 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1011 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1013 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1016 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1017 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
1019 if ((mg = SvTIED_mg(sv, how))) {
1020 PUSHs(SvTIED_obj(sv, mg));
1033 HV * const hv = MUTABLE_HV(POPs);
1034 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1035 stash = gv_stashsv(sv, 0);
1036 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1038 require_pv("AnyDBM_File.pm");
1040 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1041 DIE(aTHX_ "No dbm on this machine");
1051 mPUSHu(O_RDWR|O_CREAT);
1055 if (!SvOK(right)) right = &PL_sv_no;
1059 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1062 if (!sv_isobject(TOPs)) {
1070 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1074 if (sv_isobject(TOPs)) {
1075 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1076 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1093 struct timeval timebuf;
1094 struct timeval *tbuf = &timebuf;
1097 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1102 # if BYTEORDER & 0xf0000
1103 # define ORDERBYTE (0x88888888 - BYTEORDER)
1105 # define ORDERBYTE (0x4444 - BYTEORDER)
1111 for (i = 1; i <= 3; i++) {
1112 SV * const sv = SP[i];
1116 if (SvREADONLY(sv)) {
1117 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1118 Perl_croak_no_modify();
1120 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1123 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1124 "Non-string passed as bitmask");
1125 SvPV_force_nomg_nolen(sv); /* force string conversion */
1132 /* little endians can use vecs directly */
1133 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1140 masksize = NFDBITS / NBBY;
1142 masksize = sizeof(long); /* documented int, everyone seems to use long */
1144 Zero(&fd_sets[0], 4, char*);
1147 # if SELECT_MIN_BITS == 1
1148 growsize = sizeof(fd_set);
1150 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1151 # undef SELECT_MIN_BITS
1152 # define SELECT_MIN_BITS __FD_SETSIZE
1154 /* If SELECT_MIN_BITS is greater than one we most probably will want
1155 * to align the sizes with SELECT_MIN_BITS/8 because for example
1156 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1157 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1158 * on (sets/tests/clears bits) is 32 bits. */
1159 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1165 value = SvNV_nomg(sv);
1168 timebuf.tv_sec = (long)value;
1169 value -= (NV)timebuf.tv_sec;
1170 timebuf.tv_usec = (long)(value * 1000000.0);
1175 for (i = 1; i <= 3; i++) {
1177 if (!SvOK(sv) || SvCUR(sv) == 0) {
1184 Sv_Grow(sv, growsize);
1188 while (++j <= growsize) {
1192 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1194 Newx(fd_sets[i], growsize, char);
1195 for (offset = 0; offset < growsize; offset += masksize) {
1196 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1197 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1200 fd_sets[i] = SvPVX(sv);
1204 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1205 /* Can't make just the (void*) conditional because that would be
1206 * cpp #if within cpp macro, and not all compilers like that. */
1207 nfound = PerlSock_select(
1209 (Select_fd_set_t) fd_sets[1],
1210 (Select_fd_set_t) fd_sets[2],
1211 (Select_fd_set_t) fd_sets[3],
1212 (void*) tbuf); /* Workaround for compiler bug. */
1214 nfound = PerlSock_select(
1216 (Select_fd_set_t) fd_sets[1],
1217 (Select_fd_set_t) fd_sets[2],
1218 (Select_fd_set_t) fd_sets[3],
1221 for (i = 1; i <= 3; i++) {
1224 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1226 for (offset = 0; offset < growsize; offset += masksize) {
1227 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1228 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1230 Safefree(fd_sets[i]);
1237 if (GIMME == G_ARRAY && tbuf) {
1238 value = (NV)(timebuf.tv_sec) +
1239 (NV)(timebuf.tv_usec) / 1000000.0;
1244 DIE(aTHX_ "select not implemented");
1249 =for apidoc setdefout
1251 Sets PL_defoutgv, the default file handle for output, to the passed in
1252 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1253 count of the passed in typeglob is increased by one, and the reference count
1254 of the typeglob that PL_defoutgv points to is decreased by one.
1260 Perl_setdefout(pTHX_ GV *gv)
1263 PERL_ARGS_ASSERT_SETDEFOUT;
1264 SvREFCNT_inc_simple_void_NN(gv);
1265 SvREFCNT_dec(PL_defoutgv);
1273 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1274 GV * egv = GvEGVx(PL_defoutgv);
1279 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1280 gvp = hv && HvENAME(hv)
1281 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1283 if (gvp && *gvp == egv) {
1284 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1288 mXPUSHs(newRV(MUTABLE_SV(egv)));
1292 if (!GvIO(newdefout))
1293 gv_IOadd(newdefout);
1294 setdefout(newdefout);
1304 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1305 IO *const io = GvIO(gv);
1311 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1313 const U32 gimme = GIMME_V;
1314 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1315 if (gimme == G_SCALAR) {
1317 SvSetMagicSV_nosteal(TARG, TOPs);
1322 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1323 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1325 SETERRNO(EBADF,RMS_IFI);
1329 sv_setpvs(TARG, " ");
1330 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1331 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1332 /* Find out how many bytes the char needs */
1333 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1336 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1337 SvCUR_set(TARG,1+len);
1346 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1350 const I32 gimme = GIMME_V;
1352 PERL_ARGS_ASSERT_DOFORM;
1354 if (cv && CvCLONE(cv))
1355 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1360 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1361 PUSHFORMAT(cx, retop);
1362 if (CvDEPTH(cv) >= 2) {
1363 PERL_STACK_OVERFLOW_CHECK();
1364 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1367 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1369 setdefout(gv); /* locally select filehandle so $% et al work */
1388 gv = MUTABLE_GV(POPs);
1405 tmpsv = sv_newmortal();
1406 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1407 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1409 IoFLAGS(io) &= ~IOf_DIDTOP;
1410 RETURNOP(doform(cv,gv,PL_op->op_next));
1416 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1417 IO * const io = GvIOp(gv);
1425 if (!io || !(ofp = IoOFP(io)))
1428 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1429 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1431 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1432 PL_formtarget != PL_toptarget)
1436 if (!IoTOP_GV(io)) {
1439 if (!IoTOP_NAME(io)) {
1441 if (!IoFMT_NAME(io))
1442 IoFMT_NAME(io) = savepv(GvNAME(gv));
1443 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1444 HEKfARG(GvNAME_HEK(gv))));
1445 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1446 if ((topgv && GvFORM(topgv)) ||
1447 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1448 IoTOP_NAME(io) = savesvpv(topname);
1450 IoTOP_NAME(io) = savepvs("top");
1452 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1453 if (!topgv || !GvFORM(topgv)) {
1454 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1457 IoTOP_GV(io) = topgv;
1459 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1460 I32 lines = IoLINES_LEFT(io);
1461 const char *s = SvPVX_const(PL_formtarget);
1462 if (lines <= 0) /* Yow, header didn't even fit!!! */
1464 while (lines-- > 0) {
1465 s = strchr(s, '\n');
1471 const STRLEN save = SvCUR(PL_formtarget);
1472 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1473 do_print(PL_formtarget, ofp);
1474 SvCUR_set(PL_formtarget, save);
1475 sv_chop(PL_formtarget, s);
1476 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1479 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1480 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1481 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1483 PL_formtarget = PL_toptarget;
1484 IoFLAGS(io) |= IOf_DIDTOP;
1486 assert(fgv); /* IoTOP_GV(io) should have been set above */
1489 SV * const sv = sv_newmortal();
1490 gv_efullname4(sv, fgv, NULL, FALSE);
1491 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1493 return doform(cv, gv, PL_op);
1497 POPBLOCK(cx,PL_curpm);
1498 retop = cx->blk_sub.retop;
1500 SP = newsp; /* ignore retval of formline */
1503 if (!io || !(fp = IoOFP(io))) {
1504 if (io && IoIFP(io))
1505 report_wrongway_fh(gv, '<');
1511 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1512 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1514 if (!do_print(PL_formtarget, fp))
1517 FmLINES(PL_formtarget) = 0;
1518 SvCUR_set(PL_formtarget, 0);
1519 *SvEND(PL_formtarget) = '\0';
1520 if (IoFLAGS(io) & IOf_FLUSH)
1521 (void)PerlIO_flush(fp);
1525 PL_formtarget = PL_bodytarget;
1526 PERL_UNUSED_VAR(gimme);
1532 dVAR; dSP; dMARK; dORIGMARK;
1536 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1537 IO *const io = GvIO(gv);
1539 /* Treat empty list as "" */
1540 if (MARK == SP) XPUSHs(&PL_sv_no);
1543 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1545 if (MARK == ORIGMARK) {
1548 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1551 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1553 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1560 SETERRNO(EBADF,RMS_IFI);
1563 else if (!(fp = IoOFP(io))) {
1565 report_wrongway_fh(gv, '<');
1566 else if (ckWARN(WARN_CLOSED))
1568 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1572 SV *sv = sv_newmortal();
1573 do_sprintf(sv, SP - MARK, MARK + 1);
1574 if (!do_print(sv, fp))
1577 if (IoFLAGS(io) & IOf_FLUSH)
1578 if (PerlIO_flush(fp) == EOF)
1587 PUSHs(&PL_sv_undef);
1595 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1596 const int mode = POPi;
1597 SV * const sv = POPs;
1598 GV * const gv = MUTABLE_GV(POPs);
1601 /* Need TIEHANDLE method ? */
1602 const char * const tmps = SvPV_const(sv, len);
1603 /* FIXME? do_open should do const */
1604 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1605 IoLINES(GvIOp(gv)) = 0;
1609 PUSHs(&PL_sv_undef);
1616 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1630 bool charstart = FALSE;
1631 STRLEN charskip = 0;
1634 GV * const gv = MUTABLE_GV(*++MARK);
1635 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1636 && gv && (io = GvIO(gv)) )
1638 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1640 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1641 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1650 sv_setpvs(bufsv, "");
1651 length = SvIVx(*++MARK);
1653 DIE(aTHX_ "Negative length");
1656 offset = SvIVx(*++MARK);
1660 if (!io || !IoIFP(io)) {
1662 SETERRNO(EBADF,RMS_IFI);
1665 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1666 buffer = SvPVutf8_force(bufsv, blen);
1667 /* UTF-8 may not have been set if they are all low bytes */
1672 buffer = SvPV_force(bufsv, blen);
1673 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1675 if (DO_UTF8(bufsv)) {
1676 blen = sv_len_utf8_nomg(bufsv);
1685 if (PL_op->op_type == OP_RECV) {
1686 Sock_size_t bufsize;
1687 char namebuf[MAXPATHLEN];
1688 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1689 bufsize = sizeof (struct sockaddr_in);
1691 bufsize = sizeof namebuf;
1693 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1697 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1698 /* 'offset' means 'flags' here */
1699 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1700 (struct sockaddr *)namebuf, &bufsize);
1703 /* MSG_TRUNC can give oversized count; quietly lose it */
1706 SvCUR_set(bufsv, count);
1707 *SvEND(bufsv) = '\0';
1708 (void)SvPOK_only(bufsv);
1712 /* This should not be marked tainted if the fp is marked clean */
1713 if (!(IoFLAGS(io) & IOf_UNTAINT))
1714 SvTAINTED_on(bufsv);
1716 sv_setpvn(TARG, namebuf, bufsize);
1722 if (-offset > (SSize_t)blen)
1723 DIE(aTHX_ "Offset outside string");
1726 if (DO_UTF8(bufsv)) {
1727 /* convert offset-as-chars to offset-as-bytes */
1728 if (offset >= (SSize_t)blen)
1729 offset += SvCUR(bufsv) - blen;
1731 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1734 orig_size = SvCUR(bufsv);
1735 /* Allocating length + offset + 1 isn't perfect in the case of reading
1736 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1738 (should be 2 * length + offset + 1, or possibly something longer if
1739 PL_encoding is true) */
1740 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1741 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1742 Zero(buffer+orig_size, offset-orig_size, char);
1744 buffer = buffer + offset;
1746 read_target = bufsv;
1748 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1749 concatenate it to the current buffer. */
1751 /* Truncate the existing buffer to the start of where we will be
1753 SvCUR_set(bufsv, offset);
1755 read_target = sv_newmortal();
1756 SvUPGRADE(read_target, SVt_PV);
1757 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1760 if (PL_op->op_type == OP_SYSREAD) {
1761 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1762 if (IoTYPE(io) == IoTYPE_SOCKET) {
1763 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1769 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1775 count = PerlIO_read(IoIFP(io), buffer, length);
1776 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1777 if (count == 0 && PerlIO_error(IoIFP(io)))
1781 if (IoTYPE(io) == IoTYPE_WRONLY)
1782 report_wrongway_fh(gv, '>');
1785 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1786 *SvEND(read_target) = '\0';
1787 (void)SvPOK_only(read_target);
1788 if (fp_utf8 && !IN_BYTES) {
1789 /* Look at utf8 we got back and count the characters */
1790 const char *bend = buffer + count;
1791 while (buffer < bend) {
1793 skip = UTF8SKIP(buffer);
1796 if (buffer - charskip + skip > bend) {
1797 /* partial character - try for rest of it */
1798 length = skip - (bend-buffer);
1799 offset = bend - SvPVX_const(bufsv);
1811 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1812 provided amount read (count) was what was requested (length)
1814 if (got < wanted && count == length) {
1815 length = wanted - got;
1816 offset = bend - SvPVX_const(bufsv);
1819 /* return value is character count */
1823 else if (buffer_utf8) {
1824 /* Let svcatsv upgrade the bytes we read in to utf8.
1825 The buffer is a mortal so will be freed soon. */
1826 sv_catsv_nomg(bufsv, read_target);
1829 /* This should not be marked tainted if the fp is marked clean */
1830 if (!(IoFLAGS(io) & IOf_UNTAINT))
1831 SvTAINTED_on(bufsv);
1843 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1848 STRLEN orig_blen_bytes;
1849 const int op_type = PL_op->op_type;
1852 GV *const gv = MUTABLE_GV(*++MARK);
1853 IO *const io = GvIO(gv);
1855 if (op_type == OP_SYSWRITE && io) {
1856 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1858 if (MARK == SP - 1) {
1860 mXPUSHi(sv_len(sv));
1864 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1865 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1875 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1877 if (io && IoIFP(io))
1878 report_wrongway_fh(gv, '<');
1881 SETERRNO(EBADF,RMS_IFI);
1885 /* Do this first to trigger any overloading. */
1886 buffer = SvPV_const(bufsv, blen);
1887 orig_blen_bytes = blen;
1888 doing_utf8 = DO_UTF8(bufsv);
1890 if (PerlIO_isutf8(IoIFP(io))) {
1891 if (!SvUTF8(bufsv)) {
1892 /* We don't modify the original scalar. */
1893 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1894 buffer = (char *) tmpbuf;
1898 else if (doing_utf8) {
1899 STRLEN tmplen = blen;
1900 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1903 buffer = (char *) tmpbuf;
1907 assert((char *)result == buffer);
1908 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1913 if (op_type == OP_SEND) {
1914 const int flags = SvIVx(*++MARK);
1917 char * const sockbuf = SvPVx(*++MARK, mlen);
1918 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1919 flags, (struct sockaddr *)sockbuf, mlen);
1923 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1929 Size_t length = 0; /* This length is in characters. */
1935 /* The SV is bytes, and we've had to upgrade it. */
1936 blen_chars = orig_blen_bytes;
1938 /* The SV really is UTF-8. */
1939 /* Don't call sv_len_utf8 on a magical or overloaded
1940 scalar, as we might get back a different result. */
1941 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1948 length = blen_chars;
1950 #if Size_t_size > IVSIZE
1951 length = (Size_t)SvNVx(*++MARK);
1953 length = (Size_t)SvIVx(*++MARK);
1955 if ((SSize_t)length < 0) {
1957 DIE(aTHX_ "Negative length");
1962 offset = SvIVx(*++MARK);
1964 if (-offset > (IV)blen_chars) {
1966 DIE(aTHX_ "Offset outside string");
1968 offset += blen_chars;
1969 } else if (offset > (IV)blen_chars) {
1971 DIE(aTHX_ "Offset outside string");
1975 if (length > blen_chars - offset)
1976 length = blen_chars - offset;
1978 /* Here we convert length from characters to bytes. */
1979 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1980 /* Either we had to convert the SV, or the SV is magical, or
1981 the SV has overloading, in which case we can't or mustn't
1982 or mustn't call it again. */
1984 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1985 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1987 /* It's a real UTF-8 SV, and it's not going to change under
1988 us. Take advantage of any cache. */
1990 I32 len_I32 = length;
1992 /* Convert the start and end character positions to bytes.
1993 Remember that the second argument to sv_pos_u2b is relative
1995 sv_pos_u2b(bufsv, &start, &len_I32);
2002 buffer = buffer+offset;
2004 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2005 if (IoTYPE(io) == IoTYPE_SOCKET) {
2006 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2012 /* See the note at doio.c:do_print about filesize limits. --jhi */
2013 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2022 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2025 #if Size_t_size > IVSIZE
2045 * in Perl 5.12 and later, the additional parameter is a bitmask:
2048 * 2 = eof() <- ARGV magic
2050 * I'll rely on the compiler's trace flow analysis to decide whether to
2051 * actually assign this out here, or punt it into the only block where it is
2052 * used. Doing it out here is DRY on the condition logic.
2057 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2063 if (PL_op->op_flags & OPf_SPECIAL) {
2064 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2068 gv = PL_last_in_gv; /* eof */
2076 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2077 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2080 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2081 if (io && !IoIFP(io)) {
2082 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2084 IoFLAGS(io) &= ~IOf_START;
2085 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2087 sv_setpvs(GvSV(gv), "-");
2089 GvSV(gv) = newSVpvs("-");
2090 SvSETMAGIC(GvSV(gv));
2092 else if (!nextargv(gv))
2097 PUSHs(boolSV(do_eof(gv)));
2107 if (MAXARG != 0 && (TOPs || POPs))
2108 PL_last_in_gv = MUTABLE_GV(POPs);
2115 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2117 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2122 SETERRNO(EBADF,RMS_IFI);
2127 #if LSEEKSIZE > IVSIZE
2128 PUSHn( do_tell(gv) );
2130 PUSHi( do_tell(gv) );
2138 const int whence = POPi;
2139 #if LSEEKSIZE > IVSIZE
2140 const Off_t offset = (Off_t)SvNVx(POPs);
2142 const Off_t offset = (Off_t)SvIVx(POPs);
2145 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2146 IO *const io = GvIO(gv);
2149 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2151 #if LSEEKSIZE > IVSIZE
2152 SV *const offset_sv = newSVnv((NV) offset);
2154 SV *const offset_sv = newSViv(offset);
2157 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2162 if (PL_op->op_type == OP_SEEK)
2163 PUSHs(boolSV(do_seek(gv, offset, whence)));
2165 const Off_t sought = do_sysseek(gv, offset, whence);
2167 PUSHs(&PL_sv_undef);
2169 SV* const sv = sought ?
2170 #if LSEEKSIZE > IVSIZE
2175 : newSVpvn(zero_but_true, ZBTLEN);
2186 /* There seems to be no consensus on the length type of truncate()
2187 * and ftruncate(), both off_t and size_t have supporters. In
2188 * general one would think that when using large files, off_t is
2189 * at least as wide as size_t, so using an off_t should be okay. */
2190 /* XXX Configure probe for the length type of *truncate() needed XXX */
2193 #if Off_t_size > IVSIZE
2198 /* Checking for length < 0 is problematic as the type might or
2199 * might not be signed: if it is not, clever compilers will moan. */
2200 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2203 SV * const sv = POPs;
2208 if (PL_op->op_flags & OPf_SPECIAL
2209 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2210 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2217 TAINT_PROPER("truncate");
2218 if (!(fp = IoIFP(io))) {
2224 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2226 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2232 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2233 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2234 goto do_ftruncate_io;
2237 const char * const name = SvPV_nomg_const_nolen(sv);
2238 TAINT_PROPER("truncate");
2240 if (truncate(name, len) < 0)
2244 const int tmpfd = PerlLIO_open(name, O_RDWR);
2249 if (my_chsize(tmpfd, len) < 0)
2251 PerlLIO_close(tmpfd);
2260 SETERRNO(EBADF,RMS_IFI);
2268 SV * const argsv = POPs;
2269 const unsigned int func = POPu;
2270 const int optype = PL_op->op_type;
2271 GV * const gv = MUTABLE_GV(POPs);
2272 IO * const io = gv ? GvIOn(gv) : NULL;
2276 if (!io || !argsv || !IoIFP(io)) {
2278 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2282 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2285 s = SvPV_force(argsv, len);
2286 need = IOCPARM_LEN(func);
2288 s = Sv_Grow(argsv, need + 1);
2289 SvCUR_set(argsv, need);
2292 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2295 retval = SvIV(argsv);
2296 s = INT2PTR(char*,retval); /* ouch */
2299 TAINT_PROPER(PL_op_desc[optype]);
2301 if (optype == OP_IOCTL)
2303 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2305 DIE(aTHX_ "ioctl is not implemented");
2309 DIE(aTHX_ "fcntl is not implemented");
2311 #if defined(OS2) && defined(__EMX__)
2312 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2314 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2318 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2320 if (s[SvCUR(argsv)] != 17)
2321 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2323 s[SvCUR(argsv)] = 0; /* put our null back */
2324 SvSETMAGIC(argsv); /* Assume it has changed */
2333 PUSHp(zero_but_true, ZBTLEN);
2344 const int argtype = POPi;
2345 GV * const gv = MUTABLE_GV(POPs);
2346 IO *const io = GvIO(gv);
2347 PerlIO *const fp = io ? IoIFP(io) : NULL;
2349 /* XXX Looks to me like io is always NULL at this point */
2351 (void)PerlIO_flush(fp);
2352 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2357 SETERRNO(EBADF,RMS_IFI);
2362 DIE(aTHX_ PL_no_func, "flock()");
2373 const int protocol = POPi;
2374 const int type = POPi;
2375 const int domain = POPi;
2376 GV * const gv = MUTABLE_GV(POPs);
2377 IO * const io = gv ? GvIOn(gv) : NULL;
2382 if (io && IoIFP(io))
2383 do_close(gv, FALSE);
2384 SETERRNO(EBADF,LIB_INVARG);
2389 do_close(gv, FALSE);
2391 TAINT_PROPER("socket");
2392 fd = PerlSock_socket(domain, type, protocol);
2395 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2396 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2397 IoTYPE(io) = IoTYPE_SOCKET;
2398 if (!IoIFP(io) || !IoOFP(io)) {
2399 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2400 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2401 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2404 #if defined(HAS_FCNTL) && defined(F_SETFD)
2405 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2414 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2416 const int protocol = POPi;
2417 const int type = POPi;
2418 const int domain = POPi;
2419 GV * const gv2 = MUTABLE_GV(POPs);
2420 GV * const gv1 = MUTABLE_GV(POPs);
2421 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2422 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2426 report_evil_fh(gv1);
2428 report_evil_fh(gv2);
2430 if (io1 && IoIFP(io1))
2431 do_close(gv1, FALSE);
2432 if (io2 && IoIFP(io2))
2433 do_close(gv2, FALSE);
2438 TAINT_PROPER("socketpair");
2439 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2441 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2442 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2443 IoTYPE(io1) = IoTYPE_SOCKET;
2444 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2445 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2446 IoTYPE(io2) = IoTYPE_SOCKET;
2447 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2448 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2449 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2450 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2451 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2452 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2453 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2456 #if defined(HAS_FCNTL) && defined(F_SETFD)
2457 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2458 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2463 DIE(aTHX_ PL_no_sock_func, "socketpair");
2472 SV * const addrsv = POPs;
2473 /* OK, so on what platform does bind modify addr? */
2475 GV * const gv = MUTABLE_GV(POPs);
2476 IO * const io = GvIOn(gv);
2478 const int op_type = PL_op->op_type;
2480 if (!io || !IoIFP(io))
2483 addr = SvPV_const(addrsv, len);
2484 TAINT_PROPER(PL_op_desc[op_type]);
2485 if ((op_type == OP_BIND
2486 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2487 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2495 SETERRNO(EBADF,SS_IVCHAN);
2502 const int backlog = POPi;
2503 GV * const gv = MUTABLE_GV(POPs);
2504 IO * const io = gv ? GvIOn(gv) : NULL;
2506 if (!io || !IoIFP(io))
2509 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2516 SETERRNO(EBADF,SS_IVCHAN);
2525 char namebuf[MAXPATHLEN];
2526 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2527 Sock_size_t len = sizeof (struct sockaddr_in);
2529 Sock_size_t len = sizeof namebuf;
2531 GV * const ggv = MUTABLE_GV(POPs);
2532 GV * const ngv = MUTABLE_GV(POPs);
2541 if (!gstio || !IoIFP(gstio))
2545 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2548 /* Some platforms indicate zero length when an AF_UNIX client is
2549 * not bound. Simulate a non-zero-length sockaddr structure in
2551 namebuf[0] = 0; /* sun_len */
2552 namebuf[1] = AF_UNIX; /* sun_family */
2560 do_close(ngv, FALSE);
2561 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2562 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2563 IoTYPE(nstio) = IoTYPE_SOCKET;
2564 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2565 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2566 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2567 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2570 #if defined(HAS_FCNTL) && defined(F_SETFD)
2571 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2574 #ifdef __SCO_VERSION__
2575 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2578 PUSHp(namebuf, len);
2582 report_evil_fh(ggv);
2583 SETERRNO(EBADF,SS_IVCHAN);
2593 const int how = POPi;
2594 GV * const gv = MUTABLE_GV(POPs);
2595 IO * const io = GvIOn(gv);
2597 if (!io || !IoIFP(io))
2600 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2605 SETERRNO(EBADF,SS_IVCHAN);
2612 const int optype = PL_op->op_type;
2613 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2614 const unsigned int optname = (unsigned int) POPi;
2615 const unsigned int lvl = (unsigned int) POPi;
2616 GV * const gv = MUTABLE_GV(POPs);
2617 IO * const io = GvIOn(gv);
2621 if (!io || !IoIFP(io))
2624 fd = PerlIO_fileno(IoIFP(io));
2628 (void)SvPOK_only(sv);
2632 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2639 #if defined(__SYMBIAN32__)
2640 # define SETSOCKOPT_OPTION_VALUE_T void *
2642 # define SETSOCKOPT_OPTION_VALUE_T const char *
2644 /* XXX TODO: We need to have a proper type (a Configure probe,
2645 * etc.) for what the C headers think of the third argument of
2646 * setsockopt(), the option_value read-only buffer: is it
2647 * a "char *", or a "void *", const or not. Some compilers
2648 * don't take kindly to e.g. assuming that "char *" implicitly
2649 * promotes to a "void *", or to explicitly promoting/demoting
2650 * consts to non/vice versa. The "const void *" is the SUS
2651 * definition, but that does not fly everywhere for the above
2653 SETSOCKOPT_OPTION_VALUE_T buf;
2657 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2661 aint = (int)SvIV(sv);
2662 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2665 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2675 SETERRNO(EBADF,SS_IVCHAN);
2684 const int optype = PL_op->op_type;
2685 GV * const gv = MUTABLE_GV(POPs);
2686 IO * const io = GvIOn(gv);
2691 if (!io || !IoIFP(io))
2694 sv = sv_2mortal(newSV(257));
2695 (void)SvPOK_only(sv);
2699 fd = PerlIO_fileno(IoIFP(io));
2701 case OP_GETSOCKNAME:
2702 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2705 case OP_GETPEERNAME:
2706 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2708 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2710 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";
2711 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2712 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2713 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2714 sizeof(u_short) + sizeof(struct in_addr))) {
2721 #ifdef BOGUS_GETNAME_RETURN
2722 /* Interactive Unix, getpeername() and getsockname()
2723 does not return valid namelen */
2724 if (len == BOGUS_GETNAME_RETURN)
2725 len = sizeof(struct sockaddr);
2734 SETERRNO(EBADF,SS_IVCHAN);
2753 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2754 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2755 if (PL_op->op_type == OP_LSTAT) {
2756 if (gv != PL_defgv) {
2757 do_fstat_warning_check:
2758 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2759 "lstat() on filehandle%s%"SVf,
2762 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2764 } else if (PL_laststype != OP_LSTAT)
2765 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2766 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2769 if (gv != PL_defgv) {
2773 PL_laststype = OP_STAT;
2774 PL_statgv = gv ? gv : (GV *)io;
2775 sv_setpvs(PL_statname, "");
2782 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2784 } else if (IoDIRP(io)) {
2786 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2789 PL_laststatval = -1;
2792 else PL_laststatval = -1;
2793 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2796 if (PL_laststatval < 0) {
2801 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2802 io = MUTABLE_IO(SvRV(sv));
2803 if (PL_op->op_type == OP_LSTAT)
2804 goto do_fstat_warning_check;
2805 goto do_fstat_have_io;
2808 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2809 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2811 PL_laststype = PL_op->op_type;
2812 if (PL_op->op_type == OP_LSTAT)
2813 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2815 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2816 if (PL_laststatval < 0) {
2817 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2818 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2824 if (gimme != G_ARRAY) {
2825 if (gimme != G_VOID)
2826 XPUSHs(boolSV(max));
2832 mPUSHi(PL_statcache.st_dev);
2833 #if ST_INO_SIZE > IVSIZE
2834 mPUSHn(PL_statcache.st_ino);
2836 # if ST_INO_SIGN <= 0
2837 mPUSHi(PL_statcache.st_ino);
2839 mPUSHu(PL_statcache.st_ino);
2842 mPUSHu(PL_statcache.st_mode);
2843 mPUSHu(PL_statcache.st_nlink);
2845 sv_setuid(PUSHmortal, PL_statcache.st_uid);
2846 sv_setgid(PUSHmortal, PL_statcache.st_gid);
2848 #ifdef USE_STAT_RDEV
2849 mPUSHi(PL_statcache.st_rdev);
2851 PUSHs(newSVpvs_flags("", SVs_TEMP));
2853 #if Off_t_size > IVSIZE
2854 mPUSHn(PL_statcache.st_size);
2856 mPUSHi(PL_statcache.st_size);
2859 mPUSHn(PL_statcache.st_atime);
2860 mPUSHn(PL_statcache.st_mtime);
2861 mPUSHn(PL_statcache.st_ctime);
2863 mPUSHi(PL_statcache.st_atime);
2864 mPUSHi(PL_statcache.st_mtime);
2865 mPUSHi(PL_statcache.st_ctime);
2867 #ifdef USE_STAT_BLOCKS
2868 mPUSHu(PL_statcache.st_blksize);
2869 mPUSHu(PL_statcache.st_blocks);
2871 PUSHs(newSVpvs_flags("", SVs_TEMP));
2872 PUSHs(newSVpvs_flags("", SVs_TEMP));
2878 /* All filetest ops avoid manipulating the perl stack pointer in their main
2879 bodies (since commit d2c4d2d1e22d3125), and return using either
2880 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2881 the only two which manipulate the perl stack. To ensure that no stack
2882 manipulation macros are used, the filetest ops avoid defining a local copy
2883 of the stack pointer with dSP. */
2885 /* If the next filetest is stacked up with this one
2886 (PL_op->op_private & OPpFT_STACKING), we leave
2887 the original argument on the stack for success,
2888 and skip the stacked operators on failure.
2889 The next few macros/functions take care of this.
2893 S_ft_return_false(pTHX_ SV *ret) {
2897 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2901 if (PL_op->op_private & OPpFT_STACKING) {
2902 while (OP_IS_FILETEST(next->op_type)
2903 && next->op_private & OPpFT_STACKED)
2904 next = next->op_next;
2909 PERL_STATIC_INLINE OP *
2910 S_ft_return_true(pTHX_ SV *ret) {
2912 if (PL_op->op_flags & OPf_REF)
2913 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2914 else if (!(PL_op->op_private & OPpFT_STACKING))
2920 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2921 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2922 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2924 #define tryAMAGICftest_MG(chr) STMT_START { \
2925 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2926 && PL_op->op_flags & OPf_KIDS) { \
2927 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2928 if (next) return next; \
2933 S_try_amagic_ftest(pTHX_ char chr) {
2935 SV *const arg = *PL_stack_sp;
2938 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2942 const char tmpchr = chr;
2943 SV * const tmpsv = amagic_call(arg,
2944 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2945 ftest_amg, AMGf_unary);
2950 return SvTRUE(tmpsv)
2951 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2961 /* Not const, because things tweak this below. Not bool, because there's
2962 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2963 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2964 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2965 /* Giving some sort of initial value silences compilers. */
2967 int access_mode = R_OK;
2969 int access_mode = 0;
2972 /* access_mode is never used, but leaving use_access in makes the
2973 conditional compiling below much clearer. */
2976 Mode_t stat_mode = S_IRUSR;
2978 bool effective = FALSE;
2981 switch (PL_op->op_type) {
2982 case OP_FTRREAD: opchar = 'R'; break;
2983 case OP_FTRWRITE: opchar = 'W'; break;
2984 case OP_FTREXEC: opchar = 'X'; break;
2985 case OP_FTEREAD: opchar = 'r'; break;
2986 case OP_FTEWRITE: opchar = 'w'; break;
2987 case OP_FTEEXEC: opchar = 'x'; break;
2989 tryAMAGICftest_MG(opchar);
2991 switch (PL_op->op_type) {
2993 #if !(defined(HAS_ACCESS) && defined(R_OK))
2999 #if defined(HAS_ACCESS) && defined(W_OK)
3004 stat_mode = S_IWUSR;
3008 #if defined(HAS_ACCESS) && defined(X_OK)
3013 stat_mode = S_IXUSR;
3017 #ifdef PERL_EFF_ACCESS
3020 stat_mode = S_IWUSR;
3024 #ifndef PERL_EFF_ACCESS
3031 #ifdef PERL_EFF_ACCESS
3036 stat_mode = S_IXUSR;
3042 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3043 const char *name = SvPV_nolen(*PL_stack_sp);
3045 # ifdef PERL_EFF_ACCESS
3046 result = PERL_EFF_ACCESS(name, access_mode);
3048 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3054 result = access(name, access_mode);
3056 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3067 result = my_stat_flags(0);
3070 if (cando(stat_mode, effective, &PL_statcache))
3079 const int op_type = PL_op->op_type;
3083 case OP_FTIS: opchar = 'e'; break;
3084 case OP_FTSIZE: opchar = 's'; break;
3085 case OP_FTMTIME: opchar = 'M'; break;
3086 case OP_FTCTIME: opchar = 'C'; break;
3087 case OP_FTATIME: opchar = 'A'; break;
3089 tryAMAGICftest_MG(opchar);
3091 result = my_stat_flags(0);
3094 if (op_type == OP_FTIS)
3097 /* You can't dTARGET inside OP_FTIS, because you'll get
3098 "panic: pad_sv po" - the op is not flagged to have a target. */
3102 #if Off_t_size > IVSIZE
3103 sv_setnv(TARG, (NV)PL_statcache.st_size);
3105 sv_setiv(TARG, (IV)PL_statcache.st_size);
3110 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3114 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3118 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3122 return SvTRUE_nomg(TARG)
3123 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3133 switch (PL_op->op_type) {
3134 case OP_FTROWNED: opchar = 'O'; break;
3135 case OP_FTEOWNED: opchar = 'o'; break;
3136 case OP_FTZERO: opchar = 'z'; break;
3137 case OP_FTSOCK: opchar = 'S'; break;
3138 case OP_FTCHR: opchar = 'c'; break;
3139 case OP_FTBLK: opchar = 'b'; break;
3140 case OP_FTFILE: opchar = 'f'; break;
3141 case OP_FTDIR: opchar = 'd'; break;
3142 case OP_FTPIPE: opchar = 'p'; break;
3143 case OP_FTSUID: opchar = 'u'; break;
3144 case OP_FTSGID: opchar = 'g'; break;
3145 case OP_FTSVTX: opchar = 'k'; break;
3147 tryAMAGICftest_MG(opchar);
3149 /* I believe that all these three are likely to be defined on most every
3150 system these days. */
3152 if(PL_op->op_type == OP_FTSUID) {
3157 if(PL_op->op_type == OP_FTSGID) {
3162 if(PL_op->op_type == OP_FTSVTX) {
3167 result = my_stat_flags(0);
3170 switch (PL_op->op_type) {
3172 if (PL_statcache.st_uid == PerlProc_getuid())
3176 if (PL_statcache.st_uid == PerlProc_geteuid())
3180 if (PL_statcache.st_size == 0)
3184 if (S_ISSOCK(PL_statcache.st_mode))
3188 if (S_ISCHR(PL_statcache.st_mode))
3192 if (S_ISBLK(PL_statcache.st_mode))
3196 if (S_ISREG(PL_statcache.st_mode))
3200 if (S_ISDIR(PL_statcache.st_mode))
3204 if (S_ISFIFO(PL_statcache.st_mode))
3209 if (PL_statcache.st_mode & S_ISUID)
3215 if (PL_statcache.st_mode & S_ISGID)
3221 if (PL_statcache.st_mode & S_ISVTX)
3234 tryAMAGICftest_MG('l');
3235 result = my_lstat_flags(0);
3239 if (S_ISLNK(PL_statcache.st_mode))
3252 tryAMAGICftest_MG('t');
3254 if (PL_op->op_flags & OPf_REF)
3257 SV *tmpsv = *PL_stack_sp;
3258 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3259 name = SvPV_nomg(tmpsv, namelen);
3260 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3264 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3265 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3266 else if (name && isDIGIT(*name))
3270 if (PerlLIO_isatty(fd))
3288 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3290 if (PL_op->op_flags & OPf_REF)
3292 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3297 gv = MAYBE_DEREF_GV_nomg(sv);
3301 if (gv == PL_defgv) {
3303 io = SvTYPE(PL_statgv) == SVt_PVIO
3307 goto really_filename;
3312 sv_setpvs(PL_statname, "");
3313 io = GvIO(PL_statgv);
3315 PL_laststatval = -1;
3316 PL_laststype = OP_STAT;
3317 if (io && IoIFP(io)) {
3318 if (! PerlIO_has_base(IoIFP(io)))
3319 DIE(aTHX_ "-T and -B not implemented on filehandles");
3320 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3321 if (PL_laststatval < 0)
3323 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3324 if (PL_op->op_type == OP_FTTEXT)
3329 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3330 i = PerlIO_getc(IoIFP(io));
3332 (void)PerlIO_ungetc(IoIFP(io),i);
3334 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3336 len = PerlIO_get_bufsiz(IoIFP(io));
3337 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3338 /* sfio can have large buffers - limit to 512 */
3343 SETERRNO(EBADF,RMS_IFI);
3345 SETERRNO(EBADF,RMS_IFI);
3350 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3353 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3355 PL_laststatval = -1;
3356 PL_laststype = OP_STAT;
3358 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3360 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3363 PL_laststype = OP_STAT;
3364 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3365 if (PL_laststatval < 0) {
3366 (void)PerlIO_close(fp);
3369 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3370 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3371 (void)PerlIO_close(fp);
3373 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3374 FT_RETURNNO; /* special case NFS directories */
3375 FT_RETURNYES; /* null file is anything */
3380 /* now scan s to look for textiness */
3381 /* XXX ASCII dependent code */
3383 #if defined(DOSISH) || defined(USEMYBINMODE)
3384 /* ignore trailing ^Z on short files */
3385 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3389 for (i = 0; i < len; i++, s++) {
3390 if (!*s) { /* null never allowed in text */
3395 else if (!(isPRINT(*s) || isSPACE(*s)))
3398 else if (*s & 128) {
3400 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3403 /* utf8 characters don't count as odd */
3404 if (UTF8_IS_START(*s)) {
3405 int ulen = UTF8SKIP(s);
3406 if (ulen < len - i) {
3408 for (j = 1; j < ulen; j++) {
3409 if (!UTF8_IS_CONTINUATION(s[j]))
3412 --ulen; /* loop does extra increment */
3422 *s != '\n' && *s != '\r' && *s != '\b' &&
3423 *s != '\t' && *s != '\f' && *s != 27)
3428 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3439 const char *tmps = NULL;
3443 SV * const sv = POPs;
3444 if (PL_op->op_flags & OPf_SPECIAL) {
3445 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3447 else if (!(gv = MAYBE_DEREF_GV(sv)))
3448 tmps = SvPV_nomg_const_nolen(sv);
3451 if( !gv && (!tmps || !*tmps) ) {
3452 HV * const table = GvHVn(PL_envgv);
3455 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3456 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3458 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3463 deprecate("chdir('') or chdir(undef) as chdir()");
3464 tmps = SvPV_nolen_const(*svp);
3468 TAINT_PROPER("chdir");
3473 TAINT_PROPER("chdir");
3476 IO* const io = GvIO(gv);
3479 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3480 } else if (IoIFP(io)) {
3481 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3485 SETERRNO(EBADF, RMS_IFI);
3491 SETERRNO(EBADF,RMS_IFI);
3495 DIE(aTHX_ PL_no_func, "fchdir");
3499 PUSHi( PerlDir_chdir(tmps) >= 0 );
3501 /* Clear the DEFAULT element of ENV so we'll get the new value
3503 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3510 dVAR; dSP; dMARK; dTARGET;
3511 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3522 char * const tmps = POPpx;
3523 TAINT_PROPER("chroot");
3524 PUSHi( chroot(tmps) >= 0 );
3527 DIE(aTHX_ PL_no_func, "chroot");
3535 const char * const tmps2 = POPpconstx;
3536 const char * const tmps = SvPV_nolen_const(TOPs);
3537 TAINT_PROPER("rename");
3539 anum = PerlLIO_rename(tmps, tmps2);
3541 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3542 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3545 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3546 (void)UNLINK(tmps2);
3547 if (!(anum = link(tmps, tmps2)))
3548 anum = UNLINK(tmps);
3556 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3560 const int op_type = PL_op->op_type;
3564 if (op_type == OP_LINK)
3565 DIE(aTHX_ PL_no_func, "link");
3567 # ifndef HAS_SYMLINK
3568 if (op_type == OP_SYMLINK)
3569 DIE(aTHX_ PL_no_func, "symlink");
3573 const char * const tmps2 = POPpconstx;
3574 const char * const tmps = SvPV_nolen_const(TOPs);
3575 TAINT_PROPER(PL_op_desc[op_type]);
3577 # if defined(HAS_LINK)
3578 # if defined(HAS_SYMLINK)
3579 /* Both present - need to choose which. */
3580 (op_type == OP_LINK) ?
3581 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3583 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3584 PerlLIO_link(tmps, tmps2);
3587 # if defined(HAS_SYMLINK)
3588 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3589 symlink(tmps, tmps2);
3594 SETi( result >= 0 );
3601 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3612 char buf[MAXPATHLEN];
3617 len = readlink(tmps, buf, sizeof(buf) - 1);
3624 RETSETUNDEF; /* just pretend it's a normal file */
3628 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3630 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3632 char * const save_filename = filename;
3637 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3639 PERL_ARGS_ASSERT_DOONELINER;
3641 Newx(cmdline, size, char);
3642 my_strlcpy(cmdline, cmd, size);
3643 my_strlcat(cmdline, " ", size);
3644 for (s = cmdline + strlen(cmdline); *filename; ) {
3648 if (s - cmdline < size)
3649 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3650 myfp = PerlProc_popen(cmdline, "r");
3654 SV * const tmpsv = sv_newmortal();
3655 /* Need to save/restore 'PL_rs' ?? */
3656 s = sv_gets(tmpsv, myfp, 0);
3657 (void)PerlProc_pclose(myfp);
3661 #ifdef HAS_SYS_ERRLIST
3666 /* you don't see this */
3667 const char * const errmsg = Strerror(e) ;
3670 if (instr(s, errmsg)) {
3677 #define EACCES EPERM
3679 if (instr(s, "cannot make"))
3680 SETERRNO(EEXIST,RMS_FEX);
3681 else if (instr(s, "existing file"))
3682 SETERRNO(EEXIST,RMS_FEX);
3683 else if (instr(s, "ile exists"))
3684 SETERRNO(EEXIST,RMS_FEX);
3685 else if (instr(s, "non-exist"))
3686 SETERRNO(ENOENT,RMS_FNF);
3687 else if (instr(s, "does not exist"))
3688 SETERRNO(ENOENT,RMS_FNF);
3689 else if (instr(s, "not empty"))
3690 SETERRNO(EBUSY,SS_DEVOFFLINE);
3691 else if (instr(s, "cannot access"))
3692 SETERRNO(EACCES,RMS_PRV);
3694 SETERRNO(EPERM,RMS_PRV);
3697 else { /* some mkdirs return no failure indication */
3698 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3699 if (PL_op->op_type == OP_RMDIR)
3704 SETERRNO(EACCES,RMS_PRV); /* a guess */
3713 /* This macro removes trailing slashes from a directory name.
3714 * Different operating and file systems take differently to
3715 * trailing slashes. According to POSIX 1003.1 1996 Edition
3716 * any number of trailing slashes should be allowed.
3717 * Thusly we snip them away so that even non-conforming
3718 * systems are happy.
3719 * We should probably do this "filtering" for all
3720 * the functions that expect (potentially) directory names:
3721 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3722 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3724 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3725 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3728 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3729 (tmps) = savepvn((tmps), (len)); \
3739 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3741 TRIMSLASHES(tmps,len,copy);
3743 TAINT_PROPER("mkdir");
3745 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3749 SETi( dooneliner("mkdir", tmps) );
3750 oldumask = PerlLIO_umask(0);
3751 PerlLIO_umask(oldumask);
3752 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3767 TRIMSLASHES(tmps,len,copy);
3768 TAINT_PROPER("rmdir");
3770 SETi( PerlDir_rmdir(tmps) >= 0 );
3772 SETi( dooneliner("rmdir", tmps) );
3779 /* Directory calls. */
3783 #if defined(Direntry_t) && defined(HAS_READDIR)
3785 const char * const dirname = POPpconstx;
3786 GV * const gv = MUTABLE_GV(POPs);
3787 IO * const io = GvIOn(gv);
3792 if ((IoIFP(io) || IoOFP(io)))
3793 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3794 "Opening filehandle %"HEKf" also as a directory",
3795 HEKfARG(GvENAME_HEK(gv)) );
3797 PerlDir_close(IoDIRP(io));
3798 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3804 SETERRNO(EBADF,RMS_DIR);
3807 DIE(aTHX_ PL_no_dir_func, "opendir");
3813 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3814 DIE(aTHX_ PL_no_dir_func, "readdir");
3816 #if !defined(I_DIRENT) && !defined(VMS)
3817 Direntry_t *readdir (DIR *);
3823 const I32 gimme = GIMME;
3824 GV * const gv = MUTABLE_GV(POPs);
3825 const Direntry_t *dp;
3826 IO * const io = GvIOn(gv);
3828 if (!io || !IoDIRP(io)) {
3829 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3830 "readdir() attempted on invalid dirhandle %"HEKf,
3831 HEKfARG(GvENAME_HEK(gv)));
3836 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3840 sv = newSVpvn(dp->d_name, dp->d_namlen);
3842 sv = newSVpv(dp->d_name, 0);
3844 if (!(IoFLAGS(io) & IOf_UNTAINT))
3847 } while (gimme == G_ARRAY);
3849 if (!dp && gimme != G_ARRAY)
3856 SETERRNO(EBADF,RMS_ISI);
3857 if (GIMME == G_ARRAY)
3866 #if defined(HAS_TELLDIR) || defined(telldir)
3868 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3869 /* XXX netbsd still seemed to.
3870 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3871 --JHI 1999-Feb-02 */
3872 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3873 long telldir (DIR *);
3875 GV * const gv = MUTABLE_GV(POPs);
3876 IO * const io = GvIOn(gv);
3878 if (!io || !IoDIRP(io)) {
3879 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3880 "telldir() attempted on invalid dirhandle %"HEKf,
3881 HEKfARG(GvENAME_HEK(gv)));
3885 PUSHi( PerlDir_tell(IoDIRP(io)) );
3889 SETERRNO(EBADF,RMS_ISI);
3892 DIE(aTHX_ PL_no_dir_func, "telldir");
3898 #if defined(HAS_SEEKDIR) || defined(seekdir)
3900 const long along = POPl;
3901 GV * const gv = MUTABLE_GV(POPs);
3902 IO * const io = GvIOn(gv);
3904 if (!io || !IoDIRP(io)) {
3905 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3906 "seekdir() attempted on invalid dirhandle %"HEKf,
3907 HEKfARG(GvENAME_HEK(gv)));
3910 (void)PerlDir_seek(IoDIRP(io), along);
3915 SETERRNO(EBADF,RMS_ISI);
3918 DIE(aTHX_ PL_no_dir_func, "seekdir");
3924 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3926 GV * const gv = MUTABLE_GV(POPs);
3927 IO * const io = GvIOn(gv);
3929 if (!io || !IoDIRP(io)) {
3930 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3931 "rewinddir() attempted on invalid dirhandle %"HEKf,
3932 HEKfARG(GvENAME_HEK(gv)));
3935 (void)PerlDir_rewind(IoDIRP(io));
3939 SETERRNO(EBADF,RMS_ISI);
3942 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3948 #if defined(Direntry_t) && defined(HAS_READDIR)
3950 GV * const gv = MUTABLE_GV(POPs);
3951 IO * const io = GvIOn(gv);
3953 if (!io || !IoDIRP(io)) {
3954 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3955 "closedir() attempted on invalid dirhandle %"HEKf,
3956 HEKfARG(GvENAME_HEK(gv)));
3959 #ifdef VOID_CLOSEDIR
3960 PerlDir_close(IoDIRP(io));
3962 if (PerlDir_close(IoDIRP(io)) < 0) {
3963 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3972 SETERRNO(EBADF,RMS_IFI);
3975 DIE(aTHX_ PL_no_dir_func, "closedir");
3979 /* Process control. */
3986 #ifdef HAS_SIGPROCMASK
3987 sigset_t oldmask, newmask;
3991 PERL_FLUSHALL_FOR_CHILD;
3992 #ifdef HAS_SIGPROCMASK
3993 sigfillset(&newmask);
3994 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
3996 childpid = PerlProc_fork();
3997 if (childpid == 0) {
4001 for (sig = 1; sig < SIG_SIZE; sig++)
4002 PL_psig_pend[sig] = 0;
4004 #ifdef HAS_SIGPROCMASK
4007 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4014 #ifdef PERL_USES_PL_PIDSTATUS
4015 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4021 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4026 PERL_FLUSHALL_FOR_CHILD;
4027 childpid = PerlProc_fork();
4033 DIE(aTHX_ PL_no_func, "fork");
4040 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4045 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4046 childpid = wait4pid(-1, &argflags, 0);
4048 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4053 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4054 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4055 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4057 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4062 DIE(aTHX_ PL_no_func, "wait");
4068 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4070 const int optype = POPi;
4071 const Pid_t pid = TOPi;
4075 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4076 result = wait4pid(pid, &argflags, optype);
4078 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4083 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4084 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4085 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4087 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4092 DIE(aTHX_ PL_no_func, "waitpid");
4098 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4099 #if defined(__LIBCATAMOUNT__)
4100 PL_statusvalue = -1;
4109 while (++MARK <= SP) {
4110 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4115 TAINT_PROPER("system");
4117 PERL_FLUSHALL_FOR_CHILD;
4118 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4123 #ifdef HAS_SIGPROCMASK
4124 sigset_t newset, oldset;
4127 if (PerlProc_pipe(pp) >= 0)
4129 #ifdef HAS_SIGPROCMASK
4130 sigemptyset(&newset);
4131 sigaddset(&newset, SIGCHLD);
4132 sigprocmask(SIG_BLOCK, &newset, &oldset);
4134 while ((childpid = PerlProc_fork()) == -1) {
4135 if (errno != EAGAIN) {
4140 PerlLIO_close(pp[0]);
4141 PerlLIO_close(pp[1]);
4143 #ifdef HAS_SIGPROCMASK
4144 sigprocmask(SIG_SETMASK, &oldset, NULL);
4151 Sigsave_t ihand,qhand; /* place to save signals during system() */
4155 PerlLIO_close(pp[1]);
4157 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4158 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4161 result = wait4pid(childpid, &status, 0);
4162 } while (result == -1 && errno == EINTR);
4164 #ifdef HAS_SIGPROCMASK
4165 sigprocmask(SIG_SETMASK, &oldset, NULL);
4167 (void)rsignal_restore(SIGINT, &ihand);
4168 (void)rsignal_restore(SIGQUIT, &qhand);
4170 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4171 do_execfree(); /* free any memory child malloced on fork */
4178 while (n < sizeof(int)) {
4179 n1 = PerlLIO_read(pp[0],
4180 (void*)(((char*)&errkid)+n),
4186 PerlLIO_close(pp[0]);
4187 if (n) { /* Error */
4188 if (n != sizeof(int))
4189 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4190 errno = errkid; /* Propagate errno from kid */
4191 STATUS_NATIVE_CHILD_SET(-1);
4194 XPUSHi(STATUS_CURRENT);
4197 #ifdef HAS_SIGPROCMASK
4198 sigprocmask(SIG_SETMASK, &oldset, NULL);
4201 PerlLIO_close(pp[0]);
4202 #if defined(HAS_FCNTL) && defined(F_SETFD)
4203 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4206 if (PL_op->op_flags & OPf_STACKED) {
4207 SV * const really = *++MARK;
4208 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4210 else if (SP - MARK != 1)
4211 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4213 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4217 #else /* ! FORK or VMS or OS/2 */
4220 if (PL_op->op_flags & OPf_STACKED) {
4221 SV * const really = *++MARK;
4222 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4223 value = (I32)do_aspawn(really, MARK, SP);
4225 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4228 else if (SP - MARK != 1) {
4229 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4230 value = (I32)do_aspawn(NULL, MARK, SP);
4232 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4236 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4238 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4240 STATUS_NATIVE_CHILD_SET(value);
4243 XPUSHi(result ? value : STATUS_CURRENT);
4244 #endif /* !FORK or VMS or OS/2 */
4251 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4256 while (++MARK <= SP) {
4257 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4262 TAINT_PROPER("exec");
4264 PERL_FLUSHALL_FOR_CHILD;
4265 if (PL_op->op_flags & OPf_STACKED) {
4266 SV * const really = *++MARK;
4267 value = (I32)do_aexec(really, MARK, SP);
4269 else if (SP - MARK != 1)
4271 value = (I32)vms_do_aexec(NULL, MARK, SP);
4273 value = (I32)do_aexec(NULL, MARK, SP);
4277 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4279 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4292 XPUSHi( getppid() );
4295 DIE(aTHX_ PL_no_func, "getppid");
4305 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4308 pgrp = (I32)BSD_GETPGRP(pid);
4310 if (pid != 0 && pid != PerlProc_getpid())
4311 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4317 DIE(aTHX_ PL_no_func, "getpgrp()");
4327 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4328 if (MAXARG > 0) pid = TOPs && TOPi;
4334 TAINT_PROPER("setpgrp");
4336 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4338 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4339 || (pid != 0 && pid != PerlProc_getpid()))
4341 DIE(aTHX_ "setpgrp can't take arguments");
4343 SETi( setpgrp() >= 0 );
4344 #endif /* USE_BSDPGRP */
4347 DIE(aTHX_ PL_no_func, "setpgrp()");
4351 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4352 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4354 # define PRIORITY_WHICH_T(which) which
4359 #ifdef HAS_GETPRIORITY
4361 const int who = POPi;
4362 const int which = TOPi;
4363 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4366 DIE(aTHX_ PL_no_func, "getpriority()");
4372 #ifdef HAS_SETPRIORITY
4374 const int niceval = POPi;
4375 const int who = POPi;
4376 const int which = TOPi;
4377 TAINT_PROPER("setpriority");
4378 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4381 DIE(aTHX_ PL_no_func, "setpriority()");
4385 #undef PRIORITY_WHICH_T
4393 XPUSHn( time(NULL) );
4395 XPUSHi( time(NULL) );
4407 (void)PerlProc_times(&PL_timesbuf);
4409 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4410 /* struct tms, though same data */
4414 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4415 if (GIMME == G_ARRAY) {
4416 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4417 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4418 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4426 if (GIMME == G_ARRAY) {
4433 DIE(aTHX_ "times not implemented");
4435 #endif /* HAS_TIMES */
4438 /* The 32 bit int year limits the times we can represent to these
4439 boundaries with a few days wiggle room to account for time zone
4442 /* Sat Jan 3 00:00:00 -2147481748 */
4443 #define TIME_LOWER_BOUND -67768100567755200.0
4444 /* Sun Dec 29 12:00:00 2147483647 */
4445 #define TIME_UPPER_BOUND 67767976233316800.0
4454 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4455 static const char * const dayname[] =
4456 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4457 static const char * const monname[] =
4458 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4459 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4461 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4464 when = (Time64_T)now;
4467 NV input = Perl_floor(POPn);
4468 when = (Time64_T)input;
4469 if (when != input) {
4470 /* diag_listed_as: gmtime(%f) too large */
4471 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4472 "%s(%.0" NVff ") too large", opname, input);
4476 if ( TIME_LOWER_BOUND > when ) {
4477 /* diag_listed_as: gmtime(%f) too small */
4478 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4479 "%s(%.0" NVff ") too small", opname, when);
4482 else if( when > TIME_UPPER_BOUND ) {
4483 /* diag_listed_as: gmtime(%f) too small */
4484 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4485 "%s(%.0" NVff ") too large", opname, when);
4489 if (PL_op->op_type == OP_LOCALTIME)
4490 err = S_localtime64_r(&when, &tmbuf);
4492 err = S_gmtime64_r(&when, &tmbuf);
4496 /* XXX %lld broken for quads */
4497 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4498 "%s(%.0" NVff ") failed", opname, when);
4501 if (GIMME != G_ARRAY) { /* scalar context */
4503 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4504 double year = (double)tmbuf.tm_year + 1900;
4511 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4512 dayname[tmbuf.tm_wday],
4513 monname[tmbuf.tm_mon],
4521 else { /* list context */
4527 mPUSHi(tmbuf.tm_sec);
4528 mPUSHi(tmbuf.tm_min);
4529 mPUSHi(tmbuf.tm_hour);
4530 mPUSHi(tmbuf.tm_mday);
4531 mPUSHi(tmbuf.tm_mon);
4532 mPUSHn(tmbuf.tm_year);
4533 mPUSHi(tmbuf.tm_wday);
4534 mPUSHi(tmbuf.tm_yday);
4535 mPUSHi(tmbuf.tm_isdst);
4546 anum = alarm((unsigned int)anum);
4552 DIE(aTHX_ PL_no_func, "alarm");
4563 (void)time(&lasttime);
4564 if (MAXARG < 1 || (!TOPs && !POPs))
4568 PerlProc_sleep((unsigned int)duration);
4571 XPUSHi(when - lasttime);
4575 /* Shared memory. */
4576 /* Merged with some message passing. */
4580 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4581 dVAR; dSP; dMARK; dTARGET;
4582 const int op_type = PL_op->op_type;
4587 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4590 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4593 value = (I32)(do_semop(MARK, SP) >= 0);
4596 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4604 return Perl_pp_semget(aTHX);
4612 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4613 dVAR; dSP; dMARK; dTARGET;
4614 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4621 DIE(aTHX_ "System V IPC is not implemented on this machine");
4627 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4628 dVAR; dSP; dMARK; dTARGET;
4629 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4637 PUSHp(zero_but_true, ZBTLEN);
4641 return Perl_pp_semget(aTHX);
4645 /* I can't const this further without getting warnings about the types of
4646 various arrays passed in from structures. */
4648 S_space_join_names_mortal(pTHX_ char *const *array)
4652 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4654 if (array && *array) {
4655 target = newSVpvs_flags("", SVs_TEMP);
4657 sv_catpv(target, *array);
4660 sv_catpvs(target, " ");
4663 target = sv_mortalcopy(&PL_sv_no);
4668 /* Get system info. */
4672 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4674 I32 which = PL_op->op_type;
4677 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4678 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4679 struct hostent *gethostbyname(Netdb_name_t);
4680 struct hostent *gethostent(void);
4682 struct hostent *hent = NULL;
4686 if (which == OP_GHBYNAME) {
4687 #ifdef HAS_GETHOSTBYNAME
4688 const char* const name = POPpbytex;
4689 hent = PerlSock_gethostbyname(name);
4691 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4694 else if (which == OP_GHBYADDR) {
4695 #ifdef HAS_GETHOSTBYADDR
4696 const int addrtype = POPi;
4697 SV * const addrsv = POPs;
4699 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4701 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4703 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4707 #ifdef HAS_GETHOSTENT
4708 hent = PerlSock_gethostent();
4710 DIE(aTHX_ PL_no_sock_func, "gethostent");
4713 #ifdef HOST_NOT_FOUND
4715 #ifdef USE_REENTRANT_API
4716 # ifdef USE_GETHOSTENT_ERRNO
4717 h_errno = PL_reentrant_buffer->_gethostent_errno;
4720 STATUS_UNIX_SET(h_errno);
4724 if (GIMME != G_ARRAY) {
4725 PUSHs(sv = sv_newmortal());
4727 if (which == OP_GHBYNAME) {
4729 sv_setpvn(sv, hent->h_addr, hent->h_length);
4732 sv_setpv(sv, (char*)hent->h_name);
4738 mPUSHs(newSVpv((char*)hent->h_name, 0));
4739 PUSHs(space_join_names_mortal(hent->h_aliases));
4740 mPUSHi(hent->h_addrtype);
4741 len = hent->h_length;
4744 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4745 mXPUSHp(*elem, len);
4749 mPUSHp(hent->h_addr, len);
4751 PUSHs(sv_mortalcopy(&PL_sv_no));
4756 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4762 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4764 I32 which = PL_op->op_type;
4766 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4767 struct netent *getnetbyaddr(Netdb_net_t, int);
4768 struct netent *getnetbyname(Netdb_name_t);
4769 struct netent *getnetent(void);
4771 struct netent *nent;
4773 if (which == OP_GNBYNAME){
4774 #ifdef HAS_GETNETBYNAME
4775 const char * const name = POPpbytex;
4776 nent = PerlSock_getnetbyname(name);
4778 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4781 else if (which == OP_GNBYADDR) {
4782 #ifdef HAS_GETNETBYADDR
4783 const int addrtype = POPi;
4784 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4785 nent = PerlSock_getnetbyaddr(addr, addrtype);
4787 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4791 #ifdef HAS_GETNETENT
4792 nent = PerlSock_getnetent();
4794 DIE(aTHX_ PL_no_sock_func, "getnetent");
4797 #ifdef HOST_NOT_FOUND
4799 #ifdef USE_REENTRANT_API
4800 # ifdef USE_GETNETENT_ERRNO
4801 h_errno = PL_reentrant_buffer->_getnetent_errno;
4804 STATUS_UNIX_SET(h_errno);
4809 if (GIMME != G_ARRAY) {
4810 PUSHs(sv = sv_newmortal());
4812 if (which == OP_GNBYNAME)
4813 sv_setiv(sv, (IV)nent->n_net);
4815 sv_setpv(sv, nent->n_name);
4821 mPUSHs(newSVpv(nent->n_name, 0));
4822 PUSHs(space_join_names_mortal(nent->n_aliases));
4823 mPUSHi(nent->n_addrtype);
4824 mPUSHi(nent->n_net);
4829 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4835 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4837 I32 which = PL_op->op_type;
4839 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4840 struct protoent *getprotobyname(Netdb_name_t);
4841 struct protoent *getprotobynumber(int);
4842 struct protoent *getprotoent(void);
4844 struct protoent *pent;
4846 if (which == OP_GPBYNAME) {
4847 #ifdef HAS_GETPROTOBYNAME
4848 const char* const name = POPpbytex;
4849 pent = PerlSock_getprotobyname(name);
4851 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4854 else if (which == OP_GPBYNUMBER) {
4855 #ifdef HAS_GETPROTOBYNUMBER
4856 const int number = POPi;
4857 pent = PerlSock_getprotobynumber(number);
4859 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4863 #ifdef HAS_GETPROTOENT
4864 pent = PerlSock_getprotoent();
4866 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4870 if (GIMME != G_ARRAY) {
4871 PUSHs(sv = sv_newmortal());
4873 if (which == OP_GPBYNAME)
4874 sv_setiv(sv, (IV)pent->p_proto);
4876 sv_setpv(sv, pent->p_name);
4882 mPUSHs(newSVpv(pent->p_name, 0));
4883 PUSHs(space_join_names_mortal(pent->p_aliases));
4884 mPUSHi(pent->p_proto);
4889 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4895 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4897 I32 which = PL_op->op_type;
4899 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4900 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4901 struct servent *getservbyport(int, Netdb_name_t);
4902 struct servent *getservent(void);
4904 struct servent *sent;
4906 if (which == OP_GSBYNAME) {
4907 #ifdef HAS_GETSERVBYNAME
4908 const char * const proto = POPpbytex;
4909 const char * const name = POPpbytex;
4910 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4912 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4915 else if (which == OP_GSBYPORT) {
4916 #ifdef HAS_GETSERVBYPORT
4917 const char * const proto = POPpbytex;
4918 unsigned short port = (unsigned short)POPu;
4919 port = PerlSock_htons(port);
4920 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4922 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4926 #ifdef HAS_GETSERVENT
4927 sent = PerlSock_getservent();
4929 DIE(aTHX_ PL_no_sock_func, "getservent");
4933 if (GIMME != G_ARRAY) {
4934 PUSHs(sv = sv_newmortal());
4936 if (which == OP_GSBYNAME) {
4937 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4940 sv_setpv(sv, sent->s_name);
4946 mPUSHs(newSVpv(sent->s_name, 0));
4947 PUSHs(space_join_names_mortal(sent->s_aliases));
4948 mPUSHi(PerlSock_ntohs(sent->s_port));
4949 mPUSHs(newSVpv(sent->s_proto, 0));
4954 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4961 const int stayopen = TOPi;
4962 switch(PL_op->op_type) {
4964 #ifdef HAS_SETHOSTENT
4965 PerlSock_sethostent(stayopen);
4967 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4970 #ifdef HAS_SETNETENT
4972 PerlSock_setnetent(stayopen);
4974 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4978 #ifdef HAS_SETPROTOENT
4979 PerlSock_setprotoent(stayopen);
4981 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4985 #ifdef HAS_SETSERVENT
4986 PerlSock_setservent(stayopen);
4988 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4998 switch(PL_op->op_type) {
5000 #ifdef HAS_ENDHOSTENT
5001 PerlSock_endhostent();
5003 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5007 #ifdef HAS_ENDNETENT
5008 PerlSock_endnetent();
5010 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5014 #ifdef HAS_ENDPROTOENT
5015 PerlSock_endprotoent();
5017 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5021 #ifdef HAS_ENDSERVENT
5022 PerlSock_endservent();
5024 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5028 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5031 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5035 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5038 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5042 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5045 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5049 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5052 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5064 I32 which = PL_op->op_type;
5066 struct passwd *pwent = NULL;
5068 * We currently support only the SysV getsp* shadow password interface.
5069 * The interface is declared in <shadow.h> and often one needs to link
5070 * with -lsecurity or some such.
5071 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5074 * AIX getpwnam() is clever enough to return the encrypted password
5075 * only if the caller (euid?) is root.
5077 * There are at least three other shadow password APIs. Many platforms
5078 * seem to contain more than one interface for accessing the shadow
5079 * password databases, possibly for compatibility reasons.
5080 * The getsp*() is by far he simplest one, the other two interfaces
5081 * are much more complicated, but also very similar to each other.
5086 * struct pr_passwd *getprpw*();
5087 * The password is in
5088 * char getprpw*(...).ufld.fd_encrypt[]
5089 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5094 * struct es_passwd *getespw*();
5095 * The password is in
5096 * char *(getespw*(...).ufld.fd_encrypt)
5097 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5100 * struct userpw *getuserpw();
5101 * The password is in
5102 * char *(getuserpw(...)).spw_upw_passwd
5103 * (but the de facto standard getpwnam() should work okay)
5105 * Mention I_PROT here so that Configure probes for it.
5107 * In HP-UX for getprpw*() the manual page claims that one should include
5108 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5109 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5110 * and pp_sys.c already includes <shadow.h> if there is such.
5112 * Note that <sys/security.h> is already probed for, but currently
5113 * it is only included in special cases.
5115 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5116 * be preferred interface, even though also the getprpw*() interface
5117 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5118 * One also needs to call set_auth_parameters() in main() before
5119 * doing anything else, whether one is using getespw*() or getprpw*().
5121 * Note that accessing the shadow databases can be magnitudes
5122 * slower than accessing the standard databases.
5127 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5128 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5129 * the pw_comment is left uninitialized. */
5130 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5136 const char* const name = POPpbytex;
5137 pwent = getpwnam(name);
5143 pwent = getpwuid(uid);
5147 # ifdef HAS_GETPWENT
5149 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5150 if (pwent) pwent = getpwnam(pwent->pw_name);
5153 DIE(aTHX_ PL_no_func, "getpwent");
5159 if (GIMME != G_ARRAY) {
5160 PUSHs(sv = sv_newmortal());
5162 if (which == OP_GPWNAM)
5163 sv_setuid(sv, pwent->pw_uid);
5165 sv_setpv(sv, pwent->pw_name);
5171 mPUSHs(newSVpv(pwent->pw_name, 0));
5175 /* If we have getspnam(), we try to dig up the shadow
5176 * password. If we are underprivileged, the shadow
5177 * interface will set the errno to EACCES or similar,
5178 * and return a null pointer. If this happens, we will
5179 * use the dummy password (usually "*" or "x") from the
5180 * standard password database.
5182 * In theory we could skip the shadow call completely
5183 * if euid != 0 but in practice we cannot know which
5184 * security measures are guarding the shadow databases
5185 * on a random platform.
5187 * Resist the urge to use additional shadow interfaces.
5188 * Divert the urge to writing an extension instead.
5191 /* Some AIX setups falsely(?) detect some getspnam(), which
5192 * has a different API than the Solaris/IRIX one. */
5193 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5196 const struct spwd * const spwent = getspnam(pwent->pw_name);
5197 /* Save and restore errno so that
5198 * underprivileged attempts seem
5199 * to have never made the unsuccessful
5200 * attempt to retrieve the shadow password. */
5202 if (spwent && spwent->sp_pwdp)
5203 sv_setpv(sv, spwent->sp_pwdp);
5207 if (!SvPOK(sv)) /* Use the standard password, then. */
5208 sv_setpv(sv, pwent->pw_passwd);
5211 /* passwd is tainted because user himself can diddle with it.
5212 * admittedly not much and in a very limited way, but nevertheless. */
5215 sv_setuid(PUSHmortal, pwent->pw_uid);
5216 sv_setgid(PUSHmortal, pwent->pw_gid);
5218 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5219 * because of the poor interface of the Perl getpw*(),
5220 * not because there's some standard/convention saying so.
5221 * A better interface would have been to return a hash,
5222 * but we are accursed by our history, alas. --jhi. */
5224 mPUSHi(pwent->pw_change);
5227 mPUSHi(pwent->pw_quota);
5230 mPUSHs(newSVpv(pwent->pw_age, 0));
5232 /* I think that you can never get this compiled, but just in case. */
5233 PUSHs(sv_mortalcopy(&PL_sv_no));
5238 /* pw_class and pw_comment are mutually exclusive--.
5239 * see the above note for pw_change, pw_quota, and pw_age. */
5241 mPUSHs(newSVpv(pwent->pw_class, 0));
5244 mPUSHs(newSVpv(pwent->pw_comment, 0));
5246 /* I think that you can never get this compiled, but just in case. */
5247 PUSHs(sv_mortalcopy(&PL_sv_no));
5252 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5254 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5256 /* pw_gecos is tainted because user himself can diddle with it. */
5259 mPUSHs(newSVpv(pwent->pw_dir, 0));
5261 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5262 /* pw_shell is tainted because user himself can diddle with it. */
5266 mPUSHi(pwent->pw_expire);
5271 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5279 const I32 which = PL_op->op_type;
5280 const struct group *grent;
5282 if (which == OP_GGRNAM) {
5283 const char* const name = POPpbytex;
5284 grent = (const struct group *)getgrnam(name);
5286 else if (which == OP_GGRGID) {
5287 const Gid_t gid = POPi;
5288 grent = (const struct group *)getgrgid(gid);
5292 grent = (struct group *)getgrent();
5294 DIE(aTHX_ PL_no_func, "getgrent");
5298 if (GIMME != G_ARRAY) {
5299 SV * const sv = sv_newmortal();
5303 if (which == OP_GGRNAM)
5304 sv_setgid(sv, grent->gr_gid);
5306 sv_setpv(sv, grent->gr_name);
5312 mPUSHs(newSVpv(grent->gr_name, 0));
5315 mPUSHs(newSVpv(grent->gr_passwd, 0));
5317 PUSHs(sv_mortalcopy(&PL_sv_no));
5320 sv_setgid(PUSHmortal, grent->gr_gid);
5322 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5323 /* In UNICOS/mk (_CRAYMPP) the multithreading
5324 * versions (getgrnam_r, getgrgid_r)
5325 * seem to return an illegal pointer
5326 * as the group members list, gr_mem.
5327 * getgrent() doesn't even have a _r version
5328 * but the gr_mem is poisonous anyway.
5329 * So yes, you cannot get the list of group
5330 * members if building multithreaded in UNICOS/mk. */
5331 PUSHs(space_join_names_mortal(grent->gr_mem));
5337 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5347 if (!(tmps = PerlProc_getlogin()))
5349 sv_setpv_mg(TARG, tmps);
5353 DIE(aTHX_ PL_no_func, "getlogin");
5357 /* Miscellaneous. */
5362 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5363 I32 items = SP - MARK;
5364 unsigned long a[20];
5369 while (++MARK <= SP) {
5370 if (SvTAINTED(*MARK)) {
5376 TAINT_PROPER("syscall");
5379 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5380 * or where sizeof(long) != sizeof(char*). But such machines will
5381 * not likely have syscall implemented either, so who cares?
5383 while (++MARK <= SP) {
5384 if (SvNIOK(*MARK) || !i)
5385 a[i++] = SvIV(*MARK);
5386 else if (*MARK == &PL_sv_undef)
5389 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5395 DIE(aTHX_ "Too many args to syscall");
5397 DIE(aTHX_ "Too few args to syscall");
5399 retval = syscall(a[0]);
5402 retval = syscall(a[0],a[1]);
5405 retval = syscall(a[0],a[1],a[2]);
5408 retval = syscall(a[0],a[1],a[2],a[3]);
5411 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5414 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5417 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5420 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5427 DIE(aTHX_ PL_no_func, "syscall");
5431 #ifdef FCNTL_EMULATE_FLOCK
5433 /* XXX Emulate flock() with fcntl().
5434 What's really needed is a good file locking module.
5438 fcntl_emulate_flock(int fd, int operation)
5443 switch (operation & ~LOCK_NB) {
5445 flock.l_type = F_RDLCK;
5448 flock.l_type = F_WRLCK;
5451 flock.l_type = F_UNLCK;
5457 flock.l_whence = SEEK_SET;
5458 flock.l_start = flock.l_len = (Off_t)0;
5460 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5461 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5462 errno = EWOULDBLOCK;
5466 #endif /* FCNTL_EMULATE_FLOCK */
5468 #ifdef LOCKF_EMULATE_FLOCK
5470 /* XXX Emulate flock() with lockf(). This is just to increase
5471 portability of scripts. The calls are not completely
5472 interchangeable. What's really needed is a good file
5476 /* The lockf() constants might have been defined in <unistd.h>.
5477 Unfortunately, <unistd.h> causes troubles on some mixed
5478 (BSD/POSIX) systems, such as SunOS 4.1.3.
5480 Further, the lockf() constants aren't POSIX, so they might not be
5481 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5482 just stick in the SVID values and be done with it. Sigh.
5486 # define F_ULOCK 0 /* Unlock a previously locked region */
5489 # define F_LOCK 1 /* Lock a region for exclusive use */
5492 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5495 # define F_TEST 3 /* Test a region for other processes locks */
5499 lockf_emulate_flock(int fd, int operation)
5505 /* flock locks entire file so for lockf we need to do the same */
5506 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5507 if (pos > 0) /* is seekable and needs to be repositioned */
5508 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5509 pos = -1; /* seek failed, so don't seek back afterwards */
5512 switch (operation) {
5514 /* LOCK_SH - get a shared lock */
5516 /* LOCK_EX - get an exclusive lock */
5518 i = lockf (fd, F_LOCK, 0);
5521 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5522 case LOCK_SH|LOCK_NB:
5523 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5524 case LOCK_EX|LOCK_NB:
5525 i = lockf (fd, F_TLOCK, 0);
5527 if ((errno == EAGAIN) || (errno == EACCES))
5528 errno = EWOULDBLOCK;
5531 /* LOCK_UN - unlock (non-blocking is a no-op) */
5533 case LOCK_UN|LOCK_NB:
5534 i = lockf (fd, F_ULOCK, 0);
5537 /* Default - can't decipher operation */
5544 if (pos > 0) /* need to restore position of the handle */
5545 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5550 #endif /* LOCKF_EMULATE_FLOCK */
5554 * c-indentation-style: bsd
5556 * indent-tabs-mode: nil
5559 * ex: set ts=8 sts=4 sw=4 et: