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 /* make a copy of the pattern if it is gmagical, to ensure that magic
363 * is called once and only once */
364 if (SvGMAGICAL(TOPm1s)) TOPm1s = sv_2mortal(newSVsv(TOPm1s));
366 tryAMAGICunTARGETlist(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
368 if (PL_op->op_flags & OPf_SPECIAL) {
369 /* call Perl-level glob function instead. Stack args are:
370 * MARK, wildcard, csh_glob context index
371 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
375 /* stack args are: wildcard, gv(_GEN_n) */
383 /* Note that we only ever get here if File::Glob fails to load
384 * without at the same time croaking, for some reason, or if
385 * perl was built with PERL_EXTERNAL_GLOB */
387 ENTER_with_name("glob");
392 * The external globbing program may use things we can't control,
393 * so for security reasons we must assume the worst.
396 taint_proper(PL_no_security, "glob");
400 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
401 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
403 SAVESPTR(PL_rs); /* This is not permanent, either. */
404 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
407 *SvPVX(PL_rs) = '\n';
411 result = do_readline();
412 LEAVE_with_name("glob");
419 PL_last_in_gv = cGVOP_gv;
420 return do_readline();
430 do_join(TARG, &PL_sv_no, MARK, SP);
434 else if (SP == MARK) {
441 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
444 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
445 /* well-formed exception supplied */
450 if (SvGMAGICAL(ERRSV)) {
451 exsv = sv_newmortal();
452 sv_setsv_nomg(exsv, ERRSV);
456 else if (SvPOKp(ERRSV) ? SvCUR(ERRSV) : SvNIOKp(ERRSV)) {
457 exsv = sv_newmortal();
458 sv_setsv_nomg(exsv, ERRSV);
459 sv_catpvs(exsv, "\t...caught");
462 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
465 if (SvROK(exsv) && !PL_warnhook)
466 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
477 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
479 if (SP - MARK != 1) {
481 do_join(TARG, &PL_sv_no, MARK, SP);
489 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
490 /* well-formed exception supplied */
492 else if (SvROK(ERRSV)) {
494 if (sv_isobject(exsv)) {
495 HV * const stash = SvSTASH(SvRV(exsv));
496 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
498 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
499 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
506 call_sv(MUTABLE_SV(GvCV(gv)),
507 G_SCALAR|G_EVAL|G_KEEPERR);
508 exsv = sv_mortalcopy(*PL_stack_sp--);
512 else if (SvPV_const(ERRSV, len), len) {
513 exsv = sv_mortalcopy(ERRSV);
514 sv_catpvs(exsv, "\t...propagated");
517 exsv = newSVpvs_flags("Died", SVs_TEMP);
525 Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv,
526 const MAGIC *const mg, const U32 flags, U32 argc, ...)
531 PERL_ARGS_ASSERT_TIED_METHOD;
533 /* Ensure that our flag bits do not overlap. */
534 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
535 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
536 assert((TIED_METHOD_SAY & G_WANT) == 0);
538 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
539 PUSHSTACKi(PERLSI_MAGIC);
540 EXTEND(SP, argc+1); /* object + args */
542 PUSHs(SvTIED_obj(sv, mg));
543 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
544 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
548 const U32 mortalize_not_needed
549 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
551 va_start(args, argc);
553 SV *const arg = va_arg(args, SV *);
554 if(mortalize_not_needed)
563 ENTER_with_name("call_tied_method");
564 if (flags & TIED_METHOD_SAY) {
565 /* local $\ = "\n" */
566 SAVEGENERICSV(PL_ors_sv);
567 PL_ors_sv = newSVpvs("\n");
569 ret_args = call_method(methname, flags & G_WANT);
574 if (ret_args) { /* copy results back to original stack */
575 EXTEND(sp, ret_args);
576 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
580 LEAVE_with_name("call_tied_method");
584 #define tied_method0(a,b,c,d) \
585 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
586 #define tied_method1(a,b,c,d,e) \
587 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
588 #define tied_method2(a,b,c,d,e,f) \
589 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
602 GV * const gv = MUTABLE_GV(*++MARK);
604 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
605 DIE(aTHX_ PL_no_usym, "filehandle");
607 if ((io = GvIOp(gv))) {
609 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
612 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
613 "Opening dirhandle %"HEKf" also as a file",
614 HEKfARG(GvENAME_HEK(gv)));
616 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
618 /* Method's args are same as ours ... */
619 /* ... except handle is replaced by the object */
620 return Perl_tied_method(aTHX_ "OPEN", mark - 1, MUTABLE_SV(io), mg,
621 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
633 tmps = SvPV_const(sv, len);
634 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
637 PUSHi( (I32)PL_forkprocess );
638 else if (PL_forkprocess == 0) /* we are a new child */
649 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
655 IO * const io = GvIO(gv);
657 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
659 return tied_method0("CLOSE", SP, MUTABLE_SV(io), mg);
663 PUSHs(boolSV(do_close(gv, TRUE)));
676 GV * const wgv = MUTABLE_GV(POPs);
677 GV * const rgv = MUTABLE_GV(POPs);
682 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
683 DIE(aTHX_ PL_no_usym, "filehandle");
688 do_close(rgv, FALSE);
690 do_close(wgv, FALSE);
692 if (PerlProc_pipe(fd) < 0)
695 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
696 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
697 IoOFP(rstio) = IoIFP(rstio);
698 IoIFP(wstio) = IoOFP(wstio);
699 IoTYPE(rstio) = IoTYPE_RDONLY;
700 IoTYPE(wstio) = IoTYPE_WRONLY;
702 if (!IoIFP(rstio) || !IoOFP(wstio)) {
704 PerlIO_close(IoIFP(rstio));
706 PerlLIO_close(fd[0]);
708 PerlIO_close(IoOFP(wstio));
710 PerlLIO_close(fd[1]);
713 #if defined(HAS_FCNTL) && defined(F_SETFD)
714 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
715 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
722 DIE(aTHX_ PL_no_func, "pipe");
736 gv = MUTABLE_GV(POPs);
740 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
742 return tied_method0("FILENO", SP, MUTABLE_SV(io), mg);
745 if (!io || !(fp = IoIFP(io))) {
746 /* Can't do this because people seem to do things like
747 defined(fileno($foo)) to check whether $foo is a valid fh.
754 PUSHi(PerlIO_fileno(fp));
766 if (MAXARG < 1 || (!TOPs && !POPs)) {
767 anum = PerlLIO_umask(022);
768 /* setting it to 022 between the two calls to umask avoids
769 * to have a window where the umask is set to 0 -- meaning
770 * that another thread could create world-writeable files. */
772 (void)PerlLIO_umask(anum);
775 anum = PerlLIO_umask(POPi);
776 TAINT_PROPER("umask");
779 /* Only DIE if trying to restrict permissions on "user" (self).
780 * Otherwise it's harmless and more useful to just return undef
781 * since 'group' and 'other' concepts probably don't exist here. */
782 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
783 DIE(aTHX_ "umask not implemented");
784 XPUSHs(&PL_sv_undef);
803 gv = MUTABLE_GV(POPs);
807 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
809 /* This takes advantage of the implementation of the varargs
810 function, which I don't think that the optimiser will be able to
811 figure out. Although, as it's a static function, in theory it
813 return Perl_tied_method(aTHX_ "BINMODE", SP, MUTABLE_SV(io), mg,
814 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
815 discp ? 1 : 0, discp);
819 if (!io || !(fp = IoIFP(io))) {
821 SETERRNO(EBADF,RMS_IFI);
828 const char *d = NULL;
831 d = SvPV_const(discp, len);
832 mode = mode_from_discipline(d, len);
833 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
834 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
835 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
856 const I32 markoff = MARK - PL_stack_base;
857 const char *methname;
858 int how = PERL_MAGIC_tied;
862 switch(SvTYPE(varsv)) {
866 methname = "TIEHASH";
867 if (HvLAZYDEL(varsv) && (entry = HvEITER((HV *)varsv))) {
868 HvLAZYDEL_off(varsv);
869 hv_free_ent((HV *)varsv, entry);
871 HvEITER_set(MUTABLE_HV(varsv), 0);
875 methname = "TIEARRAY";
876 if (!AvREAL(varsv)) {
878 Perl_croak(aTHX_ "Cannot tie unreifiable array");
879 av_clear((AV *)varsv);
886 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
887 methname = "TIEHANDLE";
888 how = PERL_MAGIC_tiedscalar;
889 /* For tied filehandles, we apply tiedscalar magic to the IO
890 slot of the GP rather than the GV itself. AMS 20010812 */
892 GvIOp(varsv) = newIO();
893 varsv = MUTABLE_SV(GvIOp(varsv));
898 methname = "TIESCALAR";
899 how = PERL_MAGIC_tiedscalar;
903 if (sv_isobject(*MARK)) { /* Calls GET magic. */
904 ENTER_with_name("call_TIE");
905 PUSHSTACKi(PERLSI_MAGIC);
907 EXTEND(SP,(I32)items);
911 call_method(methname, G_SCALAR);
914 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
915 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
916 * wrong error message, and worse case, supreme action at a distance.
917 * (Sorry obfuscation writers. You're not going to be given this one.)
919 stash = gv_stashsv(*MARK, 0);
920 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
921 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
922 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
924 ENTER_with_name("call_TIE");
925 PUSHSTACKi(PERLSI_MAGIC);
927 EXTEND(SP,(I32)items);
931 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
937 if (sv_isobject(sv)) {
938 sv_unmagic(varsv, how);
939 /* Croak if a self-tie on an aggregate is attempted. */
940 if (varsv == SvRV(sv) &&
941 (SvTYPE(varsv) == SVt_PVAV ||
942 SvTYPE(varsv) == SVt_PVHV))
944 "Self-ties of arrays and hashes are not supported");
945 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
947 LEAVE_with_name("call_TIE");
948 SP = PL_stack_base + markoff;
958 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
959 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
961 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
964 if ((mg = SvTIED_mg(sv, how))) {
965 SV * const obj = SvRV(SvTIED_obj(sv, mg));
967 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
969 if (gv && isGV(gv) && (cv = GvCV(gv))) {
971 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
972 mXPUSHi(SvREFCNT(obj) - 1);
974 ENTER_with_name("call_UNTIE");
975 call_sv(MUTABLE_SV(cv), G_VOID);
976 LEAVE_with_name("call_UNTIE");
979 else if (mg && SvREFCNT(obj) > 1) {
980 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
981 "untie attempted while %"UVuf" inner references still exist",
982 (UV)SvREFCNT(obj) - 1 ) ;
986 sv_unmagic(sv, how) ;
996 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
997 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
999 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1002 if ((mg = SvTIED_mg(sv, how))) {
1003 PUSHs(SvTIED_obj(sv, mg));
1016 HV * const hv = MUTABLE_HV(POPs);
1017 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1018 stash = gv_stashsv(sv, 0);
1019 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1021 require_pv("AnyDBM_File.pm");
1023 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1024 DIE(aTHX_ "No dbm on this machine");
1034 mPUSHu(O_RDWR|O_CREAT);
1038 if (!SvOK(right)) right = &PL_sv_no;
1042 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1045 if (!sv_isobject(TOPs)) {
1053 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1057 if (sv_isobject(TOPs)) {
1058 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1059 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1076 struct timeval timebuf;
1077 struct timeval *tbuf = &timebuf;
1080 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1085 # if BYTEORDER & 0xf0000
1086 # define ORDERBYTE (0x88888888 - BYTEORDER)
1088 # define ORDERBYTE (0x4444 - BYTEORDER)
1094 for (i = 1; i <= 3; i++) {
1095 SV * const sv = SP[i];
1099 if (SvREADONLY(sv)) {
1101 sv_force_normal_flags(sv, 0);
1102 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1103 Perl_croak_no_modify(aTHX);
1107 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1108 "Non-string passed as bitmask");
1109 SvPV_force_nomg_nolen(sv); /* force string conversion */
1116 /* little endians can use vecs directly */
1117 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1124 masksize = NFDBITS / NBBY;
1126 masksize = sizeof(long); /* documented int, everyone seems to use long */
1128 Zero(&fd_sets[0], 4, char*);
1131 # if SELECT_MIN_BITS == 1
1132 growsize = sizeof(fd_set);
1134 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1135 # undef SELECT_MIN_BITS
1136 # define SELECT_MIN_BITS __FD_SETSIZE
1138 /* If SELECT_MIN_BITS is greater than one we most probably will want
1139 * to align the sizes with SELECT_MIN_BITS/8 because for example
1140 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1141 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1142 * on (sets/tests/clears bits) is 32 bits. */
1143 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1151 timebuf.tv_sec = (long)value;
1152 value -= (NV)timebuf.tv_sec;
1153 timebuf.tv_usec = (long)(value * 1000000.0);
1158 for (i = 1; i <= 3; i++) {
1160 if (!SvOK(sv) || SvCUR(sv) == 0) {
1167 Sv_Grow(sv, growsize);
1171 while (++j <= growsize) {
1175 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1177 Newx(fd_sets[i], growsize, char);
1178 for (offset = 0; offset < growsize; offset += masksize) {
1179 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1180 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1183 fd_sets[i] = SvPVX(sv);
1187 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1188 /* Can't make just the (void*) conditional because that would be
1189 * cpp #if within cpp macro, and not all compilers like that. */
1190 nfound = PerlSock_select(
1192 (Select_fd_set_t) fd_sets[1],
1193 (Select_fd_set_t) fd_sets[2],
1194 (Select_fd_set_t) fd_sets[3],
1195 (void*) tbuf); /* Workaround for compiler bug. */
1197 nfound = PerlSock_select(
1199 (Select_fd_set_t) fd_sets[1],
1200 (Select_fd_set_t) fd_sets[2],
1201 (Select_fd_set_t) fd_sets[3],
1204 for (i = 1; i <= 3; i++) {
1207 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1209 for (offset = 0; offset < growsize; offset += masksize) {
1210 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1211 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1213 Safefree(fd_sets[i]);
1220 if (GIMME == G_ARRAY && tbuf) {
1221 value = (NV)(timebuf.tv_sec) +
1222 (NV)(timebuf.tv_usec) / 1000000.0;
1227 DIE(aTHX_ "select not implemented");
1232 =for apidoc setdefout
1234 Sets PL_defoutgv, the default file handle for output, to the passed in
1235 typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1236 count of the passed in typeglob is increased by one, and the reference count
1237 of the typeglob that PL_defoutgv points to is decreased by one.
1243 Perl_setdefout(pTHX_ GV *gv)
1246 PERL_ARGS_ASSERT_SETDEFOUT;
1247 SvREFCNT_inc_simple_void_NN(gv);
1248 SvREFCNT_dec(PL_defoutgv);
1256 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1257 GV * egv = GvEGVx(PL_defoutgv);
1262 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1263 gvp = hv && HvENAME(hv)
1264 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1266 if (gvp && *gvp == egv) {
1267 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1271 mXPUSHs(newRV(MUTABLE_SV(egv)));
1275 if (!GvIO(newdefout))
1276 gv_IOadd(newdefout);
1277 setdefout(newdefout);
1287 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1288 IO *const io = GvIO(gv);
1294 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1296 const U32 gimme = GIMME_V;
1297 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1298 if (gimme == G_SCALAR) {
1300 SvSetMagicSV_nosteal(TARG, TOPs);
1305 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1306 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1308 SETERRNO(EBADF,RMS_IFI);
1312 sv_setpvs(TARG, " ");
1313 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1314 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1315 /* Find out how many bytes the char needs */
1316 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1319 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1320 SvCUR_set(TARG,1+len);
1329 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1333 const I32 gimme = GIMME_V;
1335 PERL_ARGS_ASSERT_DOFORM;
1337 if (cv && CvCLONE(cv))
1338 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1343 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1344 PUSHFORMAT(cx, retop);
1345 if (CvDEPTH(cv) >= 2) {
1346 PERL_STACK_OVERFLOW_CHECK();
1347 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1350 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1352 setdefout(gv); /* locally select filehandle so $% et al work */
1371 gv = MUTABLE_GV(POPs);
1388 tmpsv = sv_newmortal();
1389 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1390 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1392 IoFLAGS(io) &= ~IOf_DIDTOP;
1393 RETURNOP(doform(cv,gv,PL_op->op_next));
1399 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1400 IO * const io = GvIOp(gv);
1408 if (!io || !(ofp = IoOFP(io)))
1411 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1412 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1414 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1415 PL_formtarget != PL_toptarget)
1419 if (!IoTOP_GV(io)) {
1422 if (!IoTOP_NAME(io)) {
1424 if (!IoFMT_NAME(io))
1425 IoFMT_NAME(io) = savepv(GvNAME(gv));
1426 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1427 HEKfARG(GvNAME_HEK(gv))));
1428 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1429 if ((topgv && GvFORM(topgv)) ||
1430 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1431 IoTOP_NAME(io) = savesvpv(topname);
1433 IoTOP_NAME(io) = savepvs("top");
1435 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1436 if (!topgv || !GvFORM(topgv)) {
1437 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1440 IoTOP_GV(io) = topgv;
1442 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1443 I32 lines = IoLINES_LEFT(io);
1444 const char *s = SvPVX_const(PL_formtarget);
1445 if (lines <= 0) /* Yow, header didn't even fit!!! */
1447 while (lines-- > 0) {
1448 s = strchr(s, '\n');
1454 const STRLEN save = SvCUR(PL_formtarget);
1455 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1456 do_print(PL_formtarget, ofp);
1457 SvCUR_set(PL_formtarget, save);
1458 sv_chop(PL_formtarget, s);
1459 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1462 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1463 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1464 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1466 PL_formtarget = PL_toptarget;
1467 IoFLAGS(io) |= IOf_DIDTOP;
1470 DIE(aTHX_ "bad top format reference");
1473 SV * const sv = sv_newmortal();
1474 gv_efullname4(sv, fgv, NULL, FALSE);
1475 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1477 return doform(cv, gv, PL_op);
1481 POPBLOCK(cx,PL_curpm);
1483 retop = cx->blk_sub.retop;
1484 SP = newsp; /* ignore retval of formline */
1487 if (!io || !(fp = IoOFP(io))) {
1488 if (io && IoIFP(io))
1489 report_wrongway_fh(gv, '<');
1495 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1496 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1498 if (!do_print(PL_formtarget, fp))
1501 FmLINES(PL_formtarget) = 0;
1502 SvCUR_set(PL_formtarget, 0);
1503 *SvEND(PL_formtarget) = '\0';
1504 if (IoFLAGS(io) & IOf_FLUSH)
1505 (void)PerlIO_flush(fp);
1509 PL_formtarget = PL_bodytarget;
1510 PERL_UNUSED_VAR(gimme);
1516 dVAR; dSP; dMARK; dORIGMARK;
1521 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1522 IO *const io = GvIO(gv);
1524 /* Treat empty list as "" */
1525 if (MARK == SP) XPUSHs(&PL_sv_no);
1528 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1530 if (MARK == ORIGMARK) {
1533 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1536 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1538 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1546 SETERRNO(EBADF,RMS_IFI);
1549 else if (!(fp = IoOFP(io))) {
1551 report_wrongway_fh(gv, '<');
1552 else if (ckWARN(WARN_CLOSED))
1554 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1558 do_sprintf(sv, SP - MARK, MARK + 1);
1559 if (!do_print(sv, fp))
1562 if (IoFLAGS(io) & IOf_FLUSH)
1563 if (PerlIO_flush(fp) == EOF)
1574 PUSHs(&PL_sv_undef);
1582 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1583 const int mode = POPi;
1584 SV * const sv = POPs;
1585 GV * const gv = MUTABLE_GV(POPs);
1588 /* Need TIEHANDLE method ? */
1589 const char * const tmps = SvPV_const(sv, len);
1590 /* FIXME? do_open should do const */
1591 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1592 IoLINES(GvIOp(gv)) = 0;
1596 PUSHs(&PL_sv_undef);
1603 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1617 bool charstart = FALSE;
1618 STRLEN charskip = 0;
1621 GV * const gv = MUTABLE_GV(*++MARK);
1622 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1623 && gv && (io = GvIO(gv)) )
1625 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1627 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1628 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1637 sv_setpvs(bufsv, "");
1638 length = SvIVx(*++MARK);
1640 DIE(aTHX_ "Negative length");
1643 offset = SvIVx(*++MARK);
1647 if (!io || !IoIFP(io)) {
1649 SETERRNO(EBADF,RMS_IFI);
1652 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1653 buffer = SvPVutf8_force(bufsv, blen);
1654 /* UTF-8 may not have been set if they are all low bytes */
1659 buffer = SvPV_force(bufsv, blen);
1660 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1662 if (DO_UTF8(bufsv)) {
1663 /* offset adjust in characters not bytes */
1664 /* SV's length cache is only safe for non-magical values */
1665 if (SvGMAGICAL(bufsv))
1666 blen = utf8_length((const U8 *)buffer, (const U8 *)buffer + blen);
1668 blen = sv_len_utf8(bufsv);
1677 if (PL_op->op_type == OP_RECV) {
1678 Sock_size_t bufsize;
1679 char namebuf[MAXPATHLEN];
1680 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1681 bufsize = sizeof (struct sockaddr_in);
1683 bufsize = sizeof namebuf;
1685 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1689 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1690 /* 'offset' means 'flags' here */
1691 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1692 (struct sockaddr *)namebuf, &bufsize);
1695 /* MSG_TRUNC can give oversized count; quietly lose it */
1699 /* Bogus return without padding */
1700 bufsize = sizeof (struct sockaddr_in);
1702 SvCUR_set(bufsv, count);
1703 *SvEND(bufsv) = '\0';
1704 (void)SvPOK_only(bufsv);
1708 /* This should not be marked tainted if the fp is marked clean */
1709 if (!(IoFLAGS(io) & IOf_UNTAINT))
1710 SvTAINTED_on(bufsv);
1712 sv_setpvn(TARG, namebuf, bufsize);
1718 if (-offset > (SSize_t)blen)
1719 DIE(aTHX_ "Offset outside string");
1722 if (DO_UTF8(bufsv)) {
1723 /* convert offset-as-chars to offset-as-bytes */
1724 if (offset >= (SSize_t)blen)
1725 offset += SvCUR(bufsv) - blen;
1727 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1730 orig_size = SvCUR(bufsv);
1731 /* Allocating length + offset + 1 isn't perfect in the case of reading
1732 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1734 (should be 2 * length + offset + 1, or possibly something longer if
1735 PL_encoding is true) */
1736 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1737 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1738 Zero(buffer+orig_size, offset-orig_size, char);
1740 buffer = buffer + offset;
1742 read_target = bufsv;
1744 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1745 concatenate it to the current buffer. */
1747 /* Truncate the existing buffer to the start of where we will be
1749 SvCUR_set(bufsv, offset);
1751 read_target = sv_newmortal();
1752 SvUPGRADE(read_target, SVt_PV);
1753 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1756 if (PL_op->op_type == OP_SYSREAD) {
1757 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1758 if (IoTYPE(io) == IoTYPE_SOCKET) {
1759 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1765 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1770 #ifdef HAS_SOCKET__bad_code_maybe
1771 if (IoTYPE(io) == IoTYPE_SOCKET) {
1772 Sock_size_t bufsize;
1773 char namebuf[MAXPATHLEN];
1774 #if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1775 bufsize = sizeof (struct sockaddr_in);
1777 bufsize = sizeof namebuf;
1779 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1780 (struct sockaddr *)namebuf, &bufsize);
1785 count = PerlIO_read(IoIFP(io), buffer, length);
1786 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1787 if (count == 0 && PerlIO_error(IoIFP(io)))
1791 if (IoTYPE(io) == IoTYPE_WRONLY)
1792 report_wrongway_fh(gv, '>');
1795 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1796 *SvEND(read_target) = '\0';
1797 (void)SvPOK_only(read_target);
1798 if (fp_utf8 && !IN_BYTES) {
1799 /* Look at utf8 we got back and count the characters */
1800 const char *bend = buffer + count;
1801 while (buffer < bend) {
1803 skip = UTF8SKIP(buffer);
1806 if (buffer - charskip + skip > bend) {
1807 /* partial character - try for rest of it */
1808 length = skip - (bend-buffer);
1809 offset = bend - SvPVX_const(bufsv);
1821 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1822 provided amount read (count) was what was requested (length)
1824 if (got < wanted && count == length) {
1825 length = wanted - got;
1826 offset = bend - SvPVX_const(bufsv);
1829 /* return value is character count */
1833 else if (buffer_utf8) {
1834 /* Let svcatsv upgrade the bytes we read in to utf8.
1835 The buffer is a mortal so will be freed soon. */
1836 sv_catsv_nomg(bufsv, read_target);
1839 /* This should not be marked tainted if the fp is marked clean */
1840 if (!(IoFLAGS(io) & IOf_UNTAINT))
1841 SvTAINTED_on(bufsv);
1853 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1858 STRLEN orig_blen_bytes;
1859 const int op_type = PL_op->op_type;
1862 GV *const gv = MUTABLE_GV(*++MARK);
1863 IO *const io = GvIO(gv);
1865 if (op_type == OP_SYSWRITE && io) {
1866 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1868 if (MARK == SP - 1) {
1870 mXPUSHi(sv_len(sv));
1874 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1875 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1885 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1887 if (io && IoIFP(io))
1888 report_wrongway_fh(gv, '<');
1891 SETERRNO(EBADF,RMS_IFI);
1895 /* Do this first to trigger any overloading. */
1896 buffer = SvPV_const(bufsv, blen);
1897 orig_blen_bytes = blen;
1898 doing_utf8 = DO_UTF8(bufsv);
1900 if (PerlIO_isutf8(IoIFP(io))) {
1901 if (!SvUTF8(bufsv)) {
1902 /* We don't modify the original scalar. */
1903 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1904 buffer = (char *) tmpbuf;
1908 else if (doing_utf8) {
1909 STRLEN tmplen = blen;
1910 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1913 buffer = (char *) tmpbuf;
1917 assert((char *)result == buffer);
1918 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1923 if (op_type == OP_SEND) {
1924 const int flags = SvIVx(*++MARK);
1927 char * const sockbuf = SvPVx(*++MARK, mlen);
1928 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1929 flags, (struct sockaddr *)sockbuf, mlen);
1933 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1939 Size_t length = 0; /* This length is in characters. */
1945 /* The SV is bytes, and we've had to upgrade it. */
1946 blen_chars = orig_blen_bytes;
1948 /* The SV really is UTF-8. */
1949 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1950 /* Don't call sv_len_utf8 again because it will call magic
1951 or overloading a second time, and we might get back a
1952 different result. */
1953 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1955 /* It's safe, and it may well be cached. */
1956 blen_chars = sv_len_utf8(bufsv);
1964 length = blen_chars;
1966 #if Size_t_size > IVSIZE
1967 length = (Size_t)SvNVx(*++MARK);
1969 length = (Size_t)SvIVx(*++MARK);
1971 if ((SSize_t)length < 0) {
1973 DIE(aTHX_ "Negative length");
1978 offset = SvIVx(*++MARK);
1980 if (-offset > (IV)blen_chars) {
1982 DIE(aTHX_ "Offset outside string");
1984 offset += blen_chars;
1985 } else if (offset > (IV)blen_chars) {
1987 DIE(aTHX_ "Offset outside string");
1991 if (length > blen_chars - offset)
1992 length = blen_chars - offset;
1994 /* Here we convert length from characters to bytes. */
1995 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1996 /* Either we had to convert the SV, or the SV is magical, or
1997 the SV has overloading, in which case we can't or mustn't
1998 or mustn't call it again. */
2000 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
2001 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
2003 /* It's a real UTF-8 SV, and it's not going to change under
2004 us. Take advantage of any cache. */
2006 I32 len_I32 = length;
2008 /* Convert the start and end character positions to bytes.
2009 Remember that the second argument to sv_pos_u2b is relative
2011 sv_pos_u2b(bufsv, &start, &len_I32);
2018 buffer = buffer+offset;
2020 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2021 if (IoTYPE(io) == IoTYPE_SOCKET) {
2022 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2028 /* See the note at doio.c:do_print about filesize limits. --jhi */
2029 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2038 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2041 #if Size_t_size > IVSIZE
2061 * in Perl 5.12 and later, the additional parameter is a bitmask:
2064 * 2 = eof() <- ARGV magic
2066 * I'll rely on the compiler's trace flow analysis to decide whether to
2067 * actually assign this out here, or punt it into the only block where it is
2068 * used. Doing it out here is DRY on the condition logic.
2073 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2079 if (PL_op->op_flags & OPf_SPECIAL) {
2080 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2084 gv = PL_last_in_gv; /* eof */
2092 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2093 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2096 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2097 if (io && !IoIFP(io)) {
2098 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2100 IoFLAGS(io) &= ~IOf_START;
2101 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2103 sv_setpvs(GvSV(gv), "-");
2105 GvSV(gv) = newSVpvs("-");
2106 SvSETMAGIC(GvSV(gv));
2108 else if (!nextargv(gv))
2113 PUSHs(boolSV(do_eof(gv)));
2123 if (MAXARG != 0 && (TOPs || POPs))
2124 PL_last_in_gv = MUTABLE_GV(POPs);
2131 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2133 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2138 SETERRNO(EBADF,RMS_IFI);
2143 #if LSEEKSIZE > IVSIZE
2144 PUSHn( do_tell(gv) );
2146 PUSHi( do_tell(gv) );
2154 const int whence = POPi;
2155 #if LSEEKSIZE > IVSIZE
2156 const Off_t offset = (Off_t)SvNVx(POPs);
2158 const Off_t offset = (Off_t)SvIVx(POPs);
2161 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2162 IO *const io = GvIO(gv);
2165 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2167 #if LSEEKSIZE > IVSIZE
2168 SV *const offset_sv = newSVnv((NV) offset);
2170 SV *const offset_sv = newSViv(offset);
2173 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2178 if (PL_op->op_type == OP_SEEK)
2179 PUSHs(boolSV(do_seek(gv, offset, whence)));
2181 const Off_t sought = do_sysseek(gv, offset, whence);
2183 PUSHs(&PL_sv_undef);
2185 SV* const sv = sought ?
2186 #if LSEEKSIZE > IVSIZE
2191 : newSVpvn(zero_but_true, ZBTLEN);
2202 /* There seems to be no consensus on the length type of truncate()
2203 * and ftruncate(), both off_t and size_t have supporters. In
2204 * general one would think that when using large files, off_t is
2205 * at least as wide as size_t, so using an off_t should be okay. */
2206 /* XXX Configure probe for the length type of *truncate() needed XXX */
2209 #if Off_t_size > IVSIZE
2214 /* Checking for length < 0 is problematic as the type might or
2215 * might not be signed: if it is not, clever compilers will moan. */
2216 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2219 SV * const sv = POPs;
2224 if (PL_op->op_flags & OPf_SPECIAL
2225 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2226 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2233 TAINT_PROPER("truncate");
2234 if (!(fp = IoIFP(io))) {
2240 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2242 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2248 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2249 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2250 goto do_ftruncate_io;
2253 const char * const name = SvPV_nomg_const_nolen(sv);
2254 TAINT_PROPER("truncate");
2256 if (truncate(name, len) < 0)
2260 const int tmpfd = PerlLIO_open(name, O_RDWR);
2265 if (my_chsize(tmpfd, len) < 0)
2267 PerlLIO_close(tmpfd);
2276 SETERRNO(EBADF,RMS_IFI);
2284 SV * const argsv = POPs;
2285 const unsigned int func = POPu;
2286 const int optype = PL_op->op_type;
2287 GV * const gv = MUTABLE_GV(POPs);
2288 IO * const io = gv ? GvIOn(gv) : NULL;
2292 if (!io || !argsv || !IoIFP(io)) {
2294 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2298 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2301 s = SvPV_force(argsv, len);
2302 need = IOCPARM_LEN(func);
2304 s = Sv_Grow(argsv, need + 1);
2305 SvCUR_set(argsv, need);
2308 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2311 retval = SvIV(argsv);
2312 s = INT2PTR(char*,retval); /* ouch */
2315 TAINT_PROPER(PL_op_desc[optype]);
2317 if (optype == OP_IOCTL)
2319 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2321 DIE(aTHX_ "ioctl is not implemented");
2325 DIE(aTHX_ "fcntl is not implemented");
2327 #if defined(OS2) && defined(__EMX__)
2328 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2330 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2334 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2336 if (s[SvCUR(argsv)] != 17)
2337 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2339 s[SvCUR(argsv)] = 0; /* put our null back */
2340 SvSETMAGIC(argsv); /* Assume it has changed */
2349 PUSHp(zero_but_true, ZBTLEN);
2360 const int argtype = POPi;
2361 GV * const gv = MUTABLE_GV(POPs);
2362 IO *const io = GvIO(gv);
2363 PerlIO *const fp = io ? IoIFP(io) : NULL;
2365 /* XXX Looks to me like io is always NULL at this point */
2367 (void)PerlIO_flush(fp);
2368 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2373 SETERRNO(EBADF,RMS_IFI);
2378 DIE(aTHX_ PL_no_func, "flock()");
2389 const int protocol = POPi;
2390 const int type = POPi;
2391 const int domain = POPi;
2392 GV * const gv = MUTABLE_GV(POPs);
2393 IO * const io = gv ? GvIOn(gv) : NULL;
2398 if (io && IoIFP(io))
2399 do_close(gv, FALSE);
2400 SETERRNO(EBADF,LIB_INVARG);
2405 do_close(gv, FALSE);
2407 TAINT_PROPER("socket");
2408 fd = PerlSock_socket(domain, type, protocol);
2411 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2412 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2413 IoTYPE(io) = IoTYPE_SOCKET;
2414 if (!IoIFP(io) || !IoOFP(io)) {
2415 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2416 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2417 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2420 #if defined(HAS_FCNTL) && defined(F_SETFD)
2421 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2425 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2434 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2436 const int protocol = POPi;
2437 const int type = POPi;
2438 const int domain = POPi;
2439 GV * const gv2 = MUTABLE_GV(POPs);
2440 GV * const gv1 = MUTABLE_GV(POPs);
2441 IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2442 IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2446 report_evil_fh(gv1);
2448 report_evil_fh(gv2);
2450 if (io1 && IoIFP(io1))
2451 do_close(gv1, FALSE);
2452 if (io2 && IoIFP(io2))
2453 do_close(gv2, FALSE);
2458 TAINT_PROPER("socketpair");
2459 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2461 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2462 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2463 IoTYPE(io1) = IoTYPE_SOCKET;
2464 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2465 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2466 IoTYPE(io2) = IoTYPE_SOCKET;
2467 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2468 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2469 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2470 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2471 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2472 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2473 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2476 #if defined(HAS_FCNTL) && defined(F_SETFD)
2477 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2478 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2483 DIE(aTHX_ PL_no_sock_func, "socketpair");
2492 SV * const addrsv = POPs;
2493 /* OK, so on what platform does bind modify addr? */
2495 GV * const gv = MUTABLE_GV(POPs);
2496 IO * const io = GvIOn(gv);
2498 const int op_type = PL_op->op_type;
2500 if (!io || !IoIFP(io))
2503 addr = SvPV_const(addrsv, len);
2504 TAINT_PROPER(PL_op_desc[op_type]);
2505 if ((op_type == OP_BIND
2506 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2507 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2515 SETERRNO(EBADF,SS_IVCHAN);
2522 const int backlog = POPi;
2523 GV * const gv = MUTABLE_GV(POPs);
2524 IO * const io = gv ? GvIOn(gv) : NULL;
2526 if (!io || !IoIFP(io))
2529 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2536 SETERRNO(EBADF,SS_IVCHAN);
2545 char namebuf[MAXPATHLEN];
2546 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2547 Sock_size_t len = sizeof (struct sockaddr_in);
2549 Sock_size_t len = sizeof namebuf;
2551 GV * const ggv = MUTABLE_GV(POPs);
2552 GV * const ngv = MUTABLE_GV(POPs);
2561 if (!gstio || !IoIFP(gstio))
2565 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2568 /* Some platforms indicate zero length when an AF_UNIX client is
2569 * not bound. Simulate a non-zero-length sockaddr structure in
2571 namebuf[0] = 0; /* sun_len */
2572 namebuf[1] = AF_UNIX; /* sun_family */
2580 do_close(ngv, FALSE);
2581 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2582 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2583 IoTYPE(nstio) = IoTYPE_SOCKET;
2584 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2585 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2586 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2587 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2590 #if defined(HAS_FCNTL) && defined(F_SETFD)
2591 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2595 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2596 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2598 #ifdef __SCO_VERSION__
2599 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2602 PUSHp(namebuf, len);
2606 report_evil_fh(ggv);
2607 SETERRNO(EBADF,SS_IVCHAN);
2617 const int how = POPi;
2618 GV * const gv = MUTABLE_GV(POPs);
2619 IO * const io = GvIOn(gv);
2621 if (!io || !IoIFP(io))
2624 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2629 SETERRNO(EBADF,SS_IVCHAN);
2636 const int optype = PL_op->op_type;
2637 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2638 const unsigned int optname = (unsigned int) POPi;
2639 const unsigned int lvl = (unsigned int) POPi;
2640 GV * const gv = MUTABLE_GV(POPs);
2641 IO * const io = GvIOn(gv);
2645 if (!io || !IoIFP(io))
2648 fd = PerlIO_fileno(IoIFP(io));
2652 (void)SvPOK_only(sv);
2656 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2663 #if defined(__SYMBIAN32__)
2664 # define SETSOCKOPT_OPTION_VALUE_T void *
2666 # define SETSOCKOPT_OPTION_VALUE_T const char *
2668 /* XXX TODO: We need to have a proper type (a Configure probe,
2669 * etc.) for what the C headers think of the third argument of
2670 * setsockopt(), the option_value read-only buffer: is it
2671 * a "char *", or a "void *", const or not. Some compilers
2672 * don't take kindly to e.g. assuming that "char *" implicitly
2673 * promotes to a "void *", or to explicitly promoting/demoting
2674 * consts to non/vice versa. The "const void *" is the SUS
2675 * definition, but that does not fly everywhere for the above
2677 SETSOCKOPT_OPTION_VALUE_T buf;
2681 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2685 aint = (int)SvIV(sv);
2686 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2689 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2699 SETERRNO(EBADF,SS_IVCHAN);
2708 const int optype = PL_op->op_type;
2709 GV * const gv = MUTABLE_GV(POPs);
2710 IO * const io = GvIOn(gv);
2715 if (!io || !IoIFP(io))
2718 sv = sv_2mortal(newSV(257));
2719 (void)SvPOK_only(sv);
2723 fd = PerlIO_fileno(IoIFP(io));
2725 case OP_GETSOCKNAME:
2726 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2729 case OP_GETPEERNAME:
2730 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2732 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2734 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";
2735 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2736 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2737 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2738 sizeof(u_short) + sizeof(struct in_addr))) {
2745 #ifdef BOGUS_GETNAME_RETURN
2746 /* Interactive Unix, getpeername() and getsockname()
2747 does not return valid namelen */
2748 if (len == BOGUS_GETNAME_RETURN)
2749 len = sizeof(struct sockaddr);
2758 SETERRNO(EBADF,SS_IVCHAN);
2777 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2778 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2779 if (PL_op->op_type == OP_LSTAT) {
2780 if (gv != PL_defgv) {
2781 do_fstat_warning_check:
2782 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2783 "lstat() on filehandle%s%"SVf,
2786 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2788 } else if (PL_laststype != OP_LSTAT)
2789 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2790 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2793 if (gv != PL_defgv) {
2797 PL_laststype = OP_STAT;
2798 PL_statgv = gv ? gv : (GV *)io;
2799 sv_setpvs(PL_statname, "");
2806 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2808 } else if (IoDIRP(io)) {
2810 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2813 PL_laststatval = -1;
2816 else PL_laststatval = -1;
2817 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2820 if (PL_laststatval < 0) {
2825 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2826 io = MUTABLE_IO(SvRV(sv));
2827 if (PL_op->op_type == OP_LSTAT)
2828 goto do_fstat_warning_check;
2829 goto do_fstat_have_io;
2832 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2833 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2835 PL_laststype = PL_op->op_type;
2836 if (PL_op->op_type == OP_LSTAT)
2837 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2839 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2840 if (PL_laststatval < 0) {
2841 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2842 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2848 if (gimme != G_ARRAY) {
2849 if (gimme != G_VOID)
2850 XPUSHs(boolSV(max));
2856 mPUSHi(PL_statcache.st_dev);
2857 #if ST_INO_SIZE > IVSIZE
2858 mPUSHn(PL_statcache.st_ino);
2860 # if ST_INO_SIGN <= 0
2861 mPUSHi(PL_statcache.st_ino);
2863 mPUSHu(PL_statcache.st_ino);
2866 mPUSHu(PL_statcache.st_mode);
2867 mPUSHu(PL_statcache.st_nlink);
2868 #if Uid_t_size > IVSIZE
2869 mPUSHn(PL_statcache.st_uid);
2871 # if Uid_t_sign <= 0
2872 mPUSHi(PL_statcache.st_uid);
2874 mPUSHu(PL_statcache.st_uid);
2877 #if Gid_t_size > IVSIZE
2878 mPUSHn(PL_statcache.st_gid);
2880 # if Gid_t_sign <= 0
2881 mPUSHi(PL_statcache.st_gid);
2883 mPUSHu(PL_statcache.st_gid);
2886 #ifdef USE_STAT_RDEV
2887 mPUSHi(PL_statcache.st_rdev);
2889 PUSHs(newSVpvs_flags("", SVs_TEMP));
2891 #if Off_t_size > IVSIZE
2892 mPUSHn(PL_statcache.st_size);
2894 mPUSHi(PL_statcache.st_size);
2897 mPUSHn(PL_statcache.st_atime);
2898 mPUSHn(PL_statcache.st_mtime);
2899 mPUSHn(PL_statcache.st_ctime);
2901 mPUSHi(PL_statcache.st_atime);
2902 mPUSHi(PL_statcache.st_mtime);
2903 mPUSHi(PL_statcache.st_ctime);
2905 #ifdef USE_STAT_BLOCKS
2906 mPUSHu(PL_statcache.st_blksize);
2907 mPUSHu(PL_statcache.st_blocks);
2909 PUSHs(newSVpvs_flags("", SVs_TEMP));
2910 PUSHs(newSVpvs_flags("", SVs_TEMP));
2916 /* All filetest ops avoid manipulating the perl stack pointer in their main
2917 bodies (since commit d2c4d2d1e22d3125), and return using either
2918 S_ft_return_false() or S_ft_return_true(). These two helper functions are
2919 the only two which manipulate the perl stack. To ensure that no stack
2920 manipulation macros are used, the filetest ops avoid defining a local copy
2921 of the stack pointer with dSP. */
2923 /* If the next filetest is stacked up with this one
2924 (PL_op->op_private & OPpFT_STACKING), we leave
2925 the original argument on the stack for success,
2926 and skip the stacked operators on failure.
2927 The next few macros/functions take care of this.
2931 S_ft_return_false(pTHX_ SV *ret) {
2935 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
2939 if (PL_op->op_private & OPpFT_STACKING) {
2940 while (OP_IS_FILETEST(next->op_type)
2941 && next->op_private & OPpFT_STACKED)
2942 next = next->op_next;
2947 PERL_STATIC_INLINE OP *
2948 S_ft_return_true(pTHX_ SV *ret) {
2950 if (PL_op->op_flags & OPf_REF)
2951 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
2952 else if (!(PL_op->op_private & OPpFT_STACKING))
2958 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
2959 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
2960 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
2962 #define tryAMAGICftest_MG(chr) STMT_START { \
2963 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
2964 && PL_op->op_flags & OPf_KIDS) { \
2965 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2966 if (next) return next; \
2971 S_try_amagic_ftest(pTHX_ char chr) {
2973 SV *const arg = *PL_stack_sp;
2976 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2980 const char tmpchr = chr;
2981 SV * const tmpsv = amagic_call(arg,
2982 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2983 ftest_amg, AMGf_unary);
2988 return SvTRUE(tmpsv)
2989 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
2999 /* Not const, because things tweak this below. Not bool, because there's
3000 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
3001 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3002 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3003 /* Giving some sort of initial value silences compilers. */
3005 int access_mode = R_OK;
3007 int access_mode = 0;
3010 /* access_mode is never used, but leaving use_access in makes the
3011 conditional compiling below much clearer. */
3014 Mode_t stat_mode = S_IRUSR;
3016 bool effective = FALSE;
3019 switch (PL_op->op_type) {
3020 case OP_FTRREAD: opchar = 'R'; break;
3021 case OP_FTRWRITE: opchar = 'W'; break;
3022 case OP_FTREXEC: opchar = 'X'; break;
3023 case OP_FTEREAD: opchar = 'r'; break;
3024 case OP_FTEWRITE: opchar = 'w'; break;
3025 case OP_FTEEXEC: opchar = 'x'; break;
3027 tryAMAGICftest_MG(opchar);
3029 switch (PL_op->op_type) {
3031 #if !(defined(HAS_ACCESS) && defined(R_OK))
3037 #if defined(HAS_ACCESS) && defined(W_OK)
3042 stat_mode = S_IWUSR;
3046 #if defined(HAS_ACCESS) && defined(X_OK)
3051 stat_mode = S_IXUSR;
3055 #ifdef PERL_EFF_ACCESS
3058 stat_mode = S_IWUSR;
3062 #ifndef PERL_EFF_ACCESS
3069 #ifdef PERL_EFF_ACCESS
3074 stat_mode = S_IXUSR;
3080 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3081 const char *name = SvPV_nolen(*PL_stack_sp);
3083 # ifdef PERL_EFF_ACCESS
3084 result = PERL_EFF_ACCESS(name, access_mode);
3086 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3092 result = access(name, access_mode);
3094 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3105 result = my_stat_flags(0);
3108 if (cando(stat_mode, effective, &PL_statcache))
3117 const int op_type = PL_op->op_type;
3121 case OP_FTIS: opchar = 'e'; break;
3122 case OP_FTSIZE: opchar = 's'; break;
3123 case OP_FTMTIME: opchar = 'M'; break;
3124 case OP_FTCTIME: opchar = 'C'; break;
3125 case OP_FTATIME: opchar = 'A'; break;
3127 tryAMAGICftest_MG(opchar);
3129 result = my_stat_flags(0);
3132 if (op_type == OP_FTIS)
3135 /* You can't dTARGET inside OP_FTIS, because you'll get
3136 "panic: pad_sv po" - the op is not flagged to have a target. */
3140 #if Off_t_size > IVSIZE
3141 sv_setnv(TARG, (NV)PL_statcache.st_size);
3143 sv_setiv(TARG, (IV)PL_statcache.st_size);
3148 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3152 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3156 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3160 return SvTRUE_nomg(TARG)
3161 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3171 switch (PL_op->op_type) {
3172 case OP_FTROWNED: opchar = 'O'; break;
3173 case OP_FTEOWNED: opchar = 'o'; break;
3174 case OP_FTZERO: opchar = 'z'; break;
3175 case OP_FTSOCK: opchar = 'S'; break;
3176 case OP_FTCHR: opchar = 'c'; break;
3177 case OP_FTBLK: opchar = 'b'; break;
3178 case OP_FTFILE: opchar = 'f'; break;
3179 case OP_FTDIR: opchar = 'd'; break;
3180 case OP_FTPIPE: opchar = 'p'; break;
3181 case OP_FTSUID: opchar = 'u'; break;
3182 case OP_FTSGID: opchar = 'g'; break;
3183 case OP_FTSVTX: opchar = 'k'; break;
3185 tryAMAGICftest_MG(opchar);
3187 /* I believe that all these three are likely to be defined on most every
3188 system these days. */
3190 if(PL_op->op_type == OP_FTSUID) {
3195 if(PL_op->op_type == OP_FTSGID) {
3200 if(PL_op->op_type == OP_FTSVTX) {
3205 result = my_stat_flags(0);
3208 switch (PL_op->op_type) {
3210 if (PL_statcache.st_uid == PerlProc_getuid())
3214 if (PL_statcache.st_uid == PerlProc_geteuid())
3218 if (PL_statcache.st_size == 0)
3222 if (S_ISSOCK(PL_statcache.st_mode))
3226 if (S_ISCHR(PL_statcache.st_mode))
3230 if (S_ISBLK(PL_statcache.st_mode))
3234 if (S_ISREG(PL_statcache.st_mode))
3238 if (S_ISDIR(PL_statcache.st_mode))
3242 if (S_ISFIFO(PL_statcache.st_mode))
3247 if (PL_statcache.st_mode & S_ISUID)
3253 if (PL_statcache.st_mode & S_ISGID)
3259 if (PL_statcache.st_mode & S_ISVTX)
3272 tryAMAGICftest_MG('l');
3273 result = my_lstat_flags(0);
3277 if (S_ISLNK(PL_statcache.st_mode))
3290 tryAMAGICftest_MG('t');
3292 if (PL_op->op_flags & OPf_REF)
3295 SV *tmpsv = *PL_stack_sp;
3296 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3297 name = SvPV_nomg(tmpsv, namelen);
3298 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3302 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3303 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3304 else if (name && isDIGIT(*name))
3308 if (PerlLIO_isatty(fd))
3326 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3328 if (PL_op->op_flags & OPf_REF)
3330 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3335 gv = MAYBE_DEREF_GV_nomg(sv);
3339 if (gv == PL_defgv) {
3341 io = SvTYPE(PL_statgv) == SVt_PVIO
3345 goto really_filename;
3350 sv_setpvs(PL_statname, "");
3351 io = GvIO(PL_statgv);
3353 PL_laststatval = -1;
3354 PL_laststype = OP_STAT;
3355 if (io && IoIFP(io)) {
3356 if (! PerlIO_has_base(IoIFP(io)))
3357 DIE(aTHX_ "-T and -B not implemented on filehandles");
3358 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3359 if (PL_laststatval < 0)
3361 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3362 if (PL_op->op_type == OP_FTTEXT)
3367 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3368 i = PerlIO_getc(IoIFP(io));
3370 (void)PerlIO_ungetc(IoIFP(io),i);
3372 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3374 len = PerlIO_get_bufsiz(IoIFP(io));
3375 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3376 /* sfio can have large buffers - limit to 512 */
3381 SETERRNO(EBADF,RMS_IFI);
3383 SETERRNO(EBADF,RMS_IFI);
3388 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3391 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3393 PL_laststatval = -1;
3394 PL_laststype = OP_STAT;
3396 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3398 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3401 PL_laststype = OP_STAT;
3402 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3403 if (PL_laststatval < 0) {
3404 (void)PerlIO_close(fp);
3407 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3408 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3409 (void)PerlIO_close(fp);
3411 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3412 FT_RETURNNO; /* special case NFS directories */
3413 FT_RETURNYES; /* null file is anything */
3418 /* now scan s to look for textiness */
3419 /* XXX ASCII dependent code */
3421 #if defined(DOSISH) || defined(USEMYBINMODE)
3422 /* ignore trailing ^Z on short files */
3423 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3427 for (i = 0; i < len; i++, s++) {
3428 if (!*s) { /* null never allowed in text */
3433 else if (!(isPRINT(*s) || isSPACE(*s)))
3436 else if (*s & 128) {
3438 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3441 /* utf8 characters don't count as odd */
3442 if (UTF8_IS_START(*s)) {
3443 int ulen = UTF8SKIP(s);
3444 if (ulen < len - i) {
3446 for (j = 1; j < ulen; j++) {
3447 if (!UTF8_IS_CONTINUATION(s[j]))
3450 --ulen; /* loop does extra increment */
3460 *s != '\n' && *s != '\r' && *s != '\b' &&
3461 *s != '\t' && *s != '\f' && *s != 27)
3466 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3477 const char *tmps = NULL;
3481 SV * const sv = POPs;
3482 if (PL_op->op_flags & OPf_SPECIAL) {
3483 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3485 else if (!(gv = MAYBE_DEREF_GV(sv)))
3486 tmps = SvPV_nomg_const_nolen(sv);
3489 if( !gv && (!tmps || !*tmps) ) {
3490 HV * const table = GvHVn(PL_envgv);
3493 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3494 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3496 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3501 deprecate("chdir('') or chdir(undef) as chdir()");
3502 tmps = SvPV_nolen_const(*svp);
3506 TAINT_PROPER("chdir");
3511 TAINT_PROPER("chdir");
3514 IO* const io = GvIO(gv);
3517 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3518 } else if (IoIFP(io)) {
3519 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3523 SETERRNO(EBADF, RMS_IFI);
3529 SETERRNO(EBADF,RMS_IFI);
3533 DIE(aTHX_ PL_no_func, "fchdir");
3537 PUSHi( PerlDir_chdir(tmps) >= 0 );
3539 /* Clear the DEFAULT element of ENV so we'll get the new value
3541 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3548 dVAR; dSP; dMARK; dTARGET;
3549 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3560 char * const tmps = POPpx;
3561 TAINT_PROPER("chroot");
3562 PUSHi( chroot(tmps) >= 0 );
3565 DIE(aTHX_ PL_no_func, "chroot");
3573 const char * const tmps2 = POPpconstx;
3574 const char * const tmps = SvPV_nolen_const(TOPs);
3575 TAINT_PROPER("rename");
3577 anum = PerlLIO_rename(tmps, tmps2);
3579 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3580 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3583 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3584 (void)UNLINK(tmps2);
3585 if (!(anum = link(tmps, tmps2)))
3586 anum = UNLINK(tmps);
3594 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3598 const int op_type = PL_op->op_type;
3602 if (op_type == OP_LINK)
3603 DIE(aTHX_ PL_no_func, "link");
3605 # ifndef HAS_SYMLINK
3606 if (op_type == OP_SYMLINK)
3607 DIE(aTHX_ PL_no_func, "symlink");
3611 const char * const tmps2 = POPpconstx;
3612 const char * const tmps = SvPV_nolen_const(TOPs);
3613 TAINT_PROPER(PL_op_desc[op_type]);
3615 # if defined(HAS_LINK)
3616 # if defined(HAS_SYMLINK)
3617 /* Both present - need to choose which. */
3618 (op_type == OP_LINK) ?
3619 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3621 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3622 PerlLIO_link(tmps, tmps2);
3625 # if defined(HAS_SYMLINK)
3626 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3627 symlink(tmps, tmps2);
3632 SETi( result >= 0 );
3639 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3650 char buf[MAXPATHLEN];
3653 #ifndef INCOMPLETE_TAINTS
3657 len = readlink(tmps, buf, sizeof(buf) - 1);
3664 RETSETUNDEF; /* just pretend it's a normal file */
3668 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3670 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3672 char * const save_filename = filename;
3677 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3679 PERL_ARGS_ASSERT_DOONELINER;
3681 Newx(cmdline, size, char);
3682 my_strlcpy(cmdline, cmd, size);
3683 my_strlcat(cmdline, " ", size);
3684 for (s = cmdline + strlen(cmdline); *filename; ) {
3688 if (s - cmdline < size)
3689 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3690 myfp = PerlProc_popen(cmdline, "r");
3694 SV * const tmpsv = sv_newmortal();
3695 /* Need to save/restore 'PL_rs' ?? */
3696 s = sv_gets(tmpsv, myfp, 0);
3697 (void)PerlProc_pclose(myfp);
3701 #ifdef HAS_SYS_ERRLIST
3706 /* you don't see this */
3707 const char * const errmsg =
3708 #ifdef HAS_SYS_ERRLIST
3716 if (instr(s, errmsg)) {
3723 #define EACCES EPERM
3725 if (instr(s, "cannot make"))
3726 SETERRNO(EEXIST,RMS_FEX);
3727 else if (instr(s, "existing file"))
3728 SETERRNO(EEXIST,RMS_FEX);
3729 else if (instr(s, "ile exists"))
3730 SETERRNO(EEXIST,RMS_FEX);
3731 else if (instr(s, "non-exist"))
3732 SETERRNO(ENOENT,RMS_FNF);
3733 else if (instr(s, "does not exist"))
3734 SETERRNO(ENOENT,RMS_FNF);
3735 else if (instr(s, "not empty"))
3736 SETERRNO(EBUSY,SS_DEVOFFLINE);
3737 else if (instr(s, "cannot access"))
3738 SETERRNO(EACCES,RMS_PRV);
3740 SETERRNO(EPERM,RMS_PRV);
3743 else { /* some mkdirs return no failure indication */
3744 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3745 if (PL_op->op_type == OP_RMDIR)
3750 SETERRNO(EACCES,RMS_PRV); /* a guess */
3759 /* This macro removes trailing slashes from a directory name.
3760 * Different operating and file systems take differently to
3761 * trailing slashes. According to POSIX 1003.1 1996 Edition
3762 * any number of trailing slashes should be allowed.
3763 * Thusly we snip them away so that even non-conforming
3764 * systems are happy.
3765 * We should probably do this "filtering" for all
3766 * the functions that expect (potentially) directory names:
3767 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3768 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3770 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3771 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3774 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3775 (tmps) = savepvn((tmps), (len)); \
3785 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3787 TRIMSLASHES(tmps,len,copy);
3789 TAINT_PROPER("mkdir");
3791 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3795 SETi( dooneliner("mkdir", tmps) );
3796 oldumask = PerlLIO_umask(0);
3797 PerlLIO_umask(oldumask);
3798 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3813 TRIMSLASHES(tmps,len,copy);
3814 TAINT_PROPER("rmdir");
3816 SETi( PerlDir_rmdir(tmps) >= 0 );
3818 SETi( dooneliner("rmdir", tmps) );
3825 /* Directory calls. */
3829 #if defined(Direntry_t) && defined(HAS_READDIR)
3831 const char * const dirname = POPpconstx;
3832 GV * const gv = MUTABLE_GV(POPs);
3833 IO * const io = GvIOn(gv);
3838 if ((IoIFP(io) || IoOFP(io)))
3839 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3840 "Opening filehandle %"HEKf" also as a directory",
3841 HEKfARG(GvENAME_HEK(gv)) );
3843 PerlDir_close(IoDIRP(io));
3844 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3850 SETERRNO(EBADF,RMS_DIR);
3853 DIE(aTHX_ PL_no_dir_func, "opendir");
3859 #if !defined(Direntry_t) || !defined(HAS_READDIR)
3860 DIE(aTHX_ PL_no_dir_func, "readdir");
3862 #if !defined(I_DIRENT) && !defined(VMS)
3863 Direntry_t *readdir (DIR *);
3869 const I32 gimme = GIMME;
3870 GV * const gv = MUTABLE_GV(POPs);
3871 const Direntry_t *dp;
3872 IO * const io = GvIOn(gv);
3874 if (!io || !IoDIRP(io)) {
3875 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3876 "readdir() attempted on invalid dirhandle %"HEKf,
3877 HEKfARG(GvENAME_HEK(gv)));
3882 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3886 sv = newSVpvn(dp->d_name, dp->d_namlen);
3888 sv = newSVpv(dp->d_name, 0);
3890 #ifndef INCOMPLETE_TAINTS
3891 if (!(IoFLAGS(io) & IOf_UNTAINT))
3895 } while (gimme == G_ARRAY);
3897 if (!dp && gimme != G_ARRAY)
3904 SETERRNO(EBADF,RMS_ISI);
3905 if (GIMME == G_ARRAY)
3914 #if defined(HAS_TELLDIR) || defined(telldir)
3916 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3917 /* XXX netbsd still seemed to.
3918 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3919 --JHI 1999-Feb-02 */
3920 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3921 long telldir (DIR *);
3923 GV * const gv = MUTABLE_GV(POPs);
3924 IO * const io = GvIOn(gv);
3926 if (!io || !IoDIRP(io)) {
3927 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3928 "telldir() attempted on invalid dirhandle %"HEKf,
3929 HEKfARG(GvENAME_HEK(gv)));
3933 PUSHi( PerlDir_tell(IoDIRP(io)) );
3937 SETERRNO(EBADF,RMS_ISI);
3940 DIE(aTHX_ PL_no_dir_func, "telldir");
3946 #if defined(HAS_SEEKDIR) || defined(seekdir)
3948 const long along = POPl;
3949 GV * const gv = MUTABLE_GV(POPs);
3950 IO * const io = GvIOn(gv);
3952 if (!io || !IoDIRP(io)) {
3953 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3954 "seekdir() attempted on invalid dirhandle %"HEKf,
3955 HEKfARG(GvENAME_HEK(gv)));
3958 (void)PerlDir_seek(IoDIRP(io), along);
3963 SETERRNO(EBADF,RMS_ISI);
3966 DIE(aTHX_ PL_no_dir_func, "seekdir");
3972 #if defined(HAS_REWINDDIR) || defined(rewinddir)
3974 GV * const gv = MUTABLE_GV(POPs);
3975 IO * const io = GvIOn(gv);
3977 if (!io || !IoDIRP(io)) {
3978 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3979 "rewinddir() attempted on invalid dirhandle %"HEKf,
3980 HEKfARG(GvENAME_HEK(gv)));
3983 (void)PerlDir_rewind(IoDIRP(io));
3987 SETERRNO(EBADF,RMS_ISI);
3990 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3996 #if defined(Direntry_t) && defined(HAS_READDIR)
3998 GV * const gv = MUTABLE_GV(POPs);
3999 IO * const io = GvIOn(gv);
4001 if (!io || !IoDIRP(io)) {
4002 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4003 "closedir() attempted on invalid dirhandle %"HEKf,
4004 HEKfARG(GvENAME_HEK(gv)));
4007 #ifdef VOID_CLOSEDIR
4008 PerlDir_close(IoDIRP(io));
4010 if (PerlDir_close(IoDIRP(io)) < 0) {
4011 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4020 SETERRNO(EBADF,RMS_IFI);
4023 DIE(aTHX_ PL_no_dir_func, "closedir");
4027 /* Process control. */
4034 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4035 sigset_t oldmask, newmask;
4039 PERL_FLUSHALL_FOR_CHILD;
4040 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4041 sigfillset(&newmask);
4042 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4044 childpid = PerlProc_fork();
4045 if (childpid == 0) {
4049 for (sig = 1; sig < SIG_SIZE; sig++)
4050 PL_psig_pend[sig] = 0;
4052 #if defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO)
4055 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4062 #ifdef PERL_USES_PL_PIDSTATUS
4063 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4069 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4074 PERL_FLUSHALL_FOR_CHILD;
4075 childpid = PerlProc_fork();
4081 DIE(aTHX_ PL_no_func, "fork");
4088 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4093 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4094 childpid = wait4pid(-1, &argflags, 0);
4096 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4101 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4102 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4103 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4105 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4110 DIE(aTHX_ PL_no_func, "wait");
4116 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4118 const int optype = POPi;
4119 const Pid_t pid = TOPi;
4123 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4124 result = wait4pid(pid, &argflags, optype);
4126 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4131 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4132 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4133 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4135 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4140 DIE(aTHX_ PL_no_func, "waitpid");
4146 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4147 #if defined(__LIBCATAMOUNT__)
4148 PL_statusvalue = -1;
4157 while (++MARK <= SP) {
4158 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4163 TAINT_PROPER("system");
4165 PERL_FLUSHALL_FOR_CHILD;
4166 #if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4171 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4172 sigset_t newset, oldset;
4175 if (PerlProc_pipe(pp) >= 0)
4177 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4178 sigemptyset(&newset);
4179 sigaddset(&newset, SIGCHLD);
4180 sigprocmask(SIG_BLOCK, &newset, &oldset);
4182 while ((childpid = PerlProc_fork()) == -1) {
4183 if (errno != EAGAIN) {
4188 PerlLIO_close(pp[0]);
4189 PerlLIO_close(pp[1]);
4191 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4192 sigprocmask(SIG_SETMASK, &oldset, NULL);
4199 Sigsave_t ihand,qhand; /* place to save signals during system() */
4203 PerlLIO_close(pp[1]);
4205 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4206 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4209 result = wait4pid(childpid, &status, 0);
4210 } while (result == -1 && errno == EINTR);
4212 #ifdef HAS_SIGPROCMASK
4213 sigprocmask(SIG_SETMASK, &oldset, NULL);
4215 (void)rsignal_restore(SIGINT, &ihand);
4216 (void)rsignal_restore(SIGQUIT, &qhand);
4218 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4219 do_execfree(); /* free any memory child malloced on fork */
4226 while (n < sizeof(int)) {
4227 n1 = PerlLIO_read(pp[0],
4228 (void*)(((char*)&errkid)+n),
4234 PerlLIO_close(pp[0]);
4235 if (n) { /* Error */
4236 if (n != sizeof(int))
4237 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4238 errno = errkid; /* Propagate errno from kid */
4239 STATUS_NATIVE_CHILD_SET(-1);
4242 XPUSHi(STATUS_CURRENT);
4245 #if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4246 sigprocmask(SIG_SETMASK, &oldset, NULL);
4249 PerlLIO_close(pp[0]);
4250 #if defined(HAS_FCNTL) && defined(F_SETFD)
4251 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4254 if (PL_op->op_flags & OPf_STACKED) {
4255 SV * const really = *++MARK;
4256 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4258 else if (SP - MARK != 1)
4259 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4261 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4265 #else /* ! FORK or VMS or OS/2 */
4268 if (PL_op->op_flags & OPf_STACKED) {
4269 SV * const really = *++MARK;
4270 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4271 value = (I32)do_aspawn(really, MARK, SP);
4273 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4276 else if (SP - MARK != 1) {
4277 # if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4278 value = (I32)do_aspawn(NULL, MARK, SP);
4280 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4284 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4286 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4288 STATUS_NATIVE_CHILD_SET(value);
4291 XPUSHi(result ? value : STATUS_CURRENT);
4292 #endif /* !FORK or VMS or OS/2 */
4299 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4304 while (++MARK <= SP) {
4305 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4310 TAINT_PROPER("exec");
4312 PERL_FLUSHALL_FOR_CHILD;
4313 if (PL_op->op_flags & OPf_STACKED) {
4314 SV * const really = *++MARK;
4315 value = (I32)do_aexec(really, MARK, SP);
4317 else if (SP - MARK != 1)
4319 value = (I32)vms_do_aexec(NULL, MARK, SP);
4321 value = (I32)do_aexec(NULL, MARK, SP);
4325 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4327 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4340 XPUSHi( getppid() );
4343 DIE(aTHX_ PL_no_func, "getppid");
4353 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4356 pgrp = (I32)BSD_GETPGRP(pid);
4358 if (pid != 0 && pid != PerlProc_getpid())
4359 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4365 DIE(aTHX_ PL_no_func, "getpgrp()");
4375 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4376 if (MAXARG > 0) pid = TOPs && TOPi;
4382 TAINT_PROPER("setpgrp");
4384 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4386 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4387 || (pid != 0 && pid != PerlProc_getpid()))
4389 DIE(aTHX_ "setpgrp can't take arguments");
4391 SETi( setpgrp() >= 0 );
4392 #endif /* USE_BSDPGRP */
4395 DIE(aTHX_ PL_no_func, "setpgrp()");
4399 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4400 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4402 # define PRIORITY_WHICH_T(which) which
4407 #ifdef HAS_GETPRIORITY
4409 const int who = POPi;
4410 const int which = TOPi;
4411 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4414 DIE(aTHX_ PL_no_func, "getpriority()");
4420 #ifdef HAS_SETPRIORITY
4422 const int niceval = POPi;
4423 const int who = POPi;
4424 const int which = TOPi;
4425 TAINT_PROPER("setpriority");
4426 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4429 DIE(aTHX_ PL_no_func, "setpriority()");
4433 #undef PRIORITY_WHICH_T
4441 XPUSHn( time(NULL) );
4443 XPUSHi( time(NULL) );
4455 (void)PerlProc_times(&PL_timesbuf);
4457 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4458 /* struct tms, though same data */
4462 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4463 if (GIMME == G_ARRAY) {
4464 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4465 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4466 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4474 if (GIMME == G_ARRAY) {
4481 DIE(aTHX_ "times not implemented");
4483 #endif /* HAS_TIMES */
4486 /* The 32 bit int year limits the times we can represent to these
4487 boundaries with a few days wiggle room to account for time zone
4490 /* Sat Jan 3 00:00:00 -2147481748 */
4491 #define TIME_LOWER_BOUND -67768100567755200.0
4492 /* Sun Dec 29 12:00:00 2147483647 */
4493 #define TIME_UPPER_BOUND 67767976233316800.0
4502 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4503 static const char * const dayname[] =
4504 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4505 static const char * const monname[] =
4506 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4507 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4509 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4512 when = (Time64_T)now;
4515 NV input = Perl_floor(POPn);
4516 when = (Time64_T)input;
4517 if (when != input) {
4518 /* diag_listed_as: gmtime(%f) too large */
4519 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4520 "%s(%.0" NVff ") too large", opname, input);
4524 if ( TIME_LOWER_BOUND > when ) {
4525 /* diag_listed_as: gmtime(%f) too small */
4526 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4527 "%s(%.0" NVff ") too small", opname, when);
4530 else if( when > TIME_UPPER_BOUND ) {
4531 /* diag_listed_as: gmtime(%f) too small */
4532 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4533 "%s(%.0" NVff ") too large", opname, when);
4537 if (PL_op->op_type == OP_LOCALTIME)
4538 err = S_localtime64_r(&when, &tmbuf);
4540 err = S_gmtime64_r(&when, &tmbuf);
4544 /* XXX %lld broken for quads */
4545 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4546 "%s(%.0" NVff ") failed", opname, when);
4549 if (GIMME != G_ARRAY) { /* scalar context */
4551 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4552 double year = (double)tmbuf.tm_year + 1900;
4559 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4560 dayname[tmbuf.tm_wday],
4561 monname[tmbuf.tm_mon],
4569 else { /* list context */
4575 mPUSHi(tmbuf.tm_sec);
4576 mPUSHi(tmbuf.tm_min);
4577 mPUSHi(tmbuf.tm_hour);
4578 mPUSHi(tmbuf.tm_mday);
4579 mPUSHi(tmbuf.tm_mon);
4580 mPUSHn(tmbuf.tm_year);
4581 mPUSHi(tmbuf.tm_wday);
4582 mPUSHi(tmbuf.tm_yday);
4583 mPUSHi(tmbuf.tm_isdst);
4594 anum = alarm((unsigned int)anum);
4600 DIE(aTHX_ PL_no_func, "alarm");
4611 (void)time(&lasttime);
4612 if (MAXARG < 1 || (!TOPs && !POPs))
4616 PerlProc_sleep((unsigned int)duration);
4619 XPUSHi(when - lasttime);
4623 /* Shared memory. */
4624 /* Merged with some message passing. */
4628 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4629 dVAR; dSP; dMARK; dTARGET;
4630 const int op_type = PL_op->op_type;
4635 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4638 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4641 value = (I32)(do_semop(MARK, SP) >= 0);
4644 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4652 return Perl_pp_semget(aTHX);
4660 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4661 dVAR; dSP; dMARK; dTARGET;
4662 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4669 DIE(aTHX_ "System V IPC is not implemented on this machine");
4675 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4676 dVAR; dSP; dMARK; dTARGET;
4677 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4685 PUSHp(zero_but_true, ZBTLEN);
4689 return Perl_pp_semget(aTHX);
4693 /* I can't const this further without getting warnings about the types of
4694 various arrays passed in from structures. */
4696 S_space_join_names_mortal(pTHX_ char *const *array)
4700 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4702 if (array && *array) {
4703 target = newSVpvs_flags("", SVs_TEMP);
4705 sv_catpv(target, *array);
4708 sv_catpvs(target, " ");
4711 target = sv_mortalcopy(&PL_sv_no);
4716 /* Get system info. */
4720 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4722 I32 which = PL_op->op_type;
4725 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4726 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4727 struct hostent *gethostbyname(Netdb_name_t);
4728 struct hostent *gethostent(void);
4730 struct hostent *hent = NULL;
4734 if (which == OP_GHBYNAME) {
4735 #ifdef HAS_GETHOSTBYNAME
4736 const char* const name = POPpbytex;
4737 hent = PerlSock_gethostbyname(name);
4739 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4742 else if (which == OP_GHBYADDR) {
4743 #ifdef HAS_GETHOSTBYADDR
4744 const int addrtype = POPi;
4745 SV * const addrsv = POPs;
4747 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4749 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4751 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4755 #ifdef HAS_GETHOSTENT
4756 hent = PerlSock_gethostent();
4758 DIE(aTHX_ PL_no_sock_func, "gethostent");
4761 #ifdef HOST_NOT_FOUND
4763 #ifdef USE_REENTRANT_API
4764 # ifdef USE_GETHOSTENT_ERRNO
4765 h_errno = PL_reentrant_buffer->_gethostent_errno;
4768 STATUS_UNIX_SET(h_errno);
4772 if (GIMME != G_ARRAY) {
4773 PUSHs(sv = sv_newmortal());
4775 if (which == OP_GHBYNAME) {
4777 sv_setpvn(sv, hent->h_addr, hent->h_length);
4780 sv_setpv(sv, (char*)hent->h_name);
4786 mPUSHs(newSVpv((char*)hent->h_name, 0));
4787 PUSHs(space_join_names_mortal(hent->h_aliases));
4788 mPUSHi(hent->h_addrtype);
4789 len = hent->h_length;
4792 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4793 mXPUSHp(*elem, len);
4797 mPUSHp(hent->h_addr, len);
4799 PUSHs(sv_mortalcopy(&PL_sv_no));
4804 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4810 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4812 I32 which = PL_op->op_type;
4814 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4815 struct netent *getnetbyaddr(Netdb_net_t, int);
4816 struct netent *getnetbyname(Netdb_name_t);
4817 struct netent *getnetent(void);
4819 struct netent *nent;
4821 if (which == OP_GNBYNAME){
4822 #ifdef HAS_GETNETBYNAME
4823 const char * const name = POPpbytex;
4824 nent = PerlSock_getnetbyname(name);
4826 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4829 else if (which == OP_GNBYADDR) {
4830 #ifdef HAS_GETNETBYADDR
4831 const int addrtype = POPi;
4832 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4833 nent = PerlSock_getnetbyaddr(addr, addrtype);
4835 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4839 #ifdef HAS_GETNETENT
4840 nent = PerlSock_getnetent();
4842 DIE(aTHX_ PL_no_sock_func, "getnetent");
4845 #ifdef HOST_NOT_FOUND
4847 #ifdef USE_REENTRANT_API
4848 # ifdef USE_GETNETENT_ERRNO
4849 h_errno = PL_reentrant_buffer->_getnetent_errno;
4852 STATUS_UNIX_SET(h_errno);
4857 if (GIMME != G_ARRAY) {
4858 PUSHs(sv = sv_newmortal());
4860 if (which == OP_GNBYNAME)
4861 sv_setiv(sv, (IV)nent->n_net);
4863 sv_setpv(sv, nent->n_name);
4869 mPUSHs(newSVpv(nent->n_name, 0));
4870 PUSHs(space_join_names_mortal(nent->n_aliases));
4871 mPUSHi(nent->n_addrtype);
4872 mPUSHi(nent->n_net);
4877 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4883 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4885 I32 which = PL_op->op_type;
4887 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4888 struct protoent *getprotobyname(Netdb_name_t);
4889 struct protoent *getprotobynumber(int);
4890 struct protoent *getprotoent(void);
4892 struct protoent *pent;
4894 if (which == OP_GPBYNAME) {
4895 #ifdef HAS_GETPROTOBYNAME
4896 const char* const name = POPpbytex;
4897 pent = PerlSock_getprotobyname(name);
4899 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4902 else if (which == OP_GPBYNUMBER) {
4903 #ifdef HAS_GETPROTOBYNUMBER
4904 const int number = POPi;
4905 pent = PerlSock_getprotobynumber(number);
4907 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4911 #ifdef HAS_GETPROTOENT
4912 pent = PerlSock_getprotoent();
4914 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4918 if (GIMME != G_ARRAY) {
4919 PUSHs(sv = sv_newmortal());
4921 if (which == OP_GPBYNAME)
4922 sv_setiv(sv, (IV)pent->p_proto);
4924 sv_setpv(sv, pent->p_name);
4930 mPUSHs(newSVpv(pent->p_name, 0));
4931 PUSHs(space_join_names_mortal(pent->p_aliases));
4932 mPUSHi(pent->p_proto);
4937 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4943 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4945 I32 which = PL_op->op_type;
4947 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4948 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4949 struct servent *getservbyport(int, Netdb_name_t);
4950 struct servent *getservent(void);
4952 struct servent *sent;
4954 if (which == OP_GSBYNAME) {
4955 #ifdef HAS_GETSERVBYNAME
4956 const char * const proto = POPpbytex;
4957 const char * const name = POPpbytex;
4958 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4960 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4963 else if (which == OP_GSBYPORT) {
4964 #ifdef HAS_GETSERVBYPORT
4965 const char * const proto = POPpbytex;
4966 unsigned short port = (unsigned short)POPu;
4968 port = PerlSock_htons(port);
4970 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4972 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4976 #ifdef HAS_GETSERVENT
4977 sent = PerlSock_getservent();
4979 DIE(aTHX_ PL_no_sock_func, "getservent");
4983 if (GIMME != G_ARRAY) {
4984 PUSHs(sv = sv_newmortal());
4986 if (which == OP_GSBYNAME) {
4988 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4990 sv_setiv(sv, (IV)(sent->s_port));
4994 sv_setpv(sv, sent->s_name);
5000 mPUSHs(newSVpv(sent->s_name, 0));
5001 PUSHs(space_join_names_mortal(sent->s_aliases));
5003 mPUSHi(PerlSock_ntohs(sent->s_port));
5005 mPUSHi(sent->s_port);
5007 mPUSHs(newSVpv(sent->s_proto, 0));
5012 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5019 const int stayopen = TOPi;
5020 switch(PL_op->op_type) {
5022 #ifdef HAS_SETHOSTENT