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));
479 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
481 if (SP - MARK != 1) {
483 do_join(TARG, &PL_sv_no, MARK, SP);
491 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
492 /* well-formed exception supplied */
495 SV * const errsv = ERRSV;
499 if (sv_isobject(exsv)) {
500 HV * const stash = SvSTASH(SvRV(exsv));
501 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
503 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
504 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
511 call_sv(MUTABLE_SV(GvCV(gv)),
512 G_SCALAR|G_EVAL|G_KEEPERR);
513 exsv = sv_mortalcopy(*PL_stack_sp--);
517 else if (SvPOK(errsv) && SvCUR(errsv)) {
518 exsv = sv_mortalcopy(errsv);
519 sv_catpvs(exsv, "\t...propagated");
522 exsv = newSVpvs_flags("Died", SVs_TEMP);
531 Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv,
532 const MAGIC *const mg, const U32 flags, U32 argc, ...)
537 PERL_ARGS_ASSERT_TIED_METHOD;
539 /* Ensure that our flag bits do not overlap. */
540 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
541 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
542 assert((TIED_METHOD_SAY & G_WANT) == 0);
544 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
545 PUSHSTACKi(PERLSI_MAGIC);
546 EXTEND(SP, argc+1); /* object + args */
548 PUSHs(SvTIED_obj(sv, mg));
549 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
550 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
554 const U32 mortalize_not_needed
555 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
557 va_start(args, argc);
559 SV *const arg = va_arg(args, SV *);
560 if(mortalize_not_needed)
569 ENTER_with_name("call_tied_method");
570 if (flags & TIED_METHOD_SAY) {
571 /* local $\ = "\n" */
572 SAVEGENERICSV(PL_ors_sv);
573 PL_ors_sv = newSVpvs("\n");
575 ret_args = call_sv(methname, (flags & G_WANT)|G_METHOD_NAMED);
580 if (ret_args) { /* copy results back to original stack */
581 EXTEND(sp, ret_args);
582 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
586 LEAVE_with_name("call_tied_method");
590 #define tied_method0(a,b,c,d) \
591 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
592 #define tied_method1(a,b,c,d,e) \
593 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
594 #define tied_method2(a,b,c,d,e,f) \
595 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
608 GV * const gv = MUTABLE_GV(*++MARK);
610 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
611 DIE(aTHX_ PL_no_usym, "filehandle");
613 if ((io = GvIOp(gv))) {
615 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
618 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
619 "Opening dirhandle %"HEKf" also as a file",
620 HEKfARG(GvENAME_HEK(gv)));
622 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
624 /* Method's args are same as ours ... */
625 /* ... except handle is replaced by the object */
626 return Perl_tied_method(aTHX_ SV_CONST(OPEN), mark - 1, MUTABLE_SV(io), mg,
627 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
639 tmps = SvPV_const(sv, len);
640 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
643 PUSHi( (I32)PL_forkprocess );
644 else if (PL_forkprocess == 0) /* we are a new child */
655 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
661 IO * const io = GvIO(gv);
663 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
665 return tied_method0(SV_CONST(CLOSE), SP, MUTABLE_SV(io), mg);
669 PUSHs(boolSV(do_close(gv, TRUE)));
682 GV * const wgv = MUTABLE_GV(POPs);
683 GV * const rgv = MUTABLE_GV(POPs);
688 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
689 DIE(aTHX_ PL_no_usym, "filehandle");
694 do_close(rgv, FALSE);
696 do_close(wgv, FALSE);
698 if (PerlProc_pipe(fd) < 0)
701 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
702 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
703 IoOFP(rstio) = IoIFP(rstio);
704 IoIFP(wstio) = IoOFP(wstio);
705 IoTYPE(rstio) = IoTYPE_RDONLY;
706 IoTYPE(wstio) = IoTYPE_WRONLY;
708 if (!IoIFP(rstio) || !IoOFP(wstio)) {
710 PerlIO_close(IoIFP(rstio));
712 PerlLIO_close(fd[0]);
714 PerlIO_close(IoOFP(wstio));
716 PerlLIO_close(fd[1]);
719 #if defined(HAS_FCNTL) && defined(F_SETFD)
720 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
721 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
728 DIE(aTHX_ PL_no_func, "pipe");
742 gv = MUTABLE_GV(POPs);
746 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
748 return tied_method0(SV_CONST(FILENO), SP, MUTABLE_SV(io), mg);
751 if (!io || !(fp = IoIFP(io))) {
752 /* Can't do this because people seem to do things like
753 defined(fileno($foo)) to check whether $foo is a valid fh.
760 PUSHi(PerlIO_fileno(fp));
772 if (MAXARG < 1 || (!TOPs && !POPs)) {
773 anum = PerlLIO_umask(022);
774 /* setting it to 022 between the two calls to umask avoids
775 * to have a window where the umask is set to 0 -- meaning
776 * that another thread could create world-writeable files. */
778 (void)PerlLIO_umask(anum);
781 anum = PerlLIO_umask(POPi);
782 TAINT_PROPER("umask");
785 /* Only DIE if trying to restrict permissions on "user" (self).
786 * Otherwise it's harmless and more useful to just return undef
787 * since 'group' and 'other' concepts probably don't exist here. */
788 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
789 DIE(aTHX_ "umask not implemented");
790 XPUSHs(&PL_sv_undef);
809 gv = MUTABLE_GV(POPs);
813 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
815 /* This takes advantage of the implementation of the varargs
816 function, which I don't think that the optimiser will be able to
817 figure out. Although, as it's a static function, in theory it
819 return Perl_tied_method(aTHX_ SV_CONST(BINMODE), SP, MUTABLE_SV(io), mg,
820 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
821 discp ? 1 : 0, discp);
825 if (!io || !(fp = IoIFP(io))) {
827 SETERRNO(EBADF,RMS_IFI);
834 const char *d = NULL;
837 d = SvPV_const(discp, len);
838 mode = mode_from_discipline(d, len);
839 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
840 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
841 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
862 const I32 markoff = MARK - PL_stack_base;
863 const char *methname;
864 int how = PERL_MAGIC_tied;
868 switch(SvTYPE(varsv)) {
872 methname = "TIEHASH";
873 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
874 HvLAZYDEL_off(varsv);
875 hv_free_ent((HV *)varsv, entry);
877 HvEITER_set(MUTABLE_HV(varsv), 0);
881 methname = "TIEARRAY";
882 if (!AvREAL(varsv)) {
884 Perl_croak(aTHX_ "Cannot tie unreifiable array");
885 av_clear((AV *)varsv);
892 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
893 methname = "TIEHANDLE";
894 how = PERL_MAGIC_tiedscalar;
895 /* For tied filehandles, we apply tiedscalar magic to the IO
896 slot of the GP rather than the GV itself. AMS 20010812 */
898 GvIOp(varsv) = newIO();
899 varsv = MUTABLE_SV(GvIOp(varsv));
902 if (SvTYPE(varsv) == SVt_PVLV && LvTYPE(varsv) == 'y') {
903 vivify_defelem(varsv);
904 varsv = LvTARG(varsv);
908 methname = "TIESCALAR";
909 how = PERL_MAGIC_tiedscalar;
913 if (sv_isobject(*MARK)) { /* Calls GET magic. */
914 ENTER_with_name("call_TIE");
915 PUSHSTACKi(PERLSI_MAGIC);
917 EXTEND(SP,(I32)items);
921 call_method(methname, G_SCALAR);
924 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
925 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
926 * wrong error message, and worse case, supreme action at a distance.
927 * (Sorry obfuscation writers. You're not going to be given this one.)
929 stash = gv_stashsv(*MARK, 0);
930 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
931 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
932 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
934 ENTER_with_name("call_TIE");
935 PUSHSTACKi(PERLSI_MAGIC);
937 EXTEND(SP,(I32)items);
941 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
947 if (sv_isobject(sv)) {
948 sv_unmagic(varsv, how);
949 /* Croak if a self-tie on an aggregate is attempted. */
950 if (varsv == SvRV(sv) &&
951 (SvTYPE(varsv) == SVt_PVAV ||
952 SvTYPE(varsv) == SVt_PVHV))
954 "Self-ties of arrays and hashes are not supported");
955 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
957 LEAVE_with_name("call_TIE");
958 SP = PL_stack_base + markoff;
968 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
969 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
971 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
974 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
975 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
977 if ((mg = SvTIED_mg(sv, how))) {
978 SV * const obj = SvRV(SvTIED_obj(sv, mg));
980 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
982 if (gv && isGV(gv) && (cv = GvCV(gv))) {
984 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
985 mXPUSHi(SvREFCNT(obj) - 1);
987 ENTER_with_name("call_UNTIE");
988 call_sv(MUTABLE_SV(cv), G_VOID);
989 LEAVE_with_name("call_UNTIE");
992 else if (mg && SvREFCNT(obj) > 1) {
993 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
994 "untie attempted while %"UVuf" inner references still exist",
995 (UV)SvREFCNT(obj) - 1 ) ;
999 sv_unmagic(sv, how) ;
1009 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1010 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1012 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1015 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1016 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
1018 if ((mg = SvTIED_mg(sv, how))) {
1019 PUSHs(SvTIED_obj(sv, mg));
1032 HV * const hv = MUTABLE_HV(POPs);
1033 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1034 stash = gv_stashsv(sv, 0);
1035 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1037 require_pv("AnyDBM_File.pm");
1039 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1040 DIE(aTHX_ "No dbm on this machine");
1050 mPUSHu(O_RDWR|O_CREAT);
1054 if (!SvOK(right)) right = &PL_sv_no;
1058 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1061 if (!sv_isobject(TOPs)) {
1069 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1073 if (sv_isobject(TOPs)) {
1074 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1075 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1092 struct timeval timebuf;
1093 struct timeval *tbuf = &timebuf;
1096 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1101 # if BYTEORDER & 0xf0000
1102 # define ORDERBYTE (0x88888888 - BYTEORDER)
1104 # define ORDERBYTE (0x4444 - BYTEORDER)
1110 for (i = 1; i <= 3; i++) {
1111 SV * const sv = SP[i];
1115 if (SvREADONLY(sv)) {
1116 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1117 Perl_croak_no_modify();
1119 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1122 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1123 "Non-string passed as bitmask");
1124 SvPV_force_nomg_nolen(sv); /* force string conversion */
1131 /* little endians can use vecs directly */
1132 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1139 masksize = NFDBITS / NBBY;
1141 masksize = sizeof(long); /* documented int, everyone seems to use long */
1143 Zero(&fd_sets[0], 4, char*);
1146 # if SELECT_MIN_BITS == 1
1147 growsize = sizeof(fd_set);
1149 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1150 # undef SELECT_MIN_BITS
1151 # define SELECT_MIN_BITS __FD_SETSIZE
1153 /* If SELECT_MIN_BITS is greater than one we most probably will want
1154 * to align the sizes with SELECT_MIN_BITS/8 because for example
1155 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1156 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1157 * on (sets/tests/clears bits) is 32 bits. */
1158 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1166 timebuf.tv_sec = (long)value;
1167 value -= (NV)timebuf.tv_sec;
1168 timebuf.tv_usec = (long)(value * 1000000.0);
1173 for (i = 1; i <= 3; i++) {
1175 if (!SvOK(sv) || SvCUR(sv) == 0) {
1182 Sv_Grow(sv, growsize);
1186 while (++j <= growsize) {
1190 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1192 Newx(fd_sets[i], growsize, char);
1193 for (offset = 0; offset < growsize; offset += masksize) {
1194 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1195 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1198 fd_sets[i] = SvPVX(sv);
1202 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1203 /* Can't make just the (void*) conditional because that would be
1204 * cpp #if within cpp macro, and not all compilers like that. */
1205 nfound = PerlSock_select(
1207 (Select_fd_set_t) fd_sets[1],
1208 (Select_fd_set_t) fd_sets[2],
1209 (Select_fd_set_t) fd_sets[3],
1210 (void*) tbuf); /* Workaround for compiler bug. */
1212 nfound = PerlSock_select(
1214 (Select_fd_set_t) fd_sets[1],
1215 (Select_fd_set_t) fd_sets[2],
1216 (Select_fd_set_t) fd_sets[3],
1219 for (i = 1; i <= 3; i++) {
1222 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1224 for (offset = 0; offset < growsize; offset += masksize) {
1225 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1226 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1228 Safefree(fd_sets[i]);
1235 if (GIMME == G_ARRAY && tbuf) {
1236 value = (NV)(timebuf.tv_sec) +
1237 (NV)(timebuf.tv_usec) / 1000000.0;
1242 DIE(aTHX_ "select not implemented");
1247 =for apidoc setdefout
1249 Sets PL_defoutgv, the default file handle for output, to the passed in
1250 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1251 count of the passed in typeglob is increased by one, and the reference count
1252 of the typeglob that PL_defoutgv points to is decreased by one.
1258 Perl_setdefout(pTHX_ GV *gv)
1261 PERL_ARGS_ASSERT_SETDEFOUT;
1262 SvREFCNT_inc_simple_void_NN(gv);
1263 SvREFCNT_dec(PL_defoutgv);
1271 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1272 GV * egv = GvEGVx(PL_defoutgv);
1277 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1278 gvp = hv && HvENAME(hv)
1279 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1281 if (gvp && *gvp == egv) {
1282 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1286 mXPUSHs(newRV(MUTABLE_SV(egv)));
1290 if (!GvIO(newdefout))
1291 gv_IOadd(newdefout);
1292 setdefout(newdefout);
1302 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1303 IO *const io = GvIO(gv);
1309 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1311 const U32 gimme = GIMME_V;
1312 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1313 if (gimme == G_SCALAR) {
1315 SvSetMagicSV_nosteal(TARG, TOPs);
1320 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1321 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1323 SETERRNO(EBADF,RMS_IFI);
1327 sv_setpvs(TARG, " ");
1328 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1329 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1330 /* Find out how many bytes the char needs */
1331 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1334 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1335 SvCUR_set(TARG,1+len);
1344 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1348 const I32 gimme = GIMME_V;
1350 PERL_ARGS_ASSERT_DOFORM;
1352 if (cv && CvCLONE(cv))
1353 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1358 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1359 PUSHFORMAT(cx, retop);
1360 if (CvDEPTH(cv) >= 2) {
1361 PERL_STACK_OVERFLOW_CHECK();
1362 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1365 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1367 setdefout(gv); /* locally select filehandle so $% et al work */
1386 gv = MUTABLE_GV(POPs);
1403 tmpsv = sv_newmortal();
1404 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1405 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1407 IoFLAGS(io) &= ~IOf_DIDTOP;
1408 RETURNOP(doform(cv,gv,PL_op->op_next));
1414 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1415 IO * const io = GvIOp(gv);
1423 if (!io || !(ofp = IoOFP(io)))
1426 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1427 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1429 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1430 PL_formtarget != PL_toptarget)
1434 if (!IoTOP_GV(io)) {
1437 if (!IoTOP_NAME(io)) {
1439 if (!IoFMT_NAME(io))
1440 IoFMT_NAME(io) = savepv(GvNAME(gv));
1441 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1442 HEKfARG(GvNAME_HEK(gv))));
1443 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1444 if ((topgv && GvFORM(topgv)) ||
1445 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1446 IoTOP_NAME(io) = savesvpv(topname);
1448 IoTOP_NAME(io) = savepvs("top");
1450 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1451 if (!topgv || !GvFORM(topgv)) {
1452 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1455 IoTOP_GV(io) = topgv;
1457 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1458 I32 lines = IoLINES_LEFT(io);
1459 const char *s = SvPVX_const(PL_formtarget);
1460 if (lines <= 0) /* Yow, header didn't even fit!!! */
1462 while (lines-- > 0) {
1463 s = strchr(s, '\n');
1469 const STRLEN save = SvCUR(PL_formtarget);
1470 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1471 do_print(PL_formtarget, ofp);
1472 SvCUR_set(PL_formtarget, save);
1473 sv_chop(PL_formtarget, s);
1474 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1477 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1478 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1479 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1481 PL_formtarget = PL_toptarget;
1482 IoFLAGS(io) |= IOf_DIDTOP;
1484 assert(fgv); /* IoTOP_GV(io) should have been set above */
1487 SV * const sv = sv_newmortal();
1488 gv_efullname4(sv, fgv, NULL, FALSE);
1489 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1491 return doform(cv, gv, PL_op);
1495 POPBLOCK(cx,PL_curpm);
1496 retop = cx->blk_sub.retop;
1498 SP = newsp; /* ignore retval of formline */
1501 if (!io || !(fp = IoOFP(io))) {
1502 if (io && IoIFP(io))
1503 report_wrongway_fh(gv, '<');
1509 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1510 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1512 if (!do_print(PL_formtarget, fp))
1515 FmLINES(PL_formtarget) = 0;
1516 SvCUR_set(PL_formtarget, 0);
1517 *SvEND(PL_formtarget) = '\0';
1518 if (IoFLAGS(io) & IOf_FLUSH)
1519 (void)PerlIO_flush(fp);
1523 PL_formtarget = PL_bodytarget;
1524 PERL_UNUSED_VAR(gimme);
1530 dVAR; dSP; dMARK; dORIGMARK;
1534 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1535 IO *const io = GvIO(gv);
1537 /* Treat empty list as "" */
1538 if (MARK == SP) XPUSHs(&PL_sv_no);
1541 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1543 if (MARK == ORIGMARK) {
1546 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1549 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1551 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1558 SETERRNO(EBADF,RMS_IFI);
1561 else if (!(fp = IoOFP(io))) {
1563 report_wrongway_fh(gv, '<');
1564 else if (ckWARN(WARN_CLOSED))
1566 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1570 SV *sv = sv_newmortal();
1571 do_sprintf(sv, SP - MARK, MARK + 1);
1572 if (!do_print(sv, fp))
1575 if (IoFLAGS(io) & IOf_FLUSH)
1576 if (PerlIO_flush(fp) == EOF)
1585 PUSHs(&PL_sv_undef);
1593 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1594 const int mode = POPi;
1595 SV * const sv = POPs;
1596 GV * const gv = MUTABLE_GV(POPs);
1599 /* Need TIEHANDLE method ? */
1600 const char * const tmps = SvPV_const(sv, len);
1601 /* FIXME? do_open should do const */
1602 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1603 IoLINES(GvIOp(gv)) = 0;
1607 PUSHs(&PL_sv_undef);
1614 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1628 bool charstart = FALSE;
1629 STRLEN charskip = 0;
1632 GV * const gv = MUTABLE_GV(*++MARK);
1633 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1634 && gv && (io = GvIO(gv)) )
1636 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1638 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1639 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1648 sv_setpvs(bufsv, "");
1649 length = SvIVx(*++MARK);
1651 DIE(aTHX_ "Negative length");
1654 offset = SvIVx(*++MARK);
1658 if (!io || !IoIFP(io)) {
1660 SETERRNO(EBADF,RMS_IFI);
1663 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1664 buffer = SvPVutf8_force(bufsv, blen);
1665 /* UTF-8 may not have been set if they are all low bytes */
1670 buffer = SvPV_force(bufsv, blen);
1671 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1673 if (DO_UTF8(bufsv)) {
1674 blen = sv_len_utf8_nomg(bufsv);
1683 if (PL_op->op_type == OP_RECV) {
1684 Sock_size_t bufsize;
1685 char namebuf[MAXPATHLEN];
1686 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1687 bufsize = sizeof (struct sockaddr_in);
1689 bufsize = sizeof namebuf;
1691 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1695 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1696 /* 'offset' means 'flags' here */
1697 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1698 (struct sockaddr *)namebuf, &bufsize);
1701 /* MSG_TRUNC can give oversized count; quietly lose it */
1704 SvCUR_set(bufsv, count);
1705 *SvEND(bufsv) = '\0';
1706 (void)SvPOK_only(bufsv);
1710 /* This should not be marked tainted if the fp is marked clean */
1711 if (!(IoFLAGS(io) & IOf_UNTAINT))
1712 SvTAINTED_on(bufsv);
1714 sv_setpvn(TARG, namebuf, bufsize);
1720 if (-offset > (SSize_t)blen)
1721 DIE(aTHX_ "Offset outside string");
1724 if (DO_UTF8(bufsv)) {
1725 /* convert offset-as-chars to offset-as-bytes */
1726 if (offset >= (SSize_t)blen)
1727 offset += SvCUR(bufsv) - blen;
1729 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1732 orig_size = SvCUR(bufsv);
1733 /* Allocating length + offset + 1 isn't perfect in the case of reading
1734 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1736 (should be 2 * length + offset + 1, or possibly something longer if
1737 PL_encoding is true) */
1738 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1739 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1740 Zero(buffer+orig_size, offset-orig_size, char);
1742 buffer = buffer + offset;
1744 read_target = bufsv;
1746 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1747 concatenate it to the current buffer. */
1749 /* Truncate the existing buffer to the start of where we will be
1751 SvCUR_set(bufsv, offset);
1753 read_target = sv_newmortal();
1754 SvUPGRADE(read_target, SVt_PV);
1755 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1758 if (PL_op->op_type == OP_SYSREAD) {
1759 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1760 if (IoTYPE(io) == IoTYPE_SOCKET) {
1761 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1767 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1773 count = PerlIO_read(IoIFP(io), buffer, length);
1774 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1775 if (count == 0 && PerlIO_error(IoIFP(io)))
1779 if (IoTYPE(io) == IoTYPE_WRONLY)
1780 report_wrongway_fh(gv, '>');
1783 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1784 *SvEND(read_target) = '\0';
1785 (void)SvPOK_only(read_target);
1786 if (fp_utf8 && !IN_BYTES) {
1787 /* Look at utf8 we got back and count the characters */
1788 const char *bend = buffer + count;
1789 while (buffer < bend) {
1791 skip = UTF8SKIP(buffer);
1794 if (buffer - charskip + skip > bend) {
1795 /* partial character - try for rest of it */
1796 length = skip - (bend-buffer);
1797 offset = bend - SvPVX_const(bufsv);
1809 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1810 provided amount read (count) was what was requested (length)
1812 if (got < wanted && count == length) {
1813 length = wanted - got;
1814 offset = bend - SvPVX_const(bufsv);
1817 /* return value is character count */
1821 else if (buffer_utf8) {
1822 /* Let svcatsv upgrade the bytes we read in to utf8.
1823 The buffer is a mortal so will be freed soon. */
1824 sv_catsv_nomg(bufsv, read_target);
1827 /* This should not be marked tainted if the fp is marked clean */
1828 if (!(IoFLAGS(io) & IOf_UNTAINT))
1829 SvTAINTED_on(bufsv);
1841 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1846 STRLEN orig_blen_bytes;
1847 const int op_type = PL_op->op_type;
1850 GV *const gv = MUTABLE_GV(*++MARK);
1851 IO *const io = GvIO(gv);
1853 if (op_type == OP_SYSWRITE && io) {
1854 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1856 if (MARK == SP - 1) {
1858 mXPUSHi(sv_len(sv));
1862 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1863 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1873 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1875 if (io && IoIFP(io))
1876 report_wrongway_fh(gv, '<');
1879 SETERRNO(EBADF,RMS_IFI);
1883 /* Do this first to trigger any overloading. */
1884 buffer = SvPV_const(bufsv, blen);
1885 orig_blen_bytes = blen;
1886 doing_utf8 = DO_UTF8(bufsv);
1888 if (PerlIO_isutf8(IoIFP(io))) {
1889 if (!SvUTF8(bufsv)) {
1890 /* We don't modify the original scalar. */
1891 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1892 buffer = (char *) tmpbuf;
1896 else if (doing_utf8) {
1897 STRLEN tmplen = blen;
1898 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1901 buffer = (char *) tmpbuf;
1905 assert((char *)result == buffer);
1906 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1911 if (op_type == OP_SEND) {
1912 const int flags = SvIVx(*++MARK);
1915 char * const sockbuf = SvPVx(*++MARK, mlen);
1916 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1917 flags, (struct sockaddr *)sockbuf, mlen);
1921 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1927 Size_t length = 0; /* This length is in characters. */
1933 /* The SV is bytes, and we've had to upgrade it. */
1934 blen_chars = orig_blen_bytes;
1936 /* The SV really is UTF-8. */
1937 /* Don't call sv_len_utf8 on a magical or overloaded
1938 scalar, as we might get back a different result. */
1939 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1946 length = blen_chars;
1948 #if Size_t_size > IVSIZE
1949 length = (Size_t)SvNVx(*++MARK);
1951 length = (Size_t)SvIVx(*++MARK);
1953 if ((SSize_t)length < 0) {
1955 DIE(aTHX_ "Negative length");
1960 offset = SvIVx(*++MARK);
1962 if (-offset > (IV)blen_chars) {
1964 DIE(aTHX_ "Offset outside string");
1966 offset += blen_chars;
1967 } else if (offset > (IV)blen_chars) {
1969 DIE(aTHX_ "Offset outside string");
1973 if (length > blen_chars - offset)
1974 length = blen_chars - offset;
1976 /* Here we convert length from characters to bytes. */
1977 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1978 /* Either we had to convert the SV, or the SV is magical, or
1979 the SV has overloading, in which case we can't or mustn't
1980 or mustn't call it again. */
1982 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1983 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1985 /* It's a real UTF-8 SV, and it's not going to change under
1986 us. Take advantage of any cache. */
1988 I32 len_I32 = length;
1990 /* Convert the start and end character positions to bytes.
1991 Remember that the second argument to sv_pos_u2b is relative
1993 sv_pos_u2b(bufsv, &start, &len_I32);
2000 buffer = buffer+offset;
2002 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2003 if (IoTYPE(io) == IoTYPE_SOCKET) {
2004 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2010 /* See the note at doio.c:do_print about filesize limits. --jhi */
2011 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2020 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2023 #if Size_t_size > IVSIZE
2043 * in Perl 5.12 and later, the additional parameter is a bitmask:
2046 * 2 = eof() <- ARGV magic
2048 * I'll rely on the compiler's trace flow analysis to decide whether to
2049 * actually assign this out here, or punt it into the only block where it is
2050 * used. Doing it out here is DRY on the condition logic.
2055 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2061 if (PL_op->op_flags & OPf_SPECIAL) {
2062 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2066 gv = PL_last_in_gv; /* eof */
2074 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2075 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2078 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2079 if (io && !IoIFP(io)) {
2080 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2082 IoFLAGS(io) &= ~IOf_START;
2083 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2085 sv_setpvs(GvSV(gv), "-");
2087 GvSV(gv) = newSVpvs("-");
2088 SvSETMAGIC(GvSV(gv));
2090 else if (!nextargv(gv))
2095 PUSHs(boolSV(do_eof(gv)));
2105 if (MAXARG != 0 && (TOPs || POPs))
2106 PL_last_in_gv = MUTABLE_GV(POPs);
2113 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2115 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2120 SETERRNO(EBADF,RMS_IFI);
2125 #if LSEEKSIZE > IVSIZE
2126 PUSHn( do_tell(gv) );
2128 PUSHi( do_tell(gv) );
2136 const int whence = POPi;
2137 #if LSEEKSIZE > IVSIZE
2138 const Off_t offset = (Off_t)SvNVx(POPs);
2140 const Off_t offset = (Off_t)SvIVx(POPs);
2143 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2144 IO *const io = GvIO(gv);
2147 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2149 #if LSEEKSIZE > IVSIZE
2150 SV *const offset_sv = newSVnv((NV) offset);
2152 SV *const offset_sv = newSViv(offset);
2155 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2160 if (PL_op->op_type == OP_SEEK)
2161 PUSHs(boolSV(do_seek(gv, offset, whence)));
2163 const Off_t sought = do_sysseek(gv, offset, whence);
2165 PUSHs(&PL_sv_undef);
2167 SV* const sv = sought ?
2168 #if LSEEKSIZE > IVSIZE
2173 : newSVpvn(zero_but_true, ZBTLEN);
2184 /* There seems to be no consensus on the length type of truncate()
2185 * and ftruncate(), both off_t and size_t have supporters. In
2186 * general one would think that when using large files, off_t is
2187 * at least as wide as size_t, so using an off_t should be okay. */
2188 /* XXX Configure probe for the length type of *truncate() needed XXX */
2191 #if Off_t_size > IVSIZE
2196 /* Checking for length < 0 is problematic as the type might or
2197 * might not be signed: if it is not, clever compilers will moan. */
2198 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2201 SV * const sv = POPs;
2206 if (PL_op->op_flags & OPf_SPECIAL
2207 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2208 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2215 TAINT_PROPER("truncate");
2216 if (!(fp = IoIFP(io))) {
2222 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2224 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2230 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2231 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2232 goto do_ftruncate_io;
2235 const char * const name = SvPV_nomg_const_nolen(sv);
2236 TAINT_PROPER("truncate");
2238 if (truncate(name, len) < 0)
2242 const int tmpfd = PerlLIO_open(name, O_RDWR);
2247 if (my_chsize(tmpfd, len) < 0)
2249 PerlLIO_close(tmpfd);
2258 SETERRNO(EBADF,RMS_IFI);
2266 SV * const argsv = POPs;
2267 const unsigned int func = POPu;
2268 const int optype = PL_op->op_type;
2269 GV * const gv = MUTABLE_GV(POPs);
2270 IO * const io = gv ? GvIOn(gv) : NULL;
2274 if (!io || !argsv || !IoIFP(io)) {
2276 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2280 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2283 s = SvPV_force(argsv, len);
2284 need = IOCPARM_LEN(func);
2286 s = Sv_Grow(argsv, need + 1);
2287 SvCUR_set(argsv, need);
2290 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2293 retval = SvIV(argsv);
2294 s = INT2PTR(char*,retval); /* ouch */
2297 TAINT_PROPER(PL_op_desc[optype]);
2299 if (optype == OP_IOCTL)
2301 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2303 DIE(aTHX_ "ioctl is not implemented");
2307 DIE(aTHX_ "fcntl is not implemented");
2309 #if defined(OS2) && defined(__EMX__)
2310 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2312 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2316 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2318 if (s[SvCUR(argsv)] != 17)
2319 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2321 s[SvCUR(argsv)] = 0; /* put our null back */
2322 SvSETMAGIC(argsv); /* Assume it has changed */
2331 PUSHp(zero_but_true, ZBTLEN);
2342 const int argtype = POPi;
2343 GV * const gv = MUTABLE_GV(POPs);
2344 IO *const io = GvIO(gv);
2345 PerlIO *const fp = io ? IoIFP(io) : NULL;
2347 /* XXX Looks to me like io is always NULL at this point */
2349 (void)PerlIO_flush(fp);
2350 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2355 SETERRNO(EBADF,RMS_IFI);
2360 DIE(aTHX_ PL_no_func, "flock()");
2371 const int protocol = POPi;
2372 const int type = POPi;
2373 const int domain = POPi;
2374 GV * const gv = MUTABLE_GV(POPs);
2375 IO * const io = gv ? GvIOn(gv) : NULL;
2380 if (io && IoIFP(io))
2381 do_close(gv, FALSE);
2382 SETERRNO(EBADF,LIB_INVARG);
2387 do_close(gv, FALSE);
2389 TAINT_PROPER("socket");
2390 fd = PerlSock_socket(domain, type, protocol);
2393 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2394 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2395 IoTYPE(io) = IoTYPE_SOCKET;
2396 if (!IoIFP(io) || !IoOFP(io)) {
2397 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2398 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2399 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2402 #if defined(HAS_FCNTL) && defined(F_SETFD)
2403 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2412 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2414 const int protocol = POPi;
2415 const int type = POPi;
2416 const int domain = POPi;
2417 GV * const gv2 = MUTABLE_GV(POPs);
2418 GV * const gv1 = MUTABLE_GV(POPs);
2419 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2420 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2424 report_evil_fh(gv1);
2426 report_evil_fh(gv2);
2428 if (io1 && IoIFP(io1))
2429 do_close(gv1, FALSE);
2430 if (io2 && IoIFP(io2))
2431 do_close(gv2, FALSE);
2436 TAINT_PROPER("socketpair");
2437 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2439 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2440 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2441 IoTYPE(io1) = IoTYPE_SOCKET;
2442 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2443 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2444 IoTYPE(io2) = IoTYPE_SOCKET;
2445 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2446 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2447 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2448 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2449 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2450 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2451 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2454 #if defined(HAS_FCNTL) && defined(F_SETFD)
2455 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2456 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2461 DIE(aTHX_ PL_no_sock_func, "socketpair");
2470 SV * const addrsv = POPs;
2471 /* OK, so on what platform does bind modify addr? */
2473 GV * const gv = MUTABLE_GV(POPs);
2474 IO * const io = GvIOn(gv);
2476 const int op_type = PL_op->op_type;
2478 if (!io || !IoIFP(io))
2481 addr = SvPV_const(addrsv, len);
2482 TAINT_PROPER(PL_op_desc[op_type]);
2483 if ((op_type == OP_BIND
2484 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2485 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2493 SETERRNO(EBADF,SS_IVCHAN);
2500 const int backlog = POPi;
2501 GV * const gv = MUTABLE_GV(POPs);
2502 IO * const io = gv ? GvIOn(gv) : NULL;
2504 if (!io || !IoIFP(io))
2507 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2514 SETERRNO(EBADF,SS_IVCHAN);
2523 char namebuf[MAXPATHLEN];
2524 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2525 Sock_size_t len = sizeof (struct sockaddr_in);
2527 Sock_size_t len = sizeof namebuf;
2529 GV * const ggv = MUTABLE_GV(POPs);
2530 GV * const ngv = MUTABLE_GV(POPs);
2539 if (!gstio || !IoIFP(gstio))
2543 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2546 /* Some platforms indicate zero length when an AF_UNIX client is
2547 * not bound. Simulate a non-zero-length sockaddr structure in
2549 namebuf[0] = 0; /* sun_len */
2550 namebuf[1] = AF_UNIX; /* sun_family */
2558 do_close(ngv, FALSE);
2559 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2560 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2561 IoTYPE(nstio) = IoTYPE_SOCKET;
2562 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2563 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2564 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2565 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2568 #if defined(HAS_FCNTL) && defined(F_SETFD)
2569 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2572 #ifdef __SCO_VERSION__
2573 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2576 PUSHp(namebuf, len);
2580 report_evil_fh(ggv);
2581 SETERRNO(EBADF,SS_IVCHAN);
2591 const int how = POPi;
2592 GV * const gv = MUTABLE_GV(POPs);
2593 IO * const io = GvIOn(gv);
2595 if (!io || !IoIFP(io))
2598 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2603 SETERRNO(EBADF,SS_IVCHAN);
2610 const int optype = PL_op->op_type;
2611 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2612 const unsigned int optname = (unsigned int) POPi;
2613 const unsigned int lvl = (unsigned int) POPi;
2614 GV * const gv = MUTABLE_GV(POPs);
2615 IO * const io = GvIOn(gv);
2619 if (!io || !IoIFP(io))
2622 fd = PerlIO_fileno(IoIFP(io));
2626 (void)SvPOK_only(sv);
2630 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2637 #if defined(__SYMBIAN32__)
2638 # define SETSOCKOPT_OPTION_VALUE_T void *
2640 # define SETSOCKOPT_OPTION_VALUE_T const char *
2642 /* XXX TODO: We need to have a proper type (a Configure probe,
2643 * etc.) for what the C headers think of the third argument of
2644 * setsockopt(), the option_value read-only buffer: is it
2645 * a "char *", or a "void *", const or not. Some compilers
2646 * don't take kindly to e.g. assuming that "char *" implicitly
2647 * promotes to a "void *", or to explicitly promoting/demoting
2648 * consts to non/vice versa. The "const void *" is the SUS
2649 * definition, but that does not fly everywhere for the above
2651 SETSOCKOPT_OPTION_VALUE_T buf;
2655 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2659 aint = (int)SvIV(sv);
2660 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2663 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2673 SETERRNO(EBADF,SS_IVCHAN);
2682 const int optype = PL_op->op_type;
2683 GV * const gv = MUTABLE_GV(POPs);
2684 IO * const io = GvIOn(gv);
2689 if (!io || !IoIFP(io))
2692 sv = sv_2mortal(newSV(257));
2693 (void)SvPOK_only(sv);
2697 fd = PerlIO_fileno(IoIFP(io));
2699 case OP_GETSOCKNAME:
2700 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2703 case OP_GETPEERNAME:
2704 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2706 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2708 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";
2709 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2710 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2711 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2712 sizeof(u_short) + sizeof(struct in_addr))) {
2719 #ifdef BOGUS_GETNAME_RETURN
2720 /* Interactive Unix, getpeername() and getsockname()
2721 does not return valid namelen */
2722 if (len == BOGUS_GETNAME_RETURN)
2723 len = sizeof(struct sockaddr);
2732 SETERRNO(EBADF,SS_IVCHAN);
2751 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2752 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2753 if (PL_op->op_type == OP_LSTAT) {
2754 if (gv != PL_defgv) {
2755 do_fstat_warning_check:
2756 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2757 "lstat() on filehandle%s%"SVf,
2760 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2762 } else if (PL_laststype != OP_LSTAT)
2763 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2764 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2767 if (gv != PL_defgv) {
2771 PL_laststype = OP_STAT;
2772 PL_statgv = gv ? gv : (GV *)io;
2773 sv_setpvs(PL_statname, "");
2780 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2782 } else if (IoDIRP(io)) {
2784 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2787 PL_laststatval = -1;
2790 else PL_laststatval = -1;
2791 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2794 if (PL_laststatval < 0) {
2799 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2800 io = MUTABLE_IO(SvRV(sv));
2801 if (PL_op->op_type == OP_LSTAT)
2802 goto do_fstat_warning_check;
2803 goto do_fstat_have_io;
2806 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2807 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2809 PL_laststype = PL_op->op_type;
2810 if (PL_op->op_type == OP_LSTAT)
2811 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2813 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2814 if (PL_laststatval < 0) {
2815 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2816 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2822 if (gimme != G_ARRAY) {
2823 if (gimme != G_VOID)
2824 XPUSHs(boolSV(max));
2830 mPUSHi(PL_statcache.st_dev);
2831 #if ST_INO_SIZE > IVSIZE
2832 mPUSHn(PL_statcache.st_ino);
2834 # if ST_INO_SIGN <= 0
2835 mPUSHi(PL_statcache.st_ino);
2837 mPUSHu(PL_statcache.st_ino);
2840 mPUSHu(PL_statcache.st_mode);
2841 mPUSHu(PL_statcache.st_nlink);
2843 sv_setuid(PUSHmortal, PL_statcache.st_uid);
2844 sv_setgid(PUSHmortal, PL_statcache.st_gid);
2846 #ifdef USE_STAT_RDEV
2847 mPUSHi(PL_statcache.st_rdev);
2849 PUSHs(newSVpvs_flags("", SVs_TEMP));
2851 #if Off_t_size > IVSIZE
2852 mPUSHn(PL_statcache.st_size);
2854 mPUSHi(PL_statcache.st_size);
2857 mPUSHn(PL_statcache.st_atime);
2858 mPUSHn(PL_statcache.st_mtime);
2859 mPUSHn(PL_statcache.st_ctime);
2861 mPUSHi(PL_statcache.st_atime);
2862 mPUSHi(PL_statcache.st_mtime);
2863 mPUSHi(PL_statcache.st_ctime);
2865 #ifdef USE_STAT_BLOCKS
2866 mPUSHu(PL_statcache.st_blksize);
2867 mPUSHu(PL_statcache.st_blocks);
2869 PUSHs(newSVpvs_flags("", SVs_TEMP));
2870 PUSHs(newSVpvs_flags("", SVs_TEMP));
2876 /* All filetest ops avoid manipulating the perl stack pointer in their main
2877 bodies (since commit d2c4d2d1e22d3125), and return using either
2878 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2879 the only two which manipulate the perl stack. To ensure that no stack
2880 manipulation macros are used, the filetest ops avoid defining a local copy
2881 of the stack pointer with dSP. */
2883 /* If the next filetest is stacked up with this one
2884 (PL_op->op_private & OPpFT_STACKING), we leave
2885 the original argument on the stack for success,
2886 and skip the stacked operators on failure.
2887 The next few macros/functions take care of this.
2891 S_ft_return_false(pTHX_ SV *ret) {
2895 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2899 if (PL_op->op_private & OPpFT_STACKING) {
2900 while (OP_IS_FILETEST(next->op_type)
2901 && next->op_private & OPpFT_STACKED)
2902 next = next->op_next;
2907 PERL_STATIC_INLINE OP *
2908 S_ft_return_true(pTHX_ SV *ret) {
2910 if (PL_op->op_flags & OPf_REF)
2911 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2912 else if (!(PL_op->op_private & OPpFT_STACKING))
2918 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2919 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2920 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2922 #define tryAMAGICftest_MG(chr) STMT_START { \
2923 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2924 && PL_op->op_flags & OPf_KIDS) { \
2925 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2926 if (next) return next; \
2931 S_try_amagic_ftest(pTHX_ char chr) {
2933 SV *const arg = *PL_stack_sp;
2936 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2940 const char tmpchr = chr;
2941 SV * const tmpsv = amagic_call(arg,
2942 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2943 ftest_amg, AMGf_unary);
2948 return SvTRUE(tmpsv)
2949 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2959 /* Not const, because things tweak this below. Not bool, because there's
2960 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2961 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2962 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2963 /* Giving some sort of initial value silences compilers. */
2965 int access_mode = R_OK;
2967 int access_mode = 0;
2970 /* access_mode is never used, but leaving use_access in makes the
2971 conditional compiling below much clearer. */
2974 Mode_t stat_mode = S_IRUSR;
2976 bool effective = FALSE;
2979 switch (PL_op->op_type) {
2980 case OP_FTRREAD: opchar = 'R'; break;
2981 case OP_FTRWRITE: opchar = 'W'; break;
2982 case OP_FTREXEC: opchar = 'X'; break;
2983 case OP_FTEREAD: opchar = 'r'; break;
2984 case OP_FTEWRITE: opchar = 'w'; break;
2985 case OP_FTEEXEC: opchar = 'x'; break;
2987 tryAMAGICftest_MG(opchar);
2989 switch (PL_op->op_type) {
2991 #if !(defined(HAS_ACCESS) && defined(R_OK))
2997 #if defined(HAS_ACCESS) && defined(W_OK)
3002 stat_mode = S_IWUSR;
3006 #if defined(HAS_ACCESS) && defined(X_OK)
3011 stat_mode = S_IXUSR;
3015 #ifdef PERL_EFF_ACCESS
3018 stat_mode = S_IWUSR;
3022 #ifndef PERL_EFF_ACCESS
3029 #ifdef PERL_EFF_ACCESS
3034 stat_mode = S_IXUSR;
3040 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3041 const char *name = SvPV_nolen(*PL_stack_sp);
3043 # ifdef PERL_EFF_ACCESS
3044 result = PERL_EFF_ACCESS(name, access_mode);
3046 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3052 result = access(name, access_mode);
3054 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3065 result = my_stat_flags(0);
3068 if (cando(stat_mode, effective, &PL_statcache))
3077 const int op_type = PL_op->op_type;
3081 case OP_FTIS: opchar = 'e'; break;
3082 case OP_FTSIZE: opchar = 's'; break;
3083 case OP_FTMTIME: opchar = 'M'; break;
3084 case OP_FTCTIME: opchar = 'C'; break;
3085 case OP_FTATIME: opchar = 'A'; break;
3087 tryAMAGICftest_MG(opchar);
3089 result = my_stat_flags(0);
3092 if (op_type == OP_FTIS)
3095 /* You can't dTARGET inside OP_FTIS, because you'll get
3096 "panic: pad_sv po" - the op is not flagged to have a target. */
3100 #if Off_t_size > IVSIZE
3101 sv_setnv(TARG, (NV)PL_statcache.st_size);
3103 sv_setiv(TARG, (IV)PL_statcache.st_size);
3108 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3112 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3116 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3120 return SvTRUE_nomg(TARG)
3121 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3131 switch (PL_op->op_type) {
3132 case OP_FTROWNED: opchar = 'O'; break;
3133 case OP_FTEOWNED: opchar = 'o'; break;
3134 case OP_FTZERO: opchar = 'z'; break;
3135 case OP_FTSOCK: opchar = 'S'; break;
3136 case OP_FTCHR: opchar = 'c'; break;
3137 case OP_FTBLK: opchar = 'b'; break;
3138 case OP_FTFILE: opchar = 'f'; break;
3139 case OP_FTDIR: opchar = 'd'; break;
3140 case OP_FTPIPE: opchar = 'p'; break;
3141 case OP_FTSUID: opchar = 'u'; break;
3142 case OP_FTSGID: opchar = 'g'; break;
3143 case OP_FTSVTX: opchar = 'k'; break;
3145 tryAMAGICftest_MG(opchar);
3147 /* I believe that all these three are likely to be defined on most every
3148 system these days. */
3150 if(PL_op->op_type == OP_FTSUID) {
3155 if(PL_op->op_type == OP_FTSGID) {
3160 if(PL_op->op_type == OP_FTSVTX) {
3165 result = my_stat_flags(0);
3168 switch (PL_op->op_type) {
3170 if (PL_statcache.st_uid == PerlProc_getuid())
3174 if (PL_statcache.st_uid == PerlProc_geteuid())
3178 if (PL_statcache.st_size == 0)
3182 if (S_ISSOCK(PL_statcache.st_mode))
3186 if (S_ISCHR(PL_statcache.st_mode))
3190 if (S_ISBLK(PL_statcache.st_mode))
3194 if (S_ISREG(PL_statcache.st_mode))
3198 if (S_ISDIR(PL_statcache.st_mode))
3202 if (S_ISFIFO(PL_statcache.st_mode))
3207 if (PL_statcache.st_mode & S_ISUID)
3213 if (PL_statcache.st_mode & S_ISGID)
3219 if (PL_statcache.st_mode & S_ISVTX)
3232 tryAMAGICftest_MG('l');
3233 result = my_lstat_flags(0);
3237 if (S_ISLNK(PL_statcache.st_mode))
3250 tryAMAGICftest_MG('t');
3252 if (PL_op->op_flags & OPf_REF)
3255 SV *tmpsv = *PL_stack_sp;
3256 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3257 name = SvPV_nomg(tmpsv, namelen);
3258 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3262 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3263 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3264 else if (name && isDIGIT(*name))
3268 if (PerlLIO_isatty(fd))
3286 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3288 if (PL_op->op_flags & OPf_REF)
3290 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3295 gv = MAYBE_DEREF_GV_nomg(sv);
3299 if (gv == PL_defgv) {
3301 io = SvTYPE(PL_statgv) == SVt_PVIO
3305 goto really_filename;
3310 sv_setpvs(PL_statname, "");
3311 io = GvIO(PL_statgv);
3313 PL_laststatval = -1;
3314 PL_laststype = OP_STAT;
3315 if (io && IoIFP(io)) {
3316 if (! PerlIO_has_base(IoIFP(io)))
3317 DIE(aTHX_ "-T and -B not implemented on filehandles");
3318 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3319 if (PL_laststatval < 0)
3321 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3322 if (PL_op->op_type == OP_FTTEXT)
3327 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3328 i = PerlIO_getc(IoIFP(io));
3330 (void)PerlIO_ungetc(IoIFP(io),i);
3332 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3334 len = PerlIO_get_bufsiz(IoIFP(io));
3335 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3336 /* sfio can have large buffers - limit to 512 */
3341 SETERRNO(EBADF,RMS_IFI);
3343 SETERRNO(EBADF,RMS_IFI);
3348 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3351 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3353 PL_laststatval = -1;
3354 PL_laststype = OP_STAT;
3356 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3358 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3361 PL_laststype = OP_STAT;
3362 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3363 if (PL_laststatval < 0) {
3364 (void)PerlIO_close(fp);
3367 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3368 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3369 (void)PerlIO_close(fp);
3371 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3372 FT_RETURNNO; /* special case NFS directories */
3373 FT_RETURNYES; /* null file is anything */
3378 /* now scan s to look for textiness */
3379 /* XXX ASCII dependent code */
3381 #if defined(DOSISH) || defined(USEMYBINMODE)
3382 /* ignore trailing ^Z on short files */
3383 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3387 for (i = 0; i < len; i++, s++) {
3388 if (!*s) { /* null never allowed in text */
3393 else if (!(isPRINT(*s) || isSPACE(*s)))
3396 else if (*s & 128) {
3398 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3401 /* utf8 characters don't count as odd */
3402 if (UTF8_IS_START(*s)) {
3403 int ulen = UTF8SKIP(s);
3404 if (ulen < len - i) {
3406 for (j = 1; j < ulen; j++) {
3407 if (!UTF8_IS_CONTINUATION(s[j]))
3410 --ulen; /* loop does extra increment */
3420 *s != '\n' && *s != '\r' && *s != '\b' &&
3421 *s != '\t' && *s != '\f' && *s != 27)
3426 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3437 const char *tmps = NULL;
3441 SV * const sv = POPs;
3442 if (PL_op->op_flags & OPf_SPECIAL) {
3443 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3445 else if (!(gv = MAYBE_DEREF_GV(sv)))
3446 tmps = SvPV_nomg_const_nolen(sv);
3449 if( !gv && (!tmps || !*tmps) ) {
3450 HV * const table = GvHVn(PL_envgv);
3453 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3454 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3456 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3461 deprecate("chdir('') or chdir(undef) as chdir()");
3462 tmps = SvPV_nolen_const(*svp);
3466 TAINT_PROPER("chdir");
3471 TAINT_PROPER("chdir");
3474 IO* const io = GvIO(gv);
3477 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3478 } else if (IoIFP(io)) {
3479 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3483 SETERRNO(EBADF, RMS_IFI);
3489 SETERRNO(EBADF,RMS_IFI);
3493 DIE(aTHX_ PL_no_func, "fchdir");
3497 PUSHi( PerlDir_chdir(tmps) >= 0 );
3499 /* Clear the DEFAULT element of ENV so we'll get the new value
3501 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3508 dVAR; dSP; dMARK; dTARGET;
3509 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3520 char * const tmps = POPpx;
3521 TAINT_PROPER("chroot");
3522 PUSHi( chroot(tmps) >= 0 );
3525 DIE(aTHX_ PL_no_func, "chroot");
3533 const char * const tmps2 = POPpconstx;
3534 const char * const tmps = SvPV_nolen_const(TOPs);
3535 TAINT_PROPER("rename");
3537 anum = PerlLIO_rename(tmps, tmps2);
3539 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3540 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3543 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3544 (void)UNLINK(tmps2);
3545 if (!(anum = link(tmps, tmps2)))
3546 anum = UNLINK(tmps);
3554 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3558 const int op_type = PL_op->op_type;
3562 if (op_type == OP_LINK)
3563 DIE(aTHX_ PL_no_func, "link");
3565 # ifndef HAS_SYMLINK
3566 if (op_type == OP_SYMLINK)
3567 DIE(aTHX_ PL_no_func, "symlink");
3571 const char * const tmps2 = POPpconstx;
3572 const char * const tmps = SvPV_nolen_const(TOPs);
3573 TAINT_PROPER(PL_op_desc[op_type]);
3575 # if defined(HAS_LINK)
3576 # if defined(HAS_SYMLINK)
3577 /* Both present - need to choose which. */
3578 (op_type == OP_LINK) ?
3579 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3581 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3582 PerlLIO_link(tmps, tmps2);
3585 # if defined(HAS_SYMLINK)
3586 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3587 symlink(tmps, tmps2);
3592 SETi( result >= 0 );
3599 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3610 char buf[MAXPATHLEN];
3615 len = readlink(tmps, buf, sizeof(buf) - 1);
3622 RETSETUNDEF; /* just pretend it's a normal file */
3626 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3628 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3630 char * const save_filename = filename;
3635 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3637 PERL_ARGS_ASSERT_DOONELINER;
3639 Newx(cmdline, size, char);
3640 my_strlcpy(cmdline, cmd, size);
3641 my_strlcat(cmdline, " ", size);
3642 for (s = cmdline + strlen(cmdline); *filename; ) {
3646 if (s - cmdline < size)
3647 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3648 myfp = PerlProc_popen(cmdline, "r");
3652 SV * const tmpsv = sv_newmortal();
3653 /* Need to save/restore 'PL_rs' ?? */
3654 s = sv_gets(tmpsv, myfp, 0);
3655 (void)PerlProc_pclose(myfp);
3659 #ifdef HAS_SYS_ERRLIST
3664 /* you don't see this */
3665 const char * const errmsg = Strerror(e) ;
3668 if (instr(s, errmsg)) {
3675 #define EACCES EPERM
3677 if (instr(s, "cannot make"))
3678 SETERRNO(EEXIST,RMS_FEX);
3679 else if (instr(s, "existing file"))
3680 SETERRNO(EEXIST,RMS_FEX);
3681 else if (instr(s, "ile exists"))
3682 SETERRNO(EEXIST,RMS_FEX);
3683 else if (instr(s, "non-exist"))
3684 SETERRNO(ENOENT,RMS_FNF);
3685 else if (instr(s, "does not exist"))
3686 SETERRNO(ENOENT,RMS_FNF);
3687 else if (instr(s, "not empty"))
3688 SETERRNO(EBUSY,SS_DEVOFFLINE);
3689 else if (instr(s, "cannot access"))
3690 SETERRNO(EACCES,RMS_PRV);
3692 SETERRNO(EPERM,RMS_PRV);
3695 else { /* some mkdirs return no failure indication */
3696 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3697 if (PL_op->op_type == OP_RMDIR)
3702 SETERRNO(EACCES,RMS_PRV); /* a guess */
3711 /* This macro removes trailing slashes from a directory name.
3712 * Different operating and file systems take differently to
3713 * trailing slashes. According to POSIX 1003.1 1996 Edition
3714 * any number of trailing slashes should be allowed.
3715 * Thusly we snip them away so that even non-conforming
3716 * systems are happy.
3717 * We should probably do this "filtering" for all
3718 * the functions that expect (potentially) directory names:
3719 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3720 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3722 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3723 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3726 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3727 (tmps) = savepvn((tmps), (len)); \
3737 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3739 TRIMSLASHES(tmps,len,copy);
3741 TAINT_PROPER("mkdir");
3743 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3747 SETi( dooneliner("mkdir", tmps) );
3748 oldumask = PerlLIO_umask(0);
3749 PerlLIO_umask(oldumask);
3750 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3765 TRIMSLASHES(tmps,len,copy);
3766 TAINT_PROPER("rmdir");
3768 SETi( PerlDir_rmdir(tmps) >= 0 );
3770 SETi( dooneliner("rmdir", tmps) );
3777 /* Directory calls. */
3781 #if defined(Direntry_t) && defined(HAS_READDIR)
3783 const char * const dirname = POPpconstx;
3784 GV * const gv = MUTABLE_GV(POPs);
3785 IO * const io = GvIOn(gv);
3790 if ((IoIFP(io) || IoOFP(io)))
3791 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3792 "Opening filehandle %"HEKf" also as a directory",
3793 HEKfARG(GvENAME_HEK(gv)) );
3795 PerlDir_close(IoDIRP(io));
3796 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3802 SETERRNO(EBADF,RMS_DIR);
3805 DIE(aTHX_ PL_no_dir_func, "opendir");
3811 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3812 DIE(aTHX_ PL_no_dir_func, "readdir");
3814 #if !defined(I_DIRENT) && !defined(VMS)
3815 Direntry_t *readdir (DIR *);
3821 const I32 gimme = GIMME;
3822 GV * const gv = MUTABLE_GV(POPs);
3823 const Direntry_t *dp;
3824 IO * const io = GvIOn(gv);
3826 if (!io || !IoDIRP(io)) {
3827 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3828 "readdir() attempted on invalid dirhandle %"HEKf,
3829 HEKfARG(GvENAME_HEK(gv)));
3834 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3838 sv = newSVpvn(dp->d_name, dp->d_namlen);
3840 sv = newSVpv(dp->d_name, 0);
3842 if (!(IoFLAGS(io) & IOf_UNTAINT))
3845 } while (gimme == G_ARRAY);
3847 if (!dp && gimme != G_ARRAY)
3854 SETERRNO(EBADF,RMS_ISI);
3855 if (GIMME == G_ARRAY)
3864 #if defined(HAS_TELLDIR) || defined(telldir)
3866 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3867 /* XXX netbsd still seemed to.
3868 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3869 --JHI 1999-Feb-02 */
3870 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3871 long telldir (DIR *);
3873 GV * const gv = MUTABLE_GV(POPs);
3874 IO * const io = GvIOn(gv);
3876 if (!io || !IoDIRP(io)) {
3877 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3878 "telldir() attempted on invalid dirhandle %"HEKf,
3879 HEKfARG(GvENAME_HEK(gv)));
3883 PUSHi( PerlDir_tell(IoDIRP(io)) );
3887 SETERRNO(EBADF,RMS_ISI);
3890 DIE(aTHX_ PL_no_dir_func, "telldir");
3896 #if defined(HAS_SEEKDIR) || defined(seekdir)
3898 const long along = POPl;
3899 GV * const gv = MUTABLE_GV(POPs);
3900 IO * const io = GvIOn(gv);
3902 if (!io || !IoDIRP(io)) {
3903 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3904 "seekdir() attempted on invalid dirhandle %"HEKf,
3905 HEKfARG(GvENAME_HEK(gv)));
3908 (void)PerlDir_seek(IoDIRP(io), along);
3913 SETERRNO(EBADF,RMS_ISI);
3916 DIE(aTHX_ PL_no_dir_func, "seekdir");
3922 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3924 GV * const gv = MUTABLE_GV(POPs);
3925 IO * const io = GvIOn(gv);
3927 if (!io || !IoDIRP(io)) {
3928 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3929 "rewinddir() attempted on invalid dirhandle %"HEKf,
3930 HEKfARG(GvENAME_HEK(gv)));
3933 (void)PerlDir_rewind(IoDIRP(io));
3937 SETERRNO(EBADF,RMS_ISI);
3940 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3946 #if defined(Direntry_t) && defined(HAS_READDIR)
3948 GV * const gv = MUTABLE_GV(POPs);
3949 IO * const io = GvIOn(gv);
3951 if (!io || !IoDIRP(io)) {
3952 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3953 "closedir() attempted on invalid dirhandle %"HEKf,
3954 HEKfARG(GvENAME_HEK(gv)));
3957 #ifdef VOID_CLOSEDIR
3958 PerlDir_close(IoDIRP(io));
3960 if (PerlDir_close(IoDIRP(io)) < 0) {
3961 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
3970 SETERRNO(EBADF,RMS_IFI);
3973 DIE(aTHX_ PL_no_dir_func, "closedir");
3977 /* Process control. */
3984 #ifdef HAS_SIGPROCMASK
3985 sigset_t oldmask, newmask;
3989 PERL_FLUSHALL_FOR_CHILD;
3990 #ifdef HAS_SIGPROCMASK
3991 sigfillset(&newmask);
3992 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
3994 childpid = PerlProc_fork();
3995 if (childpid == 0) {
3999 for (sig = 1; sig < SIG_SIZE; sig++)
4000 PL_psig_pend[sig] = 0;
4002 #ifdef HAS_SIGPROCMASK
4005 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4012 #ifdef PERL_USES_PL_PIDSTATUS
4013 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4019 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4024 PERL_FLUSHALL_FOR_CHILD;
4025 childpid = PerlProc_fork();
4031 DIE(aTHX_ PL_no_func, "fork");
4038 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4043 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4044 childpid = wait4pid(-1, &argflags, 0);
4046 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4051 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4052 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4053 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4055 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4060 DIE(aTHX_ PL_no_func, "wait");
4066 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4068 const int optype = POPi;
4069 const Pid_t pid = TOPi;
4073 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4074 result = wait4pid(pid, &argflags, optype);
4076 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4081 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4082 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4083 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4085 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4090 DIE(aTHX_ PL_no_func, "waitpid");
4096 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4097 #if defined(__LIBCATAMOUNT__)
4098 PL_statusvalue = -1;
4107 while (++MARK <= SP) {
4108 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4113 TAINT_PROPER("system");
4115 PERL_FLUSHALL_FOR_CHILD;
4116 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4121 #ifdef HAS_SIGPROCMASK
4122 sigset_t newset, oldset;
4125 if (PerlProc_pipe(pp) >= 0)
4127 #ifdef HAS_SIGPROCMASK
4128 sigemptyset(&newset);
4129 sigaddset(&newset, SIGCHLD);
4130 sigprocmask(SIG_BLOCK, &newset, &oldset);
4132 while ((childpid = PerlProc_fork()) == -1) {
4133 if (errno != EAGAIN) {
4138 PerlLIO_close(pp[0]);
4139 PerlLIO_close(pp[1]);
4141 #ifdef HAS_SIGPROCMASK
4142 sigprocmask(SIG_SETMASK, &oldset, NULL);
4149 Sigsave_t ihand,qhand; /* place to save signals during system() */
4153 PerlLIO_close(pp[1]);
4155 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4156 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4159 result = wait4pid(childpid, &status, 0);
4160 } while (result == -1 && errno == EINTR);
4162 #ifdef HAS_SIGPROCMASK
4163 sigprocmask(SIG_SETMASK, &oldset, NULL);
4165 (void)rsignal_restore(SIGINT, &ihand);
4166 (void)rsignal_restore(SIGQUIT, &qhand);
4168 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4169 do_execfree(); /* free any memory child malloced on fork */
4176 while (n < sizeof(int)) {
4177 n1 = PerlLIO_read(pp[0],
4178 (void*)(((char*)&errkid)+n),
4184 PerlLIO_close(pp[0]);
4185 if (n) { /* Error */
4186 if (n != sizeof(int))
4187 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4188 errno = errkid; /* Propagate errno from kid */
4189 STATUS_NATIVE_CHILD_SET(-1);
4192 XPUSHi(STATUS_CURRENT);
4195 #ifdef HAS_SIGPROCMASK
4196 sigprocmask(SIG_SETMASK, &oldset, NULL);
4199 PerlLIO_close(pp[0]);
4200 #if defined(HAS_FCNTL) && defined(F_SETFD)
4201 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4204 if (PL_op->op_flags & OPf_STACKED) {
4205 SV * const really = *++MARK;
4206 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4208 else if (SP - MARK != 1)
4209 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4211 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4215 #else /* ! FORK or VMS or OS/2 */
4218 if (PL_op->op_flags & OPf_STACKED) {
4219 SV * const really = *++MARK;
4220 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4221 value = (I32)do_aspawn(really, MARK, SP);
4223 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4226 else if (SP - MARK != 1) {
4227 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4228 value = (I32)do_aspawn(NULL, MARK, SP);
4230 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4234 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4236 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4238 STATUS_NATIVE_CHILD_SET(value);
4241 XPUSHi(result ? value : STATUS_CURRENT);
4242 #endif /* !FORK or VMS or OS/2 */
4249 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4254 while (++MARK <= SP) {
4255 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4260 TAINT_PROPER("exec");
4262 PERL_FLUSHALL_FOR_CHILD;
4263 if (PL_op->op_flags & OPf_STACKED) {
4264 SV * const really = *++MARK;
4265 value = (I32)do_aexec(really, MARK, SP);
4267 else if (SP - MARK != 1)
4269 value = (I32)vms_do_aexec(NULL, MARK, SP);
4271 value = (I32)do_aexec(NULL, MARK, SP);
4275 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4277 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4290 XPUSHi( getppid() );
4293 DIE(aTHX_ PL_no_func, "getppid");
4303 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4306 pgrp = (I32)BSD_GETPGRP(pid);
4308 if (pid != 0 && pid != PerlProc_getpid())
4309 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4315 DIE(aTHX_ PL_no_func, "getpgrp()");
4325 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4326 if (MAXARG > 0) pid = TOPs && TOPi;
4332 TAINT_PROPER("setpgrp");
4334 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4336 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4337 || (pid != 0 && pid != PerlProc_getpid()))
4339 DIE(aTHX_ "setpgrp can't take arguments");
4341 SETi( setpgrp() >= 0 );
4342 #endif /* USE_BSDPGRP */
4345 DIE(aTHX_ PL_no_func, "setpgrp()");
4349 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4350 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4352 # define PRIORITY_WHICH_T(which) which
4357 #ifdef HAS_GETPRIORITY
4359 const int who = POPi;
4360 const int which = TOPi;
4361 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4364 DIE(aTHX_ PL_no_func, "getpriority()");
4370 #ifdef HAS_SETPRIORITY
4372 const int niceval = POPi;
4373 const int who = POPi;
4374 const int which = TOPi;
4375 TAINT_PROPER("setpriority");
4376 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4379 DIE(aTHX_ PL_no_func, "setpriority()");
4383 #undef PRIORITY_WHICH_T
4391 XPUSHn( time(NULL) );
4393 XPUSHi( time(NULL) );
4405 (void)PerlProc_times(&PL_timesbuf);
4407 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4408 /* struct tms, though same data */
4412 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4413 if (GIMME == G_ARRAY) {
4414 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4415 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4416 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4424 if (GIMME == G_ARRAY) {
4431 DIE(aTHX_ "times not implemented");
4433 #endif /* HAS_TIMES */
4436 /* The 32 bit int year limits the times we can represent to these
4437 boundaries with a few days wiggle room to account for time zone
4440 /* Sat Jan 3 00:00:00 -2147481748 */
4441 #define TIME_LOWER_BOUND -67768100567755200.0
4442 /* Sun Dec 29 12:00:00 2147483647 */
4443 #define TIME_UPPER_BOUND 67767976233316800.0
4452 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4453 static const char * const dayname[] =
4454 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4455 static const char * const monname[] =
4456 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4457 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4459 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4462 when = (Time64_T)now;
4465 NV input = Perl_floor(POPn);
4466 when = (Time64_T)input;
4467 if (when != input) {
4468 /* diag_listed_as: gmtime(%f) too large */
4469 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4470 "%s(%.0" NVff ") too large", opname, input);
4474 if ( TIME_LOWER_BOUND > when ) {
4475 /* diag_listed_as: gmtime(%f) too small */
4476 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4477 "%s(%.0" NVff ") too small", opname, when);
4480 else if( when > TIME_UPPER_BOUND ) {
4481 /* diag_listed_as: gmtime(%f) too small */
4482 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4483 "%s(%.0" NVff ") too large", opname, when);
4487 if (PL_op->op_type == OP_LOCALTIME)
4488 err = S_localtime64_r(&when, &tmbuf);
4490 err = S_gmtime64_r(&when, &tmbuf);
4494 /* XXX %lld broken for quads */
4495 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4496 "%s(%.0" NVff ") failed", opname, when);
4499 if (GIMME != G_ARRAY) { /* scalar context */
4501 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4502 double year = (double)tmbuf.tm_year + 1900;
4509 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4510 dayname[tmbuf.tm_wday],
4511 monname[tmbuf.tm_mon],
4519 else { /* list context */
4525 mPUSHi(tmbuf.tm_sec);
4526 mPUSHi(tmbuf.tm_min);
4527 mPUSHi(tmbuf.tm_hour);
4528 mPUSHi(tmbuf.tm_mday);
4529 mPUSHi(tmbuf.tm_mon);
4530 mPUSHn(tmbuf.tm_year);
4531 mPUSHi(tmbuf.tm_wday);
4532 mPUSHi(tmbuf.tm_yday);
4533 mPUSHi(tmbuf.tm_isdst);
4544 anum = alarm((unsigned int)anum);
4550 DIE(aTHX_ PL_no_func, "alarm");
4561 (void)time(&lasttime);
4562 if (MAXARG < 1 || (!TOPs && !POPs))
4566 PerlProc_sleep((unsigned int)duration);
4569 XPUSHi(when - lasttime);
4573 /* Shared memory. */
4574 /* Merged with some message passing. */
4578 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4579 dVAR; dSP; dMARK; dTARGET;
4580 const int op_type = PL_op->op_type;
4585 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4588 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4591 value = (I32)(do_semop(MARK, SP) >= 0);
4594 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4602 return Perl_pp_semget(aTHX);
4610 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4611 dVAR; dSP; dMARK; dTARGET;
4612 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4619 DIE(aTHX_ "System V IPC is not implemented on this machine");
4625 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4626 dVAR; dSP; dMARK; dTARGET;
4627 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4635 PUSHp(zero_but_true, ZBTLEN);
4639 return Perl_pp_semget(aTHX);
4643 /* I can't const this further without getting warnings about the types of
4644 various arrays passed in from structures. */
4646 S_space_join_names_mortal(pTHX_ char *const *array)
4650 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4652 if (array && *array) {
4653 target = newSVpvs_flags("", SVs_TEMP);
4655 sv_catpv(target, *array);
4658 sv_catpvs(target, " ");
4661 target = sv_mortalcopy(&PL_sv_no);
4666 /* Get system info. */
4670 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4672 I32 which = PL_op->op_type;
4675 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4676 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4677 struct hostent *gethostbyname(Netdb_name_t);
4678 struct hostent *gethostent(void);
4680 struct hostent *hent = NULL;
4684 if (which == OP_GHBYNAME) {
4685 #ifdef HAS_GETHOSTBYNAME
4686 const char* const name = POPpbytex;
4687 hent = PerlSock_gethostbyname(name);
4689 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4692 else if (which == OP_GHBYADDR) {
4693 #ifdef HAS_GETHOSTBYADDR
4694 const int addrtype = POPi;
4695 SV * const addrsv = POPs;
4697 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4699 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4701 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4705 #ifdef HAS_GETHOSTENT
4706 hent = PerlSock_gethostent();
4708 DIE(aTHX_ PL_no_sock_func, "gethostent");
4711 #ifdef HOST_NOT_FOUND
4713 #ifdef USE_REENTRANT_API
4714 # ifdef USE_GETHOSTENT_ERRNO
4715 h_errno = PL_reentrant_buffer->_gethostent_errno;
4718 STATUS_UNIX_SET(h_errno);
4722 if (GIMME != G_ARRAY) {
4723 PUSHs(sv = sv_newmortal());
4725 if (which == OP_GHBYNAME) {
4727 sv_setpvn(sv, hent->h_addr, hent->h_length);
4730 sv_setpv(sv, (char*)hent->h_name);
4736 mPUSHs(newSVpv((char*)hent->h_name, 0));
4737 PUSHs(space_join_names_mortal(hent->h_aliases));
4738 mPUSHi(hent->h_addrtype);
4739 len = hent->h_length;
4742 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4743 mXPUSHp(*elem, len);
4747 mPUSHp(hent->h_addr, len);
4749 PUSHs(sv_mortalcopy(&PL_sv_no));
4754 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4760 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4762 I32 which = PL_op->op_type;
4764 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4765 struct netent *getnetbyaddr(Netdb_net_t, int);
4766 struct netent *getnetbyname(Netdb_name_t);
4767 struct netent *getnetent(void);
4769 struct netent *nent;
4771 if (which == OP_GNBYNAME){
4772 #ifdef HAS_GETNETBYNAME
4773 const char * const name = POPpbytex;
4774 nent = PerlSock_getnetbyname(name);
4776 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4779 else if (which == OP_GNBYADDR) {
4780 #ifdef HAS_GETNETBYADDR
4781 const int addrtype = POPi;
4782 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4783 nent = PerlSock_getnetbyaddr(addr, addrtype);
4785 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4789 #ifdef HAS_GETNETENT
4790 nent = PerlSock_getnetent();
4792 DIE(aTHX_ PL_no_sock_func, "getnetent");
4795 #ifdef HOST_NOT_FOUND
4797 #ifdef USE_REENTRANT_API
4798 # ifdef USE_GETNETENT_ERRNO
4799 h_errno = PL_reentrant_buffer->_getnetent_errno;
4802 STATUS_UNIX_SET(h_errno);
4807 if (GIMME != G_ARRAY) {
4808 PUSHs(sv = sv_newmortal());
4810 if (which == OP_GNBYNAME)
4811 sv_setiv(sv, (IV)nent->n_net);
4813 sv_setpv(sv, nent->n_name);
4819 mPUSHs(newSVpv(nent->n_name, 0));
4820 PUSHs(space_join_names_mortal(nent->n_aliases));
4821 mPUSHi(nent->n_addrtype);
4822 mPUSHi(nent->n_net);
4827 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4833 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4835 I32 which = PL_op->op_type;
4837 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4838 struct protoent *getprotobyname(Netdb_name_t);
4839 struct protoent *getprotobynumber(int);
4840 struct protoent *getprotoent(void);
4842 struct protoent *pent;
4844 if (which == OP_GPBYNAME) {
4845 #ifdef HAS_GETPROTOBYNAME
4846 const char* const name = POPpbytex;
4847 pent = PerlSock_getprotobyname(name);
4849 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4852 else if (which == OP_GPBYNUMBER) {
4853 #ifdef HAS_GETPROTOBYNUMBER
4854 const int number = POPi;
4855 pent = PerlSock_getprotobynumber(number);
4857 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4861 #ifdef HAS_GETPROTOENT
4862 pent = PerlSock_getprotoent();
4864 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4868 if (GIMME != G_ARRAY) {
4869 PUSHs(sv = sv_newmortal());
4871 if (which == OP_GPBYNAME)
4872 sv_setiv(sv, (IV)pent->p_proto);
4874 sv_setpv(sv, pent->p_name);
4880 mPUSHs(newSVpv(pent->p_name, 0));
4881 PUSHs(space_join_names_mortal(pent->p_aliases));
4882 mPUSHi(pent->p_proto);
4887 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4893 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4895 I32 which = PL_op->op_type;
4897 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4898 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4899 struct servent *getservbyport(int, Netdb_name_t);
4900 struct servent *getservent(void);
4902 struct servent *sent;
4904 if (which == OP_GSBYNAME) {
4905 #ifdef HAS_GETSERVBYNAME
4906 const char * const proto = POPpbytex;
4907 const char * const name = POPpbytex;
4908 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4910 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4913 else if (which == OP_GSBYPORT) {
4914 #ifdef HAS_GETSERVBYPORT
4915 const char * const proto = POPpbytex;
4916 unsigned short port = (unsigned short)POPu;
4917 port = PerlSock_htons(port);
4918 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4920 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4924 #ifdef HAS_GETSERVENT
4925 sent = PerlSock_getservent();
4927 DIE(aTHX_ PL_no_sock_func, "getservent");
4931 if (GIMME != G_ARRAY) {
4932 PUSHs(sv = sv_newmortal());
4934 if (which == OP_GSBYNAME) {
4935 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4938 sv_setpv(sv, sent->s_name);
4944 mPUSHs(newSVpv(sent->s_name, 0));
4945 PUSHs(space_join_names_mortal(sent->s_aliases));
4946 mPUSHi(PerlSock_ntohs(sent->s_port));
4947 mPUSHs(newSVpv(sent->s_proto, 0));
4952 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4959 const int stayopen = TOPi;
4960 switch(PL_op->op_type) {
4962 #ifdef HAS_SETHOSTENT
4963 PerlSock_sethostent(stayopen);
4965 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4968 #ifdef HAS_SETNETENT
4970 PerlSock_setnetent(stayopen);
4972 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4976 #ifdef HAS_SETPROTOENT
4977 PerlSock_setprotoent(stayopen);
4979 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4983 #ifdef HAS_SETSERVENT
4984 PerlSock_setservent(stayopen);
4986 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4996 switch(PL_op->op_type) {
4998 #ifdef HAS_ENDHOSTENT
4999 PerlSock_endhostent();
5001 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5005 #ifdef HAS_ENDNETENT
5006 PerlSock_endnetent();
5008 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5012 #ifdef HAS_ENDPROTOENT
5013 PerlSock_endprotoent();
5015 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5019 #ifdef HAS_ENDSERVENT
5020 PerlSock_endservent();
5022 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5026 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5029 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5033 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5036 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5040 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5043 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5047 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)