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
35 /* Shadow password support for solaris - pdo@cs.umd.edu
36 * Not just Solaris: at least HP-UX, IRIX, Linux.
37 * The API is from SysV.
39 * There are at least two more shadow interfaces,
40 * see the comments in pp_gpwent().
44 /* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
45 * and another MAXINT from "perl.h" <- <sys/param.h>. */
52 # include <sys/resource.h>
61 # include <sys/select.h>
65 /* XXX Configure test needed.
66 h_errno might not be a simple 'int', especially for multi-threaded
67 applications, see "extern int errno in perl.h". Creating such
68 a test requires taking into account the differences between
69 compiling multithreaded and singlethreaded ($ccflags et al).
70 HOST_NOT_FOUND is typically defined in <netdb.h>.
72 #if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
80 struct passwd *getpwnam (char *);
81 struct passwd *getpwuid (Uid_t);
85 struct passwd *getpwent (void);
86 # elif defined (VMS) && defined (my_getpwent)
87 struct passwd *Perl_my_getpwent (pTHX);
96 struct group *getgrnam (char *);
97 struct group *getgrgid (Gid_t);
101 struct group *getgrent (void);
107 # if defined(_MSC_VER) || defined(__MINGW32__)
108 # include <sys/utime.h>
115 # ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
118 # define my_chsize PerlLIO_chsize
119 #elif defined(HAS_TRUNCATE)
120 # define my_chsize PerlLIO_chsize
122 I32 my_chsize(int fd, Off_t length);
127 #else /* no flock() */
129 /* fcntl.h might not have been included, even if it exists, because
130 the current Configure only sets I_FCNTL if it's needed to pick up
131 the *_OK constants. Make sure it has been included before testing
132 the fcntl() locking constants. */
133 # if defined(HAS_FCNTL) && !defined(I_FCNTL)
137 # if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
138 # define FLOCK fcntl_emulate_flock
139 # define FCNTL_EMULATE_FLOCK
140 # elif defined(HAS_LOCKF)
141 # define FLOCK lockf_emulate_flock
142 # define LOCKF_EMULATE_FLOCK
146 static int FLOCK (int, int);
149 * These are the flock() constants. Since this sytems doesn't have
150 * flock(), the values of the constants are probably not available.
164 # endif /* emulating flock() */
166 #endif /* no flock() */
169 static const char zero_but_true[ZBTLEN + 1] = "0 but true";
171 #if defined(I_SYS_ACCESS) && !defined(R_OK)
172 # include <sys/access.h>
178 /* Missing protos on LynxOS */
179 void sethostent(int);
180 void endhostent(void);
182 void endnetent(void);
183 void setprotoent(int);
184 void endprotoent(void);
185 void setservent(int);
186 void endservent(void);
190 # include "amigaos4/amigaio.h"
193 #undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
195 /* F_OK unused: if stat() cannot find it... */
197 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
198 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
199 # define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
202 #if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
203 # ifdef I_SYS_SECURITY
204 # include <sys/security.h>
208 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
211 # define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
215 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
216 /* AIX's accessx() doesn't declare its argument const, unlike every other platform */
217 # define PERL_EFF_ACCESS(p,f) (accessx((char*)(p), (f), ACC_SELF))
221 #if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
222 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
223 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
226 S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
228 const Uid_t ruid = getuid();
229 const Uid_t euid = geteuid();
230 const Gid_t rgid = getgid();
231 const Gid_t egid = getegid();
234 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
235 Perl_croak(aTHX_ "switching effective uid is not implemented");
238 if (setreuid(euid, ruid))
239 # elif defined(HAS_SETRESUID)
240 if (setresuid(euid, ruid, (Uid_t)-1))
242 /* diag_listed_as: entering effective %s failed */
243 Perl_croak(aTHX_ "entering effective uid failed");
246 #if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
247 Perl_croak(aTHX_ "switching effective gid is not implemented");
250 if (setregid(egid, rgid))
251 # elif defined(HAS_SETRESGID)
252 if (setresgid(egid, rgid, (Gid_t)-1))
254 /* diag_listed_as: entering effective %s failed */
255 Perl_croak(aTHX_ "entering effective gid failed");
258 res = access(path, mode);
261 if (setreuid(ruid, euid))
262 #elif defined(HAS_SETRESUID)
263 if (setresuid(ruid, euid, (Uid_t)-1))
265 /* diag_listed_as: leaving effective %s failed */
266 Perl_croak(aTHX_ "leaving effective uid failed");
269 if (setregid(rgid, egid))
270 #elif defined(HAS_SETRESGID)
271 if (setresgid(rgid, egid, (Gid_t)-1))
273 /* diag_listed_as: leaving effective %s failed */
274 Perl_croak(aTHX_ "leaving effective gid failed");
278 # define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
285 const char * const tmps = POPpconstx;
286 const U8 gimme = GIMME_V;
287 const char *mode = "r";
290 if (PL_op->op_private & OPpOPEN_IN_RAW)
292 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
294 fp = PerlProc_popen(tmps, mode);
296 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
298 PerlIO_apply_layers(aTHX_ fp,mode,type);
300 if (gimme == G_VOID) {
302 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
305 else if (gimme == G_SCALAR) {
306 ENTER_with_name("backtick");
308 PL_rs = &PL_sv_undef;
309 SvPVCLEAR(TARG); /* note that this preserves previous buffer */
310 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
312 LEAVE_with_name("backtick");
318 SV * const sv = newSV(79);
319 if (sv_gets(sv, fp, 0) == NULL) {
324 if (SvLEN(sv) - SvCUR(sv) > 20) {
325 SvPV_shrink_to_cur(sv);
330 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
331 TAINT; /* "I believe that this is not gratuitous!" */
334 STATUS_NATIVE_CHILD_SET(-1);
335 if (gimme == G_SCALAR)
346 GV * const gv = (PL_op->op_flags & OPf_SPECIAL) ? NULL : (GV *)POPs;
350 /* make a copy of the pattern if it is gmagical, to ensure that magic
351 * is called once and only once */
352 if (SvGMAGICAL(TOPs)) TOPs = sv_2mortal(newSVsv(TOPs));
354 tryAMAGICunTARGETlist(iter_amg, (PL_op->op_flags & OPf_SPECIAL));
356 if (PL_op->op_flags & OPf_SPECIAL) {
357 /* call Perl-level glob function instead. Stack args are:
359 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
368 /* Note that we only ever get here if File::Glob fails to load
369 * without at the same time croaking, for some reason, or if
370 * perl was built with PERL_EXTERNAL_GLOB */
372 ENTER_with_name("glob");
377 * The external globbing program may use things we can't control,
378 * so for security reasons we must assume the worst.
381 taint_proper(PL_no_security, "glob");
385 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
388 SAVESPTR(PL_rs); /* This is not permanent, either. */
389 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
392 *SvPVX(PL_rs) = '\n';
396 result = do_readline();
397 LEAVE_with_name("glob");
403 PL_last_in_gv = cGVOP_gv;
404 return do_readline();
414 do_join(TARG, &PL_sv_no, MARK, SP);
418 else if (SP == MARK) {
425 if (SvGMAGICAL(exsv)) exsv = sv_mortalcopy(exsv);
428 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
429 /* well-formed exception supplied */
432 SV * const errsv = ERRSV;
435 if (SvGMAGICAL(errsv)) {
436 exsv = sv_newmortal();
437 sv_setsv_nomg(exsv, errsv);
441 else if (SvPOKp(errsv) ? SvCUR(errsv) : SvNIOKp(errsv)) {
442 exsv = sv_newmortal();
443 sv_setsv_nomg(exsv, errsv);
444 sv_catpvs(exsv, "\t...caught");
447 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
450 if (SvROK(exsv) && !PL_warnhook)
451 Perl_warn(aTHX_ "%" SVf, SVfARG(exsv));
463 VMSISH_HUSHED || (PL_curcop->op_private & OPpHUSH_VMSISH);
465 if (SP - MARK != 1) {
467 do_join(TARG, &PL_sv_no, MARK, SP);
475 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
476 /* well-formed exception supplied */
479 SV * const errsv = ERRSV;
483 if (sv_isobject(exsv)) {
484 HV * const stash = SvSTASH(SvRV(exsv));
485 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
487 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
488 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
495 call_sv(MUTABLE_SV(GvCV(gv)),
496 G_SCALAR|G_EVAL|G_KEEPERR);
497 exsv = sv_mortalcopy(*PL_stack_sp--);
501 else if (SvOK(errsv) && (SvPV_nomg(errsv,len), len)) {
502 exsv = sv_mortalcopy(errsv);
503 sv_catpvs(exsv, "\t...propagated");
506 exsv = newSVpvs_flags("Died", SVs_TEMP);
510 NOT_REACHED; /* NOTREACHED */
511 return NULL; /* avoid missing return from non-void function warning */
517 Perl_tied_method(pTHX_ SV *methname, SV **sp, SV *const sv,
518 const MAGIC *const mg, const U32 flags, U32 argc, ...)
524 PERL_ARGS_ASSERT_TIED_METHOD;
526 /* Ensure that our flag bits do not overlap. */
527 STATIC_ASSERT_STMT((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
528 STATIC_ASSERT_STMT((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
529 STATIC_ASSERT_STMT((TIED_METHOD_SAY & G_WANT) == 0);
531 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
532 PUSHSTACKi(PERLSI_MAGIC);
533 /* extend for object + args. If argc might wrap/truncate when cast
534 * to SSize_t and incremented, set to -1, which will trigger a panic in
536 * The weird way this is written is because g++ is dumb enough to
537 * warn "comparison is always false" on something like:
539 * sizeof(a) >= sizeof(b) && a >= B_t_MAX -1
541 * (where the LH condition is false)
544 (argc > (sizeof(argc) >= sizeof(SSize_t) ? SSize_t_MAX - 1 : argc))
545 ? -1 : (SSize_t)argc + 1;
546 EXTEND(SP, extend_size);
548 PUSHs(SvTIED_obj(sv, mg));
549 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
550 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
554 const U32 mortalize_not_needed
555 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
557 va_start(args, argc);
559 SV *const arg = va_arg(args, SV *);
560 if(mortalize_not_needed)
569 ENTER_with_name("call_tied_method");
570 if (flags & TIED_METHOD_SAY) {
571 /* local $\ = "\n" */
572 SAVEGENERICSV(PL_ors_sv);
573 PL_ors_sv = newSVpvs("\n");
575 ret_args = call_sv(methname, (flags & G_WANT)|G_METHOD_NAMED);
580 if (ret_args) { /* copy results back to original stack */
581 EXTEND(sp, ret_args);
582 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
586 LEAVE_with_name("call_tied_method");
590 #define tied_method0(a,b,c,d) \
591 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
592 #define tied_method1(a,b,c,d,e) \
593 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
594 #define tied_method2(a,b,c,d,e,f) \
595 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
608 GV * const gv = MUTABLE_GV(*++MARK);
610 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
611 DIE(aTHX_ PL_no_usym, "filehandle");
613 if ((io = GvIOp(gv))) {
615 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
618 Perl_croak(aTHX_ "Cannot open %" HEKf " as a filehandle: it is already open as a dirhandle",
619 HEKfARG(GvENAME_HEK(gv)));
621 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
623 /* Method's args are same as ours ... */
624 /* ... except handle is replaced by the object */
625 return Perl_tied_method(aTHX_ SV_CONST(OPEN), mark - 1, MUTABLE_SV(io), mg,
626 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
638 tmps = SvPV_const(sv, len);
639 ok = do_open6(gv, tmps, len, NULL, MARK+1, (SP-MARK));
642 PUSHi( (I32)PL_forkprocess );
643 else if (PL_forkprocess == 0) /* we are a new child */
653 /* pp_coreargs pushes a NULL to indicate no args passed to
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)));
682 GV * const wgv = MUTABLE_GV(POPs);
683 GV * const rgv = MUTABLE_GV(POPs);
687 do_close(rgv, FALSE);
691 do_close(wgv, FALSE);
693 if (PerlProc_pipe_cloexec(fd) < 0)
696 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r" PIPE_OPEN_MODE);
697 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w" PIPE_OPEN_MODE);
698 IoOFP(rstio) = IoIFP(rstio);
699 IoIFP(wstio) = IoOFP(wstio);
700 IoTYPE(rstio) = IoTYPE_RDONLY;
701 IoTYPE(wstio) = IoTYPE_WRONLY;
703 if (!IoIFP(rstio) || !IoOFP(wstio)) {
705 PerlIO_close(IoIFP(rstio));
707 PerlLIO_close(fd[0]);
709 PerlIO_close(IoOFP(wstio));
711 PerlLIO_close(fd[1]);
719 DIE(aTHX_ PL_no_func, "pipe");
733 gv = MUTABLE_GV(POPs);
737 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
739 return tied_method0(SV_CONST(FILENO), SP, MUTABLE_SV(io), mg);
742 if (io && IoDIRP(io)) {
743 #if defined(HAS_DIRFD) || defined(HAS_DIR_DD_FD)
744 PUSHi(my_dirfd(IoDIRP(io)));
746 #elif defined(ENOTSUP)
747 errno = ENOTSUP; /* Operation not supported */
749 #elif defined(EOPNOTSUPP)
750 errno = EOPNOTSUPP; /* Operation not supported on socket */
753 errno = EINVAL; /* Invalid argument */
758 if (!io || !(fp = IoIFP(io))) {
759 /* Can't do this because people seem to do things like
760 defined(fileno($foo)) to check whether $foo is a valid fh.
767 PUSHi(PerlIO_fileno(fp));
778 if (MAXARG < 1 || (!TOPs && !POPs)) {
779 anum = PerlLIO_umask(022);
780 /* setting it to 022 between the two calls to umask avoids
781 * to have a window where the umask is set to 0 -- meaning
782 * that another thread could create world-writeable files. */
784 (void)PerlLIO_umask(anum);
787 anum = PerlLIO_umask(POPi);
788 TAINT_PROPER("umask");
791 /* Only DIE if trying to restrict permissions on "user" (self).
792 * Otherwise it's harmless and more useful to just return undef
793 * since 'group' and 'other' concepts probably don't exist here. */
794 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
795 DIE(aTHX_ "umask not implemented");
796 XPUSHs(&PL_sv_undef);
815 gv = MUTABLE_GV(POPs);
819 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
821 /* This takes advantage of the implementation of the varargs
822 function, which I don't think that the optimiser will be able to
823 figure out. Although, as it's a static function, in theory it
825 return Perl_tied_method(aTHX_ SV_CONST(BINMODE), SP, MUTABLE_SV(io), mg,
826 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
827 discp ? 1 : 0, discp);
831 if (!io || !(fp = IoIFP(io))) {
833 SETERRNO(EBADF,RMS_IFI);
840 const char *d = NULL;
843 d = SvPV_const(discp, len);
844 mode = mode_from_discipline(d, len);
845 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
846 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
847 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
868 const I32 markoff = MARK - PL_stack_base;
869 const char *methname;
870 int how = PERL_MAGIC_tied;
874 switch(SvTYPE(varsv)) {
878 methname = "TIEHASH";
879 if (HvLAZYDEL(varsv) && (entry = HvEITER_get((HV *)varsv))) {
880 HvLAZYDEL_off(varsv);
881 hv_free_ent((HV *)varsv, entry);
883 HvEITER_set(MUTABLE_HV(varsv), 0);
884 HvRITER_set(MUTABLE_HV(varsv), -1);
888 methname = "TIEARRAY";
889 if (!AvREAL(varsv)) {
891 Perl_croak(aTHX_ "Cannot tie unreifiable array");
892 av_clear((AV *)varsv);
899 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
900 methname = "TIEHANDLE";
901 how = PERL_MAGIC_tiedscalar;
902 /* For tied filehandles, we apply tiedscalar magic to the IO
903 slot of the GP rather than the GV itself. AMS 20010812 */
905 GvIOp(varsv) = newIO();
906 varsv = MUTABLE_SV(GvIOp(varsv));
909 if (SvTYPE(varsv) == SVt_PVLV && LvTYPE(varsv) == 'y') {
910 vivify_defelem(varsv);
911 varsv = LvTARG(varsv);
915 methname = "TIESCALAR";
916 how = PERL_MAGIC_tiedscalar;
920 if (sv_isobject(*MARK)) { /* Calls GET magic. */
921 ENTER_with_name("call_TIE");
922 PUSHSTACKi(PERLSI_MAGIC);
924 EXTEND(SP,(I32)items);
928 call_method(methname, G_SCALAR);
931 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
932 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
933 * wrong error message, and worse case, supreme action at a distance.
934 * (Sorry obfuscation writers. You're not going to be given this one.)
936 stash = gv_stashsv(*MARK, 0);
939 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
940 methname, SVfARG(*MARK));
941 else if (isGV(*MARK)) {
942 /* If the glob doesn't name an existing package, using
943 * SVfARG(*MARK) would yield "*Foo::Bar" or *main::Foo. So
944 * generate the name for the error message explicitly. */
945 SV *stashname = sv_2mortal(newSV(0));
946 gv_fullname4(stashname, (GV *) *MARK, NULL, FALSE);
947 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\"",
948 methname, SVfARG(stashname));
951 SV *stashname = !SvPOK(*MARK) ? &PL_sv_no
952 : SvCUR(*MARK) ? *MARK
953 : sv_2mortal(newSVpvs("main"));
954 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" SVf "\""
955 " (perhaps you forgot to load \"%" SVf "\"?)",
956 methname, SVfARG(stashname), SVfARG(stashname));
959 else if (!(gv = gv_fetchmethod(stash, methname))) {
960 /* The effective name can only be NULL for stashes that have
961 * been deleted from the symbol table, which this one can't
962 * be, since we just looked it up by name.
964 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%" HEKf "\"",
965 methname, HvENAME_HEK_NN(stash));
967 ENTER_with_name("call_TIE");
968 PUSHSTACKi(PERLSI_MAGIC);
970 EXTEND(SP,(I32)items);
974 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
980 if (sv_isobject(sv)) {
981 sv_unmagic(varsv, how);
982 /* Croak if a self-tie on an aggregate is attempted. */
983 if (varsv == SvRV(sv) &&
984 (SvTYPE(varsv) == SVt_PVAV ||
985 SvTYPE(varsv) == SVt_PVHV))
987 "Self-ties of arrays and hashes are not supported");
988 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
990 LEAVE_with_name("call_TIE");
991 SP = PL_stack_base + markoff;
997 /* also used for: pp_dbmclose() */
1004 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1005 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1007 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1010 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1011 !(sv = defelem_target(sv, NULL))) RETPUSHUNDEF;
1013 if ((mg = SvTIED_mg(sv, how))) {
1014 SV * const obj = SvRV(SvTIED_obj(sv, mg));
1015 if (obj && SvSTASH(obj)) {
1016 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
1018 if (gv && isGV(gv) && (cv = GvCV(gv))) {
1020 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
1021 mXPUSHi(SvREFCNT(obj) - 1);
1023 ENTER_with_name("call_UNTIE");
1024 call_sv(MUTABLE_SV(cv), G_VOID);
1025 LEAVE_with_name("call_UNTIE");
1028 else if (mg && SvREFCNT(obj) > 1) {
1029 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
1030 "untie attempted while %" UVuf " inner references still exist",
1031 (UV)SvREFCNT(obj) - 1 ) ;
1035 sv_unmagic(sv, how) ;
1044 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
1045 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
1047 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
1050 if (SvTYPE(sv) == SVt_PVLV && LvTYPE(sv) == 'y' &&
1051 !(sv = defelem_target(sv, NULL))) goto ret_undef;
1053 if ((mg = SvTIED_mg(sv, how))) {
1054 SETs(SvTIED_obj(sv, mg));
1055 return NORMAL; /* PUTBACK not needed, pp_tied never moves SP */
1069 HV * const hv = MUTABLE_HV(POPs);
1070 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1071 stash = gv_stashsv(sv, 0);
1072 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1074 require_pv("AnyDBM_File.pm");
1076 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1077 DIE(aTHX_ "No dbm on this machine");
1087 mPUSHu(O_RDWR|O_CREAT);
1091 if (!SvOK(right)) right = &PL_sv_no;
1095 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1098 if (!sv_isobject(TOPs)) {
1106 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1108 if (sv_isobject(TOPs))
1113 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1114 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1131 struct timeval timebuf;
1132 struct timeval *tbuf = &timebuf;
1136 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1141 # if BYTEORDER & 0xf0000
1142 # define ORDERBYTE (0x88888888 - BYTEORDER)
1144 # define ORDERBYTE (0x4444 - BYTEORDER)
1150 for (i = 1; i <= 3; i++) {
1151 SV * const sv = svs[i] = SP[i];
1155 if (SvREADONLY(sv)) {
1156 if (!(SvPOK(sv) && SvCUR(sv) == 0))
1157 Perl_croak_no_modify();
1159 else if (SvIsCOW(sv)) sv_force_normal_flags(sv, 0);
1162 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1163 "Non-string passed as bitmask");
1164 if (SvGAMAGIC(sv)) {
1165 svs[i] = sv_newmortal();
1166 sv_copypv_nomg(svs[i], sv);
1169 SvPV_force_nomg_nolen(sv); /* force string conversion */
1176 /* little endians can use vecs directly */
1177 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1184 masksize = NFDBITS / NBBY;
1186 masksize = sizeof(long); /* documented int, everyone seems to use long */
1188 Zero(&fd_sets[0], 4, char*);
1191 # if SELECT_MIN_BITS == 1
1192 growsize = sizeof(fd_set);
1194 # if defined(__GLIBC__) && defined(__FD_SETSIZE)
1195 # undef SELECT_MIN_BITS
1196 # define SELECT_MIN_BITS __FD_SETSIZE
1198 /* If SELECT_MIN_BITS is greater than one we most probably will want
1199 * to align the sizes with SELECT_MIN_BITS/8 because for example
1200 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1201 * UNIX, Solaris, Darwin) the smallest quantum select() operates
1202 * on (sets/tests/clears bits) is 32 bits. */
1203 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1209 value = SvNV_nomg(sv);
1212 timebuf.tv_sec = (long)value;
1213 value -= (NV)timebuf.tv_sec;
1214 timebuf.tv_usec = (long)(value * 1000000.0);
1219 for (i = 1; i <= 3; i++) {
1221 if (!SvOK(sv) || SvCUR(sv) == 0) {
1228 Sv_Grow(sv, growsize);
1232 while (++j <= growsize) {
1236 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1238 Newx(fd_sets[i], growsize, char);
1239 for (offset = 0; offset < growsize; offset += masksize) {
1240 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1241 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1244 fd_sets[i] = SvPVX(sv);
1248 #ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1249 /* Can't make just the (void*) conditional because that would be
1250 * cpp #if within cpp macro, and not all compilers like that. */
1251 nfound = PerlSock_select(
1253 (Select_fd_set_t) fd_sets[1],
1254 (Select_fd_set_t) fd_sets[2],
1255 (Select_fd_set_t) fd_sets[3],
1256 (void*) tbuf); /* Workaround for compiler bug. */
1258 nfound = PerlSock_select(
1260 (Select_fd_set_t) fd_sets[1],
1261 (Select_fd_set_t) fd_sets[2],
1262 (Select_fd_set_t) fd_sets[3],
1265 for (i = 1; i <= 3; i++) {
1268 #if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1270 for (offset = 0; offset < growsize; offset += masksize) {
1271 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1272 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1274 Safefree(fd_sets[i]);
1277 SvSetMagicSV(SP[i], sv);
1284 if (GIMME_V == G_LIST && tbuf) {
1285 value = (NV)(timebuf.tv_sec) +
1286 (NV)(timebuf.tv_usec) / 1000000.0;
1291 DIE(aTHX_ "select not implemented");
1297 =for apidoc_section $GV
1299 =for apidoc setdefout
1301 Sets C<PL_defoutgv>, the default file handle for output, to the passed in
1302 typeglob. As C<PL_defoutgv> "owns" a reference on its typeglob, the reference
1303 count of the passed in typeglob is increased by one, and the reference count
1304 of the typeglob that C<PL_defoutgv> points to is decreased by one.
1310 Perl_setdefout(pTHX_ GV *gv)
1312 GV *oldgv = PL_defoutgv;
1314 PERL_ARGS_ASSERT_SETDEFOUT;
1316 SvREFCNT_inc_simple_void_NN(gv);
1318 SvREFCNT_dec(oldgv);
1325 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1326 GV * egv = GvEGVx(PL_defoutgv);
1331 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1332 gvp = hv && HvENAME(hv)
1333 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1335 if (gvp && *gvp == egv) {
1336 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1340 mXPUSHs(newRV(MUTABLE_SV(egv)));
1344 if (!GvIO(newdefout))
1345 gv_IOadd(newdefout);
1346 setdefout(newdefout);
1355 /* pp_coreargs pushes a NULL to indicate no args passed to
1358 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1359 IO *const io = GvIO(gv);
1365 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1367 const U8 gimme = GIMME_V;
1368 Perl_tied_method(aTHX_ SV_CONST(GETC), SP, MUTABLE_SV(io), mg, gimme, 0);
1369 if (gimme == G_SCALAR) {
1371 SvSetMagicSV_nosteal(TARG, TOPs);
1376 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1377 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1379 SETERRNO(EBADF,RMS_IFI);
1383 sv_setpvs(TARG, " ");
1384 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1385 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1386 /* Find out how many bytes the char needs */
1387 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1390 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1391 SvCUR_set(TARG,1+len);
1395 else SvUTF8_off(TARG);
1401 S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1404 const U8 gimme = GIMME_V;
1406 PERL_ARGS_ASSERT_DOFORM;
1409 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1411 cx = cx_pushblock(CXt_FORMAT, gimme, PL_stack_sp, PL_savestack_ix);
1412 cx_pushformat(cx, cv, retop, gv);
1413 if (CvDEPTH(cv) >= 2)
1414 pad_push(CvPADLIST(cv), CvDEPTH(cv));
1415 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), CvDEPTH(cv));
1417 setdefout(gv); /* locally select filehandle so $% et al work */
1434 gv = MUTABLE_GV(POPs);
1451 SV * const tmpsv = sv_newmortal();
1452 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1453 DIE(aTHX_ "Undefined format \"%" SVf "\" called", SVfARG(tmpsv));
1455 IoFLAGS(io) &= ~IOf_DIDTOP;
1456 RETURNOP(doform(cv,gv,PL_op->op_next));
1462 GV * const gv = CX_CUR()->blk_format.gv;
1463 IO * const io = GvIOp(gv);
1468 bool is_return = cBOOL(PL_op->op_type == OP_RETURN);
1470 if (is_return || !io || !(ofp = IoOFP(io)))
1473 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1474 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1476 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1477 PL_formtarget != PL_toptarget)
1481 if (!IoTOP_GV(io)) {
1484 if (!IoTOP_NAME(io)) {
1486 if (!IoFMT_NAME(io))
1487 IoFMT_NAME(io) = savepv(GvNAME(gv));
1488 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%" HEKf "_TOP",
1489 HEKfARG(GvNAME_HEK(gv))));
1490 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1491 if ((topgv && GvFORM(topgv)) ||
1492 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1493 IoTOP_NAME(io) = savesvpv(topname);
1495 IoTOP_NAME(io) = savepvs("top");
1497 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1498 if (!topgv || !GvFORM(topgv)) {
1499 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1502 IoTOP_GV(io) = topgv;
1504 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1505 I32 lines = IoLINES_LEFT(io);
1506 const char *s = SvPVX_const(PL_formtarget);
1507 const char *e = SvEND(PL_formtarget);
1508 if (lines <= 0) /* Yow, header didn't even fit!!! */
1510 while (lines-- > 0) {
1511 s = (char *) memchr(s, '\n', e - s);
1517 const STRLEN save = SvCUR(PL_formtarget);
1518 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1519 do_print(PL_formtarget, ofp);
1520 SvCUR_set(PL_formtarget, save);
1521 sv_chop(PL_formtarget, s);
1522 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1525 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1526 do_print(GvSV(gv_fetchpvs("\f", GV_ADD, SVt_PV)), ofp);
1527 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1529 PL_formtarget = PL_toptarget;
1530 IoFLAGS(io) |= IOf_DIDTOP;
1532 assert(fgv); /* IoTOP_GV(io) should have been set above */
1535 SV * const sv = sv_newmortal();
1536 gv_efullname4(sv, fgv, NULL, FALSE);
1537 DIE(aTHX_ "Undefined top format \"%" SVf "\" called", SVfARG(sv));
1539 return doform(cv, gv, PL_op);
1544 assert(CxTYPE(cx) == CXt_FORMAT);
1545 SP = PL_stack_base + cx->blk_oldsp; /* ignore retval of formline */
1549 retop = cx->blk_sub.retop;
1555 /* XXX the semantics of doing 'return' in a format aren't documented.
1556 * Currently we ignore any args to 'return' and just return
1557 * a single undef in both scalar and list contexts
1559 PUSHs(&PL_sv_undef);
1560 else if (!io || !(fp = IoOFP(io))) {
1561 if (io && IoIFP(io))
1562 report_wrongway_fh(gv, '<');
1568 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1569 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1571 if (!do_print(PL_formtarget, fp))
1574 FmLINES(PL_formtarget) = 0;
1575 SvCUR_set(PL_formtarget, 0);
1576 *SvEND(PL_formtarget) = '\0';
1577 if (IoFLAGS(io) & IOf_FLUSH)
1578 (void)PerlIO_flush(fp);
1582 PL_formtarget = PL_bodytarget;
1588 dSP; dMARK; dORIGMARK;
1592 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1593 IO *const io = GvIO(gv);
1595 /* Treat empty list as "" */
1596 if (MARK == SP) XPUSHs(&PL_sv_no);
1599 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1601 if (MARK == ORIGMARK) {
1604 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1607 return Perl_tied_method(aTHX_ SV_CONST(PRINTF), mark - 1, MUTABLE_SV(io),
1609 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1616 SETERRNO(EBADF,RMS_IFI);
1619 else if (!(fp = IoOFP(io))) {
1621 report_wrongway_fh(gv, '<');
1622 else if (ckWARN(WARN_CLOSED))
1624 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1628 SV *sv = sv_newmortal();
1629 do_sprintf(sv, SP - MARK, MARK + 1);
1630 if (!do_print(sv, fp))
1633 if (IoFLAGS(io) & IOf_FLUSH)
1634 if (PerlIO_flush(fp) == EOF)
1643 PUSHs(&PL_sv_undef);
1650 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1651 const int mode = POPi;
1652 SV * const sv = POPs;
1653 GV * const gv = MUTABLE_GV(POPs);
1656 /* Need TIEHANDLE method ? */
1657 const char * const tmps = SvPV_const(sv, len);
1658 if (do_open_raw(gv, tmps, len, mode, perm, NULL)) {
1659 IoLINES(GvIOp(gv)) = 0;
1663 PUSHs(&PL_sv_undef);
1669 /* also used for: pp_read() and pp_recv() (where supported) */
1673 dSP; dMARK; dORIGMARK; dTARGET;
1687 bool charstart = FALSE;
1688 STRLEN charskip = 0;
1690 GV * const gv = MUTABLE_GV(*++MARK);
1693 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1694 && gv && (io = GvIO(gv)) )
1696 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1698 return Perl_tied_method(aTHX_ SV_CONST(READ), mark - 1, MUTABLE_SV(io), mg,
1699 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1709 length = SvIVx(*++MARK);
1711 DIE(aTHX_ "Negative length");
1714 offset = SvIVx(*++MARK);
1718 if (!io || !IoIFP(io)) {
1720 SETERRNO(EBADF,RMS_IFI);
1724 /* Note that fd can here validly be -1, don't check it yet. */
1725 fd = PerlIO_fileno(IoIFP(io));
1727 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1728 if (PL_op->op_type == OP_SYSREAD || PL_op->op_type == OP_RECV) {
1730 "%s() isn't allowed on :utf8 handles",
1733 buffer = SvPVutf8_force(bufsv, blen);
1734 /* UTF-8 may not have been set if they are all low bytes */
1739 buffer = SvPV_force(bufsv, blen);
1740 buffer_utf8 = DO_UTF8(bufsv);
1742 if (DO_UTF8(bufsv)) {
1743 blen = sv_len_utf8_nomg(bufsv);
1752 if (PL_op->op_type == OP_RECV) {
1753 Sock_size_t bufsize;
1754 char namebuf[MAXPATHLEN];
1756 SETERRNO(EBADF,SS_IVCHAN);
1759 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
1760 bufsize = sizeof (struct sockaddr_in);
1762 bufsize = sizeof namebuf;
1764 #ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1768 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1769 /* 'offset' means 'flags' here */
1770 count = PerlSock_recvfrom(fd, buffer, length, offset,
1771 (struct sockaddr *)namebuf, &bufsize);
1774 /* MSG_TRUNC can give oversized count; quietly lose it */
1777 SvCUR_set(bufsv, count);
1778 *SvEND(bufsv) = '\0';
1779 (void)SvPOK_only(bufsv);
1783 /* This should not be marked tainted if the fp is marked clean */
1784 if (!(IoFLAGS(io) & IOf_UNTAINT))
1785 SvTAINTED_on(bufsv);
1787 #if defined(__CYGWIN__)
1788 /* recvfrom() on cygwin doesn't set bufsize at all for
1789 connected sockets, leaving us with trash in the returned
1790 name, so use the same test as the Win32 code to check if it
1791 wasn't set, and set it [perl #118843] */
1792 if (bufsize == sizeof namebuf)
1795 sv_setpvn(TARG, namebuf, bufsize);
1801 if (-offset > (SSize_t)blen)
1802 DIE(aTHX_ "Offset outside string");
1805 if (DO_UTF8(bufsv)) {
1806 /* convert offset-as-chars to offset-as-bytes */
1807 if (offset >= (SSize_t)blen)
1808 offset += SvCUR(bufsv) - blen;
1810 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1814 /* Reestablish the fd in case it shifted from underneath us. */
1815 fd = PerlIO_fileno(IoIFP(io));
1817 orig_size = SvCUR(bufsv);
1818 /* Allocating length + offset + 1 isn't perfect in the case of reading
1819 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1821 (should be 2 * length + offset + 1, or possibly something longer if
1822 IN_ENCODING Is true) */
1823 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1824 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1825 Zero(buffer+orig_size, offset-orig_size, char);
1827 buffer = buffer + offset;
1829 read_target = bufsv;
1831 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1832 concatenate it to the current buffer. */
1834 /* Truncate the existing buffer to the start of where we will be
1836 SvCUR_set(bufsv, offset);
1838 read_target = sv_newmortal();
1839 SvUPGRADE(read_target, SVt_PV);
1840 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1843 if (PL_op->op_type == OP_SYSREAD) {
1844 #ifdef PERL_SOCK_SYSREAD_IS_RECV
1845 if (IoTYPE(io) == IoTYPE_SOCKET) {
1847 SETERRNO(EBADF,SS_IVCHAN);
1851 count = PerlSock_recv(fd, buffer, length, 0);
1857 SETERRNO(EBADF,RMS_IFI);
1861 count = PerlLIO_read(fd, buffer, length);
1866 count = PerlIO_read(IoIFP(io), buffer, length);
1867 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1868 if (count == 0 && PerlIO_error(IoIFP(io)))
1872 if (IoTYPE(io) == IoTYPE_WRONLY)
1873 report_wrongway_fh(gv, '>');
1876 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1877 *SvEND(read_target) = '\0';
1878 (void)SvPOK_only(read_target);
1879 if (fp_utf8 && !IN_BYTES) {
1880 /* Look at utf8 we got back and count the characters */
1881 const char *bend = buffer + count;
1882 while (buffer < bend) {
1884 skip = UTF8SKIP(buffer);
1887 if (buffer - charskip + skip > bend) {
1888 /* partial character - try for rest of it */
1889 length = skip - (bend-buffer);
1890 offset = bend - SvPVX_const(bufsv);
1902 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1903 provided amount read (count) was what was requested (length)
1905 if (got < wanted && count == length) {
1906 length = wanted - got;
1907 offset = bend - SvPVX_const(bufsv);
1910 /* return value is character count */
1914 else if (buffer_utf8) {
1915 /* Let svcatsv upgrade the bytes we read in to utf8.
1916 The buffer is a mortal so will be freed soon. */
1917 sv_catsv_nomg(bufsv, read_target);
1920 /* This should not be marked tainted if the fp is marked clean */
1921 if (!(IoFLAGS(io) & IOf_UNTAINT))
1922 SvTAINTED_on(bufsv);
1933 /* also used for: pp_send() where defined */
1937 dSP; dMARK; dORIGMARK; dTARGET;
1942 const int op_type = PL_op->op_type;
1945 GV *const gv = MUTABLE_GV(*++MARK);
1946 IO *const io = GvIO(gv);
1949 if (op_type == OP_SYSWRITE && io) {
1950 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1952 if (MARK == SP - 1) {
1954 mXPUSHi(sv_len(sv));
1958 return Perl_tied_method(aTHX_ SV_CONST(WRITE), mark - 1, MUTABLE_SV(io), mg,
1959 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1969 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1971 if (io && IoIFP(io))
1972 report_wrongway_fh(gv, '<');
1975 SETERRNO(EBADF,RMS_IFI);
1978 fd = PerlIO_fileno(IoIFP(io));
1980 SETERRNO(EBADF,SS_IVCHAN);
1985 /* Do this first to trigger any overloading. */
1986 buffer = SvPV_const(bufsv, blen);
1987 doing_utf8 = DO_UTF8(bufsv);
1989 if (PerlIO_isutf8(IoIFP(io))) {
1991 "%s() isn't allowed on :utf8 handles",
1994 else if (doing_utf8) {
1995 STRLEN tmplen = blen;
1996 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1999 buffer = (char *) tmpbuf;
2003 assert((char *)result == buffer);
2004 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
2009 if (op_type == OP_SEND) {
2010 const int flags = SvIVx(*++MARK);
2013 char * const sockbuf = SvPVx(*++MARK, mlen);
2014 retval = PerlSock_sendto(fd, buffer, blen,
2015 flags, (struct sockaddr *)sockbuf, mlen);
2018 retval = PerlSock_send(fd, buffer, blen, flags);
2024 Size_t length = 0; /* This length is in characters. */
2030 #if Size_t_size > IVSIZE
2031 length = (Size_t)SvNVx(*++MARK);
2033 length = (Size_t)SvIVx(*++MARK);
2035 if ((SSize_t)length < 0) {
2037 DIE(aTHX_ "Negative length");
2042 offset = SvIVx(*++MARK);
2044 if (-offset > (IV)blen) {
2046 DIE(aTHX_ "Offset outside string");
2049 } else if (offset > (IV)blen) {
2051 DIE(aTHX_ "Offset outside string");
2055 if (length > blen - offset)
2056 length = blen - offset;
2057 buffer = buffer+offset;
2059 #ifdef PERL_SOCK_SYSWRITE_IS_SEND
2060 if (IoTYPE(io) == IoTYPE_SOCKET) {
2061 retval = PerlSock_send(fd, buffer, length, 0);
2066 /* See the note at doio.c:do_print about filesize limits. --jhi */
2067 retval = PerlLIO_write(fd, buffer, length);
2076 #if Size_t_size > IVSIZE
2096 * in Perl 5.12 and later, the additional parameter is a bitmask:
2099 * 2 = eof() <- ARGV magic
2101 * I'll rely on the compiler's trace flow analysis to decide whether to
2102 * actually assign this out here, or punt it into the only block where it is
2103 * used. Doing it out here is DRY on the condition logic.
2108 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2114 if (PL_op->op_flags & OPf_SPECIAL) {
2115 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2119 gv = PL_last_in_gv; /* eof */
2127 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2128 return tied_method1(SV_CONST(EOF), SP, MUTABLE_SV(io), mg, newSVuv(which));
2131 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2132 if (io && !IoIFP(io)) {
2133 if ((IoFLAGS(io) & IOf_START) && av_count(GvAVn(gv)) == 0) {
2136 IoFLAGS(io) &= ~IOf_START;
2137 do_open6(gv, "-", 1, NULL, NULL, 0);
2145 *svp = newSVpvs("-");
2147 else if (!nextargv(gv, FALSE))
2152 PUSHs(boolSV(do_eof(gv)));
2162 if (MAXARG != 0 && (TOPs || POPs))
2163 PL_last_in_gv = MUTABLE_GV(POPs);
2170 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2172 return tied_method0(SV_CONST(TELL), SP, MUTABLE_SV(io), mg);
2177 SETERRNO(EBADF,RMS_IFI);
2182 #if LSEEKSIZE > IVSIZE
2183 PUSHn( (NV)do_tell(gv) );
2185 PUSHi( (IV)do_tell(gv) );
2191 /* also used for: pp_seek() */
2196 const int whence = POPi;
2197 #if LSEEKSIZE > IVSIZE
2198 const Off_t offset = (Off_t)SvNVx(POPs);
2200 const Off_t offset = (Off_t)SvIVx(POPs);
2203 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2204 IO *const io = GvIO(gv);
2207 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2209 #if LSEEKSIZE > IVSIZE
2210 SV *const offset_sv = newSVnv((NV) offset);
2212 SV *const offset_sv = newSViv(offset);
2215 return tied_method2(SV_CONST(SEEK), SP, MUTABLE_SV(io), mg, offset_sv,
2220 if (PL_op->op_type == OP_SEEK)
2221 PUSHs(boolSV(do_seek(gv, offset, whence)));
2223 const Off_t sought = do_sysseek(gv, offset, whence);
2225 PUSHs(&PL_sv_undef);
2227 SV* const sv = sought ?
2228 #if LSEEKSIZE > IVSIZE
2233 : newSVpvn(zero_but_true, ZBTLEN);
2243 /* There seems to be no consensus on the length type of truncate()
2244 * and ftruncate(), both off_t and size_t have supporters. In
2245 * general one would think that when using large files, off_t is
2246 * at least as wide as size_t, so using an off_t should be okay. */
2247 /* XXX Configure probe for the length type of *truncate() needed XXX */
2250 #if Off_t_size > IVSIZE
2255 /* Checking for length < 0 is problematic as the type might or
2256 * might not be signed: if it is not, clever compilers will moan. */
2257 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2260 SV * const sv = POPs;
2265 if (PL_op->op_flags & OPf_SPECIAL
2266 ? (tmpgv = gv_fetchsv(sv, 0, SVt_PVIO), 1)
2267 : !!(tmpgv = MAYBE_DEREF_GV(sv)) ) {
2274 TAINT_PROPER("truncate");
2275 if (!(fp = IoIFP(io))) {
2279 int fd = PerlIO_fileno(fp);
2281 SETERRNO(EBADF,RMS_IFI);
2285 SETERRNO(EINVAL, LIB_INVARG);
2290 if (ftruncate(fd, len) < 0)
2292 if (my_chsize(fd, len) < 0)
2300 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2301 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2302 goto do_ftruncate_io;
2305 const char * const name = SvPV_nomg_const_nolen(sv);
2306 TAINT_PROPER("truncate");
2308 if (truncate(name, len) < 0)
2315 #if defined(USE_64_BIT_RAWIO) && defined(O_LARGEFILE)
2316 mode |= O_LARGEFILE; /* Transparently largefiley. */
2319 /* On open(), the Win32 CRT tries to seek around text
2320 * files using 32-bit offsets, which causes the open()
2321 * to fail on large files, so open in binary mode.
2325 tmpfd = PerlLIO_open_cloexec(name, mode);
2330 if (my_chsize(tmpfd, len) < 0)
2332 PerlLIO_close(tmpfd);
2341 SETERRNO(EBADF,RMS_IFI);
2347 /* also used for: pp_fcntl() */
2352 SV * const argsv = POPs;
2353 const unsigned int func = POPu;
2355 GV * const gv = MUTABLE_GV(POPs);
2356 IO * const io = GvIOn(gv);
2362 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2366 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2369 s = SvPV_force(argsv, len);
2370 need = IOCPARM_LEN(func);
2372 s = Sv_Grow(argsv, need + 1);
2373 SvCUR_set(argsv, need);
2376 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2379 retval = SvIV(argsv);
2380 s = INT2PTR(char*,retval); /* ouch */
2383 optype = PL_op->op_type;
2384 TAINT_PROPER(PL_op_desc[optype]);
2386 if (optype == OP_IOCTL)
2388 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2390 DIE(aTHX_ "ioctl is not implemented");
2394 DIE(aTHX_ "fcntl is not implemented");
2395 #elif defined(OS2) && defined(__EMX__)
2396 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2398 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2401 #if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2403 if (s[SvCUR(argsv)] != 17)
2404 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2406 s[SvCUR(argsv)] = 0; /* put our null back */
2407 SvSETMAGIC(argsv); /* Assume it has changed */
2416 PUSHp(zero_but_true, ZBTLEN);
2427 const int argtype = POPi;
2428 GV * const gv = MUTABLE_GV(POPs);
2429 IO *const io = GvIO(gv);
2430 PerlIO *const fp = io ? IoIFP(io) : NULL;
2432 /* XXX Looks to me like io is always NULL at this point */
2434 (void)PerlIO_flush(fp);
2435 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2440 SETERRNO(EBADF,RMS_IFI);
2445 DIE(aTHX_ PL_no_func, "flock");
2456 const int protocol = POPi;
2457 const int type = POPi;
2458 const int domain = POPi;
2459 GV * const gv = MUTABLE_GV(POPs);
2460 IO * const io = GvIOn(gv);
2464 do_close(gv, FALSE);
2466 TAINT_PROPER("socket");
2467 fd = PerlSock_socket_cloexec(domain, type, protocol);
2471 IoIFP(io) = PerlIO_fdopen(fd, "r" SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2472 IoOFP(io) = PerlIO_fdopen(fd, "w" SOCKET_OPEN_MODE);
2473 IoTYPE(io) = IoTYPE_SOCKET;
2474 if (!IoIFP(io) || !IoOFP(io)) {
2475 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2476 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2477 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2487 #if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2490 const int protocol = POPi;
2491 const int type = POPi;
2492 const int domain = POPi;
2494 GV * const gv2 = MUTABLE_GV(POPs);
2495 IO * const io2 = GvIOn(gv2);
2496 GV * const gv1 = MUTABLE_GV(POPs);
2497 IO * const io1 = GvIOn(gv1);
2500 do_close(gv1, FALSE);
2502 do_close(gv2, FALSE);
2504 TAINT_PROPER("socketpair");
2505 if (PerlSock_socketpair_cloexec(domain, type, protocol, fd) < 0)
2507 IoIFP(io1) = PerlIO_fdopen(fd[0], "r" SOCKET_OPEN_MODE);
2508 IoOFP(io1) = PerlIO_fdopen(fd[0], "w" SOCKET_OPEN_MODE);
2509 IoTYPE(io1) = IoTYPE_SOCKET;
2510 IoIFP(io2) = PerlIO_fdopen(fd[1], "r" SOCKET_OPEN_MODE);
2511 IoOFP(io2) = PerlIO_fdopen(fd[1], "w" SOCKET_OPEN_MODE);
2512 IoTYPE(io2) = IoTYPE_SOCKET;
2513 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2514 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2515 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2516 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2517 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2518 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2519 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2525 DIE(aTHX_ PL_no_sock_func, "socketpair");
2531 /* also used for: pp_connect() */
2536 SV * const addrsv = POPs;
2537 /* OK, so on what platform does bind modify addr? */
2539 GV * const gv = MUTABLE_GV(POPs);
2540 IO * const io = GvIOn(gv);
2547 fd = PerlIO_fileno(IoIFP(io));
2551 addr = SvPV_const(addrsv, len);
2552 op_type = PL_op->op_type;
2553 TAINT_PROPER(PL_op_desc[op_type]);
2554 if ((op_type == OP_BIND
2555 ? PerlSock_bind(fd, (struct sockaddr *)addr, len)
2556 : PerlSock_connect(fd, (struct sockaddr *)addr, len))
2564 SETERRNO(EBADF,SS_IVCHAN);
2571 const int backlog = POPi;
2572 GV * const gv = MUTABLE_GV(POPs);
2573 IO * const io = GvIOn(gv);
2578 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2585 SETERRNO(EBADF,SS_IVCHAN);
2593 char namebuf[MAXPATHLEN];
2594 #if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(__QNXNTO__)
2595 Sock_size_t len = sizeof (struct sockaddr_in);
2597 Sock_size_t len = sizeof namebuf;
2599 GV * const ggv = MUTABLE_GV(POPs);
2600 GV * const ngv = MUTABLE_GV(POPs);
2603 IO * const gstio = GvIO(ggv);
2604 if (!gstio || !IoIFP(gstio))
2608 fd = PerlSock_accept_cloexec(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2611 /* Some platforms indicate zero length when an AF_UNIX client is
2612 * not bound. Simulate a non-zero-length sockaddr structure in
2614 namebuf[0] = 0; /* sun_len */
2615 namebuf[1] = AF_UNIX; /* sun_family */
2623 do_close(ngv, FALSE);
2624 IoIFP(nstio) = PerlIO_fdopen(fd, "r" SOCKET_OPEN_MODE);
2625 IoOFP(nstio) = PerlIO_fdopen(fd, "w" SOCKET_OPEN_MODE);
2626 IoTYPE(nstio) = IoTYPE_SOCKET;
2627 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2628 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2629 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2630 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2634 #ifdef __SCO_VERSION__
2635 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2638 PUSHp(namebuf, len);
2642 report_evil_fh(ggv);
2643 SETERRNO(EBADF,SS_IVCHAN);
2653 const int how = POPi;
2654 GV * const gv = MUTABLE_GV(POPs);
2655 IO * const io = GvIOn(gv);
2660 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2665 SETERRNO(EBADF,SS_IVCHAN);
2670 /* also used for: pp_gsockopt() */
2675 const int optype = PL_op->op_type;
2676 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2677 const unsigned int optname = (unsigned int) POPi;
2678 const unsigned int lvl = (unsigned int) POPi;
2679 GV * const gv = MUTABLE_GV(POPs);
2680 IO * const io = GvIOn(gv);
2687 fd = PerlIO_fileno(IoIFP(io));
2693 (void)SvPOK_only(sv);
2697 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2700 /* XXX Configure test: does getsockopt set the length properly? */
2714 buf = SvPVbyte_nomg(sv, l);
2718 aint = (int)SvIV_nomg(sv);
2719 buf = (const char *) &aint;
2722 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2732 SETERRNO(EBADF,SS_IVCHAN);
2739 /* also used for: pp_getsockname() */
2744 const int optype = PL_op->op_type;
2745 GV * const gv = MUTABLE_GV(POPs);
2746 IO * const io = GvIOn(gv);
2754 #ifdef HAS_SOCKADDR_STORAGE
2755 len = sizeof(struct sockaddr_storage);
2759 sv = sv_2mortal(newSV(len+1));
2760 (void)SvPOK_only(sv);
2763 fd = PerlIO_fileno(IoIFP(io));
2767 case OP_GETSOCKNAME:
2768 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2771 case OP_GETPEERNAME:
2772 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2774 #if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2776 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";
2777 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2778 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2779 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2780 sizeof(u_short) + sizeof(struct in_addr))) {
2787 #ifdef BOGUS_GETNAME_RETURN
2788 /* Interactive Unix, getpeername() and getsockname()
2789 does not return valid namelen */
2790 if (len == BOGUS_GETNAME_RETURN)
2791 len = sizeof(struct sockaddr);
2800 SETERRNO(EBADF,SS_IVCHAN);
2809 /* also used for: pp_lstat() */
2820 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2821 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2822 if (PL_op->op_type == OP_LSTAT) {
2823 if (gv != PL_defgv) {
2824 do_fstat_warning_check:
2825 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2826 "lstat() on filehandle%s%" SVf,
2829 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2831 } else if (PL_laststype != OP_LSTAT)
2832 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2833 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2836 if (gv == PL_defgv) {
2837 if (PL_laststatval < 0)
2838 SETERRNO(EBADF,RMS_IFI);
2841 PL_laststype = OP_STAT;
2842 PL_statgv = gv ? gv : (GV *)io;
2843 SvPVCLEAR(PL_statname);
2849 int fd = PerlIO_fileno(IoIFP(io));
2852 PL_laststatval = -1;
2853 SETERRNO(EBADF,RMS_IFI);
2855 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
2857 } else if (IoDIRP(io)) {
2859 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2862 PL_laststatval = -1;
2863 SETERRNO(EBADF,RMS_IFI);
2867 PL_laststatval = -1;
2868 SETERRNO(EBADF,RMS_IFI);
2872 if (PL_laststatval < 0) {
2880 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2881 io = MUTABLE_IO(SvRV(sv));
2882 if (PL_op->op_type == OP_LSTAT)
2883 goto do_fstat_warning_check;
2884 goto do_fstat_have_io;
2886 SvTAINTED_off(PL_statname); /* previous tainting irrelevant */
2887 temp = SvPV_nomg_const(sv, len);
2888 sv_setpv(PL_statname, temp);
2890 PL_laststype = PL_op->op_type;
2891 file = SvPV_nolen_const(PL_statname);
2892 if (!IS_SAFE_PATHNAME(temp, len, OP_NAME(PL_op))) {
2893 PL_laststatval = -1;
2895 else if (PL_op->op_type == OP_LSTAT)
2896 PL_laststatval = PerlLIO_lstat(file, &PL_statcache);
2898 PL_laststatval = PerlLIO_stat(file, &PL_statcache);
2899 if (PL_laststatval < 0) {
2900 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
2901 /* PL_warn_nl is constant */
2902 GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
2903 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2904 GCC_DIAG_RESTORE_STMT;
2911 if (gimme != G_LIST) {
2912 if (gimme != G_VOID)
2913 XPUSHs(boolSV(max));
2919 #if ST_DEV_SIZE < IVSIZE || (ST_DEV_SIZE == IVSIZE && ST_DEV_SIGN < 0)
2920 mPUSHi(PL_statcache.st_dev);
2921 #elif ST_DEV_SIZE == IVSIZE
2922 mPUSHu(PL_statcache.st_dev);
2924 # if ST_DEV_SIGN < 0
2925 if (LIKELY((IV)PL_statcache.st_dev == PL_statcache.st_dev)) {
2926 mPUSHi((IV)PL_statcache.st_dev);
2929 if (LIKELY((UV)PL_statcache.st_dev == PL_statcache.st_dev)) {
2930 mPUSHu((UV)PL_statcache.st_dev);
2934 char buf[sizeof(PL_statcache.st_dev)*3+1];
2935 /* sv_catpvf() casts 'j' size values down to IV, so it
2936 isn't suitable for use here.
2938 # if defined(I_INTTYPES) && defined(HAS_SNPRINTF)
2939 # if ST_DEV_SIGN < 0
2940 int size = snprintf(buf, sizeof(buf), "%" PRIdMAX, (intmax_t)PL_statcache.st_dev);
2942 int size = snprintf(buf, sizeof(buf), "%" PRIuMAX, (uintmax_t)PL_statcache.st_dev);
2944 STATIC_ASSERT_STMT(sizeof(intmax_t) >= sizeof(PL_statcache.st_dev));
2947 # error extraordinarily large st_dev but no inttypes.h or no snprintf
2953 * We try to represent st_ino as a native IV or UV where
2954 * possible, but fall back to a decimal string where
2955 * necessary. The code to generate these decimal strings
2956 * is quite obtuse, because (a) we're portable to non-POSIX
2957 * platforms where st_ino might be signed; (b) we didn't
2958 * necessarily detect at Configure time whether st_ino is
2959 * signed; (c) we're portable to non-POSIX platforms where
2960 * ino_t isn't defined, so have no name for the type of
2961 * st_ino; and (d) sprintf() doesn't necessarily support
2962 * integers as large as st_ino.
2966 CLANG_DIAG_IGNORE_STMT(-Wtautological-compare);
2967 GCC_DIAG_IGNORE_STMT(-Wtype-limits);
2968 neg = PL_statcache.st_ino < 0;
2969 GCC_DIAG_RESTORE_STMT;
2970 CLANG_DIAG_RESTORE_STMT;
2972 s.st_ino = (IV)PL_statcache.st_ino;
2973 if (LIKELY(s.st_ino == PL_statcache.st_ino)) {
2976 char buf[sizeof(s.st_ino)*3+1], *p;
2977 s.st_ino = PL_statcache.st_ino;
2978 for (p = buf + sizeof(buf); p != buf+1; ) {
2980 t.st_ino = s.st_ino / 10;
2981 *--p = '0' + (int)(t.st_ino*10 - s.st_ino);
2982 s.st_ino = t.st_ino;
2987 mPUSHp(p, buf+sizeof(buf) - p);
2990 s.st_ino = (UV)PL_statcache.st_ino;
2991 if (LIKELY(s.st_ino == PL_statcache.st_ino)) {
2994 char buf[sizeof(s.st_ino)*3], *p;
2995 s.st_ino = PL_statcache.st_ino;
2996 for (p = buf + sizeof(buf); p != buf; ) {
2998 t.st_ino = s.st_ino / 10;
2999 *--p = '0' + (int)(s.st_ino - t.st_ino*10);
3000 s.st_ino = t.st_ino;
3004 mPUSHp(p, buf+sizeof(buf) - p);
3008 mPUSHu(PL_statcache.st_mode);
3009 mPUSHu(PL_statcache.st_nlink);
3011 sv_setuid(PUSHmortal, PL_statcache.st_uid);
3012 sv_setgid(PUSHmortal, PL_statcache.st_gid);
3014 #ifdef USE_STAT_RDEV
3015 mPUSHi(PL_statcache.st_rdev);
3017 PUSHs(newSVpvs_flags("", SVs_TEMP));
3019 #if Off_t_size > IVSIZE
3020 mPUSHn(PL_statcache.st_size);
3022 mPUSHi(PL_statcache.st_size);
3025 mPUSHn(PL_statcache.st_atime);
3026 mPUSHn(PL_statcache.st_mtime);
3027 mPUSHn(PL_statcache.st_ctime);
3029 mPUSHi(PL_statcache.st_atime);
3030 mPUSHi(PL_statcache.st_mtime);
3031 mPUSHi(PL_statcache.st_ctime);
3033 #ifdef USE_STAT_BLOCKS
3034 mPUSHu(PL_statcache.st_blksize);
3035 mPUSHu(PL_statcache.st_blocks);
3037 PUSHs(newSVpvs_flags("", SVs_TEMP));
3038 PUSHs(newSVpvs_flags("", SVs_TEMP));
3044 /* All filetest ops avoid manipulating the perl stack pointer in their main
3045 bodies (since commit d2c4d2d1e22d3125), and return using either
3046 S_ft_return_false() or S_ft_return_true(). These two helper functions are
3047 the only two which manipulate the perl stack. To ensure that no stack
3048 manipulation macros are used, the filetest ops avoid defining a local copy
3049 of the stack pointer with dSP. */
3051 /* If the next filetest is stacked up with this one
3052 (PL_op->op_private & OPpFT_STACKING), we leave
3053 the original argument on the stack for success,
3054 and skip the stacked operators on failure.
3055 The next few macros/functions take care of this.
3059 S_ft_return_false(pTHX_ SV *ret) {
3063 if (PL_op->op_flags & OPf_REF) XPUSHs(ret);
3067 if (PL_op->op_private & OPpFT_STACKING) {
3068 while (next && OP_IS_FILETEST(next->op_type)
3069 && next->op_private & OPpFT_STACKED)
3070 next = next->op_next;
3075 PERL_STATIC_INLINE OP *
3076 S_ft_return_true(pTHX_ SV *ret) {
3078 if (PL_op->op_flags & OPf_REF)
3079 XPUSHs(PL_op->op_private & OPpFT_STACKING ? (SV *)cGVOP_gv : (ret));
3080 else if (!(PL_op->op_private & OPpFT_STACKING))
3086 #define FT_RETURNNO return S_ft_return_false(aTHX_ &PL_sv_no)
3087 #define FT_RETURNUNDEF return S_ft_return_false(aTHX_ &PL_sv_undef)
3088 #define FT_RETURNYES return S_ft_return_true(aTHX_ &PL_sv_yes)
3090 #define tryAMAGICftest_MG(chr) STMT_START { \
3091 if ( (SvFLAGS(*PL_stack_sp) & (SVf_ROK|SVs_GMG)) \
3092 && PL_op->op_flags & OPf_KIDS) { \
3093 OP *next = S_try_amagic_ftest(aTHX_ chr); \
3094 if (next) return next; \
3099 S_try_amagic_ftest(pTHX_ char chr) {
3100 SV *const arg = *PL_stack_sp;
3103 if (!(PL_op->op_private & OPpFT_STACKED)) SvGETMAGIC(arg);
3107 const char tmpchr = chr;
3108 SV * const tmpsv = amagic_call(arg,
3109 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
3110 ftest_amg, AMGf_unary);
3115 return SvTRUE(tmpsv)
3116 ? S_ft_return_true(aTHX_ tmpsv) : S_ft_return_false(aTHX_ tmpsv);
3122 /* also used for: pp_fteexec() pp_fteread() pp_ftewrite() pp_ftrexec()
3128 /* Not const, because things tweak this below. Not bool, because there's
3129 no guarantee that OPpFT_ACCESS is <= CHAR_MAX */
3130 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3131 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
3132 /* Giving some sort of initial value silences compilers. */
3134 int access_mode = R_OK;
3136 int access_mode = 0;
3139 /* access_mode is never used, but leaving use_access in makes the
3140 conditional compiling below much clearer. */
3143 Mode_t stat_mode = S_IRUSR;
3145 bool effective = FALSE;
3148 switch (PL_op->op_type) {
3149 case OP_FTRREAD: opchar = 'R'; break;
3150 case OP_FTRWRITE: opchar = 'W'; break;
3151 case OP_FTREXEC: opchar = 'X'; break;
3152 case OP_FTEREAD: opchar = 'r'; break;
3153 case OP_FTEWRITE: opchar = 'w'; break;
3154 case OP_FTEEXEC: opchar = 'x'; break;
3156 tryAMAGICftest_MG(opchar);
3158 switch (PL_op->op_type) {
3160 #if !(defined(HAS_ACCESS) && defined(R_OK))
3166 #if defined(HAS_ACCESS) && defined(W_OK)
3171 stat_mode = S_IWUSR;
3175 #if defined(HAS_ACCESS) && defined(X_OK)
3180 stat_mode = S_IXUSR;
3184 #ifdef PERL_EFF_ACCESS
3187 stat_mode = S_IWUSR;
3191 #ifndef PERL_EFF_ACCESS
3198 #ifdef PERL_EFF_ACCESS
3203 stat_mode = S_IXUSR;
3209 #if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3211 const char *name = SvPV(*PL_stack_sp, len);
3212 if (!IS_SAFE_PATHNAME(name, len, OP_NAME(PL_op))) {
3215 else if (effective) {
3216 # ifdef PERL_EFF_ACCESS
3217 result = PERL_EFF_ACCESS(name, access_mode);
3219 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3225 result = access(name, access_mode);
3227 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3238 result = my_stat_flags(0);
3241 if (cando(stat_mode, effective, &PL_statcache))
3247 /* also used for: pp_ftatime() pp_ftctime() pp_ftmtime() pp_ftsize() */
3252 const int op_type = PL_op->op_type;
3256 case OP_FTIS: opchar = 'e'; break;
3257 case OP_FTSIZE: opchar = 's'; break;
3258 case OP_FTMTIME: opchar = 'M'; break;
3259 case OP_FTCTIME: opchar = 'C'; break;
3260 case OP_FTATIME: opchar = 'A'; break;
3262 tryAMAGICftest_MG(opchar);
3264 result = my_stat_flags(0);
3267 if (op_type == OP_FTIS)
3270 /* You can't dTARGET inside OP_FTIS, because you'll get
3271 "panic: pad_sv po" - the op is not flagged to have a target. */
3275 #if Off_t_size > IVSIZE
3276 sv_setnv(TARG, (NV)PL_statcache.st_size);
3278 sv_setiv(TARG, (IV)PL_statcache.st_size);
3283 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3287 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3291 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3295 return SvTRUE_nomg_NN(TARG)
3296 ? S_ft_return_true(aTHX_ TARG) : S_ft_return_false(aTHX_ TARG);
3301 /* also used for: pp_ftblk() pp_ftchr() pp_ftdir() pp_fteowned()
3302 * pp_ftfile() pp_ftpipe() pp_ftsgid() pp_ftsock()
3303 * pp_ftsuid() pp_ftsvtx() pp_ftzero() */
3310 switch (PL_op->op_type) {
3311 case OP_FTROWNED: opchar = 'O'; break;
3312 case OP_FTEOWNED: opchar = 'o'; break;
3313 case OP_FTZERO: opchar = 'z'; break;
3314 case OP_FTSOCK: opchar = 'S'; break;
3315 case OP_FTCHR: opchar = 'c'; break;
3316 case OP_FTBLK: opchar = 'b'; break;
3317 case OP_FTFILE: opchar = 'f'; break;
3318 case OP_FTDIR: opchar = 'd'; break;
3319 case OP_FTPIPE: opchar = 'p'; break;
3320 case OP_FTSUID: opchar = 'u'; break;
3321 case OP_FTSGID: opchar = 'g'; break;
3322 case OP_FTSVTX: opchar = 'k'; break;
3324 tryAMAGICftest_MG(opchar);
3326 result = my_stat_flags(0);
3329 switch (PL_op->op_type) {
3331 if (PL_statcache.st_uid == PerlProc_getuid())
3335 if (PL_statcache.st_uid == PerlProc_geteuid())
3339 if (PL_statcache.st_size == 0)
3343 if (S_ISSOCK(PL_statcache.st_mode))
3347 if (S_ISCHR(PL_statcache.st_mode))
3351 if (S_ISBLK(PL_statcache.st_mode))
3355 if (S_ISREG(PL_statcache.st_mode))
3359 if (S_ISDIR(PL_statcache.st_mode))
3363 if (S_ISFIFO(PL_statcache.st_mode))
3368 if (PL_statcache.st_mode & S_ISUID)
3374 if (PL_statcache.st_mode & S_ISGID)
3380 if (PL_statcache.st_mode & S_ISVTX)
3392 tryAMAGICftest_MG('l');
3393 result = my_lstat_flags(0);
3397 if (S_ISLNK(PL_statcache.st_mode))
3410 tryAMAGICftest_MG('t');
3412 if (PL_op->op_flags & OPf_REF)
3415 SV *tmpsv = *PL_stack_sp;
3416 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3417 name = SvPV_nomg(tmpsv, namelen);
3418 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3422 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3423 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3424 else if (name && isDIGIT(*name) && grok_atoUV(name, &uv, NULL) && uv <= PERL_INT_MAX)
3429 SETERRNO(EBADF,RMS_IFI);
3432 if (PerlLIO_isatty(fd))
3438 /* also used for: pp_ftbinary() */
3451 const U8 * first_variant;
3453 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3455 if (PL_op->op_flags & OPf_REF)
3457 else if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3462 gv = MAYBE_DEREF_GV_nomg(sv);
3466 if (gv == PL_defgv) {
3468 io = SvTYPE(PL_statgv) == SVt_PVIO
3472 goto really_filename;
3477 SvPVCLEAR(PL_statname);
3478 io = GvIO(PL_statgv);
3480 PL_laststatval = -1;
3481 PL_laststype = OP_STAT;
3482 if (io && IoIFP(io)) {
3484 if (! PerlIO_has_base(IoIFP(io)))
3485 DIE(aTHX_ "-T and -B not implemented on filehandles");
3486 fd = PerlIO_fileno(IoIFP(io));
3488 SETERRNO(EBADF,RMS_IFI);
3491 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3492 if (PL_laststatval < 0)
3494 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3495 if (PL_op->op_type == OP_FTTEXT)
3500 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3501 i = PerlIO_getc(IoIFP(io));
3503 (void)PerlIO_ungetc(IoIFP(io),i);
3505 /* null file is anything */
3508 len = PerlIO_get_bufsiz(IoIFP(io));
3509 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3510 /* sfio can have large buffers - limit to 512 */
3515 SETERRNO(EBADF,RMS_IFI);
3517 SETERRNO(EBADF,RMS_IFI);
3528 temp = SvPV_nomg_const(sv, temp_len);
3529 sv_setpv(PL_statname, temp);
3530 if (!IS_SAFE_PATHNAME(temp, temp_len, OP_NAME(PL_op))) {
3531 PL_laststatval = -1;
3532 PL_laststype = OP_STAT;
3536 file = SvPVX_const(PL_statname);
3538 if (!(fp = PerlIO_open(file, "r"))) {
3540 PL_laststatval = -1;
3541 PL_laststype = OP_STAT;
3543 if (ckWARN(WARN_NEWLINE) && should_warn_nl(file)) {
3544 /* PL_warn_nl is constant */
3545 GCC_DIAG_IGNORE_STMT(-Wformat-nonliteral);
3546 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3547 GCC_DIAG_RESTORE_STMT;
3551 PL_laststype = OP_STAT;
3552 fd = PerlIO_fileno(fp);
3554 (void)PerlIO_close(fp);
3555 SETERRNO(EBADF,RMS_IFI);
3558 PL_laststatval = PerlLIO_fstat(fd, &PL_statcache);
3559 if (PL_laststatval < 0) {
3561 (void)PerlIO_close(fp);
3565 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3566 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3567 (void)PerlIO_close(fp);
3569 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3570 FT_RETURNNO; /* special case NFS directories */
3571 FT_RETURNYES; /* null file is anything */
3576 /* now scan s to look for textiness */
3578 #if defined(DOSISH) || defined(USEMYBINMODE)
3579 /* ignore trailing ^Z on short files */
3580 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3585 if (! is_utf8_invariant_string_loc((U8 *) s, len, &first_variant)) {
3587 /* Here contains a variant under UTF-8 . See if the entire string is
3589 if (is_utf8_fixed_width_buf_flags(first_variant,
3590 len - ((char *) first_variant - (char *) s),
3593 if (PL_op->op_type == OP_FTTEXT) {
3602 /* Here, is not UTF-8 or is entirely ASCII. Look through the buffer for
3603 * things that wouldn't be in ASCII text or rich ASCII text. Count these
3605 for (i = 0; i < len; i++, s++) {
3606 if (!*s) { /* null never allowed in text */
3610 #ifdef USE_LOCALE_CTYPE
3611 if (IN_LC_RUNTIME(LC_CTYPE)) {
3612 if ( isPRINT_LC(*s) || isSPACE_LC(*s)) {
3619 /* VT occurs so rarely in text, that we consider it odd */
3620 || (isSPACE_A(*s) && *s != VT_NATIVE)
3622 /* But there is a fair amount of backspaces and escapes in
3625 || *s == ESC_NATIVE)
3632 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3643 const char *tmps = NULL;
3647 SV * const sv = POPs;
3648 if (PL_op->op_flags & OPf_SPECIAL) {
3649 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3651 if (ckWARN(WARN_UNOPENED)) {
3652 Perl_warner(aTHX_ packWARN(WARN_UNOPENED),
3653 "chdir() on unopened filehandle %" SVf, sv);
3655 SETERRNO(EBADF,RMS_IFI);
3657 TAINT_PROPER("chdir");
3661 else if (!(gv = MAYBE_DEREF_GV(sv)))
3662 tmps = SvPV_nomg_const_nolen(sv);
3665 HV * const table = GvHVn(PL_envgv);
3669 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3670 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3672 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3676 tmps = SvPV_nolen_const(*svp);
3680 SETERRNO(EINVAL, LIB_INVARG);
3681 TAINT_PROPER("chdir");
3686 TAINT_PROPER("chdir");
3689 IO* const io = GvIO(gv);
3692 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3693 } else if (IoIFP(io)) {
3694 int fd = PerlIO_fileno(IoIFP(io));
3698 PUSHi(fchdir(fd) >= 0);
3708 DIE(aTHX_ PL_no_func, "fchdir");
3712 PUSHi( PerlDir_chdir(tmps) >= 0 );
3714 /* Clear the DEFAULT element of ENV so we'll get the new value
3716 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3723 SETERRNO(EBADF,RMS_IFI);
3730 /* also used for: pp_chmod() pp_kill() pp_unlink() pp_utime() */
3734 dSP; dMARK; dTARGET;
3735 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3746 char * const tmps = POPpx;
3747 TAINT_PROPER("chroot");
3748 PUSHi( chroot(tmps) >= 0 );
3751 DIE(aTHX_ PL_no_func, "chroot");
3762 const char * const tmps2 = POPpconstx;
3763 const char * const tmps = SvPV_nolen_const(TOPs);
3764 TAINT_PROPER("rename");
3766 anum = PerlLIO_rename(tmps, tmps2);
3768 if (!(anum = PerlLIO_stat(tmps, &statbuf))) {
3769 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3772 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode))
3773 (void)UNLINK(tmps2);
3774 if (!(anum = link(tmps, tmps2)))
3775 anum = UNLINK(tmps);
3784 /* also used for: pp_symlink() */
3786 #if defined(HAS_LINK) || defined(HAS_SYMLINK)
3790 const int op_type = PL_op->op_type;
3794 if (op_type == OP_LINK)
3795 DIE(aTHX_ PL_no_func, "link");
3797 # ifndef HAS_SYMLINK
3798 if (op_type == OP_SYMLINK)
3799 DIE(aTHX_ PL_no_func, "symlink");
3803 const char * const tmps2 = POPpconstx;
3804 const char * const tmps = SvPV_nolen_const(TOPs);
3805 TAINT_PROPER(PL_op_desc[op_type]);
3807 # if defined(HAS_LINK) && defined(HAS_SYMLINK)
3808 /* Both present - need to choose which. */
3809 (op_type == OP_LINK) ?
3810 PerlLIO_link(tmps, tmps2) : PerlLIO_symlink(tmps, tmps2);
3811 # elif defined(HAS_LINK)
3812 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3813 PerlLIO_link(tmps, tmps2);
3814 # elif defined(HAS_SYMLINK)
3815 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3816 PerlLIO_symlink(tmps, tmps2);
3820 SETi( result >= 0 );
3825 /* also used for: pp_symlink() */
3830 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3840 char buf[MAXPATHLEN];
3845 /* NOTE: if the length returned by readlink() is sizeof(buf) - 1,
3846 * it is impossible to know whether the result was truncated. */
3847 len = PerlLIO_readlink(tmps, buf, sizeof(buf) - 1);
3855 RETSETUNDEF; /* just pretend it's a normal file */
3859 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3861 S_dooneliner(pTHX_ const char *cmd, const char *filename)
3863 char * const save_filename = filename;
3868 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3870 PERL_ARGS_ASSERT_DOONELINER;
3872 Newx(cmdline, size, char);
3873 my_strlcpy(cmdline, cmd, size);
3874 my_strlcat(cmdline, " ", size);
3875 for (s = cmdline + strlen(cmdline); *filename; ) {
3879 if (s - cmdline < size)
3880 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3881 myfp = PerlProc_popen(cmdline, "r");
3885 SV * const tmpsv = sv_newmortal();
3886 /* Need to save/restore 'PL_rs' ?? */
3887 s = sv_gets(tmpsv, myfp, 0);
3888 (void)PerlProc_pclose(myfp);
3892 #ifdef HAS_SYS_ERRLIST
3897 /* you don't see this */
3898 const char * const errmsg = Strerror(e) ;
3901 if (instr(s, errmsg)) {
3908 #define EACCES EPERM
3910 if (instr(s, "cannot make"))
3911 SETERRNO(EEXIST,RMS_FEX);
3912 else if (instr(s, "existing file"))
3913 SETERRNO(EEXIST,RMS_FEX);
3914 else if (instr(s, "ile exists"))
3915 SETERRNO(EEXIST,RMS_FEX);
3916 else if (instr(s, "non-exist"))
3917 SETERRNO(ENOENT,RMS_FNF);
3918 else if (instr(s, "does not exist"))
3919 SETERRNO(ENOENT,RMS_FNF);
3920 else if (instr(s, "not empty"))
3921 SETERRNO(EBUSY,SS_DEVOFFLINE);
3922 else if (instr(s, "cannot access"))
3923 SETERRNO(EACCES,RMS_PRV);
3925 SETERRNO(EPERM,RMS_PRV);
3928 else { /* some mkdirs return no failure indication */
3930 anum = (PerlLIO_stat(save_filename, &statbuf) >= 0);
3931 if (PL_op->op_type == OP_RMDIR)
3936 SETERRNO(EACCES,RMS_PRV); /* a guess */
3945 /* This macro removes trailing slashes from a directory name.
3946 * Different operating and file systems take differently to
3947 * trailing slashes. According to POSIX 1003.1 1996 Edition
3948 * any number of trailing slashes should be allowed.
3949 * Thusly we snip them away so that even non-conforming
3950 * systems are happy.
3951 * We should probably do this "filtering" for all
3952 * the functions that expect (potentially) directory names:
3953 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3954 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3956 #define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3957 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3960 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3961 (tmps) = savepvn((tmps), (len)); \
3971 const unsigned int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPu : 0777;
3973 TRIMSLASHES(tmps,len,copy);
3975 TAINT_PROPER("mkdir");
3977 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3981 SETi( dooneliner("mkdir", tmps) );
3982 oldumask = PerlLIO_umask(0);
3983 PerlLIO_umask(oldumask);
3984 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3999 TRIMSLASHES(tmps,len,copy);
4000 TAINT_PROPER("rmdir");
4002 SETi( PerlDir_rmdir(tmps) >= 0 );
4004 SETi( dooneliner("rmdir", tmps) );
4011 /* Directory calls. */
4015 #if defined(Direntry_t) && defined(HAS_READDIR)
4017 const char * const dirname = POPpconstx;
4018 GV * const gv = MUTABLE_GV(POPs);
4019 IO * const io = GvIOn(gv);
4021 if ((IoIFP(io) || IoOFP(io)))
4022 Perl_croak(aTHX_ "Cannot open %" HEKf " as a dirhandle: it is already open as a filehandle",
4023 HEKfARG(GvENAME_HEK(gv)));
4025 PerlDir_close(IoDIRP(io));
4026 if (!(IoDIRP(io) = PerlDir_open(dirname)))
4032 SETERRNO(EBADF,RMS_DIR);
4035 DIE(aTHX_ PL_no_dir_func, "opendir");
4041 #if !defined(Direntry_t) || !defined(HAS_READDIR)
4042 DIE(aTHX_ PL_no_dir_func, "readdir");
4044 #if !defined(I_DIRENT) && !defined(VMS)
4045 Direntry_t *readdir (DIR *);
4050 const U8 gimme = GIMME_V;
4051 GV * const gv = MUTABLE_GV(POPs);
4052 const Direntry_t *dp;
4053 IO * const io = GvIOn(gv);
4056 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4057 "readdir() attempted on invalid dirhandle %" HEKf,
4058 HEKfARG(GvENAME_HEK(gv)));
4063 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
4067 sv = newSVpvn(dp->d_name, dp->d_namlen);
4069 sv = newSVpv(dp->d_name, 0);
4071 if (!(IoFLAGS(io) & IOf_UNTAINT))
4074 } while (gimme == G_LIST);
4076 if (!dp && gimme != G_LIST)
4083 SETERRNO(EBADF,RMS_ISI);
4084 if (gimme == G_LIST)
4093 #if defined(HAS_TELLDIR) || defined(telldir)
4095 /* XXX does _anyone_ need this? --AD 2/20/1998 */
4096 /* XXX netbsd still seemed to.
4097 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
4098 --JHI 1999-Feb-02 */
4099 # if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
4100 long telldir (DIR *);
4102 GV * const gv = MUTABLE_GV(POPs);
4103 IO * const io = GvIOn(gv);
4106 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4107 "telldir() attempted on invalid dirhandle %" HEKf,
4108 HEKfARG(GvENAME_HEK(gv)));
4112 PUSHi( PerlDir_tell(IoDIRP(io)) );
4116 SETERRNO(EBADF,RMS_ISI);
4119 DIE(aTHX_ PL_no_dir_func, "telldir");
4125 #if defined(HAS_SEEKDIR) || defined(seekdir)
4127 const long along = POPl;
4128 GV * const gv = MUTABLE_GV(POPs);
4129 IO * const io = GvIOn(gv);
4132 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4133 "seekdir() attempted on invalid dirhandle %" HEKf,
4134 HEKfARG(GvENAME_HEK(gv)));
4137 (void)PerlDir_seek(IoDIRP(io), along);
4142 SETERRNO(EBADF,RMS_ISI);
4145 DIE(aTHX_ PL_no_dir_func, "seekdir");
4151 #if defined(HAS_REWINDDIR) || defined(rewinddir)
4153 GV * const gv = MUTABLE_GV(POPs);
4154 IO * const io = GvIOn(gv);
4157 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4158 "rewinddir() attempted on invalid dirhandle %" HEKf,
4159 HEKfARG(GvENAME_HEK(gv)));
4162 (void)PerlDir_rewind(IoDIRP(io));
4166 SETERRNO(EBADF,RMS_ISI);
4169 DIE(aTHX_ PL_no_dir_func, "rewinddir");
4175 #if defined(Direntry_t) && defined(HAS_READDIR)
4177 GV * const gv = MUTABLE_GV(POPs);
4178 IO * const io = GvIOn(gv);
4181 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4182 "closedir() attempted on invalid dirhandle %" HEKf,
4183 HEKfARG(GvENAME_HEK(gv)));
4186 #ifdef VOID_CLOSEDIR
4187 PerlDir_close(IoDIRP(io));
4189 if (PerlDir_close(IoDIRP(io)) < 0) {
4190 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4199 SETERRNO(EBADF,RMS_IFI);
4202 DIE(aTHX_ PL_no_dir_func, "closedir");
4206 /* Process control. */
4213 #ifdef HAS_SIGPROCMASK
4214 sigset_t oldmask, newmask;
4218 PERL_FLUSHALL_FOR_CHILD;
4219 #ifdef HAS_SIGPROCMASK
4220 sigfillset(&newmask);
4221 sigprocmask(SIG_SETMASK, &newmask, &oldmask);
4223 childpid = PerlProc_fork();
4224 if (childpid == 0) {
4228 for (sig = 1; sig < SIG_SIZE; sig++)
4229 PL_psig_pend[sig] = 0;
4231 #ifdef HAS_SIGPROCMASK
4234 sigprocmask(SIG_SETMASK, &oldmask, NULL);
4241 #ifdef PERL_USES_PL_PIDSTATUS
4242 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4247 #elif (defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)) || defined(__amigaos4__)
4252 PERL_FLUSHALL_FOR_CHILD;
4253 childpid = PerlProc_fork();
4259 DIE(aTHX_ PL_no_func, "fork");
4265 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4270 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4271 childpid = wait4pid(-1, &argflags, 0);
4273 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4278 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4279 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4280 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4282 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4287 DIE(aTHX_ PL_no_func, "wait");
4293 #if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4295 const int optype = POPi;
4296 const Pid_t pid = TOPi;
4300 result = amigaos_waitpid(aTHX_ optype, pid, &argflags);
4301 STATUS_NATIVE_CHILD_SET((result >= 0) ? argflags : -1);
4302 result = result == 0 ? pid : -1;
4306 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4307 result = wait4pid(pid, &argflags, optype);
4309 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4314 # if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4315 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4316 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4318 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4320 # endif /* __amigaos4__ */
4324 DIE(aTHX_ PL_no_func, "waitpid");
4330 dSP; dMARK; dORIGMARK; dTARGET;
4331 #if defined(__LIBCATAMOUNT__)
4332 PL_statusvalue = -1;
4337 # ifdef __amigaos4__
4343 while (++MARK <= SP) {
4344 SV *origsv = *MARK, *copysv;
4348 #if defined(WIN32) || defined(__VMS)
4350 * Because of a nasty platform-specific variation on the meaning
4351 * of arguments to this op, we must preserve numeric arguments
4352 * as numeric, not just retain the string value.
4354 if (SvNIOK(origsv) || SvNIOKp(origsv)) {
4355 copysv = newSV_type(SVt_PVNV);
4357 if (SvPOK(origsv) || SvPOKp(origsv)) {
4358 pv = SvPV_nomg(origsv, len);
4359 sv_setpvn(copysv, pv, len);
4362 if (SvIOK(origsv) || SvIOKp(origsv))
4363 SvIV_set(copysv, SvIVX(origsv));
4364 if (SvNOK(origsv) || SvNOKp(origsv))
4365 SvNV_set(copysv, SvNVX(origsv));
4366 SvFLAGS(copysv) |= SvFLAGS(origsv) &
4367 (SVf_IOK|SVf_NOK|SVf_POK|SVp_IOK|SVp_NOK|SVp_POK|
4368 SVf_UTF8|SVf_IVisUV);
4372 pv = SvPV_nomg(origsv, len);
4373 copysv = newSVpvn_flags(pv, len,
4374 (SvFLAGS(origsv) & SVf_UTF8) | SVs_TEMP);
4382 TAINT_PROPER("system");
4384 PERL_FLUSHALL_FOR_CHILD;
4385 #if (defined(HAS_FORK) || defined(__amigaos4__)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4388 struct UserData userdata;
4395 bool child_success = FALSE;
4396 #ifdef HAS_SIGPROCMASK
4397 sigset_t newset, oldset;
4400 if (PerlProc_pipe_cloexec(pp) >= 0)
4403 amigaos_fork_set_userdata(aTHX_
4409 pthread_create(&proc,NULL,amigaos_system_child,(void *)&userdata);
4410 child_success = proc > 0;
4412 #ifdef HAS_SIGPROCMASK
4413 sigemptyset(&newset);
4414 sigaddset(&newset, SIGCHLD);
4415 sigprocmask(SIG_BLOCK, &newset, &oldset);
4417 while ((childpid = PerlProc_fork()) == -1) {
4418 if (errno != EAGAIN) {
4423 PerlLIO_close(pp[0]);
4424 PerlLIO_close(pp[1]);
4426 #ifdef HAS_SIGPROCMASK
4427 sigprocmask(SIG_SETMASK, &oldset, NULL);
4433 child_success = childpid > 0;
4435 if (child_success) {
4436 Sigsave_t ihand,qhand; /* place to save signals during system() */
4439 #ifndef __amigaos4__
4441 PerlLIO_close(pp[1]);
4444 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4445 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4448 result = pthread_join(proc, (void **)&status);
4451 result = wait4pid(childpid, &status, 0);
4452 } while (result == -1 && errno == EINTR);
4455 #ifdef HAS_SIGPROCMASK
4456 sigprocmask(SIG_SETMASK, &oldset, NULL);
4458 (void)rsignal_restore(SIGINT, &ihand);
4459 (void)rsignal_restore(SIGQUIT, &qhand);
4461 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4467 while (n < sizeof(int)) {
4468 const SSize_t n1 = PerlLIO_read(pp[0],
4469 (void*)(((char*)&errkid)+n),
4475 PerlLIO_close(pp[0]);
4476 if (n) { /* Error */
4477 if (n != sizeof(int))
4478 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4479 errno = errkid; /* Propagate errno from kid */
4481 /* The pipe always has something in it
4482 * so n alone is not enough. */
4486 STATUS_NATIVE_CHILD_SET(-1);
4490 XPUSHi(STATUS_CURRENT);
4493 #ifndef __amigaos4__
4494 #ifdef HAS_SIGPROCMASK
4495 sigprocmask(SIG_SETMASK, &oldset, NULL);
4498 PerlLIO_close(pp[0]);
4499 if (PL_op->op_flags & OPf_STACKED) {
4500 SV * const really = *++MARK;
4501 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4503 else if (SP - MARK != 1)
4504 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4506 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4508 #endif /* __amigaos4__ */
4511 #else /* ! FORK or VMS or OS/2 */
4514 if (PL_op->op_flags & OPf_STACKED) {
4515 SV * const really = *++MARK;
4516 # if defined(WIN32) || defined(OS2) || defined(__VMS)
4517 value = (I32)do_aspawn(really, MARK, SP);
4519 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4522 else if (SP - MARK != 1) {
4523 # if defined(WIN32) || defined(OS2) || defined(__VMS)
4524 value = (I32)do_aspawn(NULL, MARK, SP);
4526 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4530 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4532 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4534 STATUS_NATIVE_CHILD_SET(value);
4536 XPUSHi(result ? value : STATUS_CURRENT);
4537 #endif /* !FORK or VMS or OS/2 */
4544 dSP; dMARK; dORIGMARK; dTARGET;
4549 while (++MARK <= SP) {
4550 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4555 TAINT_PROPER("exec");
4558 PERL_FLUSHALL_FOR_CHILD;
4559 if (PL_op->op_flags & OPf_STACKED) {
4560 SV * const really = *++MARK;
4561 value = (I32)do_aexec(really, MARK, SP);
4563 else if (SP - MARK != 1)
4565 value = (I32)vms_do_aexec(NULL, MARK, SP);
4567 value = (I32)do_aexec(NULL, MARK, SP);
4571 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4573 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4585 XPUSHi( getppid() );
4588 DIE(aTHX_ PL_no_func, "getppid");
4598 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4601 pgrp = (I32)BSD_GETPGRP(pid);
4603 if (pid != 0 && pid != PerlProc_getpid())
4604 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4610 DIE(aTHX_ PL_no_func, "getpgrp");
4620 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4621 if (MAXARG > 0) pid = TOPs ? TOPi : 0;
4628 TAINT_PROPER("setpgrp");
4630 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4632 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4633 || (pid != 0 && pid != PerlProc_getpid()))
4635 DIE(aTHX_ "setpgrp can't take arguments");
4637 SETi( setpgrp() >= 0 );
4638 #endif /* USE_BSDPGRP */
4641 DIE(aTHX_ PL_no_func, "setpgrp");
4646 * The glibc headers typedef __priority_which_t to an enum under C, but
4647 * under C++, it keeps it as int. -Wc++-compat doesn't know this, so we
4648 * need to explicitly cast it to shut up the warning.
4650 #if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4651 # define PRIORITY_WHICH_T(which) (__priority_which_t)which
4653 # define PRIORITY_WHICH_T(which) which
4658 #ifdef HAS_GETPRIORITY
4660 const int who = POPi;
4661 const int which = TOPi;
4662 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4665 DIE(aTHX_ PL_no_func, "getpriority");
4671 #ifdef HAS_SETPRIORITY
4673 const int niceval = POPi;
4674 const int who = POPi;
4675 const int which = TOPi;
4676 TAINT_PROPER("setpriority");
4677 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4680 DIE(aTHX_ PL_no_func, "setpriority");
4684 #undef PRIORITY_WHICH_T
4692 XPUSHn( (NV)time(NULL) );
4694 XPUSHu( (UV)time(NULL) );
4703 struct tms timesbuf;
4706 (void)PerlProc_times(×buf);
4708 mPUSHn(((NV)timesbuf.tms_utime)/(NV)PL_clocktick);
4709 if (GIMME_V == G_LIST) {
4710 mPUSHn(((NV)timesbuf.tms_stime)/(NV)PL_clocktick);
4711 mPUSHn(((NV)timesbuf.tms_cutime)/(NV)PL_clocktick);
4712 mPUSHn(((NV)timesbuf.tms_cstime)/(NV)PL_clocktick);
4715 #elif defined(PERL_MICRO)
4719 if (GIMME_V == G_LIST) {
4726 DIE(aTHX_ "times not implemented");
4727 #endif /* HAS_TIMES */
4730 /* The 32 bit int year limits the times we can represent to these
4731 boundaries with a few days wiggle room to account for time zone
4734 /* Sat Jan 3 00:00:00 -2147481748 */
4735 #define TIME_LOWER_BOUND -67768100567755200.0
4736 /* Sun Dec 29 12:00:00 2147483647 */
4737 #define TIME_UPPER_BOUND 67767976233316800.0
4740 /* also used for: pp_localtime() */
4748 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4749 static const char * const dayname[] =
4750 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4751 static const char * const monname[] =
4752 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4753 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4755 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4758 when = (Time64_T)now;
4761 NV input = Perl_floor(POPn);
4762 const bool pl_isnan = Perl_isnan(input);
4763 when = (Time64_T)input;
4764 if (UNLIKELY(pl_isnan || when != input)) {
4765 /* diag_listed_as: gmtime(%f) too large */
4766 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4767 "%s(%.0" NVff ") too large", opname, input);
4775 if ( TIME_LOWER_BOUND > when ) {
4776 /* diag_listed_as: gmtime(%f) too small */
4777 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4778 "%s(%.0" NVff ") too small", opname, when);
4781 else if( when > TIME_UPPER_BOUND ) {
4782 /* diag_listed_as: gmtime(%f) too small */
4783 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4784 "%s(%.0" NVff ") too large", opname, when);
4788 if (PL_op->op_type == OP_LOCALTIME)
4789 err = Perl_localtime64_r(&when, &tmbuf);
4791 err = Perl_gmtime64_r(&when, &tmbuf);
4795 /* diag_listed_as: gmtime(%f) failed */
4796 /* XXX %lld broken for quads */
4798 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4799 "%s(%.0" NVff ") failed", opname, when);
4802 if (GIMME_V != G_LIST) { /* scalar context */
4809 Perl_sv_setpvf_mg(aTHX_ TARG, "%s %s %2d %02d:%02d:%02d %" IVdf,
4810 dayname[tmbuf.tm_wday],
4811 monname[tmbuf.tm_mon],
4816 (IV)tmbuf.tm_year + 1900);
4819 else { /* list context */
4825 mPUSHi(tmbuf.tm_sec);
4826 mPUSHi(tmbuf.tm_min);
4827 mPUSHi(tmbuf.tm_hour);
4828 mPUSHi(tmbuf.tm_mday);
4829 mPUSHi(tmbuf.tm_mon);
4830 mPUSHn(tmbuf.tm_year);
4831 mPUSHi(tmbuf.tm_wday);
4832 mPUSHi(tmbuf.tm_yday);
4833 mPUSHi(tmbuf.tm_isdst);
4842 /* alarm() takes an unsigned int number of seconds, and return the
4843 * unsigned int number of seconds remaining in the previous alarm
4844 * (alarms don't stack). Therefore negative return values are not
4848 /* Note that while the C library function alarm() as such has
4849 * no errors defined (or in other words, properly behaving client
4850 * code shouldn't expect any), alarm() being obsoleted by
4851 * setitimer() and often being implemented in terms of
4852 * setitimer(), can fail. */
4853 /* diag_listed_as: %s() with negative argument */
4854 Perl_ck_warner_d(aTHX_ packWARN(WARN_MISC),
4855 "alarm() with negative argument");
4856 SETERRNO(EINVAL, LIB_INVARG);
4860 unsigned int retval = alarm(anum);
4861 if ((int)retval < 0) /* Strictly speaking "cannot happen". */
4867 DIE(aTHX_ PL_no_func, "alarm");
4877 (void)time(&lasttime);
4878 if (MAXARG < 1 || (!TOPs && !POPs))
4881 const I32 duration = POPi;
4883 /* diag_listed_as: %s() with negative argument */
4884 Perl_ck_warner_d(aTHX_ packWARN(WARN_MISC),
4885 "sleep() with negative argument");
4886 SETERRNO(EINVAL, LIB_INVARG);
4887 XPUSHs(&PL_sv_zero);
4890 PerlProc_sleep((unsigned int)duration);
4894 XPUSHu((UV)(when - lasttime));
4898 /* Shared memory. */
4899 /* Merged with some message passing. */
4901 /* also used for: pp_msgrcv() pp_msgsnd() pp_semop() pp_shmread() */
4905 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4906 dSP; dMARK; dTARGET;
4907 const int op_type = PL_op->op_type;
4912 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4915 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4918 value = (I32)(do_semop(MARK, SP) >= 0);
4921 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4929 return Perl_pp_semget(aTHX);
4935 /* also used for: pp_msgget() pp_shmget() */
4939 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4940 dSP; dMARK; dTARGET;
4941 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4948 DIE(aTHX_ "System V IPC is not implemented on this machine");
4952 /* also used for: pp_msgctl() pp_shmctl() */
4956 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4957 dSP; dMARK; dTARGET;
4958 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4966 PUSHp(zero_but_true, ZBTLEN);
4970 return Perl_pp_semget(aTHX);
4974 /* I can't const this further without getting warnings about the types of
4975 various arrays passed in from structures. */
4977 S_space_join_names_mortal(pTHX_ char *const *array)
4981 if (array && *array) {
4982 target = newSVpvs_flags("", SVs_TEMP);
4984 sv_catpv(target, *array);
4987 sv_catpvs(target, " ");
4990 target = sv_mortalcopy(&PL_sv_no);
4995 /* Get system info. */
4997 /* also used for: pp_ghbyaddr() pp_ghbyname() */
5001 #if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
5003 I32 which = PL_op->op_type;
5006 #ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
5007 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
5008 struct hostent *gethostbyname(Netdb_name_t);
5009 struct hostent *gethostent(void);
5011 struct hostent *hent = NULL;
5015 if (which == OP_GHBYNAME) {
5016 #ifdef HAS_GETHOSTBYNAME
5017 const char* const name = POPpbytex;
5018 hent = PerlSock_gethostbyname(name);
5020 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
5023 else if (which == OP_GHBYADDR) {
5024 #ifdef HAS_GETHOSTBYADDR
5025 const int addrtype = POPi;
5026 SV * const addrsv = POPs;
5028 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
5030 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
5032 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
5036 #ifdef HAS_GETHOSTENT
5037 hent = PerlSock_gethostent();
5039 DIE(aTHX_ PL_no_sock_func, "gethostent");
5042 #ifdef HOST_NOT_FOUND
5044 #ifdef USE_REENTRANT_API
5045 # ifdef USE_GETHOSTENT_ERRNO
5046 h_errno = PL_reentrant_buffer->_gethostent_errno;
5049 STATUS_UNIX_SET(h_errno);
5053 if (GIMME_V != G_LIST) {
5054 PUSHs(sv = sv_newmortal());
5056 if (which == OP_GHBYNAME) {
5058 sv_setpvn(sv, hent->h_addr, hent->h_length);
5061 sv_setpv(sv, (char*)hent->h_name);
5067 mPUSHs(newSVpv((char*)hent->h_name, 0));
5068 PUSHs(space_join_names_mortal(hent->h_aliases));
5069 mPUSHi(hent->h_addrtype);
5070 len = hent->h_length;
5073 for (elem = hent->h_addr_list; elem && *elem; elem++) {
5074 mXPUSHp(*elem, len);
5078 mPUSHp(hent->h_addr, len);
5080 PUSHs(sv_mortalcopy(&PL_sv_no));
5085 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5089 /* also used for: pp_gnbyaddr() pp_gnbyname() */
5093 #if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
5095 I32 which = PL_op->op_type;
5097 #ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
5098 struct netent *getnetbyaddr(Netdb_net_t, int);
5099 struct netent *getnetbyname(Netdb_name_t);
5100 struct netent *getnetent(void);
5102 struct netent *nent;
5104 if (which == OP_GNBYNAME){
5105 #ifdef HAS_GETNETBYNAME
5106 const char * const name = POPpbytex;
5107 nent = PerlSock_getnetbyname(name);
5109 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
5112 else if (which == OP_GNBYADDR) {
5113 #ifdef HAS_GETNETBYADDR
5114 const int addrtype = POPi;
5115 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
5116 nent = PerlSock_getnetbyaddr(addr, addrtype);
5118 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
5122 #ifdef HAS_GETNETENT
5123 nent = PerlSock_getnetent();
5125 DIE(aTHX_ PL_no_sock_func, "getnetent");
5128 #ifdef HOST_NOT_FOUND
5130 #ifdef USE_REENTRANT_API
5131 # ifdef USE_GETNETENT_ERRNO
5132 h_errno = PL_reentrant_buffer->_getnetent_errno;
5135 STATUS_UNIX_SET(h_errno);
5140 if (GIMME_V != G_LIST) {
5141 PUSHs(sv = sv_newmortal());
5143 if (which == OP_GNBYNAME)
5144 sv_setiv(sv, (IV)nent->n_net);
5146 sv_setpv(sv, nent->n_name);
5152 mPUSHs(newSVpv(nent->n_name, 0));
5153 PUSHs(space_join_names_mortal(nent->n_aliases));
5154 mPUSHi(nent->n_addrtype);
5155 mPUSHi(nent->n_net);
5160 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5165 /* also used for: pp_gpbyname() pp_gpbynumber() */
5169 #if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
5171 I32 which = PL_op->op_type;
5173 #ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
5174 struct protoent *getprotobyname(Netdb_name_t);
5175 struct protoent *getprotobynumber(int);
5176 struct protoent *getprotoent(void);
5178 struct protoent *pent;
5180 if (which == OP_GPBYNAME) {
5181 #ifdef HAS_GETPROTOBYNAME
5182 const char* const name = POPpbytex;
5183 pent = PerlSock_getprotobyname(name);
5185 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
5188 else if (which == OP_GPBYNUMBER) {
5189 #ifdef HAS_GETPROTOBYNUMBER
5190 const int number = POPi;
5191 pent = PerlSock_getprotobynumber(number);
5193 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
5197 #ifdef HAS_GETPROTOENT
5198 pent = PerlSock_getprotoent();
5200 DIE(aTHX_ PL_no_sock_func, "getprotoent");
5204 if (GIMME_V != G_LIST) {
5205 PUSHs(sv = sv_newmortal());
5207 if (which == OP_GPBYNAME)
5208 sv_setiv(sv, (IV)pent->p_proto);
5210 sv_setpv(sv, pent->p_name);
5216 mPUSHs(newSVpv(pent->p_name, 0));
5217 PUSHs(space_join_names_mortal(pent->p_aliases));
5218 mPUSHi(pent->p_proto);
5223 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5228 /* also used for: pp_gsbyname() pp_gsbyport() */
5232 #if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
5234 I32 which = PL_op->op_type;
5236 #ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
5237 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
5238 struct servent *getservbyport(int, Netdb_name_t);
5239 struct servent *getservent(void);
5241 struct servent *sent;
5243 if (which == OP_GSBYNAME) {
5244 #ifdef HAS_GETSERVBYNAME
5245 const char * const proto = POPpbytex;
5246 const char * const name = POPpbytex;
5247 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
5249 DIE(aTHX_ PL_no_sock_func, "getservbyname");
5252 else if (which == OP_GSBYPORT) {
5253 #ifdef HAS_GETSERVBYPORT
5254 const char * const proto = POPpbytex;
5255 unsigned short port = (unsigned short)POPu;
5256 port = PerlSock_htons(port);
5257 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
5259 DIE(aTHX_ PL_no_sock_func, "getservbyport");
5263 #ifdef HAS_GETSERVENT
5264 sent = PerlSock_getservent();
5266 DIE(aTHX_ PL_no_sock_func, "getservent");
5270 if (GIMME_V != G_LIST) {
5271 PUSHs(sv = sv_newmortal());
5273 if (which == OP_GSBYNAME) {
5274 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
5277 sv_setpv(sv, sent->s_name);
5283 mPUSHs(newSVpv(sent->s_name, 0));
5284 PUSHs(space_join_names_mortal(sent->s_aliases));
5285 mPUSHi(PerlSock_ntohs(sent->s_port));
5286 mPUSHs(newSVpv(sent->s_proto, 0));
5291 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5296 /* also used for: pp_snetent() pp_sprotoent() pp_sservent() */
5301 const int stayopen = TOPi;
5302 switch(PL_op->op_type) {
5304 #ifdef HAS_SETHOSTENT
5305 PerlSock_sethostent(stayopen);
5307 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5311 #ifdef HAS_SETNETENT
5312 PerlSock_setnetent(stayopen);
5314 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5318 #ifdef HAS_SETPROTOENT
5319 PerlSock_setprotoent(stayopen);
5321 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5325 #ifdef HAS_SETSERVENT
5326 PerlSock_setservent(stayopen);
5328 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5336 /* also used for: pp_egrent() pp_enetent() pp_eprotoent() pp_epwent()
5337 * pp_eservent() pp_sgrent() pp_spwent() */
5342 switch(PL_op->op_type) {
5344 #ifdef HAS_ENDHOSTENT
5345 PerlSock_endhostent();
5347 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5351 #ifdef HAS_ENDNETENT
5352 PerlSock_endnetent();
5354 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5358 #ifdef HAS_ENDPROTOENT
5359 PerlSock_endprotoent();
5361 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5365 #ifdef HAS_ENDSERVENT
5366 PerlSock_endservent();
5368 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5372 #if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5375 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5379 #if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5382 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5386 #if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5389 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5393 #if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5396 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5405 /* also used for: pp_gpwnam() pp_gpwuid() */
5411 I32 which = PL_op->op_type;
5413 struct passwd *pwent = NULL;
5415 * We currently support only the SysV getsp* shadow password interface.
5416 * The interface is declared in <shadow.h> and often one needs to link
5417 * with -lsecurity or some such.
5418 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5421 * AIX getpwnam() is clever enough to return the encrypted password
5422 * only if the caller (euid?) is root.
5424 * There are at least three other shadow password APIs. Many platforms
5425 * seem to contain more than one interface for accessing the shadow
5426 * password databases, possibly for compatibility reasons.
5427 * The getsp*() is by far he simplest one, the other two interfaces
5428 * are much more complicated, but also very similar to each other.
5433 * struct pr_passwd *getprpw*();
5434 * The password is in
5435 * char getprpw*(...).ufld.fd_encrypt[]
5436 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5441 * struct es_passwd *getespw*();
5442 * The password is in
5443 * char *(getespw*(...).ufld.fd_encrypt)
5444 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5447 * struct userpw *getuserpw();
5448 * The password is in
5449 * char *(getuserpw(...)).spw_upw_passwd
5450 * (but the de facto standard getpwnam() should work okay)
5452 * Mention I_PROT here so that Configure probes for it.
5454 * In HP-UX for getprpw*() the manual page claims that one should include
5455 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5456 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5457 * and pp_sys.c already includes <shadow.h> if there is such.
5459 * Note that <sys/security.h> is already probed for, but currently
5460 * it is only included in special cases.
5462 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5463 * the preferred interface, even though also the getprpw*() interface
5464 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5465 * One also needs to call set_auth_parameters() in main() before
5466 * doing anything else, whether one is using getespw*() or getprpw*().
5468 * Note that accessing the shadow databases can be magnitudes
5469 * slower than accessing the standard databases.
5474 # if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5475 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5476 * the pw_comment is left uninitialized. */
5477 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5483 const char* const name = POPpbytex;
5484 pwent = getpwnam(name);
5490 pwent = getpwuid(uid);
5494 # ifdef HAS_GETPWENT
5496 #ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5497 if (pwent) pwent = getpwnam(pwent->pw_name);
5500 DIE(aTHX_ PL_no_func, "getpwent");
5506 if (GIMME_V != G_LIST) {
5507 PUSHs(sv = sv_newmortal());
5509 if (which == OP_GPWNAM)
5510 sv_setuid(sv, pwent->pw_uid);
5512 sv_setpv(sv, pwent->pw_name);
5518 mPUSHs(newSVpv(pwent->pw_name, 0));
5522 /* If we have getspnam(), we try to dig up the shadow
5523 * password. If we are underprivileged, the shadow
5524 * interface will set the errno to EACCES or similar,
5525 * and return a null pointer. If this happens, we will
5526 * use the dummy password (usually "*" or "x") from the
5527 * standard password database.
5529 * In theory we could skip the shadow call completely
5530 * if euid != 0 but in practice we cannot know which
5531 * security measures are guarding the shadow databases
5532 * on a random platform.
5534 * Resist the urge to use additional shadow interfaces.
5535 * Divert the urge to writing an extension instead.
5538 /* Some AIX setups falsely(?) detect some getspnam(), which
5539 * has a different API than the Solaris/IRIX one. */
5540 # if defined(HAS_GETSPNAM) && !defined(_AIX)
5543 const struct spwd * const spwent = getspnam(pwent->pw_name);
5544 /* Save and restore errno so that
5545 * underprivileged attempts seem
5546 * to have never made the unsuccessful
5547 * attempt to retrieve the shadow password. */
5549 if (spwent && spwent->sp_pwdp)
5550 sv_setpv(sv, spwent->sp_pwdp);
5554 if (!SvPOK(sv)) /* Use the standard password, then. */
5555 sv_setpv(sv, pwent->pw_passwd);
5558 /* passwd is tainted because user himself can diddle with it.
5559 * admittedly not much and in a very limited way, but nevertheless. */
5562 sv_setuid(PUSHmortal, pwent->pw_uid);
5563 sv_setgid(PUSHmortal, pwent->pw_gid);
5565 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5566 * because of the poor interface of the Perl getpw*(),
5567 * not because there's some standard/convention saying so.
5568 * A better interface would have been to return a hash,
5569 * but we are accursed by our history, alas. --jhi. */
5571 mPUSHi(pwent->pw_change);
5572 # elif defined(PWQUOTA)
5573 mPUSHi(pwent->pw_quota);
5574 # elif defined(PWAGE)
5575 mPUSHs(newSVpv(pwent->pw_age, 0));
5577 /* I think that you can never get this compiled, but just in case. */
5578 PUSHs(sv_mortalcopy(&PL_sv_no));
5581 /* pw_class and pw_comment are mutually exclusive--.
5582 * see the above note for pw_change, pw_quota, and pw_age. */
5584 mPUSHs(newSVpv(pwent->pw_class, 0));
5585 # elif defined(PWCOMMENT)
5586 mPUSHs(newSVpv(pwent->pw_comment, 0));
5588 /* I think that you can never get this compiled, but just in case. */
5589 PUSHs(sv_mortalcopy(&PL_sv_no));
5593 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5595 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5597 /* pw_gecos is tainted because user himself can diddle with it. */
5600 mPUSHs(newSVpv(pwent->pw_dir, 0));
5602 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5603 /* pw_shell is tainted because user himself can diddle with it. */
5607 mPUSHi(pwent->pw_expire);
5612 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5617 /* also used for: pp_ggrgid() pp_ggrnam() */
5623 const I32 which = PL_op->op_type;
5624 const struct group *grent;
5626 if (which == OP_GGRNAM) {
5627 const char* const name = POPpbytex;
5628 grent = (const struct group *)getgrnam(name);
5630 else if (which == OP_GGRGID) {
5632 const Gid_t gid = POPu;
5633 #elif Gid_t_sign == -1
5634 const Gid_t gid = POPi;
5636 # error "Unexpected Gid_t_sign"
5638 grent = (const struct group *)getgrgid(gid);
5642 grent = (struct group *)getgrent();
5644 DIE(aTHX_ PL_no_func, "getgrent");
5648 if (GIMME_V != G_LIST) {
5649 SV * const sv = sv_newmortal();
5653 if (which == OP_GGRNAM)
5654 sv_setgid(sv, grent->gr_gid);
5656 sv_setpv(sv, grent->gr_name);
5662 mPUSHs(newSVpv(grent->gr_name, 0));
5665 mPUSHs(newSVpv(grent->gr_passwd, 0));
5667 PUSHs(sv_mortalcopy(&PL_sv_no));
5670 sv_setgid(PUSHmortal, grent->gr_gid);
5672 #if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5673 /* In UNICOS/mk (_CRAYMPP) the multithreading
5674 * versions (getgrnam_r, getgrgid_r)
5675 * seem to return an illegal pointer
5676 * as the group members list, gr_mem.
5677 * getgrent() doesn't even have a _r version
5678 * but the gr_mem is poisonous anyway.
5679 * So yes, you cannot get the list of group
5680 * members if building multithreaded in UNICOS/mk. */
5681 PUSHs(space_join_names_mortal(grent->gr_mem));
5687 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5697 if (!(tmps = PerlProc_getlogin()))
5699 sv_setpv_mg(TARG, tmps);
5703 DIE(aTHX_ PL_no_func, "getlogin");
5707 /* Miscellaneous. */
5712 dSP; dMARK; dORIGMARK; dTARGET;
5713 I32 items = SP - MARK;
5714 unsigned long a[20];
5719 while (++MARK <= SP) {
5720 if (SvTAINTED(*MARK)) {
5726 TAINT_PROPER("syscall");
5729 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5730 * or where sizeof(long) != sizeof(char*). But such machines will
5731 * not likely have syscall implemented either, so who cares?
5733 while (++MARK <= SP) {
5734 if (SvNIOK(*MARK) || !i)
5735 a[i++] = SvIV(*MARK);
5736 else if (*MARK == &PL_sv_undef)
5739 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5745 DIE(aTHX_ "Too many args to syscall");
5747 DIE(aTHX_ "Too few args to syscall");
5749 retval = syscall(a[0]);
5752 retval = syscall(a[0],a[1]);
5755 retval = syscall(a[0],a[1],a[2]);
5758 retval = syscall(a[0],a[1],a[2],a[3]);
5761 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5764 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5767 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5770 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5777 DIE(aTHX_ PL_no_func, "syscall");
5781 #ifdef FCNTL_EMULATE_FLOCK
5783 /* XXX Emulate flock() with fcntl().
5784 What's really needed is a good file locking module.
5788 fcntl_emulate_flock(int fd, int operation)
5793 switch (operation & ~LOCK_NB) {
5795 flock.l_type = F_RDLCK;
5798 flock.l_type = F_WRLCK;
5801 flock.l_type = F_UNLCK;
5807 flock.l_whence = SEEK_SET;
5808 flock.l_start = flock.l_len = (Off_t)0;
5810 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5811 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5812 errno = EWOULDBLOCK;
5816 #endif /* FCNTL_EMULATE_FLOCK */
5818 #ifdef LOCKF_EMULATE_FLOCK
5820 /* XXX Emulate flock() with lockf(). This is just to increase
5821 portability of scripts. The calls are not completely
5822 interchangeable. What's really needed is a good file
5826 /* The lockf() constants might have been defined in <unistd.h>.
5827 Unfortunately, <unistd.h> causes troubles on some mixed
5828 (BSD/POSIX) systems, such as SunOS 4.1.3.
5830 Further, the lockf() constants aren't POSIX, so they might not be
5831 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5832 just stick in the SVID values and be done with it. Sigh.
5836 # define F_ULOCK 0 /* Unlock a previously locked region */
5839 # define F_LOCK 1 /* Lock a region for exclusive use */
5842 # define F_TLOCK 2 /* Test and lock a region for exclusive use */
5845 # define F_TEST 3 /* Test a region for other processes locks */
5849 lockf_emulate_flock(int fd, int operation)
5855 /* flock locks entire file so for lockf we need to do the same */
5856 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5857 if (pos > 0) /* is seekable and needs to be repositioned */
5858 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5859 pos = -1; /* seek failed, so don't seek back afterwards */
5862 switch (operation) {
5864 /* LOCK_SH - get a shared lock */
5866 /* LOCK_EX - get an exclusive lock */
5868 i = lockf (fd, F_LOCK, 0);
5871 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5872 case LOCK_SH|LOCK_NB:
5873 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5874 case LOCK_EX|LOCK_NB:
5875 i = lockf (fd, F_TLOCK, 0);
5877 if ((errno == EAGAIN) || (errno == EACCES))
5878 errno = EWOULDBLOCK;
5881 /* LOCK_UN - unlock (non-blocking is a no-op) */
5883 case LOCK_UN|LOCK_NB:
5884 i = lockf (fd, F_ULOCK, 0);
5887 /* Default - can't decipher operation */
5894 if (pos > 0) /* need to restore position of the handle */
5895 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5900 #endif /* LOCKF_EMULATE_FLOCK */
5903 * ex: set ts=8 sts=4 sw=4 et: