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_open6(gv, tmps, len, 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);
686 assert (isGV_with_GP(rgv));
687 assert (isGV_with_GP(wgv));
690 do_close(rgv, FALSE);
694 do_close(wgv, FALSE);
696 if (PerlProc_pipe(fd) < 0)
699 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
700 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
701 IoOFP(rstio) = IoIFP(rstio);
702 IoIFP(wstio) = IoOFP(wstio);
703 IoTYPE(rstio) = IoTYPE_RDONLY;
704 IoTYPE(wstio) = IoTYPE_WRONLY;
706 if (!IoIFP(rstio) || !IoOFP(wstio)) {
708 PerlIO_close(IoIFP(rstio));
710 PerlLIO_close(fd[0]);
712 PerlIO_close(IoOFP(wstio));
714 PerlLIO_close(fd[1]);
717 #if defined(HAS_FCNTL) && defined(F_SETFD)
718 /* ensure close-on-exec */
719 if ((fcntl(fd[0], F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
720 (fcntl(fd[1], F_SETFD,fd[1] > PL_maxsysfd) < 0))
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))) goto ret_undef;
1018 if ((mg = SvTIED_mg(sv, how))) {
1019 SETs(SvTIED_obj(sv, mg));
1020 return NORMAL; /* PUTBACK not needed, pp_tied never moves SP */
1034 HV * const hv = MUTABLE_HV(POPs);
1035 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1036 stash = gv_stashsv(sv, 0);
1037 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1039 require_pv("AnyDBM_File.pm");
1041 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1042 DIE(aTHX_ "No dbm on this machine");
1052 mPUSHu(O_RDWR|O_CREAT);
1056 if (!SvOK(right)) right = &PL_sv_no;
1060 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1063 if (!sv_isobject(TOPs)) {
1071 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1075 if (sv_isobject(TOPs)) {
1076 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1077 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1094 struct timeval timebuf;
1095 struct timeval *tbuf = &timebuf;
1098 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1103 # if BYTEORDER & 0xf0000
1104 # define ORDERBYTE (0x88888888 - BYTEORDER)
1106 # define ORDERBYTE (0x4444 - BYTEORDER)
1112 for (i = 1; i <= 3; i++) {
1113 SV * const sv = SP[i];
1117 if (SvREADONLY(sv)) {
1118 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1119 Perl_croak_no_modify();
1121 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1124 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1125 "Non-string passed as bitmask");
1126 SvPV_force_nomg_nolen(sv); /* force string conversion */
1133 /* little endians can use vecs directly */
1134 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1141 masksize = NFDBITS / NBBY;
1143 masksize = sizeof(long); /* documented int, everyone seems to use long */
1145 Zero(&fd_sets[0], 4, char*);
1148 # if SELECT_MIN_BITS == 1
1149 growsize = sizeof(fd_set);
1151 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1152 # undef SELECT_MIN_BITS
1153 # define SELECT_MIN_BITS __FD_SETSIZE
1155 /* If SELECT_MIN_BITS is greater than one we most probably will want
1156 * to align the sizes with SELECT_MIN_BITS/8 because for example
1157 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1158 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1159 * on (sets/tests/clears bits) is 32 bits. */
1160 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1166 value = SvNV_nomg(sv);
1169 timebuf.tv_sec = (long)value;
1170 value -= (NV)timebuf.tv_sec;
1171 timebuf.tv_usec = (long)(value * 1000000.0);
1176 for (i = 1; i <= 3; i++) {
1178 if (!SvOK(sv) || SvCUR(sv) == 0) {
1185 Sv_Grow(sv, growsize);
1189 while (++j <= growsize) {
1193 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1195 Newx(fd_sets[i], growsize, char);
1196 for (offset = 0; offset < growsize; offset += masksize) {
1197 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1198 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1201 fd_sets[i] = SvPVX(sv);
1205 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1206 /* Can't make just the (void*) conditional because that would be
1207 * cpp #if within cpp macro, and not all compilers like that. */
1208 nfound = PerlSock_select(
1210 (Select_fd_set_t) fd_sets[1],
1211 (Select_fd_set_t) fd_sets[2],
1212 (Select_fd_set_t) fd_sets[3],
1213 (void*) tbuf); /* Workaround for compiler bug. */
1215 nfound = PerlSock_select(
1217 (Select_fd_set_t) fd_sets[1],
1218 (Select_fd_set_t) fd_sets[2],
1219 (Select_fd_set_t) fd_sets[3],
1222 for (i = 1; i <= 3; i++) {
1225 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1227 for (offset = 0; offset < growsize; offset += masksize) {
1228 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1229 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1231 Safefree(fd_sets[i]);
1238 if (GIMME == G_ARRAY && tbuf) {
1239 value = (NV)(timebuf.tv_sec) +
1240 (NV)(timebuf.tv_usec) / 1000000.0;
1245 DIE(aTHX_ "select not implemented");
1250 =for apidoc setdefout
1252 Sets PL_defoutgv, the default file handle for output, to the passed in
1253 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1254 count of the passed in typeglob is increased by one, and the reference count
1255 of the typeglob that PL_defoutgv points to is decreased by one.
1261 Perl_setdefout(pTHX_ GV *gv)
1264 PERL_ARGS_ASSERT_SETDEFOUT;
1265 SvREFCNT_inc_simple_void_NN(gv);
1266 SvREFCNT_dec(PL_defoutgv);
1274 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1275 GV * egv = GvEGVx(PL_defoutgv);
1280 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1281 gvp = hv && HvENAME(hv)
1282 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1284 if (gvp && *gvp == egv) {
1285 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1289 mXPUSHs(newRV(MUTABLE_SV(egv)));
1293 if (!GvIO(newdefout))
1294 gv_IOadd(newdefout);
1295 setdefout(newdefout);
1305 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1306 IO *const io = GvIO(gv);
1312 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1314 const U32 gimme = GIMME_V;
1315 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1316 if (gimme == G_SCALAR) {
1318 SvSetMagicSV_nosteal(TARG, TOPs);
1323 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1324 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1326 SETERRNO(EBADF,RMS_IFI);
1330 sv_setpvs(TARG, " ");
1331 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1332 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1333 /* Find out how many bytes the char needs */
1334 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1337 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1338 SvCUR_set(TARG,1+len);
1342 else SvUTF8_off(TARG);
1348 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1352 const I32 gimme = GIMME_V;
1354 PERL_ARGS_ASSERT_DOFORM;
1357 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1362 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1363 PUSHFORMAT(cx, retop);
1364 if (CvDEPTH(cv) >= 2) {
1365 PERL_STACK_OVERFLOW_CHECK();
1366 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1369 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1371 setdefout(gv); /* locally select filehandle so $% et al work */
1390 gv = MUTABLE_GV(POPs);
1407 tmpsv = sv_newmortal();
1408 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1409 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1411 IoFLAGS(io) &= ~IOf_DIDTOP;
1412 RETURNOP(doform(cv,gv,PL_op->op_next));
1418 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1419 IO * const io = GvIOp(gv);
1427 if (!io || !(ofp = IoOFP(io)))
1430 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1431 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1433 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1434 PL_formtarget != PL_toptarget)
1438 if (!IoTOP_GV(io)) {
1441 if (!IoTOP_NAME(io)) {
1443 if (!IoFMT_NAME(io))
1444 IoFMT_NAME(io) = savepv(GvNAME(gv));
1445 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1446 HEKfARG(GvNAME_HEK(gv))));
1447 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1448 if ((topgv && GvFORM(topgv)) ||
1449 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1450 IoTOP_NAME(io) = savesvpv(topname);
1452 IoTOP_NAME(io) = savepvs("top");
1454 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1455 if (!topgv || !GvFORM(topgv)) {
1456 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1459 IoTOP_GV(io) = topgv;
1461 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1462 I32 lines = IoLINES_LEFT(io);
1463 const char *s = SvPVX_const(PL_formtarget);
1464 if (lines <= 0) /* Yow, header didn't even fit!!! */
1466 while (lines-- > 0) {
1467 s = strchr(s, '\n');
1473 const STRLEN save = SvCUR(PL_formtarget);
1474 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1475 do_print(PL_formtarget, ofp);
1476 SvCUR_set(PL_formtarget, save);
1477 sv_chop(PL_formtarget, s);
1478 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1481 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1482 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1483 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1485 PL_formtarget = PL_toptarget;
1486 IoFLAGS(io) |= IOf_DIDTOP;
1488 assert(fgv); /* IoTOP_GV(io) should have been set above */
1491 SV * const sv = sv_newmortal();
1492 gv_efullname4(sv, fgv, NULL, FALSE);
1493 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1495 return doform(cv, gv, PL_op);
1499 POPBLOCK(cx,PL_curpm);
1500 retop = cx->blk_sub.retop;
1502 SP = newsp; /* ignore retval of formline */
1505 if (!io || !(fp = IoOFP(io))) {
1506 if (io && IoIFP(io))
1507 report_wrongway_fh(gv, '<');
1513 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1514 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1516 if (!do_print(PL_formtarget, fp))
1519 FmLINES(PL_formtarget) = 0;
1520 SvCUR_set(PL_formtarget, 0);
1521 *SvEND(PL_formtarget) = '\0';
1522 if (IoFLAGS(io) & IOf_FLUSH)
1523 (void)PerlIO_flush(fp);
1527 PL_formtarget = PL_bodytarget;
1528 PERL_UNUSED_VAR(gimme);
1534 dVAR; dSP; dMARK; dORIGMARK;
1538 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1539 IO *const io = GvIO(gv);
1541 /* Treat empty list as "" */
1542 if (MARK == SP) XPUSHs(&PL_sv_no);
1545 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1547 if (MARK == ORIGMARK) {
1550 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1553 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1555 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1562 SETERRNO(EBADF,RMS_IFI);
1565 else if (!(fp = IoOFP(io))) {
1567 report_wrongway_fh(gv, '<');
1568 else if (ckWARN(WARN_CLOSED))
1570 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1574 SV *sv = sv_newmortal();
1575 do_sprintf(sv, SP - MARK, MARK + 1);
1576 if (!do_print(sv, fp))
1579 if (IoFLAGS(io) & IOf_FLUSH)
1580 if (PerlIO_flush(fp) == EOF)
1589 PUSHs(&PL_sv_undef);
1597 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1598 const int mode = POPi;
1599 SV * const sv = POPs;
1600 GV * const gv = MUTABLE_GV(POPs);
1603 /* Need TIEHANDLE method ? */
1604 const char * const tmps = SvPV_const(sv, len);
1605 if (do_open_raw(gv, tmps, len, mode, perm)) {
1606 IoLINES(GvIOp(gv)) = 0;
1610 PUSHs(&PL_sv_undef);
1617 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1631 bool charstart = FALSE;
1632 STRLEN charskip = 0;
1634 GV * const gv = MUTABLE_GV(*++MARK);
1637 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1638 && gv && (io = GvIO(gv)) )
1640 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1642 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1643 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1652 sv_setpvs(bufsv, "");
1653 length = SvIVx(*++MARK);
1655 DIE(aTHX_ "Negative length");
1658 offset = SvIVx(*++MARK);
1662 if (!io || !IoIFP(io)) {
1664 SETERRNO(EBADF,RMS_IFI);
1668 /* Note that fd can here validly be -1, don't check it yet. */
1669 fd = PerlIO_fileno(IoIFP(io));
1671 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1672 buffer = SvPVutf8_force(bufsv, blen);
1673 /* UTF-8 may not have been set if they are all low bytes */
1678 buffer = SvPV_force(bufsv, blen);
1679 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1681 if (DO_UTF8(bufsv)) {
1682 blen = sv_len_utf8_nomg(bufsv);
1691 if (PL_op->op_type == OP_RECV) {
1692 Sock_size_t bufsize;
1693 char namebuf[MAXPATHLEN];
1695 SETERRNO(EBADF,SS_IVCHAN);
1698 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1699 bufsize = sizeof (struct sockaddr_in);
1701 bufsize = sizeof namebuf;
1703 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1707 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1708 /* 'offset' means 'flags' here */
1709 count = PerlSock_recvfrom(fd, buffer, length, offset,
1710 (struct sockaddr *)namebuf, &bufsize);
1713 /* MSG_TRUNC can give oversized count; quietly lose it */
1716 SvCUR_set(bufsv, count);
1717 *SvEND(bufsv) = '\0';
1718 (void)SvPOK_only(bufsv);
1722 /* This should not be marked tainted if the fp is marked clean */
1723 if (!(IoFLAGS(io) & IOf_UNTAINT))
1724 SvTAINTED_on(bufsv);
1726 #if defined(__CYGWIN__)
1727 /* recvfrom() on cygwin doesn't set bufsize at all for
1728 connected sockets, leaving us with trash in the returned
1729 name, so use the same test as the Win32 code to check if it
1730 wasn't set, and set it [perl #118843] */
1731 if (bufsize == sizeof namebuf)
1734 sv_setpvn(TARG, namebuf, bufsize);
1740 if (-offset > (SSize_t)blen)
1741 DIE(aTHX_ "Offset outside string");
1744 if (DO_UTF8(bufsv)) {
1745 /* convert offset-as-chars to offset-as-bytes */
1746 if (offset >= (SSize_t)blen)
1747 offset += SvCUR(bufsv) - blen;
1749 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1753 /* Reestablish the fd in case it shifted from underneath us. */
1754 fd = PerlIO_fileno(IoIFP(io));
1756 orig_size = SvCUR(bufsv);
1757 /* Allocating length + offset + 1 isn't perfect in the case of reading
1758 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1760 (should be 2 * length + offset + 1, or possibly something longer if
1761 PL_encoding is true) */
1762 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1763 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1764 Zero(buffer+orig_size, offset-orig_size, char);
1766 buffer = buffer + offset;
1768 read_target = bufsv;
1770 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1771 concatenate it to the current buffer. */
1773 /* Truncate the existing buffer to the start of where we will be
1775 SvCUR_set(bufsv, offset);
1777 read_target = sv_newmortal();
1778 SvUPGRADE(read_target, SVt_PV);
1779 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1782 if (PL_op->op_type == OP_SYSREAD) {
1783 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1784 if (IoTYPE(io) == IoTYPE_SOCKET) {
1786 SETERRNO(EBADF,SS_IVCHAN);
1790 count = PerlSock_recv(fd, buffer, length, 0);
1796 SETERRNO(EBADF,RMS_IFI);
1800 count = PerlLIO_read(fd, buffer, length);
1805 count = PerlIO_read(IoIFP(io), buffer, length);
1806 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1807 if (count == 0 && PerlIO_error(IoIFP(io)))
1811 if (IoTYPE(io) == IoTYPE_WRONLY)
1812 report_wrongway_fh(gv, '>');
1815 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1816 *SvEND(read_target) = '\0';
1817 (void)SvPOK_only(read_target);
1818 if (fp_utf8 && !IN_BYTES) {
1819 /* Look at utf8 we got back and count the characters */
1820 const char *bend = buffer + count;
1821 while (buffer < bend) {
1823 skip = UTF8SKIP(buffer);
1826 if (buffer - charskip + skip > bend) {
1827 /* partial character - try for rest of it */
1828 length = skip - (bend-buffer);
1829 offset = bend - SvPVX_const(bufsv);
1841 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1842 provided amount read (count) was what was requested (length)
1844 if (got < wanted && count == length) {
1845 length = wanted - got;
1846 offset = bend - SvPVX_const(bufsv);
1849 /* return value is character count */
1853 else if (buffer_utf8) {
1854 /* Let svcatsv upgrade the bytes we read in to utf8.
1855 The buffer is a mortal so will be freed soon. */
1856 sv_catsv_nomg(bufsv, read_target);
1859 /* This should not be marked tainted if the fp is marked clean */
1860 if (!(IoFLAGS(io) & IOf_UNTAINT))
1861 SvTAINTED_on(bufsv);
1873 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1878 STRLEN orig_blen_bytes;
1879 const int op_type = PL_op->op_type;
1882 GV *const gv = MUTABLE_GV(*++MARK);
1883 IO *const io = GvIO(gv);
1886 if (op_type == OP_SYSWRITE && io) {
1887 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1889 if (MARK == SP - 1) {
1891 mXPUSHi(sv_len(sv));
1895 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1896 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1906 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1908 if (io && IoIFP(io))
1909 report_wrongway_fh(gv, '<');
1912 SETERRNO(EBADF,RMS_IFI);
1915 fd = PerlIO_fileno(IoIFP(io));
1917 SETERRNO(EBADF,SS_IVCHAN);
1922 /* Do this first to trigger any overloading. */
1923 buffer = SvPV_const(bufsv, blen);
1924 orig_blen_bytes = blen;
1925 doing_utf8 = DO_UTF8(bufsv);
1927 if (PerlIO_isutf8(IoIFP(io))) {
1928 if (!SvUTF8(bufsv)) {
1929 /* We don't modify the original scalar. */
1930 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1931 buffer = (char *) tmpbuf;
1935 else if (doing_utf8) {
1936 STRLEN tmplen = blen;
1937 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1940 buffer = (char *) tmpbuf;
1944 assert((char *)result == buffer);
1945 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1950 if (op_type == OP_SEND) {
1951 const int flags = SvIVx(*++MARK);
1954 char * const sockbuf = SvPVx(*++MARK, mlen);
1955 retval = PerlSock_sendto(fd, buffer, blen,
1956 flags, (struct sockaddr *)sockbuf, mlen);
1959 retval = PerlSock_send(fd, buffer, blen, flags);
1965 Size_t length = 0; /* This length is in characters. */
1971 /* The SV is bytes, and we've had to upgrade it. */
1972 blen_chars = orig_blen_bytes;
1974 /* The SV really is UTF-8. */
1975 /* Don't call sv_len_utf8 on a magical or overloaded
1976 scalar, as we might get back a different result. */
1977 blen_chars = sv_or_pv_len_utf8(bufsv, buffer, blen);
1984 length = blen_chars;
1986 #if Size_t_size > IVSIZE
1987 length = (Size_t)SvNVx(*++MARK);
1989 length = (Size_t)SvIVx(*++MARK);
1991 if ((SSize_t)length < 0) {
1993 DIE(aTHX_ "Negative length");
1998 offset = SvIVx(*++MARK);
2000 if (-offset > (IV)blen_chars) {
2002 DIE(aTHX_ "Offset outside string");
2004 offset += blen_chars;
2005 } else if (offset > (IV)blen_chars) {
2007 DIE(aTHX_ "Offset outside string");
2011 if (length > blen_chars - offset)
2012 length = blen_chars - offset;
2014 /* Here we convert length from characters to bytes. */
2015 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
2016 /* Either we had to convert the SV, or the SV is magical, or
2017 the SV has overloading, in which case we can't or mustn't
2018 or mustn't call it again. */
2020 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
2021 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
2023 /* It's a real UTF-8 SV, and it's not going to change under
2024 us. Take advantage of any cache. */
2026 I32 len_I32 = length;
2028 /* Convert the start and end character positions to bytes.
2029 Remember that the second argument to sv_pos_u2b is relative
2031 sv_pos_u2b(bufsv, &start, &len_I32);
2038 buffer = buffer+offset;
2040 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2041 if (IoTYPE(io) == IoTYPE_SOCKET) {
2042 retval = PerlSock_send(fd, buffer, length, 0);
2047 /* See the note at doio.c:do_print about filesize limits. --jhi */
2048 retval = PerlLIO_write(fd, buffer, length);
2056 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2059 #if Size_t_size > IVSIZE
2079 * in Perl 5.12 and later, the additional parameter is a bitmask:
2082 * 2 = eof() <- ARGV magic
2084 * I'll rely on the compiler's trace flow analysis to decide whether to
2085 * actually assign this out here, or punt it into the only block where it is
2086 * used. Doing it out here is DRY on the condition logic.
2091 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2097 if (PL_op->op_flags & OPf_SPECIAL) {
2098 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2102 gv = PL_last_in_gv; /* eof */
2110 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2111 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2114 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2115 if (io && !IoIFP(io)) {
2116 if ((IoFLAGS(io) & IOf_START) && av_tindex(GvAVn(gv)) < 0) {
2118 IoFLAGS(io) &= ~IOf_START;
2119 do_open6(gv, "-", 1, NULL, NULL, 0);
2121 sv_setpvs(GvSV(gv), "-");
2123 GvSV(gv) = newSVpvs("-");
2124 SvSETMAGIC(GvSV(gv));
2126 else if (!nextargv(gv))
2131 PUSHs(boolSV(do_eof(gv)));
2141 if (MAXARG != 0 && (TOPs || POPs))
2142 PL_last_in_gv = MUTABLE_GV(POPs);
2149 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2151 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2156 SETERRNO(EBADF,RMS_IFI);
2161 #if LSEEKSIZE > IVSIZE
2162 PUSHn( do_tell(gv) );
2164 PUSHi( do_tell(gv) );
2172 const int whence = POPi;
2173 #if LSEEKSIZE > IVSIZE
2174 const Off_t offset = (Off_t)SvNVx(POPs);
2176 const Off_t offset = (Off_t)SvIVx(POPs);
2179 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2180 IO *const io = GvIO(gv);
2183 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2185 #if LSEEKSIZE > IVSIZE
2186 SV *const offset_sv = newSVnv((NV) offset);
2188 SV *const offset_sv = newSViv(offset);
2191 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2196 if (PL_op->op_type == OP_SEEK)
2197 PUSHs(boolSV(do_seek(gv, offset, whence)));
2199 const Off_t sought = do_sysseek(gv, offset, whence);
2201 PUSHs(&PL_sv_undef);
2203 SV* const sv = sought ?
2204 #if LSEEKSIZE > IVSIZE
2209 : newSVpvn(zero_but_true, ZBTLEN);
2220 /* There seems to be no consensus on the length type of truncate()
2221 * and ftruncate(), both off_t and size_t have supporters. In
2222 * general one would think that when using large files, off_t is
2223 * at least as wide as size_t, so using an off_t should be okay. */
2224 /* XXX Configure probe for the length type of *truncate() needed XXX */
2227 #if Off_t_size > IVSIZE
2232 /* Checking for length < 0 is problematic as the type might or
2233 * might not be signed: if it is not, clever compilers will moan. */
2234 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2237 SV * const sv = POPs;
2242 if (PL_op->op_flags & OPf_SPECIAL
2243 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2244 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2251 TAINT_PROPER("truncate");
2252 if (!(fp = IoIFP(io))) {
2256 int fd = PerlIO_fileno(fp);
2258 SETERRNO(EBADF,RMS_IFI);
2263 if (ftruncate(fd, len) < 0)
2265 if (my_chsize(fd, len) < 0)
2272 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2273 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2274 goto do_ftruncate_io;
2277 const char * const name = SvPV_nomg_const_nolen(sv);
2278 TAINT_PROPER("truncate");
2280 if (truncate(name, len) < 0)
2284 const int tmpfd = PerlLIO_open(name, O_RDWR);
2287 SETERRNO(EBADF,RMS_IFI);
2290 if (my_chsize(tmpfd, len) < 0)
2292 PerlLIO_close(tmpfd);
2301 SETERRNO(EBADF,RMS_IFI);
2309 SV * const argsv = POPs;
2310 const unsigned int func = POPu;
2312 GV * const gv = MUTABLE_GV(POPs);
2313 IO * const io = GvIOn(gv);
2319 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2323 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2326 s = SvPV_force(argsv, len);
2327 need = IOCPARM_LEN(func);
2329 s = Sv_Grow(argsv, need + 1);
2330 SvCUR_set(argsv, need);
2333 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2336 retval = SvIV(argsv);
2337 s = INT2PTR(char*,retval); /* ouch */
2340 optype = PL_op->op_type;
2341 TAINT_PROPER(PL_op_desc[optype]);
2343 if (optype == OP_IOCTL)
2345 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2347 DIE(aTHX_ "ioctl is not implemented");
2351 DIE(aTHX_ "fcntl is not implemented");
2353 #if defined(OS2) && defined(__EMX__)
2354 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2356 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2360 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2362 if (s[SvCUR(argsv)] != 17)
2363 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2365 s[SvCUR(argsv)] = 0; /* put our null back */
2366 SvSETMAGIC(argsv); /* Assume it has changed */
2375 PUSHp(zero_but_true, ZBTLEN);
2386 const int argtype = POPi;
2387 GV * const gv = MUTABLE_GV(POPs);
2388 IO *const io = GvIO(gv);
2389 PerlIO *const fp = io ? IoIFP(io) : NULL;
2391 /* XXX Looks to me like io is always NULL at this point */
2393 (void)PerlIO_flush(fp);
2394 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2399 SETERRNO(EBADF,RMS_IFI);
2404 DIE(aTHX_ PL_no_func, "flock()");
2415 const int protocol = POPi;
2416 const int type = POPi;
2417 const int domain = POPi;
2418 GV * const gv = MUTABLE_GV(POPs);
2419 IO * const io = GvIOn(gv);
2423 do_close(gv, FALSE);
2425 TAINT_PROPER("socket");
2426 fd = PerlSock_socket(domain, type, protocol);
2428 SETERRNO(EBADF,RMS_IFI);
2431 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2432 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2433 IoTYPE(io) = IoTYPE_SOCKET;
2434 if (!IoIFP(io) || !IoOFP(io)) {
2435 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2436 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2437 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2440 #if defined(HAS_FCNTL) && defined(F_SETFD)
2441 if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
2451 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2454 const int protocol = POPi;
2455 const int type = POPi;
2456 const int domain = POPi;
2458 GV * const gv2 = MUTABLE_GV(POPs);
2459 IO * const io2 = GvIOn(gv2);
2460 GV * const gv1 = MUTABLE_GV(POPs);
2461 IO * const io1 = GvIOn(gv1);
2464 do_close(gv1, FALSE);
2466 do_close(gv2, FALSE);
2468 TAINT_PROPER("socketpair");
2469 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2471 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2472 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2473 IoTYPE(io1) = IoTYPE_SOCKET;
2474 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2475 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2476 IoTYPE(io2) = IoTYPE_SOCKET;
2477 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2478 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2479 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2480 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2481 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2482 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2483 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2486 #if defined(HAS_FCNTL) && defined(F_SETFD)
2487 /* ensure close-on-exec */
2488 if ((fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd) < 0) ||
2489 (fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd) < 0))
2495 DIE(aTHX_ PL_no_sock_func, "socketpair");
2504 SV * const addrsv = POPs;
2505 /* OK, so on what platform does bind modify addr? */
2507 GV * const gv = MUTABLE_GV(POPs);
2508 IO * const io = GvIOn(gv);
2515 fd = PerlIO_fileno(IoIFP(io));
2519 addr = SvPV_const(addrsv, len);
2520 op_type = PL_op->op_type;
2521 TAINT_PROPER(PL_op_desc[op_type]);
2522 if ((op_type == OP_BIND
2523 ? PerlSock_bind(fd, (struct sockaddr *)addr, len)
2524 : PerlSock_connect(fd, (struct sockaddr *)addr, len))
2532 SETERRNO(EBADF,SS_IVCHAN);
2539 const int backlog = POPi;
2540 GV * const gv = MUTABLE_GV(POPs);
2541 IO * const io = GvIOn(gv);
2546 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2553 SETERRNO(EBADF,SS_IVCHAN);
2561 char namebuf[MAXPATHLEN];
2562 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2563 Sock_size_t len = sizeof (struct sockaddr_in);
2565 Sock_size_t len = sizeof namebuf;
2567 GV * const ggv = MUTABLE_GV(POPs);
2568 GV * const ngv = MUTABLE_GV(POPs);
2571 IO * const gstio = GvIO(ggv);
2572 if (!gstio || !IoIFP(gstio))
2576 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2579 /* Some platforms indicate zero length when an AF_UNIX client is
2580 * not bound. Simulate a non-zero-length sockaddr structure in
2582 namebuf[0] = 0; /* sun_len */
2583 namebuf[1] = AF_UNIX; /* sun_family */
2591 do_close(ngv, FALSE);
2592 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2593 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2594 IoTYPE(nstio) = IoTYPE_SOCKET;
2595 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2596 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2597 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2598 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2601 #if defined(HAS_FCNTL) && defined(F_SETFD)
2602 if (fcntl(fd, F_SETFD, fd > PL_maxsysfd) < 0) /* ensure close-on-exec */
2606 #ifdef __SCO_VERSION__
2607 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2610 PUSHp(namebuf, len);
2614 report_evil_fh(ggv);
2615 SETERRNO(EBADF,SS_IVCHAN);
2625 const int how = POPi;
2626 GV * const gv = MUTABLE_GV(POPs);
2627 IO * const io = GvIOn(gv);
2632 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2637 SETERRNO(EBADF,SS_IVCHAN);
2644 const int optype = PL_op->op_type;
2645 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2646 const unsigned int optname = (unsigned int) POPi;
2647 const unsigned int lvl = (unsigned int) POPi;
2648 GV * const gv = MUTABLE_GV(POPs);
2649 IO * const io = GvIOn(gv);
2656 fd = PerlIO_fileno(IoIFP(io));
2662 (void)SvPOK_only(sv);
2666 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2673 #if defined(__SYMBIAN32__)
2674 # define SETSOCKOPT_OPTION_VALUE_T void *
2676 # define SETSOCKOPT_OPTION_VALUE_T const char *
2678 /* XXX TODO: We need to have a proper type (a Configure probe,
2679 * etc.) for what the C headers think of the third argument of
2680 * setsockopt(), the option_value read-only buffer: is it
2681 * a "char *", or a "void *", const or not. Some compilers
2682 * don't take kindly to e.g. assuming that "char *" implicitly
2683 * promotes to a "void *", or to explicitly promoting/demoting
2684 * consts to non/vice versa. The "const void *" is the SUS
2685 * definition, but that does not fly everywhere for the above
2687 SETSOCKOPT_OPTION_VALUE_T buf;
2691 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2695 aint = (int)SvIV(sv);
2696 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2699 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2709 SETERRNO(EBADF,SS_IVCHAN);
2718 const int optype = PL_op->op_type;
2719 GV * const gv = MUTABLE_GV(POPs);
2720 IO * const io = GvIOn(gv);
2728 sv = sv_2mortal(newSV(257));
2729 (void)SvPOK_only(sv);
2733 fd = PerlIO_fileno(IoIFP(io));
2737 case OP_GETSOCKNAME:
2738 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2741 case OP_GETPEERNAME:
2742 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2744 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2746 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";
2747 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2748 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2749 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2750 sizeof(u_short) + sizeof(struct in_addr))) {
2757 #ifdef BOGUS_GETNAME_RETURN
2758 /* Interactive Unix, getpeername() and getsockname()
2759 does not return valid namelen */
2760 if (len == BOGUS_GETNAME_RETURN)
2761 len = sizeof(struct sockaddr);
2770 SETERRNO(EBADF,SS_IVCHAN);
2789 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2790 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2791 if (PL_op->op_type == OP_LSTAT) {
2792 if (gv != PL_defgv) {
2793 do_fstat_warning_check:
2794 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2795 "lstat() on filehandle%s%"SVf,
2798 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2800 } else if (PL_laststype != OP_LSTAT)
2801 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2802 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2805 if (gv != PL_defgv) {
2809 PL_laststype = OP_STAT;
2810 PL_statgv = gv ? gv : (GV *)io;
2811 sv_setpvs(PL_statname, "");
2817 int fd = PerlIO_fileno(IoIFP(io));
2819 PL_laststatval = -1;
2820 SETERRNO(EBADF,RMS_IFI);
2822 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
2825 } else if (IoDIRP(io)) {
2827 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2830 PL_laststatval = -1;
2833 else PL_laststatval = -1;
2834 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2837 if (PL_laststatval < 0) {
2843 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2844 io = MUTABLE_IO(SvRV(sv));
2845 if (PL_op->op_type == OP_LSTAT)
2846 goto do_fstat_warning_check;
2847 goto do_fstat_have_io;
2850 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2851 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2853 PL_laststype = PL_op->op_type;
2854 file = SvPV_nolen_const(PL_statname);
2855 if (PL_op->op_type == OP_LSTAT)
2856 PL_laststatval = PerlLIO_lstat(file, &PL_statcache);
2858 PL_laststatval = PerlLIO_stat(file, &PL_statcache);
2859 if (PL_laststatval < 0) {
2860 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
2861 /* PL_warn_nl is constant */
2862 GCC_DIAG_IGNORE(-Wformat-nonliteral);
2863 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2871 if (gimme != G_ARRAY) {
2872 if (gimme != G_VOID)
2873 XPUSHs(boolSV(max));
2879 mPUSHi(PL_statcache.st_dev);
2880 #if ST_INO_SIZE > IVSIZE
2881 mPUSHn(PL_statcache.st_ino);
2883 # if ST_INO_SIGN <= 0
2884 mPUSHi(PL_statcache.st_ino);
2886 mPUSHu(PL_statcache.st_ino);
2889 mPUSHu(PL_statcache.st_mode);
2890 mPUSHu(PL_statcache.st_nlink);
2892 sv_setuid(PUSHmortal, PL_statcache.st_uid);
2893 sv_setgid(PUSHmortal, PL_statcache.st_gid);
2895 #ifdef USE_STAT_RDEV
2896 mPUSHi(PL_statcache.st_rdev);
2898 PUSHs(newSVpvs_flags("", SVs_TEMP));
2900 #if Off_t_size > IVSIZE
2901 mPUSHn(PL_statcache.st_size);
2903 mPUSHi(PL_statcache.st_size);
2906 mPUSHn(PL_statcache.st_atime);
2907 mPUSHn(PL_statcache.st_mtime);
2908 mPUSHn(PL_statcache.st_ctime);
2910 mPUSHi(PL_statcache.st_atime);
2911 mPUSHi(PL_statcache.st_mtime);
2912 mPUSHi(PL_statcache.st_ctime);
2914 #ifdef USE_STAT_BLOCKS
2915 mPUSHu(PL_statcache.st_blksize);
2916 mPUSHu(PL_statcache.st_blocks);
2918 PUSHs(newSVpvs_flags("", SVs_TEMP));
2919 PUSHs(newSVpvs_flags("", SVs_TEMP));
2925 /* All filetest ops avoid manipulating the perl stack pointer in their main
2926 bodies (since commit d2c4d2d1e22d3125), and return using either
2927 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2928 the only two which manipulate the perl stack. To ensure that no stack
2929 manipulation macros are used, the filetest ops avoid defining a local copy
2930 of the stack pointer with dSP. */
2932 /* If the next filetest is stacked up with this one
2933 (PL_op->op_private & OPpFT_STACKING), we leave
2934 the original argument on the stack for success,
2935 and skip the stacked operators on failure.
2936 The next few macros/functions take care of this.
2940 S_ft_return_false(pTHX_ SV *ret) {
2944 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2948 if (PL_op->op_private & OPpFT_STACKING) {
2949 while (OP_IS_FILETEST(next->op_type)
2950 && next->op_private & OPpFT_STACKED)
2951 next = next->op_next;
2956 PERL_STATIC_INLINE OP *
2957 S_ft_return_true(pTHX_ SV *ret) {
2959 if (PL_op->op_flags & OPf_REF)
2960 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2961 else if (!(PL_op->op_private & OPpFT_STACKING))
2967 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2968 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2969 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2971 #define tryAMAGICftest_MG(chr) STMT_START { \
2972 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2973 && PL_op->op_flags & OPf_KIDS) { \
2974 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2975 if (next) return next; \
2980 S_try_amagic_ftest(pTHX_ char chr) {
2982 SV *const arg = *PL_stack_sp;
2985 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2989 const char tmpchr = chr;
2990 SV * const tmpsv = amagic_call(arg,
2991 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2992 ftest_amg, AMGf_unary);
2997 return SvTRUE(tmpsv)
2998 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
3008 /* Not const, because things tweak this below. Not bool, because there's
3009 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
3010 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3011 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3012 /* Giving some sort of initial value silences compilers. */
3014 int access_mode = R_OK;
3016 int access_mode = 0;
3019 /* access_mode is never used, but leaving use_access in makes the
3020 conditional compiling below much clearer. */
3023 Mode_t stat_mode = S_IRUSR;
3025 bool effective = FALSE;
3028 switch (PL_op->op_type) {
3029 case OP_FTRREAD: opchar = 'R'; break;
3030 case OP_FTRWRITE: opchar = 'W'; break;
3031 case OP_FTREXEC: opchar = 'X'; break;
3032 case OP_FTEREAD: opchar = 'r'; break;
3033 case OP_FTEWRITE: opchar = 'w'; break;
3034 case OP_FTEEXEC: opchar = 'x'; break;
3036 tryAMAGICftest_MG(opchar);
3038 switch (PL_op->op_type) {
3040 #if !(defined(HAS_ACCESS) && defined(R_OK))
3046 #if defined(HAS_ACCESS) && defined(W_OK)
3051 stat_mode = S_IWUSR;
3055 #if defined(HAS_ACCESS) && defined(X_OK)
3060 stat_mode = S_IXUSR;
3064 #ifdef PERL_EFF_ACCESS
3067 stat_mode = S_IWUSR;
3071 #ifndef PERL_EFF_ACCESS
3078 #ifdef PERL_EFF_ACCESS
3083 stat_mode = S_IXUSR;
3089 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3090 const char *name = SvPV_nolen(*PL_stack_sp);
3092 # ifdef PERL_EFF_ACCESS
3093 result = PERL_EFF_ACCESS(name, access_mode);
3095 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3101 result = access(name, access_mode);
3103 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3114 result = my_stat_flags(0);
3117 if (cando(stat_mode, effective, &PL_statcache))
3126 const int op_type = PL_op->op_type;
3130 case OP_FTIS: opchar = 'e'; break;
3131 case OP_FTSIZE: opchar = 's'; break;
3132 case OP_FTMTIME: opchar = 'M'; break;
3133 case OP_FTCTIME: opchar = 'C'; break;
3134 case OP_FTATIME: opchar = 'A'; break;
3136 tryAMAGICftest_MG(opchar);
3138 result = my_stat_flags(0);
3141 if (op_type == OP_FTIS)
3144 /* You can't dTARGET inside OP_FTIS, because you'll get
3145 "panic: pad_sv po" - the op is not flagged to have a target. */
3149 #if Off_t_size > IVSIZE
3150 sv_setnv(TARG, (NV)PL_statcache.st_size);
3152 sv_setiv(TARG, (IV)PL_statcache.st_size);
3157 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3161 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3165 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3169 return SvTRUE_nomg(TARG)
3170 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3180 switch (PL_op->op_type) {
3181 case OP_FTROWNED: opchar = 'O'; break;
3182 case OP_FTEOWNED: opchar = 'o'; break;
3183 case OP_FTZERO: opchar = 'z'; break;
3184 case OP_FTSOCK: opchar = 'S'; break;
3185 case OP_FTCHR: opchar = 'c'; break;
3186 case OP_FTBLK: opchar = 'b'; break;
3187 case OP_FTFILE: opchar = 'f'; break;
3188 case OP_FTDIR: opchar = 'd'; break;
3189 case OP_FTPIPE: opchar = 'p'; break;
3190 case OP_FTSUID: opchar = 'u'; break;
3191 case OP_FTSGID: opchar = 'g'; break;
3192 case OP_FTSVTX: opchar = 'k'; break;
3194 tryAMAGICftest_MG(opchar);
3196 /* I believe that all these three are likely to be defined on most every
3197 system these days. */
3199 if(PL_op->op_type == OP_FTSUID) {
3204 if(PL_op->op_type == OP_FTSGID) {
3209 if(PL_op->op_type == OP_FTSVTX) {
3214 result = my_stat_flags(0);
3217 switch (PL_op->op_type) {
3219 if (PL_statcache.st_uid == PerlProc_getuid())
3223 if (PL_statcache.st_uid == PerlProc_geteuid())
3227 if (PL_statcache.st_size == 0)
3231 if (S_ISSOCK(PL_statcache.st_mode))
3235 if (S_ISCHR(PL_statcache.st_mode))
3239 if (S_ISBLK(PL_statcache.st_mode))
3243 if (S_ISREG(PL_statcache.st_mode))
3247 if (S_ISDIR(PL_statcache.st_mode))
3251 if (S_ISFIFO(PL_statcache.st_mode))
3256 if (PL_statcache.st_mode & S_ISUID)
3262 if (PL_statcache.st_mode & S_ISGID)
3268 if (PL_statcache.st_mode & S_ISVTX)
3281 tryAMAGICftest_MG('l');
3282 result = my_lstat_flags(0);
3286 if (S_ISLNK(PL_statcache.st_mode))
3299 tryAMAGICftest_MG('t');
3301 if (PL_op->op_flags & OPf_REF)
3304 SV *tmpsv = *PL_stack_sp;
3305 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3306 name = SvPV_nomg(tmpsv, namelen);
3307 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3311 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3312 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3313 else if (name && isDIGIT(*name))
3318 SETERRNO(EBADF,RMS_IFI);
3321 if (PerlLIO_isatty(fd))
3339 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3341 if (PL_op->op_flags & OPf_REF)
3343 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3348 gv = MAYBE_DEREF_GV_nomg(sv);
3352 if (gv == PL_defgv) {
3354 io = SvTYPE(PL_statgv) == SVt_PVIO
3358 goto really_filename;
3363 sv_setpvs(PL_statname, "");
3364 io = GvIO(PL_statgv);
3366 PL_laststatval = -1;
3367 PL_laststype = OP_STAT;
3368 if (io && IoIFP(io)) {
3370 if (! PerlIO_has_base(IoIFP(io)))
3371 DIE(aTHX_ "-T and -B not implemented on filehandles");
3372 fd = PerlIO_fileno(IoIFP(io));
3374 SETERRNO(EBADF,RMS_IFI);
3377 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3378 if (PL_laststatval < 0)
3380 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3381 if (PL_op->op_type == OP_FTTEXT)
3386 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3387 i = PerlIO_getc(IoIFP(io));
3389 (void)PerlIO_ungetc(IoIFP(io),i);
3391 /* null file is anything */
3394 len = PerlIO_get_bufsiz(IoIFP(io));
3395 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3396 /* sfio can have large buffers - limit to 512 */
3401 SETERRNO(EBADF,RMS_IFI);
3403 SETERRNO(EBADF,RMS_IFI);
3412 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3414 file = SvPVX_const(PL_statname);
3416 if (!(fp = PerlIO_open(file, "r"))) {
3418 PL_laststatval = -1;
3419 PL_laststype = OP_STAT;
3421 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
3422 /* PL_warn_nl is constant */
3423 GCC_DIAG_IGNORE(-Wformat-nonliteral);
3424 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3429 PL_laststype = OP_STAT;
3430 fd = PerlIO_fileno(fp);
3432 (void)PerlIO_close(fp);
3433 SETERRNO(EBADF,RMS_IFI);
3436 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3437 if (PL_laststatval < 0) {
3438 (void)PerlIO_close(fp);
3439 SETERRNO(EBADF,RMS_IFI);
3442 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3443 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3444 (void)PerlIO_close(fp);
3446 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3447 FT_RETURNNO; /* special case NFS directories */
3448 FT_RETURNYES; /* null file is anything */
3453 /* now scan s to look for textiness */
3454 /* XXX ASCII dependent code */
3456 #if defined(DOSISH) || defined(USEMYBINMODE)
3457 /* ignore trailing ^Z on short files */
3458 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3462 for (i = 0; i < len; i++, s++) {
3463 if (!*s) { /* null never allowed in text */
3468 else if (!(isPRINT(*s) || isSPACE(*s)))
3471 else if (*s & 128) {
3473 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3476 /* utf8 characters don't count as odd */
3477 if (UTF8_IS_START(*s)) {
3478 int ulen = UTF8SKIP(s);
3479 if (ulen < len - i) {
3481 for (j = 1; j < ulen; j++) {
3482 if (!UTF8_IS_CONTINUATION(s[j]))
3485 --ulen; /* loop does extra increment */
3495 *s != '\n' && *s != '\r' && *s != '\b' &&
3496 *s != '\t' && *s != '\f' && *s != 27)
3501 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3512 const char *tmps = NULL;
3516 SV * const sv = POPs;
3517 if (PL_op->op_flags & OPf_SPECIAL) {
3518 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3520 else if (!(gv = MAYBE_DEREF_GV(sv)))
3521 tmps = SvPV_nomg_const_nolen(sv);
3524 if( !gv && (!tmps || !*tmps) ) {
3525 HV * const table = GvHVn(PL_envgv);
3528 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3529 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3531 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3536 deprecate("chdir('') or chdir(undef) as chdir()");
3537 tmps = SvPV_nolen_const(*svp);
3541 TAINT_PROPER("chdir");
3546 TAINT_PROPER("chdir");
3549 IO* const io = GvIO(gv);
3552 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3553 } else if (IoIFP(io)) {
3554 int fd = PerlIO_fileno(IoIFP(io));
3558 PUSHi(fchdir(fd) >= 0);
3568 DIE(aTHX_ PL_no_func, "fchdir");
3572 PUSHi( PerlDir_chdir(tmps) >= 0 );
3574 /* Clear the DEFAULT element of ENV so we'll get the new value
3576 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3582 SETERRNO(EBADF,RMS_IFI);
3589 dVAR; dSP; dMARK; dTARGET;
3590 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3601 char * const tmps = POPpx;
3602 TAINT_PROPER("chroot");
3603 PUSHi( chroot(tmps) >= 0 );
3606 DIE(aTHX_ PL_no_func, "chroot");
3614 const char * const tmps2 = POPpconstx;
3615 const char * const tmps = SvPV_nolen_const(TOPs);
3616 TAINT_PROPER("rename");
3618 anum = PerlLIO_rename(tmps, tmps2);
3620 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3621 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3624 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3625 (void)UNLINK(tmps2);
3626 if (!(anum = link(tmps, tmps2)))
3627 anum = UNLINK(tmps);
3635 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3639 const int op_type = PL_op->op_type;
3643 if (op_type == OP_LINK)
3644 DIE(aTHX_ PL_no_func, "link");
3646 # ifndef HAS_SYMLINK
3647 if (op_type == OP_SYMLINK)
3648 DIE(aTHX_ PL_no_func, "symlink");
3652 const char * const tmps2 = POPpconstx;
3653 const char * const tmps = SvPV_nolen_const(TOPs);
3654 TAINT_PROPER(PL_op_desc[op_type]);
3656 # if defined(HAS_LINK)
3657 # if defined(HAS_SYMLINK)
3658 /* Both present - need to choose which. */
3659 (op_type == OP_LINK) ?
3660 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3662 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3663 PerlLIO_link(tmps, tmps2);
3666 # if defined(HAS_SYMLINK)
3667 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3668 symlink(tmps, tmps2);
3673 SETi( result >= 0 );
3680 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3691 char buf[MAXPATHLEN];
3696 len = readlink(tmps, buf, sizeof(buf) - 1);
3703 RETSETUNDEF; /* just pretend it's a normal file */
3707 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3709 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3711 char * const save_filename = filename;
3716 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3718 PERL_ARGS_ASSERT_DOONELINER;
3720 Newx(cmdline, size, char);
3721 my_strlcpy(cmdline, cmd, size);
3722 my_strlcat(cmdline, " ", size);
3723 for (s = cmdline + strlen(cmdline); *filename; ) {
3727 if (s - cmdline < size)
3728 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3729 myfp = PerlProc_popen(cmdline, "r");
3733 SV * const tmpsv = sv_newmortal();
3734 /* Need to save/restore 'PL_rs' ?? */
3735 s = sv_gets(tmpsv, myfp, 0);
3736 (void)PerlProc_pclose(myfp);
3740 #ifdef HAS_SYS_ERRLIST
3745 /* you don't see this */
3746 const char * const errmsg = Strerror(e) ;
3749 if (instr(s, errmsg)) {
3756 #define EACCES EPERM
3758 if (instr(s, "cannot make"))
3759 SETERRNO(EEXIST,RMS_FEX);
3760 else if (instr(s, "existing file"))
3761 SETERRNO(EEXIST,RMS_FEX);
3762 else if (instr(s, "ile exists"))
3763 SETERRNO(EEXIST,RMS_FEX);
3764 else if (instr(s, "non-exist"))
3765 SETERRNO(ENOENT,RMS_FNF);
3766 else if (instr(s, "does not exist"))
3767 SETERRNO(ENOENT,RMS_FNF);
3768 else if (instr(s, "not empty"))
3769 SETERRNO(EBUSY,SS_DEVOFFLINE);
3770 else if (instr(s, "cannot access"))
3771 SETERRNO(EACCES,RMS_PRV);
3773 SETERRNO(EPERM,RMS_PRV);
3776 else { /* some mkdirs return no failure indication */
3777 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3778 if (PL_op->op_type == OP_RMDIR)
3783 SETERRNO(EACCES,RMS_PRV); /* a guess */
3792 /* This macro removes trailing slashes from a directory name.
3793 * Different operating and file systems take differently to
3794 * trailing slashes. According to POSIX 1003.1 1996 Edition
3795 * any number of trailing slashes should be allowed.
3796 * Thusly we snip them away so that even non-conforming
3797 * systems are happy.
3798 * We should probably do this "filtering" for all
3799 * the functions that expect (potentially) directory names:
3800 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3801 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3803 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3804 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3807 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3808 (tmps) = savepvn((tmps), (len)); \
3818 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3820 TRIMSLASHES(tmps,len,copy);
3822 TAINT_PROPER("mkdir");
3824 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3828 SETi( dooneliner("mkdir", tmps) );
3829 oldumask = PerlLIO_umask(0);
3830 PerlLIO_umask(oldumask);
3831 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3846 TRIMSLASHES(tmps,len,copy);
3847 TAINT_PROPER("rmdir");
3849 SETi( PerlDir_rmdir(tmps) >= 0 );
3851 SETi( dooneliner("rmdir", tmps) );
3858 /* Directory calls. */
3862 #if defined(Direntry_t) && defined(HAS_READDIR)
3864 const char * const dirname = POPpconstx;
3865 GV * const gv = MUTABLE_GV(POPs);
3866 IO * const io = GvIOn(gv);
3868 if ((IoIFP(io) || IoOFP(io)))
3869 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3870 "Opening filehandle %"HEKf" also as a directory",
3871 HEKfARG(GvENAME_HEK(gv)) );
3873 PerlDir_close(IoDIRP(io));
3874 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3880 SETERRNO(EBADF,RMS_DIR);
3883 DIE(aTHX_ PL_no_dir_func, "opendir");
3889 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3890 DIE(aTHX_ PL_no_dir_func, "readdir");
3892 #if !defined(I_DIRENT) && !defined(VMS)
3893 Direntry_t *readdir (DIR *);
3899 const I32 gimme = GIMME;
3900 GV * const gv = MUTABLE_GV(POPs);
3901 const Direntry_t *dp;
3902 IO * const io = GvIOn(gv);
3905 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3906 "readdir() attempted on invalid dirhandle %"HEKf,
3907 HEKfARG(GvENAME_HEK(gv)));
3912 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3916 sv = newSVpvn(dp->d_name, dp->d_namlen);
3918 sv = newSVpv(dp->d_name, 0);
3920 if (!(IoFLAGS(io) & IOf_UNTAINT))
3923 } while (gimme == G_ARRAY);
3925 if (!dp && gimme != G_ARRAY)
3932 SETERRNO(EBADF,RMS_ISI);
3933 if (GIMME == G_ARRAY)
3942 #if defined(HAS_TELLDIR) || defined(telldir)
3944 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3945 /* XXX netbsd still seemed to.
3946 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3947 --JHI 1999-Feb-02 */
3948 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3949 long telldir (DIR *);
3951 GV * const gv = MUTABLE_GV(POPs);
3952 IO * const io = GvIOn(gv);
3955 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3956 "telldir() attempted on invalid dirhandle %"HEKf,
3957 HEKfARG(GvENAME_HEK(gv)));
3961 PUSHi( PerlDir_tell(IoDIRP(io)) );
3965 SETERRNO(EBADF,RMS_ISI);
3968 DIE(aTHX_ PL_no_dir_func, "telldir");
3974 #if defined(HAS_SEEKDIR) || defined(seekdir)
3976 const long along = POPl;
3977 GV * const gv = MUTABLE_GV(POPs);
3978 IO * const io = GvIOn(gv);
3981 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3982 "seekdir() attempted on invalid dirhandle %"HEKf,
3983 HEKfARG(GvENAME_HEK(gv)));
3986 (void)PerlDir_seek(IoDIRP(io), along);
3991 SETERRNO(EBADF,RMS_ISI);
3994 DIE(aTHX_ PL_no_dir_func, "seekdir");
4000 #if defined(HAS_REWINDDIR) || defined(rewinddir)
4002 GV * const gv = MUTABLE_GV(POPs);
4003 IO * const io = GvIOn(gv);
4006 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4007 "rewinddir() attempted on invalid dirhandle %"HEKf,
4008 HEKfARG(GvENAME_HEK(gv)));
4011 (void)PerlDir_rewind(IoDIRP(io));
4015 SETERRNO(EBADF,RMS_ISI);
4018 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4024 #if defined(Direntry_t) && defined(HAS_READDIR)
4026 GV * const gv = MUTABLE_GV(POPs);
4027 IO * const io = GvIOn(gv);
4030 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4031 "closedir() attempted on invalid dirhandle %"HEKf,
4032 HEKfARG(GvENAME_HEK(gv)));
4035 #ifdef VOID_CLOSEDIR
4036 PerlDir_close(IoDIRP(io));
4038 if (PerlDir_close(IoDIRP(io)) < 0) {
4039 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4048 SETERRNO(EBADF,RMS_IFI);
4051 DIE(aTHX_ PL_no_dir_func, "closedir");
4055 /* Process control. */
4062 #ifdef HAS_SIGPROCMASK
4063 sigset_t oldmask, newmask;
4067 PERL_FLUSHALL_FOR_CHILD;
4068 #ifdef HAS_SIGPROCMASK
4069 sigfillset(&newmask);
4070 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4072 childpid = PerlProc_fork();
4073 if (childpid == 0) {
4077 for (sig = 1; sig < SIG_SIZE; sig++)
4078 PL_psig_pend[sig] = 0;
4080 #ifdef HAS_SIGPROCMASK
4083 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4090 #ifdef PERL_USES_PL_PIDSTATUS
4091 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4097 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4102 PERL_FLUSHALL_FOR_CHILD;
4103 childpid = PerlProc_fork();
4109 DIE(aTHX_ PL_no_func, "fork");
4116 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4121 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4122 childpid = wait4pid(-1, &argflags, 0);
4124 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4129 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4130 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4131 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4133 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4138 DIE(aTHX_ PL_no_func, "wait");
4144 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4146 const int optype = POPi;
4147 const Pid_t pid = TOPi;
4151 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4152 result = wait4pid(pid, &argflags, optype);
4154 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4159 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4160 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4161 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4163 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4168 DIE(aTHX_ PL_no_func, "waitpid");
4174 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4175 #if defined(__LIBCATAMOUNT__)
4176 PL_statusvalue = -1;
4185 while (++MARK <= SP) {
4186 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4191 TAINT_PROPER("system");
4193 PERL_FLUSHALL_FOR_CHILD;
4194 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4199 #ifdef HAS_SIGPROCMASK
4200 sigset_t newset, oldset;
4203 if (PerlProc_pipe(pp) >= 0)
4205 #ifdef HAS_SIGPROCMASK
4206 sigemptyset(&newset);
4207 sigaddset(&newset, SIGCHLD);
4208 sigprocmask(SIG_BLOCK, &newset, &oldset);
4210 while ((childpid = PerlProc_fork()) == -1) {
4211 if (errno != EAGAIN) {
4216 PerlLIO_close(pp[0]);
4217 PerlLIO_close(pp[1]);
4219 #ifdef HAS_SIGPROCMASK
4220 sigprocmask(SIG_SETMASK, &oldset, NULL);
4227 Sigsave_t ihand,qhand; /* place to save signals during system() */
4231 PerlLIO_close(pp[1]);
4233 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4234 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4237 result = wait4pid(childpid, &status, 0);
4238 } while (result == -1 && errno == EINTR);
4240 #ifdef HAS_SIGPROCMASK
4241 sigprocmask(SIG_SETMASK, &oldset, NULL);
4243 (void)rsignal_restore(SIGINT, &ihand);
4244 (void)rsignal_restore(SIGQUIT, &qhand);
4246 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4247 do_execfree(); /* free any memory child malloced on fork */
4254 while (n < sizeof(int)) {
4255 n1 = PerlLIO_read(pp[0],
4256 (void*)(((char*)&errkid)+n),
4262 PerlLIO_close(pp[0]);
4263 if (n) { /* Error */
4264 if (n != sizeof(int))
4265 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4266 errno = errkid; /* Propagate errno from kid */
4267 STATUS_NATIVE_CHILD_SET(-1);
4270 XPUSHi(STATUS_CURRENT);
4273 #ifdef HAS_SIGPROCMASK
4274 sigprocmask(SIG_SETMASK, &oldset, NULL);
4277 PerlLIO_close(pp[0]);
4278 #if defined(HAS_FCNTL) && defined(F_SETFD)
4279 if (fcntl(pp[1], F_SETFD, FD_CLOEXEC) < 0)
4283 if (PL_op->op_flags & OPf_STACKED) {
4284 SV * const really = *++MARK;
4285 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4287 else if (SP - MARK != 1)
4288 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4290 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4294 #else /* ! FORK or VMS or OS/2 */
4297 if (PL_op->op_flags & OPf_STACKED) {
4298 SV * const really = *++MARK;
4299 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4300 value = (I32)do_aspawn(really, MARK, SP);
4302 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4305 else if (SP - MARK != 1) {
4306 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4307 value = (I32)do_aspawn(NULL, MARK, SP);
4309 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4313 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4315 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4317 STATUS_NATIVE_CHILD_SET(value);
4320 XPUSHi(result ? value : STATUS_CURRENT);
4321 #endif /* !FORK or VMS or OS/2 */
4328 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4333 while (++MARK <= SP) {
4334 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4339 TAINT_PROPER("exec");
4341 PERL_FLUSHALL_FOR_CHILD;
4342 if (PL_op->op_flags & OPf_STACKED) {
4343 SV * const really = *++MARK;
4344 value = (I32)do_aexec(really, MARK, SP);
4346 else if (SP - MARK != 1)
4348 value = (I32)vms_do_aexec(NULL, MARK, SP);
4350 value = (I32)do_aexec(NULL, MARK, SP);
4354 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4356 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4369 XPUSHi( getppid() );
4372 DIE(aTHX_ PL_no_func, "getppid");
4382 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4385 pgrp = (I32)BSD_GETPGRP(pid);
4387 if (pid != 0 && pid != PerlProc_getpid())
4388 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4394 DIE(aTHX_ PL_no_func, "getpgrp()");
4404 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4405 if (MAXARG > 0) pid = TOPs && TOPi;
4411 TAINT_PROPER("setpgrp");
4413 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4415 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4416 || (pid != 0 && pid != PerlProc_getpid()))
4418 DIE(aTHX_ "setpgrp can't take arguments");
4420 SETi( setpgrp() >= 0 );
4421 #endif /* USE_BSDPGRP */
4424 DIE(aTHX_ PL_no_func, "setpgrp()");
4428 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4429 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4431 # define PRIORITY_WHICH_T(which) which
4436 #ifdef HAS_GETPRIORITY
4438 const int who = POPi;
4439 const int which = TOPi;
4440 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4443 DIE(aTHX_ PL_no_func, "getpriority()");
4449 #ifdef HAS_SETPRIORITY
4451 const int niceval = POPi;
4452 const int who = POPi;
4453 const int which = TOPi;
4454 TAINT_PROPER("setpriority");
4455 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4458 DIE(aTHX_ PL_no_func, "setpriority()");
4462 #undef PRIORITY_WHICH_T
4470 XPUSHn( time(NULL) );
4472 XPUSHi( time(NULL) );
4482 struct tms timesbuf;
4485 (void)PerlProc_times(×buf);
4487 mPUSHn(((NV)timesbuf.tms_utime)/(NV)PL_clocktick);
4488 if (GIMME == G_ARRAY) {
4489 mPUSHn(((NV)timesbuf.tms_stime)/(NV)PL_clocktick);
4490 mPUSHn(((NV)timesbuf.tms_cutime)/(NV)PL_clocktick);
4491 mPUSHn(((NV)timesbuf.tms_cstime)/(NV)PL_clocktick);
4499 if (GIMME == G_ARRAY) {
4506 DIE(aTHX_ "times not implemented");
4508 #endif /* HAS_TIMES */
4511 /* The 32 bit int year limits the times we can represent to these
4512 boundaries with a few days wiggle room to account for time zone
4515 /* Sat Jan 3 00:00:00 -2147481748 */
4516 #define TIME_LOWER_BOUND -67768100567755200.0
4517 /* Sun Dec 29 12:00:00 2147483647 */
4518 #define TIME_UPPER_BOUND 67767976233316800.0
4527 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4528 static const char * const dayname[] =
4529 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4530 static const char * const monname[] =
4531 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4532 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4534 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4537 when = (Time64_T)now;
4540 NV input = Perl_floor(POPn);
4541 when = (Time64_T)input;
4542 if (when != input) {
4543 /* diag_listed_as: gmtime(%f) too large */
4544 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4545 "%s(%.0" NVff ") too large", opname, input);
4549 if ( TIME_LOWER_BOUND > when ) {
4550 /* diag_listed_as: gmtime(%f) too small */
4551 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4552 "%s(%.0" NVff ") too small", opname, when);
4555 else if( when > TIME_UPPER_BOUND ) {
4556 /* diag_listed_as: gmtime(%f) too small */
4557 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4558 "%s(%.0" NVff ") too large", opname, when);
4562 if (PL_op->op_type == OP_LOCALTIME)
4563 err = S_localtime64_r(&when, &tmbuf);
4565 err = S_gmtime64_r(&when, &tmbuf);
4569 /* diag_listed_as: gmtime(%f) failed */
4570 /* XXX %lld broken for quads */
4571 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4572 "%s(%.0" NVff ") failed", opname, when);
4575 if (GIMME != G_ARRAY) { /* scalar context */
4581 mPUSHs(Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4582 dayname[tmbuf.tm_wday],
4583 monname[tmbuf.tm_mon],
4588 /* XXX newSVpvf()'s %lld type is broken,
4589 * so cheat with a double */
4590 (double)tmbuf.tm_year + 1900));
4593 else { /* list context */
4599 mPUSHi(tmbuf.tm_sec);
4600 mPUSHi(tmbuf.tm_min);
4601 mPUSHi(tmbuf.tm_hour);
4602 mPUSHi(tmbuf.tm_mday);
4603 mPUSHi(tmbuf.tm_mon);
4604 mPUSHn(tmbuf.tm_year);
4605 mPUSHi(tmbuf.tm_wday);
4606 mPUSHi(tmbuf.tm_yday);
4607 mPUSHi(tmbuf.tm_isdst);
4618 anum = alarm((unsigned int)anum);
4624 DIE(aTHX_ PL_no_func, "alarm");
4635 (void)time(&lasttime);
4636 if (MAXARG < 1 || (!TOPs && !POPs))
4640 PerlProc_sleep((unsigned int)duration);
4643 XPUSHi(when - lasttime);
4647 /* Shared memory. */
4648 /* Merged with some message passing. */
4652 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4653 dVAR; dSP; dMARK; dTARGET;
4654 const int op_type = PL_op->op_type;
4659 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4662 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4665 value = (I32)(do_semop(MARK, SP) >= 0);
4668 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4676 return Perl_pp_semget(aTHX);
4684 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4685 dVAR; dSP; dMARK; dTARGET;
4686 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4693 DIE(aTHX_ "System V IPC is not implemented on this machine");
4699 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4700 dVAR; dSP; dMARK; dTARGET;
4701 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4709 PUSHp(zero_but_true, ZBTLEN);
4713 return Perl_pp_semget(aTHX);
4717 /* I can't const this further without getting warnings about the types of
4718 various arrays passed in from structures. */
4720 S_space_join_names_mortal(pTHX_ char *const *array)
4724 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4726 if (array && *array) {
4727 target = newSVpvs_flags("", SVs_TEMP);
4729 sv_catpv(target, *array);
4732 sv_catpvs(target, " ");
4735 target = sv_mortalcopy(&PL_sv_no);
4740 /* Get system info. */
4744 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4746 I32 which = PL_op->op_type;
4749 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4750 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4751 struct hostent *gethostbyname(Netdb_name_t);
4752 struct hostent *gethostent(void);
4754 struct hostent *hent = NULL;
4758 if (which == OP_GHBYNAME) {
4759 #ifdef HAS_GETHOSTBYNAME
4760 const char* const name = POPpbytex;
4761 hent = PerlSock_gethostbyname(name);
4763 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4766 else if (which == OP_GHBYADDR) {
4767 #ifdef HAS_GETHOSTBYADDR
4768 const int addrtype = POPi;
4769 SV * const addrsv = POPs;
4771 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4773 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4775 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4779 #ifdef HAS_GETHOSTENT
4780 hent = PerlSock_gethostent();
4782 DIE(aTHX_ PL_no_sock_func, "gethostent");
4785 #ifdef HOST_NOT_FOUND
4787 #ifdef USE_REENTRANT_API
4788 # ifdef USE_GETHOSTENT_ERRNO
4789 h_errno = PL_reentrant_buffer->_gethostent_errno;
4792 STATUS_UNIX_SET(h_errno);
4796 if (GIMME != G_ARRAY) {
4797 PUSHs(sv = sv_newmortal());
4799 if (which == OP_GHBYNAME) {
4801 sv_setpvn(sv, hent->h_addr, hent->h_length);
4804 sv_setpv(sv, (char*)hent->h_name);
4810 mPUSHs(newSVpv((char*)hent->h_name, 0));
4811 PUSHs(space_join_names_mortal(hent->h_aliases));
4812 mPUSHi(hent->h_addrtype);
4813 len = hent->h_length;
4816 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4817 mXPUSHp(*elem, len);
4821 mPUSHp(hent->h_addr, len);
4823 PUSHs(sv_mortalcopy(&PL_sv_no));
4828 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4834 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4836 I32 which = PL_op->op_type;
4838 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4839 struct netent *getnetbyaddr(Netdb_net_t, int);
4840 struct netent *getnetbyname(Netdb_name_t);
4841 struct netent *getnetent(void);
4843 struct netent *nent;
4845 if (which == OP_GNBYNAME){
4846 #ifdef HAS_GETNETBYNAME
4847 const char * const name = POPpbytex;
4848 nent = PerlSock_getnetbyname(name);
4850 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4853 else if (which == OP_GNBYADDR) {
4854 #ifdef HAS_GETNETBYADDR
4855 const int addrtype = POPi;
4856 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4857 nent = PerlSock_getnetbyaddr(addr, addrtype);
4859 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4863 #ifdef HAS_GETNETENT
4864 nent = PerlSock_getnetent();
4866 DIE(aTHX_ PL_no_sock_func, "getnetent");
4869 #ifdef HOST_NOT_FOUND
4871 #ifdef USE_REENTRANT_API
4872 # ifdef USE_GETNETENT_ERRNO
4873 h_errno = PL_reentrant_buffer->_getnetent_errno;
4876 STATUS_UNIX_SET(h_errno);
4881 if (GIMME != G_ARRAY) {
4882 PUSHs(sv = sv_newmortal());
4884 if (which == OP_GNBYNAME)
4885 sv_setiv(sv, (IV)nent->n_net);
4887 sv_setpv(sv, nent->n_name);
4893 mPUSHs(newSVpv(nent->n_name, 0));
4894 PUSHs(space_join_names_mortal(nent->n_aliases));
4895 mPUSHi(nent->n_addrtype);
4896 mPUSHi(nent->n_net);
4901 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4907 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4909 I32 which = PL_op->op_type;
4911 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4912 struct protoent *getprotobyname(Netdb_name_t);
4913 struct protoent *getprotobynumber(int);
4914 struct protoent *getprotoent(void);
4916 struct protoent *pent;
4918 if (which == OP_GPBYNAME) {
4919 #ifdef HAS_GETPROTOBYNAME
4920 const char* const name = POPpbytex;
4921 pent = PerlSock_getprotobyname(name);
4923 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4926 else if (which == OP_GPBYNUMBER) {
4927 #ifdef HAS_GETPROTOBYNUMBER
4928 const int number = POPi;
4929 pent = PerlSock_getprotobynumber(number);
4931 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4935 #ifdef HAS_GETPROTOENT
4936 pent = PerlSock_getprotoent();
4938 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4942 if (GIMME != G_ARRAY) {
4943 PUSHs(sv = sv_newmortal());
4945 if (which == OP_GPBYNAME)
4946 sv_setiv(sv, (IV)pent->p_proto);
4948 sv_setpv(sv, pent->p_name);
4954 mPUSHs(newSVpv(pent->p_name, 0));
4955 PUSHs(space_join_names_mortal(pent->p_aliases));
4956 mPUSHi(pent->p_proto);
4961 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4967 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4969 I32 which = PL_op->op_type;
4971 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4972 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4973 struct servent *getservbyport(int, Netdb_name_t);
4974 struct servent *getservent(void);
4976 struct servent *sent;
4978 if (which == OP_GSBYNAME) {
4979 #ifdef HAS_GETSERVBYNAME
4980 const char * const proto = POPpbytex;
4981 const char * const name = POPpbytex;
4982 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4984 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4987 else if (which == OP_GSBYPORT) {
4988 #ifdef HAS_GETSERVBYPORT
4989 const char * const proto = POPpbytex;
4990 unsigned short port = (unsigned short)POPu;
4991 port = PerlSock_htons(port);
4992 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4994 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4998 #ifdef HAS_GETSERVENT
4999 sent = PerlSock_getservent();
5001 DIE(aTHX_ PL_no_sock_func, "getservent");
5005 if (GIMME != G_ARRAY) {
5006 PUSHs(sv = sv_newmortal());
5008 if (which == OP_GSBYNAME) {
5009 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5012 sv_setpv(sv, sent->s_name);
5018 mPUSHs(newSVpv(sent->s_name, 0));
5019 PUSHs(space_join_names_mortal(sent->s_aliases));
5020 mPUSHi(PerlSock_ntohs(sent->s_port));
5021 mPUSHs(newSVpv(sent->s_proto, 0));
5026 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5033 const int stayopen = TOPi;
5034 switch(PL_op->op_type) {