This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Remove gete?[ug]id caching
[perl5.git] / pp_sys.c
... / ...
CommitLineData
1/* pp_sys.c
2 *
3 * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
5 *
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.
8 *
9 */
10
11/*
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.
16 *
17 * [p.945 of _The Lord of the Rings_, VI/iii: "Mount Doom"]
18 */
19
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.
25 *
26 * By 'system', we mean ops which interact with the OS, such as pp_open().
27 */
28
29#include "EXTERN.h"
30#define PERL_IN_PP_SYS_C
31#include "perl.h"
32#include "time64.h"
33#include "time64.c"
34
35#ifdef I_SHADOW
36/* Shadow password support for solaris - pdo@cs.umd.edu
37 * Not just Solaris: at least HP-UX, IRIX, Linux.
38 * The API is from SysV.
39 *
40 * There are at least two more shadow interfaces,
41 * see the comments in pp_gpwent().
42 *
43 * --jhi */
44# ifdef __hpux__
45/* There is a MAXINT coming from <shadow.h> <- <hpsecurity.h> <- <values.h>
46 * and another MAXINT from "perl.h" <- <sys/param.h>. */
47# undef MAXINT
48# endif
49# include <shadow.h>
50#endif
51
52#ifdef I_SYS_RESOURCE
53# include <sys/resource.h>
54#endif
55
56#ifdef NETWARE
57NETDB_DEFINE_CONTEXT
58#endif
59
60#ifdef HAS_SELECT
61# ifdef I_SYS_SELECT
62# include <sys/select.h>
63# endif
64#endif
65
66/* XXX Configure test needed.
67 h_errno might not be a simple 'int', especially for multi-threaded
68 applications, see "extern int errno in perl.h". Creating such
69 a test requires taking into account the differences between
70 compiling multithreaded and singlethreaded ($ccflags et al).
71 HOST_NOT_FOUND is typically defined in <netdb.h>.
72*/
73#if defined(HOST_NOT_FOUND) && !defined(h_errno) && !defined(__CYGWIN__)
74extern int h_errno;
75#endif
76
77#ifdef HAS_PASSWD
78# ifdef I_PWD
79# include <pwd.h>
80# else
81# if !defined(VMS)
82 struct passwd *getpwnam (char *);
83 struct passwd *getpwuid (Uid_t);
84# endif
85# endif
86# ifdef HAS_GETPWENT
87#ifndef getpwent
88 struct passwd *getpwent (void);
89#elif defined (VMS) && defined (my_getpwent)
90 struct passwd *Perl_my_getpwent (pTHX);
91#endif
92# endif
93#endif
94
95#ifdef HAS_GROUP
96# ifdef I_GRP
97# include <grp.h>
98# else
99 struct group *getgrnam (char *);
100 struct group *getgrgid (Gid_t);
101# endif
102# ifdef HAS_GETGRENT
103#ifndef getgrent
104 struct group *getgrent (void);
105#endif
106# endif
107#endif
108
109#ifdef I_UTIME
110# if defined(_MSC_VER) || defined(__MINGW32__)
111# include <sys/utime.h>
112# else
113# include <utime.h>
114# endif
115#endif
116
117#ifdef HAS_CHSIZE
118# ifdef my_chsize /* Probably #defined to Perl_my_chsize in embed.h */
119# undef my_chsize
120# endif
121# define my_chsize PerlLIO_chsize
122#else
123# ifdef HAS_TRUNCATE
124# define my_chsize PerlLIO_chsize
125# else
126I32 my_chsize(int fd, Off_t length);
127# endif
128#endif
129
130#ifdef HAS_FLOCK
131# define FLOCK flock
132#else /* no flock() */
133
134 /* fcntl.h might not have been included, even if it exists, because
135 the current Configure only sets I_FCNTL if it's needed to pick up
136 the *_OK constants. Make sure it has been included before testing
137 the fcntl() locking constants. */
138# if defined(HAS_FCNTL) && !defined(I_FCNTL)
139# include <fcntl.h>
140# endif
141
142# if defined(HAS_FCNTL) && defined(FCNTL_CAN_LOCK)
143# define FLOCK fcntl_emulate_flock
144# define FCNTL_EMULATE_FLOCK
145# else /* no flock() or fcntl(F_SETLK,...) */
146# ifdef HAS_LOCKF
147# define FLOCK lockf_emulate_flock
148# define LOCKF_EMULATE_FLOCK
149# endif /* lockf */
150# endif /* no flock() or fcntl(F_SETLK,...) */
151
152# ifdef FLOCK
153 static int FLOCK (int, int);
154
155 /*
156 * These are the flock() constants. Since this sytems doesn't have
157 * flock(), the values of the constants are probably not available.
158 */
159# ifndef LOCK_SH
160# define LOCK_SH 1
161# endif
162# ifndef LOCK_EX
163# define LOCK_EX 2
164# endif
165# ifndef LOCK_NB
166# define LOCK_NB 4
167# endif
168# ifndef LOCK_UN
169# define LOCK_UN 8
170# endif
171# endif /* emulating flock() */
172
173#endif /* no flock() */
174
175#define ZBTLEN 10
176static const char zero_but_true[ZBTLEN + 1] = "0 but true";
177
178#if defined(I_SYS_ACCESS) && !defined(R_OK)
179# include <sys/access.h>
180#endif
181
182#if defined(HAS_FCNTL) && defined(F_SETFD) && !defined(FD_CLOEXEC)
183# define FD_CLOEXEC 1 /* NeXT needs this */
184#endif
185
186#include "reentr.h"
187
188#ifdef __Lynx__
189/* Missing protos on LynxOS */
190void sethostent(int);
191void endhostent(void);
192void setnetent(int);
193void endnetent(void);
194void setprotoent(int);
195void endprotoent(void);
196void setservent(int);
197void endservent(void);
198#endif
199
200#undef PERL_EFF_ACCESS /* EFFective uid/gid ACCESS */
201
202/* F_OK unused: if stat() cannot find it... */
203
204#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) && defined(EFF_ONLY_OK) && !defined(NO_EFF_ONLY_OK)
205 /* Digital UNIX (when the EFF_ONLY_OK gets fixed), UnixWare */
206# define PERL_EFF_ACCESS(p,f) (access((p), (f) | EFF_ONLY_OK))
207#endif
208
209#if !defined(PERL_EFF_ACCESS) && defined(HAS_EACCESS)
210# ifdef I_SYS_SECURITY
211# include <sys/security.h>
212# endif
213# ifdef ACC_SELF
214 /* HP SecureWare */
215# define PERL_EFF_ACCESS(p,f) (eaccess((p), (f), ACC_SELF))
216# else
217 /* SCO */
218# define PERL_EFF_ACCESS(p,f) (eaccess((p), (f)))
219# endif
220#endif
221
222#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESSX) && defined(ACC_SELF)
223 /* AIX */
224# define PERL_EFF_ACCESS(p,f) (accessx((p), (f), ACC_SELF))
225#endif
226
227
228#if !defined(PERL_EFF_ACCESS) && defined(HAS_ACCESS) \
229 && (defined(HAS_SETREUID) || defined(HAS_SETRESUID) \
230 || defined(HAS_SETREGID) || defined(HAS_SETRESGID))
231/* The Hard Way. */
232STATIC int
233S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
234{
235 const Uid_t ruid = getuid();
236 const Uid_t euid = geteuid();
237 const Gid_t rgid = getgid();
238 const Gid_t egid = getegid();
239 int res;
240
241#if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
242 Perl_croak(aTHX_ "switching effective uid is not implemented");
243#else
244#ifdef HAS_SETREUID
245 if (setreuid(euid, ruid))
246#else
247#ifdef HAS_SETRESUID
248 if (setresuid(euid, ruid, (Uid_t)-1))
249#endif
250#endif
251 /* diag_listed_as: entering effective %s failed */
252 Perl_croak(aTHX_ "entering effective uid failed");
253#endif
254
255#if !defined(HAS_SETREGID) && !defined(HAS_SETRESGID)
256 Perl_croak(aTHX_ "switching effective gid is not implemented");
257#else
258#ifdef HAS_SETREGID
259 if (setregid(egid, rgid))
260#else
261#ifdef HAS_SETRESGID
262 if (setresgid(egid, rgid, (Gid_t)-1))
263#endif
264#endif
265 /* diag_listed_as: entering effective %s failed */
266 Perl_croak(aTHX_ "entering effective gid failed");
267#endif
268
269 res = access(path, mode);
270
271#ifdef HAS_SETREUID
272 if (setreuid(ruid, euid))
273#else
274#ifdef HAS_SETRESUID
275 if (setresuid(ruid, euid, (Uid_t)-1))
276#endif
277#endif
278 /* diag_listed_as: leaving effective %s failed */
279 Perl_croak(aTHX_ "leaving effective uid failed");
280
281#ifdef HAS_SETREGID
282 if (setregid(rgid, egid))
283#else
284#ifdef HAS_SETRESGID
285 if (setresgid(rgid, egid, (Gid_t)-1))
286#endif
287#endif
288 /* diag_listed_as: leaving effective %s failed */
289 Perl_croak(aTHX_ "leaving effective gid failed");
290
291 return res;
292}
293# define PERL_EFF_ACCESS(p,f) (S_emulate_eaccess(aTHX_ (p), (f)))
294#endif
295
296PP(pp_backtick)
297{
298 dVAR; dSP; dTARGET;
299 PerlIO *fp;
300 const char * const tmps = POPpconstx;
301 const I32 gimme = GIMME_V;
302 const char *mode = "r";
303
304 TAINT_PROPER("``");
305 if (PL_op->op_private & OPpOPEN_IN_RAW)
306 mode = "rb";
307 else if (PL_op->op_private & OPpOPEN_IN_CRLF)
308 mode = "rt";
309 fp = PerlProc_popen(tmps, mode);
310 if (fp) {
311 const char * const type = Perl_PerlIO_context_layers(aTHX_ NULL);
312 if (type && *type)
313 PerlIO_apply_layers(aTHX_ fp,mode,type);
314
315 if (gimme == G_VOID) {
316 char tmpbuf[256];
317 while (PerlIO_read(fp, tmpbuf, sizeof tmpbuf) > 0)
318 NOOP;
319 }
320 else if (gimme == G_SCALAR) {
321 ENTER_with_name("backtick");
322 SAVESPTR(PL_rs);
323 PL_rs = &PL_sv_undef;
324 sv_setpvs(TARG, ""); /* note that this preserves previous buffer */
325 while (sv_gets(TARG, fp, SvCUR(TARG)) != NULL)
326 NOOP;
327 LEAVE_with_name("backtick");
328 XPUSHs(TARG);
329 SvTAINTED_on(TARG);
330 }
331 else {
332 for (;;) {
333 SV * const sv = newSV(79);
334 if (sv_gets(sv, fp, 0) == NULL) {
335 SvREFCNT_dec(sv);
336 break;
337 }
338 mXPUSHs(sv);
339 if (SvLEN(sv) - SvCUR(sv) > 20) {
340 SvPV_shrink_to_cur(sv);
341 }
342 SvTAINTED_on(sv);
343 }
344 }
345 STATUS_NATIVE_CHILD_SET(PerlProc_pclose(fp));
346 TAINT; /* "I believe that this is not gratuitous!" */
347 }
348 else {
349 STATUS_NATIVE_CHILD_SET(-1);
350 if (gimme == G_SCALAR)
351 RETPUSHUNDEF;
352 }
353
354 RETURN;
355}
356
357PP(pp_glob)
358{
359 dVAR;
360 OP *result;
361 dSP;
362 /* make a copy of the pattern if it is gmagical, to ensure that magic
363 * is called once and only once */
364 if (SvGMAGICAL(TOPm1s)) TOPm1s = sv_2mortal(newSVsv(TOPm1s));
365
366 tryAMAGICunTARGET(iter_amg, -1, (PL_op->op_flags & OPf_SPECIAL));
367
368 if (PL_op->op_flags & OPf_SPECIAL) {
369 /* call Perl-level glob function instead. Stack args are:
370 * MARK, wildcard, csh_glob context index
371 * and following OPs should be: gv(CORE::GLOBAL::glob), entersub
372 * */
373 return NORMAL;
374 }
375 /* stack args are: wildcard, gv(_GEN_n) */
376
377 if (PL_globhook) {
378 SETs(GvSV(TOPs));
379 PL_globhook(aTHX);
380 return NORMAL;
381 }
382
383 /* Note that we only ever get here if File::Glob fails to load
384 * without at the same time croaking, for some reason, or if
385 * perl was built with PERL_EXTERNAL_GLOB */
386
387 ENTER_with_name("glob");
388
389#ifndef VMS
390 if (PL_tainting) {
391 /*
392 * The external globbing program may use things we can't control,
393 * so for security reasons we must assume the worst.
394 */
395 TAINT;
396 taint_proper(PL_no_security, "glob");
397 }
398#endif /* !VMS */
399
400 SAVESPTR(PL_last_in_gv); /* We don't want this to be permanent. */
401 PL_last_in_gv = MUTABLE_GV(*PL_stack_sp--);
402
403 SAVESPTR(PL_rs); /* This is not permanent, either. */
404 PL_rs = newSVpvs_flags("\000", SVs_TEMP);
405#ifndef DOSISH
406#ifndef CSH
407 *SvPVX(PL_rs) = '\n';
408#endif /* !CSH */
409#endif /* !DOSISH */
410
411 result = do_readline();
412 LEAVE_with_name("glob");
413 return result;
414}
415
416PP(pp_rcatline)
417{
418 dVAR;
419 PL_last_in_gv = cGVOP_gv;
420 return do_readline();
421}
422
423PP(pp_warn)
424{
425 dVAR; dSP; dMARK;
426 SV *exsv;
427 STRLEN len;
428 if (SP - MARK > 1) {
429 dTARGET;
430 do_join(TARG, &PL_sv_no, MARK, SP);
431 exsv = TARG;
432 SP = MARK + 1;
433 }
434 else if (SP == MARK) {
435 exsv = &PL_sv_no;
436 EXTEND(SP, 1);
437 SP = MARK + 1;
438 }
439 else {
440 exsv = TOPs;
441 }
442
443 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
444 /* well-formed exception supplied */
445 }
446 else if (SvROK(ERRSV)) {
447 exsv = ERRSV;
448 }
449 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
450 exsv = sv_mortalcopy(ERRSV);
451 sv_catpvs(exsv, "\t...caught");
452 }
453 else {
454 exsv = newSVpvs_flags("Warning: something's wrong", SVs_TEMP);
455 }
456 if (SvROK(exsv) && !PL_warnhook)
457 Perl_warn(aTHX_ "%"SVf, SVfARG(exsv));
458 else warn_sv(exsv);
459 RETSETYES;
460}
461
462PP(pp_die)
463{
464 dVAR; dSP; dMARK;
465 SV *exsv;
466 STRLEN len;
467#ifdef VMS
468 VMSISH_HUSHED = VMSISH_HUSHED || (PL_op->op_private & OPpHUSH_VMSISH);
469#endif
470 if (SP - MARK != 1) {
471 dTARGET;
472 do_join(TARG, &PL_sv_no, MARK, SP);
473 exsv = TARG;
474 SP = MARK + 1;
475 }
476 else {
477 exsv = TOPs;
478 }
479
480 if (SvROK(exsv) || (SvPV_const(exsv, len), len)) {
481 /* well-formed exception supplied */
482 }
483 else if (SvROK(ERRSV)) {
484 exsv = ERRSV;
485 if (sv_isobject(exsv)) {
486 HV * const stash = SvSTASH(SvRV(exsv));
487 GV * const gv = gv_fetchmethod(stash, "PROPAGATE");
488 if (gv) {
489 SV * const file = sv_2mortal(newSVpv(CopFILE(PL_curcop),0));
490 SV * const line = sv_2mortal(newSVuv(CopLINE(PL_curcop)));
491 EXTEND(SP, 3);
492 PUSHMARK(SP);
493 PUSHs(exsv);
494 PUSHs(file);
495 PUSHs(line);
496 PUTBACK;
497 call_sv(MUTABLE_SV(GvCV(gv)),
498 G_SCALAR|G_EVAL|G_KEEPERR);
499 exsv = sv_mortalcopy(*PL_stack_sp--);
500 }
501 }
502 }
503 else if (SvPOK(ERRSV) && SvCUR(ERRSV)) {
504 exsv = sv_mortalcopy(ERRSV);
505 sv_catpvs(exsv, "\t...propagated");
506 }
507 else {
508 exsv = newSVpvs_flags("Died", SVs_TEMP);
509 }
510 return die_sv(exsv);
511}
512
513/* I/O. */
514
515OP *
516Perl_tied_method(pTHX_ const char *const methname, SV **sp, SV *const sv,
517 const MAGIC *const mg, const U32 flags, U32 argc, ...)
518{
519 SV **orig_sp = sp;
520 I32 ret_args;
521
522 PERL_ARGS_ASSERT_TIED_METHOD;
523
524 /* Ensure that our flag bits do not overlap. */
525 assert((TIED_METHOD_MORTALIZE_NOT_NEEDED & G_WANT) == 0);
526 assert((TIED_METHOD_ARGUMENTS_ON_STACK & G_WANT) == 0);
527 assert((TIED_METHOD_SAY & G_WANT) == 0);
528
529 PUTBACK; /* sp is at *foot* of args, so this pops args from old stack */
530 PUSHSTACKi(PERLSI_MAGIC);
531 EXTEND(SP, argc+1); /* object + args */
532 PUSHMARK(sp);
533 PUSHs(SvTIED_obj(sv, mg));
534 if (flags & TIED_METHOD_ARGUMENTS_ON_STACK) {
535 Copy(orig_sp + 2, sp + 1, argc, SV*); /* copy args to new stack */
536 sp += argc;
537 }
538 else if (argc) {
539 const U32 mortalize_not_needed
540 = flags & TIED_METHOD_MORTALIZE_NOT_NEEDED;
541 va_list args;
542 va_start(args, argc);
543 do {
544 SV *const arg = va_arg(args, SV *);
545 if(mortalize_not_needed)
546 PUSHs(arg);
547 else
548 mPUSHs(arg);
549 } while (--argc);
550 va_end(args);
551 }
552
553 PUTBACK;
554 ENTER_with_name("call_tied_method");
555 if (flags & TIED_METHOD_SAY) {
556 /* local $\ = "\n" */
557 SAVEGENERICSV(PL_ors_sv);
558 PL_ors_sv = newSVpvs("\n");
559 }
560 ret_args = call_method(methname, flags & G_WANT);
561 SPAGAIN;
562 orig_sp = sp;
563 POPSTACK;
564 SPAGAIN;
565 if (ret_args) { /* copy results back to original stack */
566 EXTEND(sp, ret_args);
567 Copy(orig_sp - ret_args + 1, sp + 1, ret_args, SV*);
568 sp += ret_args;
569 PUTBACK;
570 }
571 LEAVE_with_name("call_tied_method");
572 return NORMAL;
573}
574
575#define tied_method0(a,b,c,d) \
576 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,0)
577#define tied_method1(a,b,c,d,e) \
578 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,1,e)
579#define tied_method2(a,b,c,d,e,f) \
580 Perl_tied_method(aTHX_ a,b,c,d,G_SCALAR,2,e,f)
581
582PP(pp_open)
583{
584 dVAR; dSP;
585 dMARK; dORIGMARK;
586 dTARGET;
587 SV *sv;
588 IO *io;
589 const char *tmps;
590 STRLEN len;
591 bool ok;
592
593 GV * const gv = MUTABLE_GV(*++MARK);
594
595 if (!isGV(gv) && !(SvTYPE(gv) == SVt_PVLV && isGV_with_GP(gv)))
596 DIE(aTHX_ PL_no_usym, "filehandle");
597
598 if ((io = GvIOp(gv))) {
599 const MAGIC *mg;
600 IoFLAGS(GvIOp(gv)) &= ~IOf_UNTAINT;
601
602 if (IoDIRP(io))
603 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
604 "Opening dirhandle %"HEKf" also as a file",
605 HEKfARG(GvENAME_HEK(gv)));
606
607 mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
608 if (mg) {
609 /* Method's args are same as ours ... */
610 /* ... except handle is replaced by the object */
611 return Perl_tied_method(aTHX_ "OPEN", mark - 1, MUTABLE_SV(io), mg,
612 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
613 sp - mark);
614 }
615 }
616
617 if (MARK < SP) {
618 sv = *++MARK;
619 }
620 else {
621 sv = GvSVn(gv);
622 }
623
624 tmps = SvPV_const(sv, len);
625 ok = do_openn(gv, tmps, len, FALSE, O_RDONLY, 0, NULL, MARK+1, (SP-MARK));
626 SP = ORIGMARK;
627 if (ok)
628 PUSHi( (I32)PL_forkprocess );
629 else if (PL_forkprocess == 0) /* we are a new child */
630 PUSHi(0);
631 else
632 RETPUSHUNDEF;
633 RETURN;
634}
635
636PP(pp_close)
637{
638 dVAR; dSP;
639 GV * const gv =
640 MAXARG == 0 || (!TOPs && !POPs) ? PL_defoutgv : MUTABLE_GV(POPs);
641
642 if (MAXARG == 0)
643 EXTEND(SP, 1);
644
645 if (gv) {
646 IO * const io = GvIO(gv);
647 if (io) {
648 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
649 if (mg) {
650 return tied_method0("CLOSE", SP, MUTABLE_SV(io), mg);
651 }
652 }
653 }
654 PUSHs(boolSV(do_close(gv, TRUE)));
655 RETURN;
656}
657
658PP(pp_pipe_op)
659{
660#ifdef HAS_PIPE
661 dVAR;
662 dSP;
663 register IO *rstio;
664 register IO *wstio;
665 int fd[2];
666
667 GV * const wgv = MUTABLE_GV(POPs);
668 GV * const rgv = MUTABLE_GV(POPs);
669
670 if (!rgv || !wgv)
671 goto badexit;
672
673 if (!isGV_with_GP(rgv) || !isGV_with_GP(wgv))
674 DIE(aTHX_ PL_no_usym, "filehandle");
675 rstio = GvIOn(rgv);
676 wstio = GvIOn(wgv);
677
678 if (IoIFP(rstio))
679 do_close(rgv, FALSE);
680 if (IoIFP(wstio))
681 do_close(wgv, FALSE);
682
683 if (PerlProc_pipe(fd) < 0)
684 goto badexit;
685
686 IoIFP(rstio) = PerlIO_fdopen(fd[0], "r"PIPE_OPEN_MODE);
687 IoOFP(wstio) = PerlIO_fdopen(fd[1], "w"PIPE_OPEN_MODE);
688 IoOFP(rstio) = IoIFP(rstio);
689 IoIFP(wstio) = IoOFP(wstio);
690 IoTYPE(rstio) = IoTYPE_RDONLY;
691 IoTYPE(wstio) = IoTYPE_WRONLY;
692
693 if (!IoIFP(rstio) || !IoOFP(wstio)) {
694 if (IoIFP(rstio))
695 PerlIO_close(IoIFP(rstio));
696 else
697 PerlLIO_close(fd[0]);
698 if (IoOFP(wstio))
699 PerlIO_close(IoOFP(wstio));
700 else
701 PerlLIO_close(fd[1]);
702 goto badexit;
703 }
704#if defined(HAS_FCNTL) && defined(F_SETFD)
705 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
706 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
707#endif
708 RETPUSHYES;
709
710badexit:
711 RETPUSHUNDEF;
712#else
713 DIE(aTHX_ PL_no_func, "pipe");
714#endif
715}
716
717PP(pp_fileno)
718{
719 dVAR; dSP; dTARGET;
720 GV *gv;
721 IO *io;
722 PerlIO *fp;
723 const MAGIC *mg;
724
725 if (MAXARG < 1)
726 RETPUSHUNDEF;
727 gv = MUTABLE_GV(POPs);
728 io = GvIO(gv);
729
730 if (io
731 && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar)))
732 {
733 return tied_method0("FILENO", SP, MUTABLE_SV(io), mg);
734 }
735
736 if (!io || !(fp = IoIFP(io))) {
737 /* Can't do this because people seem to do things like
738 defined(fileno($foo)) to check whether $foo is a valid fh.
739
740 report_evil_fh(gv);
741 */
742 RETPUSHUNDEF;
743 }
744
745 PUSHi(PerlIO_fileno(fp));
746 RETURN;
747}
748
749PP(pp_umask)
750{
751 dVAR;
752 dSP;
753#ifdef HAS_UMASK
754 dTARGET;
755 Mode_t anum;
756
757 if (MAXARG < 1 || (!TOPs && !POPs)) {
758 anum = PerlLIO_umask(022);
759 /* setting it to 022 between the two calls to umask avoids
760 * to have a window where the umask is set to 0 -- meaning
761 * that another thread could create world-writeable files. */
762 if (anum != 022)
763 (void)PerlLIO_umask(anum);
764 }
765 else
766 anum = PerlLIO_umask(POPi);
767 TAINT_PROPER("umask");
768 XPUSHi(anum);
769#else
770 /* Only DIE if trying to restrict permissions on "user" (self).
771 * Otherwise it's harmless and more useful to just return undef
772 * since 'group' and 'other' concepts probably don't exist here. */
773 if (MAXARG >= 1 && (TOPs||POPs) && (POPi & 0700))
774 DIE(aTHX_ "umask not implemented");
775 XPUSHs(&PL_sv_undef);
776#endif
777 RETURN;
778}
779
780PP(pp_binmode)
781{
782 dVAR; dSP;
783 GV *gv;
784 IO *io;
785 PerlIO *fp;
786 SV *discp = NULL;
787
788 if (MAXARG < 1)
789 RETPUSHUNDEF;
790 if (MAXARG > 1) {
791 discp = POPs;
792 }
793
794 gv = MUTABLE_GV(POPs);
795 io = GvIO(gv);
796
797 if (io) {
798 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
799 if (mg) {
800 /* This takes advantage of the implementation of the varargs
801 function, which I don't think that the optimiser will be able to
802 figure out. Although, as it's a static function, in theory it
803 could. */
804 return Perl_tied_method(aTHX_ "BINMODE", SP, MUTABLE_SV(io), mg,
805 G_SCALAR|TIED_METHOD_MORTALIZE_NOT_NEEDED,
806 discp ? 1 : 0, discp);
807 }
808 }
809
810 if (!io || !(fp = IoIFP(io))) {
811 report_evil_fh(gv);
812 SETERRNO(EBADF,RMS_IFI);
813 RETPUSHUNDEF;
814 }
815
816 PUTBACK;
817 {
818 STRLEN len = 0;
819 const char *d = NULL;
820 int mode;
821 if (discp)
822 d = SvPV_const(discp, len);
823 mode = mode_from_discipline(d, len);
824 if (PerlIO_binmode(aTHX_ fp, IoTYPE(io), mode, d)) {
825 if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {
826 if (!PerlIO_binmode(aTHX_ IoOFP(io), IoTYPE(io), mode, d)) {
827 SPAGAIN;
828 RETPUSHUNDEF;
829 }
830 }
831 SPAGAIN;
832 RETPUSHYES;
833 }
834 else {
835 SPAGAIN;
836 RETPUSHUNDEF;
837 }
838 }
839}
840
841PP(pp_tie)
842{
843 dVAR; dSP; dMARK;
844 HV* stash;
845 GV *gv = NULL;
846 SV *sv;
847 const I32 markoff = MARK - PL_stack_base;
848 const char *methname;
849 int how = PERL_MAGIC_tied;
850 U32 items;
851 SV *varsv = *++MARK;
852
853 switch(SvTYPE(varsv)) {
854 case SVt_PVHV:
855 methname = "TIEHASH";
856 HvEITER_set(MUTABLE_HV(varsv), 0);
857 break;
858 case SVt_PVAV:
859 methname = "TIEARRAY";
860 if (!AvREAL(varsv)) {
861 if (!AvREIFY(varsv))
862 Perl_croak(aTHX_ "Cannot tie unreifiable array");
863 av_clear((AV *)varsv);
864 AvREIFY_off(varsv);
865 AvREAL_on(varsv);
866 }
867 break;
868 case SVt_PVGV:
869 case SVt_PVLV:
870 if (isGV_with_GP(varsv) && !SvFAKE(varsv)) {
871 methname = "TIEHANDLE";
872 how = PERL_MAGIC_tiedscalar;
873 /* For tied filehandles, we apply tiedscalar magic to the IO
874 slot of the GP rather than the GV itself. AMS 20010812 */
875 if (!GvIOp(varsv))
876 GvIOp(varsv) = newIO();
877 varsv = MUTABLE_SV(GvIOp(varsv));
878 break;
879 }
880 /* FALL THROUGH */
881 default:
882 methname = "TIESCALAR";
883 how = PERL_MAGIC_tiedscalar;
884 break;
885 }
886 items = SP - MARK++;
887 if (sv_isobject(*MARK)) { /* Calls GET magic. */
888 ENTER_with_name("call_TIE");
889 PUSHSTACKi(PERLSI_MAGIC);
890 PUSHMARK(SP);
891 EXTEND(SP,(I32)items);
892 while (items--)
893 PUSHs(*MARK++);
894 PUTBACK;
895 call_method(methname, G_SCALAR);
896 }
897 else {
898 /* Can't use call_method here, else this: fileno FOO; tie @a, "FOO"
899 * will attempt to invoke IO::File::TIEARRAY, with (best case) the
900 * wrong error message, and worse case, supreme action at a distance.
901 * (Sorry obfuscation writers. You're not going to be given this one.)
902 */
903 stash = gv_stashsv(*MARK, 0);
904 if (!stash || !(gv = gv_fetchmethod(stash, methname))) {
905 DIE(aTHX_ "Can't locate object method \"%s\" via package \"%"SVf"\"",
906 methname, SVfARG(SvOK(*MARK) ? *MARK : &PL_sv_no));
907 }
908 ENTER_with_name("call_TIE");
909 PUSHSTACKi(PERLSI_MAGIC);
910 PUSHMARK(SP);
911 EXTEND(SP,(I32)items);
912 while (items--)
913 PUSHs(*MARK++);
914 PUTBACK;
915 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
916 }
917 SPAGAIN;
918
919 sv = TOPs;
920 POPSTACK;
921 if (sv_isobject(sv)) {
922 sv_unmagic(varsv, how);
923 /* Croak if a self-tie on an aggregate is attempted. */
924 if (varsv == SvRV(sv) &&
925 (SvTYPE(varsv) == SVt_PVAV ||
926 SvTYPE(varsv) == SVt_PVHV))
927 Perl_croak(aTHX_
928 "Self-ties of arrays and hashes are not supported");
929 sv_magic(varsv, (SvRV(sv) == varsv ? NULL : sv), how, NULL, 0);
930 }
931 LEAVE_with_name("call_TIE");
932 SP = PL_stack_base + markoff;
933 PUSHs(sv);
934 RETURN;
935}
936
937PP(pp_untie)
938{
939 dVAR; dSP;
940 MAGIC *mg;
941 SV *sv = POPs;
942 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
943 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
944
945 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
946 RETPUSHYES;
947
948 if ((mg = SvTIED_mg(sv, how))) {
949 SV * const obj = SvRV(SvTIED_obj(sv, mg));
950 if (obj) {
951 GV * const gv = gv_fetchmethod_autoload(SvSTASH(obj), "UNTIE", FALSE);
952 CV *cv;
953 if (gv && isGV(gv) && (cv = GvCV(gv))) {
954 PUSHMARK(SP);
955 PUSHs(SvTIED_obj(MUTABLE_SV(gv), mg));
956 mXPUSHi(SvREFCNT(obj) - 1);
957 PUTBACK;
958 ENTER_with_name("call_UNTIE");
959 call_sv(MUTABLE_SV(cv), G_VOID);
960 LEAVE_with_name("call_UNTIE");
961 SPAGAIN;
962 }
963 else if (mg && SvREFCNT(obj) > 1) {
964 Perl_ck_warner(aTHX_ packWARN(WARN_UNTIE),
965 "untie attempted while %"UVuf" inner references still exist",
966 (UV)SvREFCNT(obj) - 1 ) ;
967 }
968 }
969 }
970 sv_unmagic(sv, how) ;
971 RETPUSHYES;
972}
973
974PP(pp_tied)
975{
976 dVAR;
977 dSP;
978 const MAGIC *mg;
979 SV *sv = POPs;
980 const char how = (SvTYPE(sv) == SVt_PVHV || SvTYPE(sv) == SVt_PVAV)
981 ? PERL_MAGIC_tied : PERL_MAGIC_tiedscalar;
982
983 if (isGV_with_GP(sv) && !SvFAKE(sv) && !(sv = MUTABLE_SV(GvIOp(sv))))
984 RETPUSHUNDEF;
985
986 if ((mg = SvTIED_mg(sv, how))) {
987 PUSHs(SvTIED_obj(sv, mg));
988 RETURN;
989 }
990 RETPUSHUNDEF;
991}
992
993PP(pp_dbmopen)
994{
995 dVAR; dSP;
996 dPOPPOPssrl;
997 HV* stash;
998 GV *gv = NULL;
999
1000 HV * const hv = MUTABLE_HV(POPs);
1001 SV * const sv = newSVpvs_flags("AnyDBM_File", SVs_TEMP);
1002 stash = gv_stashsv(sv, 0);
1003 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH"))) {
1004 PUTBACK;
1005 require_pv("AnyDBM_File.pm");
1006 SPAGAIN;
1007 if (!stash || !(gv = gv_fetchmethod(stash, "TIEHASH")))
1008 DIE(aTHX_ "No dbm on this machine");
1009 }
1010
1011 ENTER;
1012 PUSHMARK(SP);
1013
1014 EXTEND(SP, 5);
1015 PUSHs(sv);
1016 PUSHs(left);
1017 if (SvIV(right))
1018 mPUSHu(O_RDWR|O_CREAT);
1019 else
1020 {
1021 mPUSHu(O_RDWR);
1022 if (!SvOK(right)) right = &PL_sv_no;
1023 }
1024 PUSHs(right);
1025 PUTBACK;
1026 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1027 SPAGAIN;
1028
1029 if (!sv_isobject(TOPs)) {
1030 SP--;
1031 PUSHMARK(SP);
1032 PUSHs(sv);
1033 PUSHs(left);
1034 mPUSHu(O_RDONLY);
1035 PUSHs(right);
1036 PUTBACK;
1037 call_sv(MUTABLE_SV(GvCV(gv)), G_SCALAR);
1038 SPAGAIN;
1039 }
1040
1041 if (sv_isobject(TOPs)) {
1042 sv_unmagic(MUTABLE_SV(hv), PERL_MAGIC_tied);
1043 sv_magic(MUTABLE_SV(hv), TOPs, PERL_MAGIC_tied, NULL, 0);
1044 }
1045 LEAVE;
1046 RETURN;
1047}
1048
1049PP(pp_sselect)
1050{
1051#ifdef HAS_SELECT
1052 dVAR; dSP; dTARGET;
1053 register I32 i;
1054 register I32 j;
1055 register char *s;
1056 register SV *sv;
1057 NV value;
1058 I32 maxlen = 0;
1059 I32 nfound;
1060 struct timeval timebuf;
1061 struct timeval *tbuf = &timebuf;
1062 I32 growsize;
1063 char *fd_sets[4];
1064#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1065 I32 masksize;
1066 I32 offset;
1067 I32 k;
1068
1069# if BYTEORDER & 0xf0000
1070# define ORDERBYTE (0x88888888 - BYTEORDER)
1071# else
1072# define ORDERBYTE (0x4444 - BYTEORDER)
1073# endif
1074
1075#endif
1076
1077 SP -= 4;
1078 for (i = 1; i <= 3; i++) {
1079 SV * const sv = SP[i];
1080 SvGETMAGIC(sv);
1081 if (!SvOK(sv))
1082 continue;
1083 if (SvREADONLY(sv)) {
1084 if (SvIsCOW(sv))
1085 sv_force_normal_flags(sv, 0);
1086 if (SvREADONLY(sv) && !(SvPOK(sv) && SvCUR(sv) == 0))
1087 Perl_croak_no_modify(aTHX);
1088 }
1089 if (!SvPOK(sv)) {
1090 if (!SvPOKp(sv))
1091 Perl_ck_warner(aTHX_ packWARN(WARN_MISC),
1092 "Non-string passed as bitmask");
1093 SvPV_force_nomg_nolen(sv); /* force string conversion */
1094 }
1095 j = SvCUR(sv);
1096 if (maxlen < j)
1097 maxlen = j;
1098 }
1099
1100/* little endians can use vecs directly */
1101#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1102# ifdef NFDBITS
1103
1104# ifndef NBBY
1105# define NBBY 8
1106# endif
1107
1108 masksize = NFDBITS / NBBY;
1109# else
1110 masksize = sizeof(long); /* documented int, everyone seems to use long */
1111# endif
1112 Zero(&fd_sets[0], 4, char*);
1113#endif
1114
1115# if SELECT_MIN_BITS == 1
1116 growsize = sizeof(fd_set);
1117# else
1118# if defined(__GLIBC__) && defined(__FD_SETSIZE)
1119# undef SELECT_MIN_BITS
1120# define SELECT_MIN_BITS __FD_SETSIZE
1121# endif
1122 /* If SELECT_MIN_BITS is greater than one we most probably will want
1123 * to align the sizes with SELECT_MIN_BITS/8 because for example
1124 * in many little-endian (Intel, Alpha) systems (Linux, OS/2, Digital
1125 * UNIX, Solaris, NeXT, Darwin) the smallest quantum select() operates
1126 * on (sets/tests/clears bits) is 32 bits. */
1127 growsize = maxlen + (SELECT_MIN_BITS/8 - (maxlen % (SELECT_MIN_BITS/8)));
1128# endif
1129
1130 sv = SP[4];
1131 if (SvOK(sv)) {
1132 value = SvNV(sv);
1133 if (value < 0.0)
1134 value = 0.0;
1135 timebuf.tv_sec = (long)value;
1136 value -= (NV)timebuf.tv_sec;
1137 timebuf.tv_usec = (long)(value * 1000000.0);
1138 }
1139 else
1140 tbuf = NULL;
1141
1142 for (i = 1; i <= 3; i++) {
1143 sv = SP[i];
1144 if (!SvOK(sv) || SvCUR(sv) == 0) {
1145 fd_sets[i] = 0;
1146 continue;
1147 }
1148 assert(SvPOK(sv));
1149 j = SvLEN(sv);
1150 if (j < growsize) {
1151 Sv_Grow(sv, growsize);
1152 }
1153 j = SvCUR(sv);
1154 s = SvPVX(sv) + j;
1155 while (++j <= growsize) {
1156 *s++ = '\0';
1157 }
1158
1159#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1160 s = SvPVX(sv);
1161 Newx(fd_sets[i], growsize, char);
1162 for (offset = 0; offset < growsize; offset += masksize) {
1163 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1164 fd_sets[i][j+offset] = s[(k % masksize) + offset];
1165 }
1166#else
1167 fd_sets[i] = SvPVX(sv);
1168#endif
1169 }
1170
1171#ifdef PERL_IRIX5_SELECT_TIMEVAL_VOID_CAST
1172 /* Can't make just the (void*) conditional because that would be
1173 * cpp #if within cpp macro, and not all compilers like that. */
1174 nfound = PerlSock_select(
1175 maxlen * 8,
1176 (Select_fd_set_t) fd_sets[1],
1177 (Select_fd_set_t) fd_sets[2],
1178 (Select_fd_set_t) fd_sets[3],
1179 (void*) tbuf); /* Workaround for compiler bug. */
1180#else
1181 nfound = PerlSock_select(
1182 maxlen * 8,
1183 (Select_fd_set_t) fd_sets[1],
1184 (Select_fd_set_t) fd_sets[2],
1185 (Select_fd_set_t) fd_sets[3],
1186 tbuf);
1187#endif
1188 for (i = 1; i <= 3; i++) {
1189 if (fd_sets[i]) {
1190 sv = SP[i];
1191#if BYTEORDER != 0x1234 && BYTEORDER != 0x12345678
1192 s = SvPVX(sv);
1193 for (offset = 0; offset < growsize; offset += masksize) {
1194 for (j = 0, k=ORDERBYTE; j < masksize; j++, (k >>= 4))
1195 s[(k % masksize) + offset] = fd_sets[i][j+offset];
1196 }
1197 Safefree(fd_sets[i]);
1198#endif
1199 SvSETMAGIC(sv);
1200 }
1201 }
1202
1203 PUSHi(nfound);
1204 if (GIMME == G_ARRAY && tbuf) {
1205 value = (NV)(timebuf.tv_sec) +
1206 (NV)(timebuf.tv_usec) / 1000000.0;
1207 mPUSHn(value);
1208 }
1209 RETURN;
1210#else
1211 DIE(aTHX_ "select not implemented");
1212#endif
1213}
1214
1215/*
1216=for apidoc setdefout
1217
1218Sets PL_defoutgv, the default file handle for output, to the passed in
1219typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
1220count of the passed in typeglob is increased by one, and the reference count
1221of the typeglob that PL_defoutgv points to is decreased by one.
1222
1223=cut
1224*/
1225
1226void
1227Perl_setdefout(pTHX_ GV *gv)
1228{
1229 dVAR;
1230 SvREFCNT_inc_simple_void(gv);
1231 SvREFCNT_dec(PL_defoutgv);
1232 PL_defoutgv = gv;
1233}
1234
1235PP(pp_select)
1236{
1237 dVAR; dSP; dTARGET;
1238 HV *hv;
1239 GV * const newdefout = (PL_op->op_private > 0) ? (MUTABLE_GV(POPs)) : NULL;
1240 GV * egv = GvEGVx(PL_defoutgv);
1241 GV * const *gvp;
1242
1243 if (!egv)
1244 egv = PL_defoutgv;
1245 hv = isGV_with_GP(egv) ? GvSTASH(egv) : NULL;
1246 gvp = hv && HvENAME(hv)
1247 ? (GV**)hv_fetch(hv, GvNAME(egv), HEK_UTF8(GvNAME_HEK(egv)) ? -GvNAMELEN(egv) : GvNAMELEN(egv), FALSE)
1248 : NULL;
1249 if (gvp && *gvp == egv) {
1250 gv_efullname4(TARG, PL_defoutgv, NULL, TRUE);
1251 XPUSHTARG;
1252 }
1253 else {
1254 mXPUSHs(newRV(MUTABLE_SV(egv)));
1255 }
1256
1257 if (newdefout) {
1258 if (!GvIO(newdefout))
1259 gv_IOadd(newdefout);
1260 setdefout(newdefout);
1261 }
1262
1263 RETURN;
1264}
1265
1266PP(pp_getc)
1267{
1268 dVAR; dSP; dTARGET;
1269 GV * const gv =
1270 MAXARG==0 || (!TOPs && !POPs) ? PL_stdingv : MUTABLE_GV(POPs);
1271 IO *const io = GvIO(gv);
1272
1273 if (MAXARG == 0)
1274 EXTEND(SP, 1);
1275
1276 if (io) {
1277 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1278 if (mg) {
1279 const U32 gimme = GIMME_V;
1280 Perl_tied_method(aTHX_ "GETC", SP, MUTABLE_SV(io), mg, gimme, 0);
1281 if (gimme == G_SCALAR) {
1282 SPAGAIN;
1283 SvSetMagicSV_nosteal(TARG, TOPs);
1284 }
1285 return NORMAL;
1286 }
1287 }
1288 if (!gv || do_eof(gv)) { /* make sure we have fp with something */
1289 if (!io || (!IoIFP(io) && IoTYPE(io) != IoTYPE_WRONLY))
1290 report_evil_fh(gv);
1291 SETERRNO(EBADF,RMS_IFI);
1292 RETPUSHUNDEF;
1293 }
1294 TAINT;
1295 sv_setpvs(TARG, " ");
1296 *SvPVX(TARG) = PerlIO_getc(IoIFP(GvIOp(gv))); /* should never be EOF */
1297 if (PerlIO_isutf8(IoIFP(GvIOp(gv)))) {
1298 /* Find out how many bytes the char needs */
1299 Size_t len = UTF8SKIP(SvPVX_const(TARG));
1300 if (len > 1) {
1301 SvGROW(TARG,len+1);
1302 len = PerlIO_read(IoIFP(GvIOp(gv)),SvPVX(TARG)+1,len-1);
1303 SvCUR_set(TARG,1+len);
1304 }
1305 SvUTF8_on(TARG);
1306 }
1307 PUSHTARG;
1308 RETURN;
1309}
1310
1311STATIC OP *
1312S_doform(pTHX_ CV *cv, GV *gv, OP *retop)
1313{
1314 dVAR;
1315 register PERL_CONTEXT *cx;
1316 const I32 gimme = GIMME_V;
1317
1318 PERL_ARGS_ASSERT_DOFORM;
1319
1320 if (cv && CvCLONE(cv))
1321 cv = MUTABLE_CV(sv_2mortal(MUTABLE_SV(cv_clone(cv))));
1322
1323 ENTER;
1324 SAVETMPS;
1325
1326 PUSHBLOCK(cx, CXt_FORMAT, PL_stack_sp);
1327 PUSHFORMAT(cx, retop);
1328 SAVECOMPPAD();
1329 PAD_SET_CUR_NOSAVE(CvPADLIST(cv), 1);
1330
1331 setdefout(gv); /* locally select filehandle so $% et al work */
1332 return CvSTART(cv);
1333}
1334
1335PP(pp_enterwrite)
1336{
1337 dVAR;
1338 dSP;
1339 register GV *gv;
1340 register IO *io;
1341 GV *fgv;
1342 CV *cv = NULL;
1343 SV *tmpsv = NULL;
1344
1345 if (MAXARG == 0) {
1346 gv = PL_defoutgv;
1347 EXTEND(SP, 1);
1348 }
1349 else {
1350 gv = MUTABLE_GV(POPs);
1351 if (!gv)
1352 gv = PL_defoutgv;
1353 }
1354 io = GvIO(gv);
1355 if (!io) {
1356 RETPUSHNO;
1357 }
1358 if (IoFMT_GV(io))
1359 fgv = IoFMT_GV(io);
1360 else
1361 fgv = gv;
1362
1363 if (!fgv)
1364 goto not_a_format_reference;
1365
1366 cv = GvFORM(fgv);
1367 if (!cv) {
1368 tmpsv = sv_newmortal();
1369 gv_efullname4(tmpsv, fgv, NULL, FALSE);
1370 if (SvPOK(tmpsv) && *SvPV_nolen_const(tmpsv))
1371 DIE(aTHX_ "Undefined format \"%"SVf"\" called", SVfARG(tmpsv));
1372
1373 not_a_format_reference:
1374 DIE(aTHX_ "Not a format reference");
1375 }
1376 IoFLAGS(io) &= ~IOf_DIDTOP;
1377 return doform(cv,gv,PL_op->op_next);
1378}
1379
1380PP(pp_leavewrite)
1381{
1382 dVAR; dSP;
1383 GV * const gv = cxstack[cxstack_ix].blk_format.gv;
1384 register IO * const io = GvIOp(gv);
1385 PerlIO *ofp;
1386 PerlIO *fp;
1387 SV **newsp;
1388 I32 gimme;
1389 register PERL_CONTEXT *cx;
1390 OP *retop;
1391
1392 if (!io || !(ofp = IoOFP(io)))
1393 goto forget_top;
1394
1395 DEBUG_f(PerlIO_printf(Perl_debug_log, "left=%ld, todo=%ld\n",
1396 (long)IoLINES_LEFT(io), (long)FmLINES(PL_formtarget)));
1397
1398 if (IoLINES_LEFT(io) < FmLINES(PL_formtarget) &&
1399 PL_formtarget != PL_toptarget)
1400 {
1401 GV *fgv;
1402 CV *cv;
1403 if (!IoTOP_GV(io)) {
1404 GV *topgv;
1405
1406 if (!IoTOP_NAME(io)) {
1407 SV *topname;
1408 if (!IoFMT_NAME(io))
1409 IoFMT_NAME(io) = savepv(GvNAME(gv));
1410 topname = sv_2mortal(Perl_newSVpvf(aTHX_ "%"HEKf"_TOP",
1411 HEKfARG(GvNAME_HEK(gv))));
1412 topgv = gv_fetchsv(topname, 0, SVt_PVFM);
1413 if ((topgv && GvFORM(topgv)) ||
1414 !gv_fetchpvs("top", GV_NOTQUAL, SVt_PVFM))
1415 IoTOP_NAME(io) = savesvpv(topname);
1416 else
1417 IoTOP_NAME(io) = savepvs("top");
1418 }
1419 topgv = gv_fetchpv(IoTOP_NAME(io), 0, SVt_PVFM);
1420 if (!topgv || !GvFORM(topgv)) {
1421 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1422 goto forget_top;
1423 }
1424 IoTOP_GV(io) = topgv;
1425 }
1426 if (IoFLAGS(io) & IOf_DIDTOP) { /* Oh dear. It still doesn't fit. */
1427 I32 lines = IoLINES_LEFT(io);
1428 const char *s = SvPVX_const(PL_formtarget);
1429 if (lines <= 0) /* Yow, header didn't even fit!!! */
1430 goto forget_top;
1431 while (lines-- > 0) {
1432 s = strchr(s, '\n');
1433 if (!s)
1434 break;
1435 s++;
1436 }
1437 if (s) {
1438 const STRLEN save = SvCUR(PL_formtarget);
1439 SvCUR_set(PL_formtarget, s - SvPVX_const(PL_formtarget));
1440 do_print(PL_formtarget, ofp);
1441 SvCUR_set(PL_formtarget, save);
1442 sv_chop(PL_formtarget, s);
1443 FmLINES(PL_formtarget) -= IoLINES_LEFT(io);
1444 }
1445 }
1446 if (IoLINES_LEFT(io) >= 0 && IoPAGE(io) > 0)
1447 do_print(PL_formfeed, ofp);
1448 IoLINES_LEFT(io) = IoPAGE_LEN(io);
1449 IoPAGE(io)++;
1450 PL_formtarget = PL_toptarget;
1451 IoFLAGS(io) |= IOf_DIDTOP;
1452 fgv = IoTOP_GV(io);
1453 if (!fgv)
1454 DIE(aTHX_ "bad top format reference");
1455 cv = GvFORM(fgv);
1456 if (!cv) {
1457 SV * const sv = sv_newmortal();
1458 gv_efullname4(sv, fgv, NULL, FALSE);
1459 if (SvPOK(sv) && *SvPV_nolen_const(sv))
1460 DIE(aTHX_ "Undefined top format \"%"SVf"\" called", SVfARG(sv));
1461 else
1462 DIE(aTHX_ "Undefined top format called");
1463 }
1464 return doform(cv, gv, PL_op);
1465 }
1466
1467 forget_top:
1468 POPBLOCK(cx,PL_curpm);
1469 POPFORMAT(cx);
1470 retop = cx->blk_sub.retop;
1471 LEAVE;
1472
1473 fp = IoOFP(io);
1474 if (!fp) {
1475 if (IoIFP(io))
1476 report_wrongway_fh(gv, '<');
1477 else
1478 report_evil_fh(gv);
1479 PUSHs(&PL_sv_no);
1480 }
1481 else {
1482 if ((IoLINES_LEFT(io) -= FmLINES(PL_formtarget)) < 0) {
1483 Perl_ck_warner(aTHX_ packWARN(WARN_IO), "page overflow");
1484 }
1485 if (!do_print(PL_formtarget, fp))
1486 PUSHs(&PL_sv_no);
1487 else {
1488 FmLINES(PL_formtarget) = 0;
1489 SvCUR_set(PL_formtarget, 0);
1490 *SvEND(PL_formtarget) = '\0';
1491 if (IoFLAGS(io) & IOf_FLUSH)
1492 (void)PerlIO_flush(fp);
1493 PUSHs(&PL_sv_yes);
1494 }
1495 }
1496 /* bad_ofp: */
1497 PL_formtarget = PL_bodytarget;
1498 PUTBACK;
1499 PERL_UNUSED_VAR(newsp);
1500 PERL_UNUSED_VAR(gimme);
1501 return retop;
1502}
1503
1504PP(pp_prtf)
1505{
1506 dVAR; dSP; dMARK; dORIGMARK;
1507 PerlIO *fp;
1508 SV *sv;
1509
1510 GV * const gv
1511 = (PL_op->op_flags & OPf_STACKED) ? MUTABLE_GV(*++MARK) : PL_defoutgv;
1512 IO *const io = GvIO(gv);
1513
1514 if (io) {
1515 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1516 if (mg) {
1517 if (MARK == ORIGMARK) {
1518 MEXTEND(SP, 1);
1519 ++MARK;
1520 Move(MARK, MARK + 1, (SP - MARK) + 1, SV*);
1521 ++SP;
1522 }
1523 return Perl_tied_method(aTHX_ "PRINTF", mark - 1, MUTABLE_SV(io),
1524 mg,
1525 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1526 sp - mark);
1527 }
1528 }
1529
1530 sv = newSV(0);
1531 if (!io) {
1532 report_evil_fh(gv);
1533 SETERRNO(EBADF,RMS_IFI);
1534 goto just_say_no;
1535 }
1536 else if (!(fp = IoOFP(io))) {
1537 if (IoIFP(io))
1538 report_wrongway_fh(gv, '<');
1539 else if (ckWARN(WARN_CLOSED))
1540 report_evil_fh(gv);
1541 SETERRNO(EBADF,IoIFP(io)?RMS_FAC:RMS_IFI);
1542 goto just_say_no;
1543 }
1544 else {
1545 do_sprintf(sv, SP - MARK, MARK + 1);
1546 if (!do_print(sv, fp))
1547 goto just_say_no;
1548
1549 if (IoFLAGS(io) & IOf_FLUSH)
1550 if (PerlIO_flush(fp) == EOF)
1551 goto just_say_no;
1552 }
1553 SvREFCNT_dec(sv);
1554 SP = ORIGMARK;
1555 PUSHs(&PL_sv_yes);
1556 RETURN;
1557
1558 just_say_no:
1559 SvREFCNT_dec(sv);
1560 SP = ORIGMARK;
1561 PUSHs(&PL_sv_undef);
1562 RETURN;
1563}
1564
1565PP(pp_sysopen)
1566{
1567 dVAR;
1568 dSP;
1569 const int perm = (MAXARG > 3 && (TOPs || POPs)) ? POPi : 0666;
1570 const int mode = POPi;
1571 SV * const sv = POPs;
1572 GV * const gv = MUTABLE_GV(POPs);
1573 STRLEN len;
1574
1575 /* Need TIEHANDLE method ? */
1576 const char * const tmps = SvPV_const(sv, len);
1577 /* FIXME? do_open should do const */
1578 if (do_open(gv, tmps, len, TRUE, mode, perm, NULL)) {
1579 IoLINES(GvIOp(gv)) = 0;
1580 PUSHs(&PL_sv_yes);
1581 }
1582 else {
1583 PUSHs(&PL_sv_undef);
1584 }
1585 RETURN;
1586}
1587
1588PP(pp_sysread)
1589{
1590 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1591 SSize_t offset;
1592 IO *io;
1593 char *buffer;
1594 STRLEN orig_size;
1595 SSize_t length;
1596 SSize_t count;
1597 SV *bufsv;
1598 STRLEN blen;
1599 int fp_utf8;
1600 int buffer_utf8;
1601 SV *read_target;
1602 Size_t got = 0;
1603 Size_t wanted;
1604 bool charstart = FALSE;
1605 STRLEN charskip = 0;
1606 STRLEN skip = 0;
1607
1608 GV * const gv = MUTABLE_GV(*++MARK);
1609 if ((PL_op->op_type == OP_READ || PL_op->op_type == OP_SYSREAD)
1610 && gv && (io = GvIO(gv)) )
1611 {
1612 const MAGIC *const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1613 if (mg) {
1614 return Perl_tied_method(aTHX_ "READ", mark - 1, MUTABLE_SV(io), mg,
1615 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1616 sp - mark);
1617 }
1618 }
1619
1620 if (!gv)
1621 goto say_undef;
1622 bufsv = *++MARK;
1623 if (! SvOK(bufsv))
1624 sv_setpvs(bufsv, "");
1625 length = SvIVx(*++MARK);
1626 SETERRNO(0,0);
1627 if (MARK < SP)
1628 offset = SvIVx(*++MARK);
1629 else
1630 offset = 0;
1631 io = GvIO(gv);
1632 if (!io || !IoIFP(io)) {
1633 report_evil_fh(gv);
1634 SETERRNO(EBADF,RMS_IFI);
1635 goto say_undef;
1636 }
1637 if ((fp_utf8 = PerlIO_isutf8(IoIFP(io))) && !IN_BYTES) {
1638 buffer = SvPVutf8_force(bufsv, blen);
1639 /* UTF-8 may not have been set if they are all low bytes */
1640 SvUTF8_on(bufsv);
1641 buffer_utf8 = 0;
1642 }
1643 else {
1644 buffer = SvPV_force(bufsv, blen);
1645 buffer_utf8 = !IN_BYTES && SvUTF8(bufsv);
1646 }
1647 if (length < 0)
1648 DIE(aTHX_ "Negative length");
1649 wanted = length;
1650
1651 charstart = TRUE;
1652 charskip = 0;
1653 skip = 0;
1654
1655#ifdef HAS_SOCKET
1656 if (PL_op->op_type == OP_RECV) {
1657 Sock_size_t bufsize;
1658 char namebuf[MAXPATHLEN];
1659#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
1660 bufsize = sizeof (struct sockaddr_in);
1661#else
1662 bufsize = sizeof namebuf;
1663#endif
1664#ifdef OS2 /* At least Warp3+IAK: only the first byte of bufsize set */
1665 if (bufsize >= 256)
1666 bufsize = 255;
1667#endif
1668 buffer = SvGROW(bufsv, (STRLEN)(length+1));
1669 /* 'offset' means 'flags' here */
1670 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, offset,
1671 (struct sockaddr *)namebuf, &bufsize);
1672 if (count < 0)
1673 RETPUSHUNDEF;
1674 /* MSG_TRUNC can give oversized count; quietly lose it */
1675 if (count > length)
1676 count = length;
1677#ifdef EPOC
1678 /* Bogus return without padding */
1679 bufsize = sizeof (struct sockaddr_in);
1680#endif
1681 SvCUR_set(bufsv, count);
1682 *SvEND(bufsv) = '\0';
1683 (void)SvPOK_only(bufsv);
1684 if (fp_utf8)
1685 SvUTF8_on(bufsv);
1686 SvSETMAGIC(bufsv);
1687 /* This should not be marked tainted if the fp is marked clean */
1688 if (!(IoFLAGS(io) & IOf_UNTAINT))
1689 SvTAINTED_on(bufsv);
1690 SP = ORIGMARK;
1691 sv_setpvn(TARG, namebuf, bufsize);
1692 PUSHs(TARG);
1693 RETURN;
1694 }
1695#endif
1696 if (DO_UTF8(bufsv)) {
1697 /* offset adjust in characters not bytes */
1698 blen = sv_len_utf8(bufsv);
1699 }
1700 if (offset < 0) {
1701 if (-offset > (SSize_t)blen)
1702 DIE(aTHX_ "Offset outside string");
1703 offset += blen;
1704 }
1705 if (DO_UTF8(bufsv)) {
1706 /* convert offset-as-chars to offset-as-bytes */
1707 if (offset >= (int)blen)
1708 offset += SvCUR(bufsv) - blen;
1709 else
1710 offset = utf8_hop((U8 *)buffer,offset) - (U8 *) buffer;
1711 }
1712 more_bytes:
1713 orig_size = SvCUR(bufsv);
1714 /* Allocating length + offset + 1 isn't perfect in the case of reading
1715 bytes from a byte file handle into a UTF8 buffer, but it won't harm us
1716 unduly.
1717 (should be 2 * length + offset + 1, or possibly something longer if
1718 PL_encoding is true) */
1719 buffer = SvGROW(bufsv, (STRLEN)(length+offset+1));
1720 if (offset > 0 && offset > (SSize_t)orig_size) { /* Zero any newly allocated space */
1721 Zero(buffer+orig_size, offset-orig_size, char);
1722 }
1723 buffer = buffer + offset;
1724 if (!buffer_utf8) {
1725 read_target = bufsv;
1726 } else {
1727 /* Best to read the bytes into a new SV, upgrade that to UTF8, then
1728 concatenate it to the current buffer. */
1729
1730 /* Truncate the existing buffer to the start of where we will be
1731 reading to: */
1732 SvCUR_set(bufsv, offset);
1733
1734 read_target = sv_newmortal();
1735 SvUPGRADE(read_target, SVt_PV);
1736 buffer = SvGROW(read_target, (STRLEN)(length + 1));
1737 }
1738
1739 if (PL_op->op_type == OP_SYSREAD) {
1740#ifdef PERL_SOCK_SYSREAD_IS_RECV
1741 if (IoTYPE(io) == IoTYPE_SOCKET) {
1742 count = PerlSock_recv(PerlIO_fileno(IoIFP(io)),
1743 buffer, length, 0);
1744 }
1745 else
1746#endif
1747 {
1748 count = PerlLIO_read(PerlIO_fileno(IoIFP(io)),
1749 buffer, length);
1750 }
1751 }
1752 else
1753#ifdef HAS_SOCKET__bad_code_maybe
1754 if (IoTYPE(io) == IoTYPE_SOCKET) {
1755 Sock_size_t bufsize;
1756 char namebuf[MAXPATHLEN];
1757#if defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)
1758 bufsize = sizeof (struct sockaddr_in);
1759#else
1760 bufsize = sizeof namebuf;
1761#endif
1762 count = PerlSock_recvfrom(PerlIO_fileno(IoIFP(io)), buffer, length, 0,
1763 (struct sockaddr *)namebuf, &bufsize);
1764 }
1765 else
1766#endif
1767 {
1768 count = PerlIO_read(IoIFP(io), buffer, length);
1769 /* PerlIO_read() - like fread() returns 0 on both error and EOF */
1770 if (count == 0 && PerlIO_error(IoIFP(io)))
1771 count = -1;
1772 }
1773 if (count < 0) {
1774 if (IoTYPE(io) == IoTYPE_WRONLY)
1775 report_wrongway_fh(gv, '>');
1776 goto say_undef;
1777 }
1778 SvCUR_set(read_target, count+(buffer - SvPVX_const(read_target)));
1779 *SvEND(read_target) = '\0';
1780 (void)SvPOK_only(read_target);
1781 if (fp_utf8 && !IN_BYTES) {
1782 /* Look at utf8 we got back and count the characters */
1783 const char *bend = buffer + count;
1784 while (buffer < bend) {
1785 if (charstart) {
1786 skip = UTF8SKIP(buffer);
1787 charskip = 0;
1788 }
1789 if (buffer - charskip + skip > bend) {
1790 /* partial character - try for rest of it */
1791 length = skip - (bend-buffer);
1792 offset = bend - SvPVX_const(bufsv);
1793 charstart = FALSE;
1794 charskip += count;
1795 goto more_bytes;
1796 }
1797 else {
1798 got++;
1799 buffer += skip;
1800 charstart = TRUE;
1801 charskip = 0;
1802 }
1803 }
1804 /* If we have not 'got' the number of _characters_ we 'wanted' get some more
1805 provided amount read (count) was what was requested (length)
1806 */
1807 if (got < wanted && count == length) {
1808 length = wanted - got;
1809 offset = bend - SvPVX_const(bufsv);
1810 goto more_bytes;
1811 }
1812 /* return value is character count */
1813 count = got;
1814 SvUTF8_on(bufsv);
1815 }
1816 else if (buffer_utf8) {
1817 /* Let svcatsv upgrade the bytes we read in to utf8.
1818 The buffer is a mortal so will be freed soon. */
1819 sv_catsv_nomg(bufsv, read_target);
1820 }
1821 SvSETMAGIC(bufsv);
1822 /* This should not be marked tainted if the fp is marked clean */
1823 if (!(IoFLAGS(io) & IOf_UNTAINT))
1824 SvTAINTED_on(bufsv);
1825 SP = ORIGMARK;
1826 PUSHi(count);
1827 RETURN;
1828
1829 say_undef:
1830 SP = ORIGMARK;
1831 RETPUSHUNDEF;
1832}
1833
1834PP(pp_syswrite)
1835{
1836 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
1837 SV *bufsv;
1838 const char *buffer;
1839 SSize_t retval;
1840 STRLEN blen;
1841 STRLEN orig_blen_bytes;
1842 const int op_type = PL_op->op_type;
1843 bool doing_utf8;
1844 U8 *tmpbuf = NULL;
1845 GV *const gv = MUTABLE_GV(*++MARK);
1846 IO *const io = GvIO(gv);
1847
1848 if (op_type == OP_SYSWRITE && io) {
1849 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
1850 if (mg) {
1851 if (MARK == SP - 1) {
1852 SV *sv = *SP;
1853 mXPUSHi(sv_len(sv));
1854 PUTBACK;
1855 }
1856
1857 return Perl_tied_method(aTHX_ "WRITE", mark - 1, MUTABLE_SV(io), mg,
1858 G_SCALAR | TIED_METHOD_ARGUMENTS_ON_STACK,
1859 sp - mark);
1860 }
1861 }
1862 if (!gv)
1863 goto say_undef;
1864
1865 bufsv = *++MARK;
1866
1867 SETERRNO(0,0);
1868 if (!io || !IoIFP(io) || IoTYPE(io) == IoTYPE_RDONLY) {
1869 retval = -1;
1870 if (io && IoIFP(io))
1871 report_wrongway_fh(gv, '<');
1872 else
1873 report_evil_fh(gv);
1874 SETERRNO(EBADF,RMS_IFI);
1875 goto say_undef;
1876 }
1877
1878 /* Do this first to trigger any overloading. */
1879 buffer = SvPV_const(bufsv, blen);
1880 orig_blen_bytes = blen;
1881 doing_utf8 = DO_UTF8(bufsv);
1882
1883 if (PerlIO_isutf8(IoIFP(io))) {
1884 if (!SvUTF8(bufsv)) {
1885 /* We don't modify the original scalar. */
1886 tmpbuf = bytes_to_utf8((const U8*) buffer, &blen);
1887 buffer = (char *) tmpbuf;
1888 doing_utf8 = TRUE;
1889 }
1890 }
1891 else if (doing_utf8) {
1892 STRLEN tmplen = blen;
1893 U8 * const result = bytes_from_utf8((const U8*) buffer, &tmplen, &doing_utf8);
1894 if (!doing_utf8) {
1895 tmpbuf = result;
1896 buffer = (char *) tmpbuf;
1897 blen = tmplen;
1898 }
1899 else {
1900 assert((char *)result == buffer);
1901 Perl_croak(aTHX_ "Wide character in %s", OP_DESC(PL_op));
1902 }
1903 }
1904
1905#ifdef HAS_SOCKET
1906 if (op_type == OP_SEND) {
1907 const int flags = SvIVx(*++MARK);
1908 if (SP > MARK) {
1909 STRLEN mlen;
1910 char * const sockbuf = SvPVx(*++MARK, mlen);
1911 retval = PerlSock_sendto(PerlIO_fileno(IoIFP(io)), buffer, blen,
1912 flags, (struct sockaddr *)sockbuf, mlen);
1913 }
1914 else {
1915 retval
1916 = PerlSock_send(PerlIO_fileno(IoIFP(io)), buffer, blen, flags);
1917 }
1918 }
1919 else
1920#endif
1921 {
1922 Size_t length = 0; /* This length is in characters. */
1923 STRLEN blen_chars;
1924 IV offset;
1925
1926 if (doing_utf8) {
1927 if (tmpbuf) {
1928 /* The SV is bytes, and we've had to upgrade it. */
1929 blen_chars = orig_blen_bytes;
1930 } else {
1931 /* The SV really is UTF-8. */
1932 if (SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1933 /* Don't call sv_len_utf8 again because it will call magic
1934 or overloading a second time, and we might get back a
1935 different result. */
1936 blen_chars = utf8_length((U8*)buffer, (U8*)buffer + blen);
1937 } else {
1938 /* It's safe, and it may well be cached. */
1939 blen_chars = sv_len_utf8(bufsv);
1940 }
1941 }
1942 } else {
1943 blen_chars = blen;
1944 }
1945
1946 if (MARK >= SP) {
1947 length = blen_chars;
1948 } else {
1949#if Size_t_size > IVSIZE
1950 length = (Size_t)SvNVx(*++MARK);
1951#else
1952 length = (Size_t)SvIVx(*++MARK);
1953#endif
1954 if ((SSize_t)length < 0) {
1955 Safefree(tmpbuf);
1956 DIE(aTHX_ "Negative length");
1957 }
1958 }
1959
1960 if (MARK < SP) {
1961 offset = SvIVx(*++MARK);
1962 if (offset < 0) {
1963 if (-offset > (IV)blen_chars) {
1964 Safefree(tmpbuf);
1965 DIE(aTHX_ "Offset outside string");
1966 }
1967 offset += blen_chars;
1968 } else if (offset > (IV)blen_chars) {
1969 Safefree(tmpbuf);
1970 DIE(aTHX_ "Offset outside string");
1971 }
1972 } else
1973 offset = 0;
1974 if (length > blen_chars - offset)
1975 length = blen_chars - offset;
1976 if (doing_utf8) {
1977 /* Here we convert length from characters to bytes. */
1978 if (tmpbuf || SvGMAGICAL(bufsv) || SvAMAGIC(bufsv)) {
1979 /* Either we had to convert the SV, or the SV is magical, or
1980 the SV has overloading, in which case we can't or mustn't
1981 or mustn't call it again. */
1982
1983 buffer = (const char*)utf8_hop((const U8 *)buffer, offset);
1984 length = utf8_hop((U8 *)buffer, length) - (U8 *)buffer;
1985 } else {
1986 /* It's a real UTF-8 SV, and it's not going to change under
1987 us. Take advantage of any cache. */
1988 I32 start = offset;
1989 I32 len_I32 = length;
1990
1991 /* Convert the start and end character positions to bytes.
1992 Remember that the second argument to sv_pos_u2b is relative
1993 to the first. */
1994 sv_pos_u2b(bufsv, &start, &len_I32);
1995
1996 buffer += start;
1997 length = len_I32;
1998 }
1999 }
2000 else {
2001 buffer = buffer+offset;
2002 }
2003#ifdef PERL_SOCK_SYSWRITE_IS_SEND
2004 if (IoTYPE(io) == IoTYPE_SOCKET) {
2005 retval = PerlSock_send(PerlIO_fileno(IoIFP(io)),
2006 buffer, length, 0);
2007 }
2008 else
2009#endif
2010 {
2011 /* See the note at doio.c:do_print about filesize limits. --jhi */
2012 retval = PerlLIO_write(PerlIO_fileno(IoIFP(io)),
2013 buffer, length);
2014 }
2015 }
2016
2017 if (retval < 0)
2018 goto say_undef;
2019 SP = ORIGMARK;
2020 if (doing_utf8)
2021 retval = utf8_length((U8*)buffer, (U8*)buffer + retval);
2022
2023 Safefree(tmpbuf);
2024#if Size_t_size > IVSIZE
2025 PUSHn(retval);
2026#else
2027 PUSHi(retval);
2028#endif
2029 RETURN;
2030
2031 say_undef:
2032 Safefree(tmpbuf);
2033 SP = ORIGMARK;
2034 RETPUSHUNDEF;
2035}
2036
2037PP(pp_eof)
2038{
2039 dVAR; dSP;
2040 GV *gv;
2041 IO *io;
2042 const MAGIC *mg;
2043 /*
2044 * in Perl 5.12 and later, the additional parameter is a bitmask:
2045 * 0 = eof
2046 * 1 = eof(FH)
2047 * 2 = eof() <- ARGV magic
2048 *
2049 * I'll rely on the compiler's trace flow analysis to decide whether to
2050 * actually assign this out here, or punt it into the only block where it is
2051 * used. Doing it out here is DRY on the condition logic.
2052 */
2053 unsigned int which;
2054
2055 if (MAXARG) {
2056 gv = PL_last_in_gv = MUTABLE_GV(POPs); /* eof(FH) */
2057 which = 1;
2058 }
2059 else {
2060 EXTEND(SP, 1);
2061
2062 if (PL_op->op_flags & OPf_SPECIAL) {
2063 gv = PL_last_in_gv = GvEGVx(PL_argvgv); /* eof() - ARGV magic */
2064 which = 2;
2065 }
2066 else {
2067 gv = PL_last_in_gv; /* eof */
2068 which = 0;
2069 }
2070 }
2071
2072 if (!gv)
2073 RETPUSHNO;
2074
2075 if ((io = GvIO(gv)) && (mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar))) {
2076 return tied_method1("EOF", SP, MUTABLE_SV(io), mg, newSVuv(which));
2077 }
2078
2079 if (!MAXARG && (PL_op->op_flags & OPf_SPECIAL)) { /* eof() */
2080 if (io && !IoIFP(io)) {
2081 if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
2082 IoLINES(io) = 0;
2083 IoFLAGS(io) &= ~IOf_START;
2084 do_open(gv, "-", 1, FALSE, O_RDONLY, 0, NULL);
2085 if (GvSV(gv))
2086 sv_setpvs(GvSV(gv), "-");
2087 else
2088 GvSV(gv) = newSVpvs("-");
2089 SvSETMAGIC(GvSV(gv));
2090 }
2091 else if (!nextargv(gv))
2092 RETPUSHYES;
2093 }
2094 }
2095
2096 PUSHs(boolSV(do_eof(gv)));
2097 RETURN;
2098}
2099
2100PP(pp_tell)
2101{
2102 dVAR; dSP; dTARGET;
2103 GV *gv;
2104 IO *io;
2105
2106 if (MAXARG != 0 && (TOPs || POPs))
2107 PL_last_in_gv = MUTABLE_GV(POPs);
2108 else
2109 EXTEND(SP, 1);
2110 gv = PL_last_in_gv;
2111
2112 io = GvIO(gv);
2113 if (io) {
2114 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2115 if (mg) {
2116 return tied_method0("TELL", SP, MUTABLE_SV(io), mg);
2117 }
2118 }
2119 else if (!gv) {
2120 if (!errno)
2121 SETERRNO(EBADF,RMS_IFI);
2122 PUSHi(-1);
2123 RETURN;
2124 }
2125
2126#if LSEEKSIZE > IVSIZE
2127 PUSHn( do_tell(gv) );
2128#else
2129 PUSHi( do_tell(gv) );
2130#endif
2131 RETURN;
2132}
2133
2134PP(pp_sysseek)
2135{
2136 dVAR; dSP;
2137 const int whence = POPi;
2138#if LSEEKSIZE > IVSIZE
2139 const Off_t offset = (Off_t)SvNVx(POPs);
2140#else
2141 const Off_t offset = (Off_t)SvIVx(POPs);
2142#endif
2143
2144 GV * const gv = PL_last_in_gv = MUTABLE_GV(POPs);
2145 IO *const io = GvIO(gv);
2146
2147 if (io) {
2148 const MAGIC * const mg = SvTIED_mg((const SV *)io, PERL_MAGIC_tiedscalar);
2149 if (mg) {
2150#if LSEEKSIZE > IVSIZE
2151 SV *const offset_sv = newSVnv((NV) offset);
2152#else
2153 SV *const offset_sv = newSViv(offset);
2154#endif
2155
2156 return tied_method2("SEEK", SP, MUTABLE_SV(io), mg, offset_sv,
2157 newSViv(whence));
2158 }
2159 }
2160
2161 if (PL_op->op_type == OP_SEEK)
2162 PUSHs(boolSV(do_seek(gv, offset, whence)));
2163 else {
2164 const Off_t sought = do_sysseek(gv, offset, whence);
2165 if (sought < 0)
2166 PUSHs(&PL_sv_undef);
2167 else {
2168 SV* const sv = sought ?
2169#if LSEEKSIZE > IVSIZE
2170 newSVnv((NV)sought)
2171#else
2172 newSViv(sought)
2173#endif
2174 : newSVpvn(zero_but_true, ZBTLEN);
2175 mPUSHs(sv);
2176 }
2177 }
2178 RETURN;
2179}
2180
2181PP(pp_truncate)
2182{
2183 dVAR;
2184 dSP;
2185 /* There seems to be no consensus on the length type of truncate()
2186 * and ftruncate(), both off_t and size_t have supporters. In
2187 * general one would think that when using large files, off_t is
2188 * at least as wide as size_t, so using an off_t should be okay. */
2189 /* XXX Configure probe for the length type of *truncate() needed XXX */
2190 Off_t len;
2191
2192#if Off_t_size > IVSIZE
2193 len = (Off_t)POPn;
2194#else
2195 len = (Off_t)POPi;
2196#endif
2197 /* Checking for length < 0 is problematic as the type might or
2198 * might not be signed: if it is not, clever compilers will moan. */
2199 /* XXX Configure probe for the signedness of the length type of *truncate() needed? XXX */
2200 SETERRNO(0,0);
2201 {
2202 SV * const sv = POPs;
2203 int result = 1;
2204 GV *tmpgv;
2205 IO *io;
2206
2207 if ((tmpgv = PL_op->op_flags & OPf_SPECIAL
2208 ? gv_fetchsv(sv, 0, SVt_PVIO)
2209 : MAYBE_DEREF_GV(sv) )) {
2210 io = GvIO(tmpgv);
2211 if (!io)
2212 result = 0;
2213 else {
2214 PerlIO *fp;
2215 do_ftruncate_io:
2216 TAINT_PROPER("truncate");
2217 if (!(fp = IoIFP(io))) {
2218 result = 0;
2219 }
2220 else {
2221 PerlIO_flush(fp);
2222#ifdef HAS_TRUNCATE
2223 if (ftruncate(PerlIO_fileno(fp), len) < 0)
2224#else
2225 if (my_chsize(PerlIO_fileno(fp), len) < 0)
2226#endif
2227 result = 0;
2228 }
2229 }
2230 }
2231 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2232 io = MUTABLE_IO(SvRV(sv)); /* *main::FRED{IO} for example */
2233 goto do_ftruncate_io;
2234 }
2235 else {
2236 const char * const name = SvPV_nomg_const_nolen(sv);
2237 TAINT_PROPER("truncate");
2238#ifdef HAS_TRUNCATE
2239 if (truncate(name, len) < 0)
2240 result = 0;
2241#else
2242 {
2243 const int tmpfd = PerlLIO_open(name, O_RDWR);
2244
2245 if (tmpfd < 0)
2246 result = 0;
2247 else {
2248 if (my_chsize(tmpfd, len) < 0)
2249 result = 0;
2250 PerlLIO_close(tmpfd);
2251 }
2252 }
2253#endif
2254 }
2255
2256 if (result)
2257 RETPUSHYES;
2258 if (!errno)
2259 SETERRNO(EBADF,RMS_IFI);
2260 RETPUSHUNDEF;
2261 }
2262}
2263
2264PP(pp_ioctl)
2265{
2266 dVAR; dSP; dTARGET;
2267 SV * const argsv = POPs;
2268 const unsigned int func = POPu;
2269 const int optype = PL_op->op_type;
2270 GV * const gv = MUTABLE_GV(POPs);
2271 IO * const io = gv ? GvIOn(gv) : NULL;
2272 char *s;
2273 IV retval;
2274
2275 if (!io || !argsv || !IoIFP(io)) {
2276 report_evil_fh(gv);
2277 SETERRNO(EBADF,RMS_IFI); /* well, sort of... */
2278 RETPUSHUNDEF;
2279 }
2280
2281 if (SvPOK(argsv) || !SvNIOK(argsv)) {
2282 STRLEN len;
2283 STRLEN need;
2284 s = SvPV_force(argsv, len);
2285 need = IOCPARM_LEN(func);
2286 if (len < need) {
2287 s = Sv_Grow(argsv, need + 1);
2288 SvCUR_set(argsv, need);
2289 }
2290
2291 s[SvCUR(argsv)] = 17; /* a little sanity check here */
2292 }
2293 else {
2294 retval = SvIV(argsv);
2295 s = INT2PTR(char*,retval); /* ouch */
2296 }
2297
2298 TAINT_PROPER(PL_op_desc[optype]);
2299
2300 if (optype == OP_IOCTL)
2301#ifdef HAS_IOCTL
2302 retval = PerlLIO_ioctl(PerlIO_fileno(IoIFP(io)), func, s);
2303#else
2304 DIE(aTHX_ "ioctl is not implemented");
2305#endif
2306 else
2307#ifndef HAS_FCNTL
2308 DIE(aTHX_ "fcntl is not implemented");
2309#else
2310#if defined(OS2) && defined(__EMX__)
2311 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, (int)s);
2312#else
2313 retval = fcntl(PerlIO_fileno(IoIFP(io)), func, s);
2314#endif
2315#endif
2316
2317#if defined(HAS_IOCTL) || defined(HAS_FCNTL)
2318 if (SvPOK(argsv)) {
2319 if (s[SvCUR(argsv)] != 17)
2320 DIE(aTHX_ "Possible memory corruption: %s overflowed 3rd argument",
2321 OP_NAME(PL_op));
2322 s[SvCUR(argsv)] = 0; /* put our null back */
2323 SvSETMAGIC(argsv); /* Assume it has changed */
2324 }
2325
2326 if (retval == -1)
2327 RETPUSHUNDEF;
2328 if (retval != 0) {
2329 PUSHi(retval);
2330 }
2331 else {
2332 PUSHp(zero_but_true, ZBTLEN);
2333 }
2334#endif
2335 RETURN;
2336}
2337
2338PP(pp_flock)
2339{
2340#ifdef FLOCK
2341 dVAR; dSP; dTARGET;
2342 I32 value;
2343 const int argtype = POPi;
2344 GV * const gv = MUTABLE_GV(POPs);
2345 IO *const io = GvIO(gv);
2346 PerlIO *const fp = io ? IoIFP(io) : NULL;
2347
2348 /* XXX Looks to me like io is always NULL at this point */
2349 if (fp) {
2350 (void)PerlIO_flush(fp);
2351 value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
2352 }
2353 else {
2354 report_evil_fh(gv);
2355 value = 0;
2356 SETERRNO(EBADF,RMS_IFI);
2357 }
2358 PUSHi(value);
2359 RETURN;
2360#else
2361 DIE(aTHX_ PL_no_func, "flock()");
2362#endif
2363}
2364
2365/* Sockets. */
2366
2367#ifdef HAS_SOCKET
2368
2369PP(pp_socket)
2370{
2371 dVAR; dSP;
2372 const int protocol = POPi;
2373 const int type = POPi;
2374 const int domain = POPi;
2375 GV * const gv = MUTABLE_GV(POPs);
2376 register IO * const io = gv ? GvIOn(gv) : NULL;
2377 int fd;
2378
2379 if (!io) {
2380 report_evil_fh(gv);
2381 if (io && IoIFP(io))
2382 do_close(gv, FALSE);
2383 SETERRNO(EBADF,LIB_INVARG);
2384 RETPUSHUNDEF;
2385 }
2386
2387 if (IoIFP(io))
2388 do_close(gv, FALSE);
2389
2390 TAINT_PROPER("socket");
2391 fd = PerlSock_socket(domain, type, protocol);
2392 if (fd < 0)
2393 RETPUSHUNDEF;
2394 IoIFP(io) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE); /* stdio gets confused about sockets */
2395 IoOFP(io) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2396 IoTYPE(io) = IoTYPE_SOCKET;
2397 if (!IoIFP(io) || !IoOFP(io)) {
2398 if (IoIFP(io)) PerlIO_close(IoIFP(io));
2399 if (IoOFP(io)) PerlIO_close(IoOFP(io));
2400 if (!IoIFP(io) && !IoOFP(io)) PerlLIO_close(fd);
2401 RETPUSHUNDEF;
2402 }
2403#if defined(HAS_FCNTL) && defined(F_SETFD)
2404 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2405#endif
2406
2407#ifdef EPOC
2408 setbuf( IoIFP(io), NULL); /* EPOC gets confused about sockets */
2409#endif
2410
2411 RETPUSHYES;
2412}
2413#endif
2414
2415PP(pp_sockpair)
2416{
2417#if defined (HAS_SOCKETPAIR) || (defined (HAS_SOCKET) && defined(SOCK_DGRAM) && defined(AF_INET) && defined(PF_INET))
2418 dVAR; dSP;
2419 const int protocol = POPi;
2420 const int type = POPi;
2421 const int domain = POPi;
2422 GV * const gv2 = MUTABLE_GV(POPs);
2423 GV * const gv1 = MUTABLE_GV(POPs);
2424 register IO * const io1 = gv1 ? GvIOn(gv1) : NULL;
2425 register IO * const io2 = gv2 ? GvIOn(gv2) : NULL;
2426 int fd[2];
2427
2428 if (!io1)
2429 report_evil_fh(gv1);
2430 if (!io2)
2431 report_evil_fh(gv2);
2432
2433 if (io1 && IoIFP(io1))
2434 do_close(gv1, FALSE);
2435 if (io2 && IoIFP(io2))
2436 do_close(gv2, FALSE);
2437
2438 if (!io1 || !io2)
2439 RETPUSHUNDEF;
2440
2441 TAINT_PROPER("socketpair");
2442 if (PerlSock_socketpair(domain, type, protocol, fd) < 0)
2443 RETPUSHUNDEF;
2444 IoIFP(io1) = PerlIO_fdopen(fd[0], "r"SOCKET_OPEN_MODE);
2445 IoOFP(io1) = PerlIO_fdopen(fd[0], "w"SOCKET_OPEN_MODE);
2446 IoTYPE(io1) = IoTYPE_SOCKET;
2447 IoIFP(io2) = PerlIO_fdopen(fd[1], "r"SOCKET_OPEN_MODE);
2448 IoOFP(io2) = PerlIO_fdopen(fd[1], "w"SOCKET_OPEN_MODE);
2449 IoTYPE(io2) = IoTYPE_SOCKET;
2450 if (!IoIFP(io1) || !IoOFP(io1) || !IoIFP(io2) || !IoOFP(io2)) {
2451 if (IoIFP(io1)) PerlIO_close(IoIFP(io1));
2452 if (IoOFP(io1)) PerlIO_close(IoOFP(io1));
2453 if (!IoIFP(io1) && !IoOFP(io1)) PerlLIO_close(fd[0]);
2454 if (IoIFP(io2)) PerlIO_close(IoIFP(io2));
2455 if (IoOFP(io2)) PerlIO_close(IoOFP(io2));
2456 if (!IoIFP(io2) && !IoOFP(io2)) PerlLIO_close(fd[1]);
2457 RETPUSHUNDEF;
2458 }
2459#if defined(HAS_FCNTL) && defined(F_SETFD)
2460 fcntl(fd[0],F_SETFD,fd[0] > PL_maxsysfd); /* ensure close-on-exec */
2461 fcntl(fd[1],F_SETFD,fd[1] > PL_maxsysfd); /* ensure close-on-exec */
2462#endif
2463
2464 RETPUSHYES;
2465#else
2466 DIE(aTHX_ PL_no_sock_func, "socketpair");
2467#endif
2468}
2469
2470#ifdef HAS_SOCKET
2471
2472PP(pp_bind)
2473{
2474 dVAR; dSP;
2475 SV * const addrsv = POPs;
2476 /* OK, so on what platform does bind modify addr? */
2477 const char *addr;
2478 GV * const gv = MUTABLE_GV(POPs);
2479 register IO * const io = GvIOn(gv);
2480 STRLEN len;
2481 const int op_type = PL_op->op_type;
2482
2483 if (!io || !IoIFP(io))
2484 goto nuts;
2485
2486 addr = SvPV_const(addrsv, len);
2487 TAINT_PROPER(PL_op_desc[op_type]);
2488 if ((op_type == OP_BIND
2489 ? PerlSock_bind(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len)
2490 : PerlSock_connect(PerlIO_fileno(IoIFP(io)), (struct sockaddr *)addr, len))
2491 >= 0)
2492 RETPUSHYES;
2493 else
2494 RETPUSHUNDEF;
2495
2496nuts:
2497 report_evil_fh(gv);
2498 SETERRNO(EBADF,SS_IVCHAN);
2499 RETPUSHUNDEF;
2500}
2501
2502PP(pp_listen)
2503{
2504 dVAR; dSP;
2505 const int backlog = POPi;
2506 GV * const gv = MUTABLE_GV(POPs);
2507 register IO * const io = gv ? GvIOn(gv) : NULL;
2508
2509 if (!io || !IoIFP(io))
2510 goto nuts;
2511
2512 if (PerlSock_listen(PerlIO_fileno(IoIFP(io)), backlog) >= 0)
2513 RETPUSHYES;
2514 else
2515 RETPUSHUNDEF;
2516
2517nuts:
2518 report_evil_fh(gv);
2519 SETERRNO(EBADF,SS_IVCHAN);
2520 RETPUSHUNDEF;
2521}
2522
2523PP(pp_accept)
2524{
2525 dVAR; dSP; dTARGET;
2526 register IO *nstio;
2527 register IO *gstio;
2528 char namebuf[MAXPATHLEN];
2529#if (defined(VMS_DO_SOCKETS) && defined(DECCRTL_SOCKETS)) || defined(MPE) || defined(__QNXNTO__)
2530 Sock_size_t len = sizeof (struct sockaddr_in);
2531#else
2532 Sock_size_t len = sizeof namebuf;
2533#endif
2534 GV * const ggv = MUTABLE_GV(POPs);
2535 GV * const ngv = MUTABLE_GV(POPs);
2536 int fd;
2537
2538 if (!ngv)
2539 goto badexit;
2540 if (!ggv)
2541 goto nuts;
2542
2543 gstio = GvIO(ggv);
2544 if (!gstio || !IoIFP(gstio))
2545 goto nuts;
2546
2547 nstio = GvIOn(ngv);
2548 fd = PerlSock_accept(PerlIO_fileno(IoIFP(gstio)), (struct sockaddr *) namebuf, &len);
2549#if defined(OEMVS)
2550 if (len == 0) {
2551 /* Some platforms indicate zero length when an AF_UNIX client is
2552 * not bound. Simulate a non-zero-length sockaddr structure in
2553 * this case. */
2554 namebuf[0] = 0; /* sun_len */
2555 namebuf[1] = AF_UNIX; /* sun_family */
2556 len = 2;
2557 }
2558#endif
2559
2560 if (fd < 0)
2561 goto badexit;
2562 if (IoIFP(nstio))
2563 do_close(ngv, FALSE);
2564 IoIFP(nstio) = PerlIO_fdopen(fd, "r"SOCKET_OPEN_MODE);
2565 IoOFP(nstio) = PerlIO_fdopen(fd, "w"SOCKET_OPEN_MODE);
2566 IoTYPE(nstio) = IoTYPE_SOCKET;
2567 if (!IoIFP(nstio) || !IoOFP(nstio)) {
2568 if (IoIFP(nstio)) PerlIO_close(IoIFP(nstio));
2569 if (IoOFP(nstio)) PerlIO_close(IoOFP(nstio));
2570 if (!IoIFP(nstio) && !IoOFP(nstio)) PerlLIO_close(fd);
2571 goto badexit;
2572 }
2573#if defined(HAS_FCNTL) && defined(F_SETFD)
2574 fcntl(fd, F_SETFD, fd > PL_maxsysfd); /* ensure close-on-exec */
2575#endif
2576
2577#ifdef EPOC
2578 len = sizeof (struct sockaddr_in); /* EPOC somehow truncates info */
2579 setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
2580#endif
2581#ifdef __SCO_VERSION__
2582 len = sizeof (struct sockaddr_in); /* OpenUNIX 8 somehow truncates info */
2583#endif
2584
2585 PUSHp(namebuf, len);
2586 RETURN;
2587
2588nuts:
2589 report_evil_fh(ggv);
2590 SETERRNO(EBADF,SS_IVCHAN);
2591
2592badexit:
2593 RETPUSHUNDEF;
2594
2595}
2596
2597PP(pp_shutdown)
2598{
2599 dVAR; dSP; dTARGET;
2600 const int how = POPi;
2601 GV * const gv = MUTABLE_GV(POPs);
2602 register IO * const io = GvIOn(gv);
2603
2604 if (!io || !IoIFP(io))
2605 goto nuts;
2606
2607 PUSHi( PerlSock_shutdown(PerlIO_fileno(IoIFP(io)), how) >= 0 );
2608 RETURN;
2609
2610nuts:
2611 report_evil_fh(gv);
2612 SETERRNO(EBADF,SS_IVCHAN);
2613 RETPUSHUNDEF;
2614}
2615
2616PP(pp_ssockopt)
2617{
2618 dVAR; dSP;
2619 const int optype = PL_op->op_type;
2620 SV * const sv = (optype == OP_GSOCKOPT) ? sv_2mortal(newSV(257)) : POPs;
2621 const unsigned int optname = (unsigned int) POPi;
2622 const unsigned int lvl = (unsigned int) POPi;
2623 GV * const gv = MUTABLE_GV(POPs);
2624 register IO * const io = GvIOn(gv);
2625 int fd;
2626 Sock_size_t len;
2627
2628 if (!io || !IoIFP(io))
2629 goto nuts;
2630
2631 fd = PerlIO_fileno(IoIFP(io));
2632 switch (optype) {
2633 case OP_GSOCKOPT:
2634 SvGROW(sv, 257);
2635 (void)SvPOK_only(sv);
2636 SvCUR_set(sv,256);
2637 *SvEND(sv) ='\0';
2638 len = SvCUR(sv);
2639 if (PerlSock_getsockopt(fd, lvl, optname, SvPVX(sv), &len) < 0)
2640 goto nuts2;
2641 SvCUR_set(sv, len);
2642 *SvEND(sv) ='\0';
2643 PUSHs(sv);
2644 break;
2645 case OP_SSOCKOPT: {
2646#if defined(__SYMBIAN32__)
2647# define SETSOCKOPT_OPTION_VALUE_T void *
2648#else
2649# define SETSOCKOPT_OPTION_VALUE_T const char *
2650#endif
2651 /* XXX TODO: We need to have a proper type (a Configure probe,
2652 * etc.) for what the C headers think of the third argument of
2653 * setsockopt(), the option_value read-only buffer: is it
2654 * a "char *", or a "void *", const or not. Some compilers
2655 * don't take kindly to e.g. assuming that "char *" implicitly
2656 * promotes to a "void *", or to explicitly promoting/demoting
2657 * consts to non/vice versa. The "const void *" is the SUS
2658 * definition, but that does not fly everywhere for the above
2659 * reasons. */
2660 SETSOCKOPT_OPTION_VALUE_T buf;
2661 int aint;
2662 if (SvPOKp(sv)) {
2663 STRLEN l;
2664 buf = (SETSOCKOPT_OPTION_VALUE_T) SvPV_const(sv, l);
2665 len = l;
2666 }
2667 else {
2668 aint = (int)SvIV(sv);
2669 buf = (SETSOCKOPT_OPTION_VALUE_T) &aint;
2670 len = sizeof(int);
2671 }
2672 if (PerlSock_setsockopt(fd, lvl, optname, buf, len) < 0)
2673 goto nuts2;
2674 PUSHs(&PL_sv_yes);
2675 }
2676 break;
2677 }
2678 RETURN;
2679
2680nuts:
2681 report_evil_fh(gv);
2682 SETERRNO(EBADF,SS_IVCHAN);
2683nuts2:
2684 RETPUSHUNDEF;
2685
2686}
2687
2688PP(pp_getpeername)
2689{
2690 dVAR; dSP;
2691 const int optype = PL_op->op_type;
2692 GV * const gv = MUTABLE_GV(POPs);
2693 register IO * const io = GvIOn(gv);
2694 Sock_size_t len;
2695 SV *sv;
2696 int fd;
2697
2698 if (!io || !IoIFP(io))
2699 goto nuts;
2700
2701 sv = sv_2mortal(newSV(257));
2702 (void)SvPOK_only(sv);
2703 len = 256;
2704 SvCUR_set(sv, len);
2705 *SvEND(sv) ='\0';
2706 fd = PerlIO_fileno(IoIFP(io));
2707 switch (optype) {
2708 case OP_GETSOCKNAME:
2709 if (PerlSock_getsockname(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2710 goto nuts2;
2711 break;
2712 case OP_GETPEERNAME:
2713 if (PerlSock_getpeername(fd, (struct sockaddr *)SvPVX(sv), &len) < 0)
2714 goto nuts2;
2715#if defined(VMS_DO_SOCKETS) && defined (DECCRTL_SOCKETS)
2716 {
2717 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";
2718 /* If the call succeeded, make sure we don't have a zeroed port/addr */
2719 if (((struct sockaddr *)SvPVX_const(sv))->sa_family == AF_INET &&
2720 !memcmp(SvPVX_const(sv) + sizeof(u_short), nowhere,
2721 sizeof(u_short) + sizeof(struct in_addr))) {
2722 goto nuts2;
2723 }
2724 }
2725#endif
2726 break;
2727 }
2728#ifdef BOGUS_GETNAME_RETURN
2729 /* Interactive Unix, getpeername() and getsockname()
2730 does not return valid namelen */
2731 if (len == BOGUS_GETNAME_RETURN)
2732 len = sizeof(struct sockaddr);
2733#endif
2734 SvCUR_set(sv, len);
2735 *SvEND(sv) ='\0';
2736 PUSHs(sv);
2737 RETURN;
2738
2739nuts:
2740 report_evil_fh(gv);
2741 SETERRNO(EBADF,SS_IVCHAN);
2742nuts2:
2743 RETPUSHUNDEF;
2744}
2745
2746#endif
2747
2748/* Stat calls. */
2749
2750PP(pp_stat)
2751{
2752 dVAR;
2753 dSP;
2754 GV *gv = NULL;
2755 IO *io = NULL;
2756 I32 gimme;
2757 I32 max = 13;
2758 SV* sv;
2759
2760 if (PL_op->op_flags & OPf_REF ? (gv = cGVOP_gv, 1)
2761 : !!(sv=POPs, gv = MAYBE_DEREF_GV(sv))) {
2762 if (PL_op->op_type == OP_LSTAT) {
2763 if (gv != PL_defgv) {
2764 do_fstat_warning_check:
2765 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
2766 "lstat() on filehandle%s%"SVf,
2767 gv ? " " : "",
2768 SVfARG(gv
2769 ? sv_2mortal(newSVhek(GvENAME_HEK(gv)))
2770 : &PL_sv_no));
2771 } else if (PL_laststype != OP_LSTAT)
2772 /* diag_listed_as: The stat preceding %s wasn't an lstat */
2773 Perl_croak(aTHX_ "The stat preceding lstat() wasn't an lstat");
2774 }
2775
2776 if (gv != PL_defgv) {
2777 bool havefp;
2778 do_fstat_have_io:
2779 havefp = FALSE;
2780 PL_laststype = OP_STAT;
2781 PL_statgv = gv ? gv : (GV *)io;
2782 sv_setpvs(PL_statname, "");
2783 if(gv) {
2784 io = GvIO(gv);
2785 }
2786 if (io) {
2787 if (IoIFP(io)) {
2788 PL_laststatval =
2789 PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
2790 havefp = TRUE;
2791 } else if (IoDIRP(io)) {
2792 PL_laststatval =
2793 PerlLIO_fstat(my_dirfd(IoDIRP(io)), &PL_statcache);
2794 havefp = TRUE;
2795 } else {
2796 PL_laststatval = -1;
2797 }
2798 }
2799 else PL_laststatval = -1;
2800 if (PL_laststatval < 0 && !havefp) report_evil_fh(gv);
2801 }
2802
2803 if (PL_laststatval < 0) {
2804 max = 0;
2805 }
2806 }
2807 else {
2808 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) {
2809 io = MUTABLE_IO(SvRV(sv));
2810 if (PL_op->op_type == OP_LSTAT)
2811 goto do_fstat_warning_check;
2812 goto do_fstat_have_io;
2813 }
2814
2815 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
2816 PL_statgv = NULL;
2817 PL_laststype = PL_op->op_type;
2818 if (PL_op->op_type == OP_LSTAT)
2819 PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(PL_statname), &PL_statcache);
2820 else
2821 PL_laststatval = PerlLIO_stat(SvPV_nolen_const(PL_statname), &PL_statcache);
2822 if (PL_laststatval < 0) {
2823 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname), '\n'))
2824 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "stat");
2825 max = 0;
2826 }
2827 }
2828
2829 gimme = GIMME_V;
2830 if (gimme != G_ARRAY) {
2831 if (gimme != G_VOID)
2832 XPUSHs(boolSV(max));
2833 RETURN;
2834 }
2835 if (max) {
2836 EXTEND(SP, max);
2837 EXTEND_MORTAL(max);
2838 mPUSHi(PL_statcache.st_dev);
2839#if ST_INO_SIZE > IVSIZE
2840 mPUSHn(PL_statcache.st_ino);
2841#else
2842# if ST_INO_SIGN <= 0
2843 mPUSHi(PL_statcache.st_ino);
2844# else
2845 mPUSHu(PL_statcache.st_ino);
2846# endif
2847#endif
2848 mPUSHu(PL_statcache.st_mode);
2849 mPUSHu(PL_statcache.st_nlink);
2850#if Uid_t_size > IVSIZE
2851 mPUSHn(PL_statcache.st_uid);
2852#else
2853# if Uid_t_sign <= 0
2854 mPUSHi(PL_statcache.st_uid);
2855# else
2856 mPUSHu(PL_statcache.st_uid);
2857# endif
2858#endif
2859#if Gid_t_size > IVSIZE
2860 mPUSHn(PL_statcache.st_gid);
2861#else
2862# if Gid_t_sign <= 0
2863 mPUSHi(PL_statcache.st_gid);
2864# else
2865 mPUSHu(PL_statcache.st_gid);
2866# endif
2867#endif
2868#ifdef USE_STAT_RDEV
2869 mPUSHi(PL_statcache.st_rdev);
2870#else
2871 PUSHs(newSVpvs_flags("", SVs_TEMP));
2872#endif
2873#if Off_t_size > IVSIZE
2874 mPUSHn(PL_statcache.st_size);
2875#else
2876 mPUSHi(PL_statcache.st_size);
2877#endif
2878#ifdef BIG_TIME
2879 mPUSHn(PL_statcache.st_atime);
2880 mPUSHn(PL_statcache.st_mtime);
2881 mPUSHn(PL_statcache.st_ctime);
2882#else
2883 mPUSHi(PL_statcache.st_atime);
2884 mPUSHi(PL_statcache.st_mtime);
2885 mPUSHi(PL_statcache.st_ctime);
2886#endif
2887#ifdef USE_STAT_BLOCKS
2888 mPUSHu(PL_statcache.st_blksize);
2889 mPUSHu(PL_statcache.st_blocks);
2890#else
2891 PUSHs(newSVpvs_flags("", SVs_TEMP));
2892 PUSHs(newSVpvs_flags("", SVs_TEMP));
2893#endif
2894 }
2895 RETURN;
2896}
2897
2898/* If the next filetest is stacked up with this one
2899 (PL_op->op_private & OPpFT_STACKING), we leave
2900 the original argument on the stack for success,
2901 and skip the stacked operators on failure.
2902 The next few macros/functions take care of this.
2903*/
2904
2905static OP *
2906S_ft_stacking_return_false(pTHX_ SV *ret) {
2907 dSP;
2908 OP *next = NORMAL;
2909 while (OP_IS_FILETEST(next->op_type)
2910 && next->op_private & OPpFT_STACKED)
2911 next = next->op_next;
2912 if (PL_op->op_flags & OPf_REF) PUSHs(ret);
2913 else SETs(ret);
2914 PUTBACK;
2915 return next;
2916}
2917
2918#define FT_RETURN_FALSE(X) \
2919 STMT_START { \
2920 if (PL_op->op_private & OPpFT_STACKING) \
2921 return S_ft_stacking_return_false(aTHX_ X); \
2922 RETURNX(PUSHs(X)); \
2923 } STMT_END
2924#define FT_RETURN_TRUE(X) \
2925 RETURNX((void)( \
2926 PL_op->op_private & OPpFT_STACKING \
2927 ? PL_op->op_flags & OPf_REF \
2928 ? PUSHs((SV *)cGVOP_gv) \
2929 : 0 \
2930 : PUSHs(X) \
2931 ))
2932
2933#define FT_RETURNNO FT_RETURN_FALSE(&PL_sv_no)
2934#define FT_RETURNUNDEF FT_RETURN_FALSE(&PL_sv_undef)
2935#define FT_RETURNYES FT_RETURN_TRUE(&PL_sv_yes)
2936
2937#define tryAMAGICftest_MG(chr) STMT_START { \
2938 if ( (SvFLAGS(TOPs) & (SVf_ROK|SVs_GMG)) \
2939 && PL_op->op_flags & OPf_KIDS) { \
2940 OP *next = S_try_amagic_ftest(aTHX_ chr); \
2941 if (next) return next; \
2942 } \
2943 } STMT_END
2944
2945STATIC OP *
2946S_try_amagic_ftest(pTHX_ char chr) {
2947 dVAR;
2948 dSP;
2949 SV* const arg = TOPs;
2950
2951 assert(chr != '?');
2952 if (!(PL_op->op_private & OPpFT_STACKING)) SvGETMAGIC(arg);
2953
2954 if (SvAMAGIC(TOPs))
2955 {
2956 const char tmpchr = chr;
2957 SV * const tmpsv = amagic_call(arg,
2958 newSVpvn_flags(&tmpchr, 1, SVs_TEMP),
2959 ftest_amg, AMGf_unary);
2960
2961 if (!tmpsv)
2962 return NULL;
2963
2964 SPAGAIN;
2965
2966 if (SvTRUE(tmpsv)) FT_RETURN_TRUE(tmpsv);
2967 FT_RETURN_FALSE(tmpsv);
2968 }
2969 return NULL;
2970}
2971
2972
2973PP(pp_ftrread)
2974{
2975 dVAR;
2976 I32 result;
2977 /* Not const, because things tweak this below. Not bool, because there's
2978 no guarantee that OPp_FT_ACCESS is <= CHAR_MAX */
2979#if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
2980 I32 use_access = PL_op->op_private & OPpFT_ACCESS;
2981 /* Giving some sort of initial value silences compilers. */
2982# ifdef R_OK
2983 int access_mode = R_OK;
2984# else
2985 int access_mode = 0;
2986# endif
2987#else
2988 /* access_mode is never used, but leaving use_access in makes the
2989 conditional compiling below much clearer. */
2990 I32 use_access = 0;
2991#endif
2992 Mode_t stat_mode = S_IRUSR;
2993
2994 bool effective = FALSE;
2995 char opchar = '?';
2996 dSP;
2997
2998 switch (PL_op->op_type) {
2999 case OP_FTRREAD: opchar = 'R'; break;
3000 case OP_FTRWRITE: opchar = 'W'; break;
3001 case OP_FTREXEC: opchar = 'X'; break;
3002 case OP_FTEREAD: opchar = 'r'; break;
3003 case OP_FTEWRITE: opchar = 'w'; break;
3004 case OP_FTEEXEC: opchar = 'x'; break;
3005 }
3006 tryAMAGICftest_MG(opchar);
3007
3008 switch (PL_op->op_type) {
3009 case OP_FTRREAD:
3010#if !(defined(HAS_ACCESS) && defined(R_OK))
3011 use_access = 0;
3012#endif
3013 break;
3014
3015 case OP_FTRWRITE:
3016#if defined(HAS_ACCESS) && defined(W_OK)
3017 access_mode = W_OK;
3018#else
3019 use_access = 0;
3020#endif
3021 stat_mode = S_IWUSR;
3022 break;
3023
3024 case OP_FTREXEC:
3025#if defined(HAS_ACCESS) && defined(X_OK)
3026 access_mode = X_OK;
3027#else
3028 use_access = 0;
3029#endif
3030 stat_mode = S_IXUSR;
3031 break;
3032
3033 case OP_FTEWRITE:
3034#ifdef PERL_EFF_ACCESS
3035 access_mode = W_OK;
3036#endif
3037 stat_mode = S_IWUSR;
3038 /* fall through */
3039
3040 case OP_FTEREAD:
3041#ifndef PERL_EFF_ACCESS
3042 use_access = 0;
3043#endif
3044 effective = TRUE;
3045 break;
3046
3047 case OP_FTEEXEC:
3048#ifdef PERL_EFF_ACCESS
3049 access_mode = X_OK;
3050#else
3051 use_access = 0;
3052#endif
3053 stat_mode = S_IXUSR;
3054 effective = TRUE;
3055 break;
3056 }
3057
3058 if (use_access) {
3059#if defined(HAS_ACCESS) || defined (PERL_EFF_ACCESS)
3060 const char *name = POPpx;
3061 if (effective) {
3062# ifdef PERL_EFF_ACCESS
3063 result = PERL_EFF_ACCESS(name, access_mode);
3064# else
3065 DIE(aTHX_ "panic: attempt to call PERL_EFF_ACCESS in %s",
3066 OP_NAME(PL_op));
3067# endif
3068 }
3069 else {
3070# ifdef HAS_ACCESS
3071 result = access(name, access_mode);
3072# else
3073 DIE(aTHX_ "panic: attempt to call access() in %s", OP_NAME(PL_op));
3074# endif
3075 }
3076 if (result == 0)
3077 RETPUSHYES;
3078 if (result < 0)
3079 RETPUSHUNDEF;
3080 RETPUSHNO;
3081#endif
3082 }
3083
3084 result = my_stat_flags(0);
3085 SPAGAIN;
3086 if (result < 0)
3087 FT_RETURNUNDEF;
3088 if (cando(stat_mode, effective, &PL_statcache))
3089 FT_RETURNYES;
3090 FT_RETURNNO;
3091}
3092
3093PP(pp_ftis)
3094{
3095 dVAR;
3096 I32 result;
3097 const int op_type = PL_op->op_type;
3098 char opchar = '?';
3099 dSP;
3100
3101 switch (op_type) {
3102 case OP_FTIS: opchar = 'e'; break;
3103 case OP_FTSIZE: opchar = 's'; break;
3104 case OP_FTMTIME: opchar = 'M'; break;
3105 case OP_FTCTIME: opchar = 'C'; break;
3106 case OP_FTATIME: opchar = 'A'; break;
3107 }
3108 tryAMAGICftest_MG(opchar);
3109
3110 result = my_stat_flags(0);
3111 SPAGAIN;
3112 if (result < 0)
3113 FT_RETURNUNDEF;
3114 if (op_type == OP_FTIS)
3115 FT_RETURNYES;
3116 {
3117 /* You can't dTARGET inside OP_FTIS, because you'll get
3118 "panic: pad_sv po" - the op is not flagged to have a target. */
3119 dTARGET;
3120 switch (op_type) {
3121 case OP_FTSIZE:
3122#if Off_t_size > IVSIZE
3123 sv_setnv(TARG, (NV)PL_statcache.st_size);
3124#else
3125 sv_setiv(TARG, (IV)PL_statcache.st_size);
3126#endif
3127 break;
3128 case OP_FTMTIME:
3129 sv_setnv(TARG,
3130 ((NV)PL_basetime - PL_statcache.st_mtime) / 86400.0 );
3131 break;
3132 case OP_FTATIME:
3133 sv_setnv(TARG,
3134 ((NV)PL_basetime - PL_statcache.st_atime) / 86400.0 );
3135 break;
3136 case OP_FTCTIME:
3137 sv_setnv(TARG,
3138 ((NV)PL_basetime - PL_statcache.st_ctime) / 86400.0 );
3139 break;
3140 }
3141 SvSETMAGIC(TARG);
3142 if (SvTRUE_nomg(TARG)) FT_RETURN_TRUE(TARG);
3143 else FT_RETURN_FALSE(TARG);
3144 }
3145}
3146
3147PP(pp_ftrowned)
3148{
3149 dVAR;
3150 I32 result;
3151 char opchar = '?';
3152 dSP;
3153
3154 switch (PL_op->op_type) {
3155 case OP_FTROWNED: opchar = 'O'; break;
3156 case OP_FTEOWNED: opchar = 'o'; break;
3157 case OP_FTZERO: opchar = 'z'; break;
3158 case OP_FTSOCK: opchar = 'S'; break;
3159 case OP_FTCHR: opchar = 'c'; break;
3160 case OP_FTBLK: opchar = 'b'; break;
3161 case OP_FTFILE: opchar = 'f'; break;
3162 case OP_FTDIR: opchar = 'd'; break;
3163 case OP_FTPIPE: opchar = 'p'; break;
3164 case OP_FTSUID: opchar = 'u'; break;
3165 case OP_FTSGID: opchar = 'g'; break;
3166 case OP_FTSVTX: opchar = 'k'; break;
3167 }
3168 tryAMAGICftest_MG(opchar);
3169
3170 /* I believe that all these three are likely to be defined on most every
3171 system these days. */
3172#ifndef S_ISUID
3173 if(PL_op->op_type == OP_FTSUID) {
3174 if ((PL_op->op_flags & OPf_REF) == 0 && !(PL_op->op_private & OPpFT_STACKING))
3175 (void) POPs;
3176 FT_RETURNNO;
3177 }
3178#endif
3179#ifndef S_ISGID
3180 if(PL_op->op_type == OP_FTSGID) {
3181 if ((PL_op->op_flags & OPf_REF) == 0 && !(PL_op->op_private & OPpFT_STACKING))
3182 (void) POPs;
3183 FT_RETURNNO;
3184 }
3185#endif
3186#ifndef S_ISVTX
3187 if(PL_op->op_type == OP_FTSVTX) {
3188 if ((PL_op->op_flags & OPf_REF) == 0 && !(PL_op->op_private & OPpFT_STACKING))
3189 (void) POPs;
3190 FT_RETURNNO;
3191 }
3192#endif
3193
3194 result = my_stat_flags(0);
3195 SPAGAIN;
3196 if (result < 0)
3197 FT_RETURNUNDEF;
3198 switch (PL_op->op_type) {
3199 case OP_FTROWNED:
3200 if (PL_statcache.st_uid == PerlProc_getuid())
3201 FT_RETURNYES;
3202 break;
3203 case OP_FTEOWNED:
3204 if (PL_statcache.st_uid == PerlProc_geteuid())
3205 FT_RETURNYES;
3206 break;
3207 case OP_FTZERO:
3208 if (PL_statcache.st_size == 0)
3209 FT_RETURNYES;
3210 break;
3211 case OP_FTSOCK:
3212 if (S_ISSOCK(PL_statcache.st_mode))
3213 FT_RETURNYES;
3214 break;
3215 case OP_FTCHR:
3216 if (S_ISCHR(PL_statcache.st_mode))
3217 FT_RETURNYES;
3218 break;
3219 case OP_FTBLK:
3220 if (S_ISBLK(PL_statcache.st_mode))
3221 FT_RETURNYES;
3222 break;
3223 case OP_FTFILE:
3224 if (S_ISREG(PL_statcache.st_mode))
3225 FT_RETURNYES;
3226 break;
3227 case OP_FTDIR:
3228 if (S_ISDIR(PL_statcache.st_mode))
3229 FT_RETURNYES;
3230 break;
3231 case OP_FTPIPE:
3232 if (S_ISFIFO(PL_statcache.st_mode))
3233 FT_RETURNYES;
3234 break;
3235#ifdef S_ISUID
3236 case OP_FTSUID:
3237 if (PL_statcache.st_mode & S_ISUID)
3238 FT_RETURNYES;
3239 break;
3240#endif
3241#ifdef S_ISGID
3242 case OP_FTSGID:
3243 if (PL_statcache.st_mode & S_ISGID)
3244 FT_RETURNYES;
3245 break;
3246#endif
3247#ifdef S_ISVTX
3248 case OP_FTSVTX:
3249 if (PL_statcache.st_mode & S_ISVTX)
3250 FT_RETURNYES;
3251 break;
3252#endif
3253 }
3254 FT_RETURNNO;
3255}
3256
3257PP(pp_ftlink)
3258{
3259 dVAR;
3260 dSP;
3261 I32 result;
3262
3263 tryAMAGICftest_MG('l');
3264 result = my_lstat_flags(0);
3265 SPAGAIN;
3266
3267 if (result < 0)
3268 FT_RETURNUNDEF;
3269 if (S_ISLNK(PL_statcache.st_mode))
3270 FT_RETURNYES;
3271 FT_RETURNNO;
3272}
3273
3274PP(pp_fttty)
3275{
3276 dVAR;
3277 dSP;
3278 int fd;
3279 GV *gv;
3280 char *name = NULL;
3281 STRLEN namelen;
3282
3283 tryAMAGICftest_MG('t');
3284
3285 if (PL_op->op_flags & OPf_REF)
3286 gv = cGVOP_gv;
3287 else {
3288 SV *tmpsv = PL_op->op_private & OPpFT_STACKING ? TOPs : POPs;
3289 if (!(gv = MAYBE_DEREF_GV_nomg(tmpsv))) {
3290 name = SvPV_nomg(tmpsv, namelen);
3291 gv = gv_fetchpvn_flags(name, namelen, SvUTF8(tmpsv), SVt_PVIO);
3292 }
3293 }
3294
3295 if (GvIO(gv) && IoIFP(GvIOp(gv)))
3296 fd = PerlIO_fileno(IoIFP(GvIOp(gv)));
3297 else if (name && isDIGIT(*name))
3298 fd = atoi(name);
3299 else
3300 FT_RETURNUNDEF;
3301 if (PerlLIO_isatty(fd))
3302 FT_RETURNYES;
3303 FT_RETURNNO;
3304}
3305
3306#if defined(atarist) /* this will work with atariST. Configure will
3307 make guesses for other systems. */
3308# define FILE_base(f) ((f)->_base)
3309# define FILE_ptr(f) ((f)->_ptr)
3310# define FILE_cnt(f) ((f)->_cnt)
3311# define FILE_bufsiz(f) ((f)->_cnt + ((f)->_ptr - (f)->_base))
3312#endif
3313
3314PP(pp_fttext)
3315{
3316 dVAR;
3317 dSP;
3318 I32 i;
3319 I32 len;
3320 I32 odd = 0;
3321 STDCHAR tbuf[512];
3322 register STDCHAR *s;
3323 register IO *io;
3324 register SV *sv = NULL;
3325 GV *gv;
3326 PerlIO *fp;
3327
3328 tryAMAGICftest_MG(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
3329
3330 if (PL_op->op_flags & OPf_REF)
3331 {
3332 gv = cGVOP_gv;
3333 EXTEND(SP, 1);
3334 }
3335 else {
3336 sv = PL_op->op_private & OPpFT_STACKING ? TOPs : POPs;
3337 if ((PL_op->op_private & (OPpFT_STACKED|OPpFT_AFTER_t))
3338 == OPpFT_STACKED)
3339 gv = PL_defgv;
3340 else gv = MAYBE_DEREF_GV_nomg(sv);
3341 }
3342
3343 if (gv) {
3344 if (gv == PL_defgv) {
3345 if (PL_statgv)
3346 io = SvTYPE(PL_statgv) == SVt_PVIO
3347 ? (IO *)PL_statgv
3348 : GvIO(PL_statgv);
3349 else {
3350 goto really_filename;
3351 }
3352 }
3353 else {
3354 PL_statgv = gv;
3355 sv_setpvs(PL_statname, "");
3356 io = GvIO(PL_statgv);
3357 }
3358 PL_laststatval = -1;
3359 PL_laststype = OP_STAT;
3360 if (io && IoIFP(io)) {
3361 if (! PerlIO_has_base(IoIFP(io)))
3362 DIE(aTHX_ "-T and -B not implemented on filehandles");
3363 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache);
3364 if (PL_laststatval < 0)
3365 FT_RETURNUNDEF;
3366 if (S_ISDIR(PL_statcache.st_mode)) { /* handle NFS glitch */
3367 if (PL_op->op_type == OP_FTTEXT)
3368 FT_RETURNNO;
3369 else
3370 FT_RETURNYES;
3371 }
3372 if (PerlIO_get_cnt(IoIFP(io)) <= 0) {
3373 i = PerlIO_getc(IoIFP(io));
3374 if (i != EOF)
3375 (void)PerlIO_ungetc(IoIFP(io),i);
3376 }
3377 if (PerlIO_get_cnt(IoIFP(io)) <= 0) /* null file is anything */
3378 FT_RETURNYES;
3379 len = PerlIO_get_bufsiz(IoIFP(io));
3380 s = (STDCHAR *) PerlIO_get_base(IoIFP(io));
3381 /* sfio can have large buffers - limit to 512 */
3382 if (len > 512)
3383 len = 512;
3384 }
3385 else {
3386 SETERRNO(EBADF,RMS_IFI);
3387 report_evil_fh(gv);
3388 SETERRNO(EBADF,RMS_IFI);
3389 FT_RETURNUNDEF;
3390 }
3391 }
3392 else {
3393 sv_setpv(PL_statname, SvPV_nomg_const_nolen(sv));
3394 really_filename:
3395 PL_statgv = NULL;
3396 if (!(fp = PerlIO_open(SvPVX_const(PL_statname), "r"))) {
3397 if (!gv) {
3398 PL_laststatval = -1;
3399 PL_laststype = OP_STAT;
3400 }
3401 if (ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(PL_statname),
3402 '\n'))
3403 Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open");
3404 FT_RETURNUNDEF;
3405 }
3406 PL_laststype = OP_STAT;
3407 PL_laststatval = PerlLIO_fstat(PerlIO_fileno(fp), &PL_statcache);
3408 if (PL_laststatval < 0) {
3409 (void)PerlIO_close(fp);
3410 FT_RETURNUNDEF;
3411 }
3412 PerlIO_binmode(aTHX_ fp, '<', O_BINARY, NULL);
3413 len = PerlIO_read(fp, tbuf, sizeof(tbuf));
3414 (void)PerlIO_close(fp);
3415 if (len <= 0) {
3416 if (S_ISDIR(PL_statcache.st_mode) && PL_op->op_type == OP_FTTEXT)
3417 FT_RETURNNO; /* special case NFS directories */
3418 FT_RETURNYES; /* null file is anything */
3419 }
3420 s = tbuf;
3421 }
3422
3423 /* now scan s to look for textiness */
3424 /* XXX ASCII dependent code */
3425
3426#if defined(DOSISH) || defined(USEMYBINMODE)
3427 /* ignore trailing ^Z on short files */
3428 if (len && len < (I32)sizeof(tbuf) && tbuf[len-1] == 26)
3429 --len;
3430#endif
3431
3432 for (i = 0; i < len; i++, s++) {
3433 if (!*s) { /* null never allowed in text */
3434 odd += len;
3435 break;
3436 }
3437#ifdef EBCDIC
3438 else if (!(isPRINT(*s) || isSPACE(*s)))
3439 odd++;
3440#else
3441 else if (*s & 128) {
3442#ifdef USE_LOCALE
3443 if (IN_LOCALE_RUNTIME && isALPHA_LC(*s))
3444 continue;
3445#endif
3446 /* utf8 characters don't count as odd */
3447 if (UTF8_IS_START(*s)) {
3448 int ulen = UTF8SKIP(s);
3449 if (ulen < len - i) {
3450 int j;
3451 for (j = 1; j < ulen; j++) {
3452 if (!UTF8_IS_CONTINUATION(s[j]))
3453 goto not_utf8;
3454 }
3455 --ulen; /* loop does extra increment */
3456 s += ulen;
3457 i += ulen;
3458 continue;
3459 }
3460 }
3461 not_utf8:
3462 odd++;
3463 }
3464 else if (*s < 32 &&
3465 *s != '\n' && *s != '\r' && *s != '\b' &&
3466 *s != '\t' && *s != '\f' && *s != 27)
3467 odd++;
3468#endif
3469 }
3470
3471 if ((odd * 3 > len) == (PL_op->op_type == OP_FTTEXT)) /* allow 1/3 odd */
3472 FT_RETURNNO;
3473 else
3474 FT_RETURNYES;
3475}
3476
3477/* File calls. */
3478
3479PP(pp_chdir)
3480{
3481 dVAR; dSP; dTARGET;
3482 const char *tmps = NULL;
3483 GV *gv = NULL;
3484
3485 if( MAXARG == 1 ) {
3486 SV * const sv = POPs;
3487 if (PL_op->op_flags & OPf_SPECIAL) {
3488 gv = gv_fetchsv(sv, 0, SVt_PVIO);
3489 }
3490 else if (!(gv = MAYBE_DEREF_GV(sv)))
3491 tmps = SvPV_nomg_const_nolen(sv);
3492 }
3493
3494 if( !gv && (!tmps || !*tmps) ) {
3495 HV * const table = GvHVn(PL_envgv);
3496 SV **svp;
3497
3498 if ( (svp = hv_fetchs(table, "HOME", FALSE))
3499 || (svp = hv_fetchs(table, "LOGDIR", FALSE))
3500#ifdef VMS
3501 || (svp = hv_fetchs(table, "SYS$LOGIN", FALSE))
3502#endif
3503 )
3504 {
3505 if( MAXARG == 1 )
3506 deprecate("chdir('') or chdir(undef) as chdir()");
3507 tmps = SvPV_nolen_const(*svp);
3508 }
3509 else {
3510 PUSHi(0);
3511 TAINT_PROPER("chdir");
3512 RETURN;
3513 }
3514 }
3515
3516 TAINT_PROPER("chdir");
3517 if (gv) {
3518#ifdef HAS_FCHDIR
3519 IO* const io = GvIO(gv);
3520 if (io) {
3521 if (IoDIRP(io)) {
3522 PUSHi(fchdir(my_dirfd(IoDIRP(io))) >= 0);
3523 } else if (IoIFP(io)) {
3524 PUSHi(fchdir(PerlIO_fileno(IoIFP(io))) >= 0);
3525 }
3526 else {
3527 report_evil_fh(gv);
3528 SETERRNO(EBADF, RMS_IFI);
3529 PUSHi(0);
3530 }
3531 }
3532 else {
3533 report_evil_fh(gv);
3534 SETERRNO(EBADF,RMS_IFI);
3535 PUSHi(0);
3536 }
3537#else
3538 DIE(aTHX_ PL_no_func, "fchdir");
3539#endif
3540 }
3541 else
3542 PUSHi( PerlDir_chdir(tmps) >= 0 );
3543#ifdef VMS
3544 /* Clear the DEFAULT element of ENV so we'll get the new value
3545 * in the future. */
3546 hv_delete(GvHVn(PL_envgv),"DEFAULT",7,G_DISCARD);
3547#endif
3548 RETURN;
3549}
3550
3551PP(pp_chown)
3552{
3553 dVAR; dSP; dMARK; dTARGET;
3554 const I32 value = (I32)apply(PL_op->op_type, MARK, SP);
3555
3556 SP = MARK;
3557 XPUSHi(value);
3558 RETURN;
3559}
3560
3561PP(pp_chroot)
3562{
3563#ifdef HAS_CHROOT
3564 dVAR; dSP; dTARGET;
3565 char * const tmps = POPpx;
3566 TAINT_PROPER("chroot");
3567 PUSHi( chroot(tmps) >= 0 );
3568 RETURN;
3569#else
3570 DIE(aTHX_ PL_no_func, "chroot");
3571#endif
3572}
3573
3574PP(pp_rename)
3575{
3576 dVAR; dSP; dTARGET;
3577 int anum;
3578 const char * const tmps2 = POPpconstx;
3579 const char * const tmps = SvPV_nolen_const(TOPs);
3580 TAINT_PROPER("rename");
3581#ifdef HAS_RENAME
3582 anum = PerlLIO_rename(tmps, tmps2);
3583#else
3584 if (!(anum = PerlLIO_stat(tmps, &PL_statbuf))) {
3585 if (same_dirent(tmps2, tmps)) /* can always rename to same name */
3586 anum = 1;
3587 else {
3588 if (PerlProc_geteuid() || PerlLIO_stat(tmps2, &PL_statbuf) < 0 || !S_ISDIR(PL_statbuf.st_mode))
3589 (void)UNLINK(tmps2);
3590 if (!(anum = link(tmps, tmps2)))
3591 anum = UNLINK(tmps);
3592 }
3593 }
3594#endif
3595 SETi( anum >= 0 );
3596 RETURN;
3597}
3598
3599#if defined(HAS_LINK) || defined(HAS_SYMLINK)
3600PP(pp_link)
3601{
3602 dVAR; dSP; dTARGET;
3603 const int op_type = PL_op->op_type;
3604 int result;
3605
3606# ifndef HAS_LINK
3607 if (op_type == OP_LINK)
3608 DIE(aTHX_ PL_no_func, "link");
3609# endif
3610# ifndef HAS_SYMLINK
3611 if (op_type == OP_SYMLINK)
3612 DIE(aTHX_ PL_no_func, "symlink");
3613# endif
3614
3615 {
3616 const char * const tmps2 = POPpconstx;
3617 const char * const tmps = SvPV_nolen_const(TOPs);
3618 TAINT_PROPER(PL_op_desc[op_type]);
3619 result =
3620# if defined(HAS_LINK)
3621# if defined(HAS_SYMLINK)
3622 /* Both present - need to choose which. */
3623 (op_type == OP_LINK) ?
3624 PerlLIO_link(tmps, tmps2) : symlink(tmps, tmps2);
3625# else
3626 /* Only have link, so calls to pp_symlink will have DIE()d above. */
3627 PerlLIO_link(tmps, tmps2);
3628# endif
3629# else
3630# if defined(HAS_SYMLINK)
3631 /* Only have symlink, so calls to pp_link will have DIE()d above. */
3632 symlink(tmps, tmps2);
3633# endif
3634# endif
3635 }
3636
3637 SETi( result >= 0 );
3638 RETURN;
3639}
3640#else
3641PP(pp_link)
3642{
3643 /* Have neither. */
3644 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
3645}
3646#endif
3647
3648PP(pp_readlink)
3649{
3650 dVAR;
3651 dSP;
3652#ifdef HAS_SYMLINK
3653 dTARGET;
3654 const char *tmps;
3655 char buf[MAXPATHLEN];
3656 int len;
3657
3658#ifndef INCOMPLETE_TAINTS
3659 TAINT;
3660#endif
3661 tmps = POPpconstx;
3662 len = readlink(tmps, buf, sizeof(buf) - 1);
3663 if (len < 0)
3664 RETPUSHUNDEF;
3665 PUSHp(buf, len);
3666 RETURN;
3667#else
3668 EXTEND(SP, 1);
3669 RETSETUNDEF; /* just pretend it's a normal file */
3670#endif
3671}
3672
3673#if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
3674STATIC int
3675S_dooneliner(pTHX_ const char *cmd, const char *filename)
3676{
3677 char * const save_filename = filename;
3678 char *cmdline;
3679 char *s;
3680 PerlIO *myfp;
3681 int anum = 1;
3682 Size_t size = strlen(cmd) + (strlen(filename) * 2) + 10;
3683
3684 PERL_ARGS_ASSERT_DOONELINER;
3685
3686 Newx(cmdline, size, char);
3687 my_strlcpy(cmdline, cmd, size);
3688 my_strlcat(cmdline, " ", size);
3689 for (s = cmdline + strlen(cmdline); *filename; ) {
3690 *s++ = '\\';
3691 *s++ = *filename++;
3692 }
3693 if (s - cmdline < size)
3694 my_strlcpy(s, " 2>&1", size - (s - cmdline));
3695 myfp = PerlProc_popen(cmdline, "r");
3696 Safefree(cmdline);
3697
3698 if (myfp) {
3699 SV * const tmpsv = sv_newmortal();
3700 /* Need to save/restore 'PL_rs' ?? */
3701 s = sv_gets(tmpsv, myfp, 0);
3702 (void)PerlProc_pclose(myfp);
3703 if (s != NULL) {
3704 int e;
3705 for (e = 1;
3706#ifdef HAS_SYS_ERRLIST
3707 e <= sys_nerr
3708#endif
3709 ; e++)
3710 {
3711 /* you don't see this */
3712 const char * const errmsg =
3713#ifdef HAS_SYS_ERRLIST
3714 sys_errlist[e]
3715#else
3716 strerror(e)
3717#endif
3718 ;
3719 if (!errmsg)
3720 break;
3721 if (instr(s, errmsg)) {
3722 SETERRNO(e,0);
3723 return 0;
3724 }
3725 }
3726 SETERRNO(0,0);
3727#ifndef EACCES
3728#define EACCES EPERM
3729#endif
3730 if (instr(s, "cannot make"))
3731 SETERRNO(EEXIST,RMS_FEX);
3732 else if (instr(s, "existing file"))
3733 SETERRNO(EEXIST,RMS_FEX);
3734 else if (instr(s, "ile exists"))
3735 SETERRNO(EEXIST,RMS_FEX);
3736 else if (instr(s, "non-exist"))
3737 SETERRNO(ENOENT,RMS_FNF);
3738 else if (instr(s, "does not exist"))
3739 SETERRNO(ENOENT,RMS_FNF);
3740 else if (instr(s, "not empty"))
3741 SETERRNO(EBUSY,SS_DEVOFFLINE);
3742 else if (instr(s, "cannot access"))
3743 SETERRNO(EACCES,RMS_PRV);
3744 else
3745 SETERRNO(EPERM,RMS_PRV);
3746 return 0;
3747 }
3748 else { /* some mkdirs return no failure indication */
3749 anum = (PerlLIO_stat(save_filename, &PL_statbuf) >= 0);
3750 if (PL_op->op_type == OP_RMDIR)
3751 anum = !anum;
3752 if (anum)
3753 SETERRNO(0,0);
3754 else
3755 SETERRNO(EACCES,RMS_PRV); /* a guess */
3756 }
3757 return anum;
3758 }
3759 else
3760 return 0;
3761}
3762#endif
3763
3764/* This macro removes trailing slashes from a directory name.
3765 * Different operating and file systems take differently to
3766 * trailing slashes. According to POSIX 1003.1 1996 Edition
3767 * any number of trailing slashes should be allowed.
3768 * Thusly we snip them away so that even non-conforming
3769 * systems are happy.
3770 * We should probably do this "filtering" for all
3771 * the functions that expect (potentially) directory names:
3772 * -d, chdir(), chmod(), chown(), chroot(), fcntl()?,
3773 * (mkdir()), opendir(), rename(), rmdir(), stat(). --jhi */
3774
3775#define TRIMSLASHES(tmps,len,copy) (tmps) = SvPV_const(TOPs, (len)); \
3776 if ((len) > 1 && (tmps)[(len)-1] == '/') { \
3777 do { \
3778 (len)--; \
3779 } while ((len) > 1 && (tmps)[(len)-1] == '/'); \
3780 (tmps) = savepvn((tmps), (len)); \
3781 (copy) = TRUE; \
3782 }
3783
3784PP(pp_mkdir)
3785{
3786 dVAR; dSP; dTARGET;
3787 STRLEN len;
3788 const char *tmps;
3789 bool copy = FALSE;
3790 const int mode = (MAXARG > 1 && (TOPs||((void)POPs,0))) ? POPi : 0777;
3791
3792 TRIMSLASHES(tmps,len,copy);
3793
3794 TAINT_PROPER("mkdir");
3795#ifdef HAS_MKDIR
3796 SETi( PerlDir_mkdir(tmps, mode) >= 0 );
3797#else
3798 {
3799 int oldumask;
3800 SETi( dooneliner("mkdir", tmps) );
3801 oldumask = PerlLIO_umask(0);
3802 PerlLIO_umask(oldumask);
3803 PerlLIO_chmod(tmps, (mode & ~oldumask) & 0777);
3804 }
3805#endif
3806 if (copy)
3807 Safefree(tmps);
3808 RETURN;
3809}
3810
3811PP(pp_rmdir)
3812{
3813 dVAR; dSP; dTARGET;
3814 STRLEN len;
3815 const char *tmps;
3816 bool copy = FALSE;
3817
3818 TRIMSLASHES(tmps,len,copy);
3819 TAINT_PROPER("rmdir");
3820#ifdef HAS_RMDIR
3821 SETi( PerlDir_rmdir(tmps) >= 0 );
3822#else
3823 SETi( dooneliner("rmdir", tmps) );
3824#endif
3825 if (copy)
3826 Safefree(tmps);
3827 RETURN;
3828}
3829
3830/* Directory calls. */
3831
3832PP(pp_open_dir)
3833{
3834#if defined(Direntry_t) && defined(HAS_READDIR)
3835 dVAR; dSP;
3836 const char * const dirname = POPpconstx;
3837 GV * const gv = MUTABLE_GV(POPs);
3838 register IO * const io = GvIOn(gv);
3839
3840 if (!io)
3841 goto nope;
3842
3843 if ((IoIFP(io) || IoOFP(io)))
3844 Perl_ck_warner_d(aTHX_ packWARN2(WARN_IO, WARN_DEPRECATED),
3845 "Opening filehandle %"HEKf" also as a directory",
3846 HEKfARG(GvENAME_HEK(gv)) );
3847 if (IoDIRP(io))
3848 PerlDir_close(IoDIRP(io));
3849 if (!(IoDIRP(io) = PerlDir_open(dirname)))
3850 goto nope;
3851
3852 RETPUSHYES;
3853nope:
3854 if (!errno)
3855 SETERRNO(EBADF,RMS_DIR);
3856 RETPUSHUNDEF;
3857#else
3858 DIE(aTHX_ PL_no_dir_func, "opendir");
3859#endif
3860}
3861
3862PP(pp_readdir)
3863{
3864#if !defined(Direntry_t) || !defined(HAS_READDIR)
3865 DIE(aTHX_ PL_no_dir_func, "readdir");
3866#else
3867#if !defined(I_DIRENT) && !defined(VMS)
3868 Direntry_t *readdir (DIR *);
3869#endif
3870 dVAR;
3871 dSP;
3872
3873 SV *sv;
3874 const I32 gimme = GIMME;
3875 GV * const gv = MUTABLE_GV(POPs);
3876 register const Direntry_t *dp;
3877 register IO * const io = GvIOn(gv);
3878
3879 if (!io || !IoDIRP(io)) {
3880 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3881 "readdir() attempted on invalid dirhandle %"HEKf,
3882 HEKfARG(GvENAME_HEK(gv)));
3883 goto nope;
3884 }
3885
3886 do {
3887 dp = (Direntry_t *)PerlDir_read(IoDIRP(io));
3888 if (!dp)
3889 break;
3890#ifdef DIRNAMLEN
3891 sv = newSVpvn(dp->d_name, dp->d_namlen);
3892#else
3893 sv = newSVpv(dp->d_name, 0);
3894#endif
3895#ifndef INCOMPLETE_TAINTS
3896 if (!(IoFLAGS(io) & IOf_UNTAINT))
3897 SvTAINTED_on(sv);
3898#endif
3899 mXPUSHs(sv);
3900 } while (gimme == G_ARRAY);
3901
3902 if (!dp && gimme != G_ARRAY)
3903 goto nope;
3904
3905 RETURN;
3906
3907nope:
3908 if (!errno)
3909 SETERRNO(EBADF,RMS_ISI);
3910 if (GIMME == G_ARRAY)
3911 RETURN;
3912 else
3913 RETPUSHUNDEF;
3914#endif
3915}
3916
3917PP(pp_telldir)
3918{
3919#if defined(HAS_TELLDIR) || defined(telldir)
3920 dVAR; dSP; dTARGET;
3921 /* XXX does _anyone_ need this? --AD 2/20/1998 */
3922 /* XXX netbsd still seemed to.
3923 XXX HAS_TELLDIR_PROTO is new style, NEED_TELLDIR_PROTO is old style.
3924 --JHI 1999-Feb-02 */
3925# if !defined(HAS_TELLDIR_PROTO) || defined(NEED_TELLDIR_PROTO)
3926 long telldir (DIR *);
3927# endif
3928 GV * const gv = MUTABLE_GV(POPs);
3929 register IO * const io = GvIOn(gv);
3930
3931 if (!io || !IoDIRP(io)) {
3932 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3933 "telldir() attempted on invalid dirhandle %"HEKf,
3934 HEKfARG(GvENAME_HEK(gv)));
3935 goto nope;
3936 }
3937
3938 PUSHi( PerlDir_tell(IoDIRP(io)) );
3939 RETURN;
3940nope:
3941 if (!errno)
3942 SETERRNO(EBADF,RMS_ISI);
3943 RETPUSHUNDEF;
3944#else
3945 DIE(aTHX_ PL_no_dir_func, "telldir");
3946#endif
3947}
3948
3949PP(pp_seekdir)
3950{
3951#if defined(HAS_SEEKDIR) || defined(seekdir)
3952 dVAR; dSP;
3953 const long along = POPl;
3954 GV * const gv = MUTABLE_GV(POPs);
3955 register IO * const io = GvIOn(gv);
3956
3957 if (!io || !IoDIRP(io)) {
3958 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3959 "seekdir() attempted on invalid dirhandle %"HEKf,
3960 HEKfARG(GvENAME_HEK(gv)));
3961 goto nope;
3962 }
3963 (void)PerlDir_seek(IoDIRP(io), along);
3964
3965 RETPUSHYES;
3966nope:
3967 if (!errno)
3968 SETERRNO(EBADF,RMS_ISI);
3969 RETPUSHUNDEF;
3970#else
3971 DIE(aTHX_ PL_no_dir_func, "seekdir");
3972#endif
3973}
3974
3975PP(pp_rewinddir)
3976{
3977#if defined(HAS_REWINDDIR) || defined(rewinddir)
3978 dVAR; dSP;
3979 GV * const gv = MUTABLE_GV(POPs);
3980 register IO * const io = GvIOn(gv);
3981
3982 if (!io || !IoDIRP(io)) {
3983 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
3984 "rewinddir() attempted on invalid dirhandle %"HEKf,
3985 HEKfARG(GvENAME_HEK(gv)));
3986 goto nope;
3987 }
3988 (void)PerlDir_rewind(IoDIRP(io));
3989 RETPUSHYES;
3990nope:
3991 if (!errno)
3992 SETERRNO(EBADF,RMS_ISI);
3993 RETPUSHUNDEF;
3994#else
3995 DIE(aTHX_ PL_no_dir_func, "rewinddir");
3996#endif
3997}
3998
3999PP(pp_closedir)
4000{
4001#if defined(Direntry_t) && defined(HAS_READDIR)
4002 dVAR; dSP;
4003 GV * const gv = MUTABLE_GV(POPs);
4004 register IO * const io = GvIOn(gv);
4005
4006 if (!io || !IoDIRP(io)) {
4007 Perl_ck_warner(aTHX_ packWARN(WARN_IO),
4008 "closedir() attempted on invalid dirhandle %"HEKf,
4009 HEKfARG(GvENAME_HEK(gv)));
4010 goto nope;
4011 }
4012#ifdef VOID_CLOSEDIR
4013 PerlDir_close(IoDIRP(io));
4014#else
4015 if (PerlDir_close(IoDIRP(io)) < 0) {
4016 IoDIRP(io) = 0; /* Don't try to close again--coredumps on SysV */
4017 goto nope;
4018 }
4019#endif
4020 IoDIRP(io) = 0;
4021
4022 RETPUSHYES;
4023nope:
4024 if (!errno)
4025 SETERRNO(EBADF,RMS_IFI);
4026 RETPUSHUNDEF;
4027#else
4028 DIE(aTHX_ PL_no_dir_func, "closedir");
4029#endif
4030}
4031
4032/* Process control. */
4033
4034PP(pp_fork)
4035{
4036#ifdef HAS_FORK
4037 dVAR; dSP; dTARGET;
4038 Pid_t childpid;
4039
4040 EXTEND(SP, 1);
4041 PERL_FLUSHALL_FOR_CHILD;
4042 childpid = PerlProc_fork();
4043 if (childpid < 0)
4044 RETSETUNDEF;
4045 if (!childpid) {
4046#ifdef PERL_USES_PL_PIDSTATUS
4047 hv_clear(PL_pidstatus); /* no kids, so don't wait for 'em */
4048#endif
4049 }
4050 PUSHi(childpid);
4051 RETURN;
4052#else
4053# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4054 dSP; dTARGET;
4055 Pid_t childpid;
4056
4057 EXTEND(SP, 1);
4058 PERL_FLUSHALL_FOR_CHILD;
4059 childpid = PerlProc_fork();
4060 if (childpid == -1)
4061 RETSETUNDEF;
4062 PUSHi(childpid);
4063 RETURN;
4064# else
4065 DIE(aTHX_ PL_no_func, "fork");
4066# endif
4067#endif
4068}
4069
4070PP(pp_wait)
4071{
4072#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4073 dVAR; dSP; dTARGET;
4074 Pid_t childpid;
4075 int argflags;
4076
4077 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4078 childpid = wait4pid(-1, &argflags, 0);
4079 else {
4080 while ((childpid = wait4pid(-1, &argflags, 0)) == -1 &&
4081 errno == EINTR) {
4082 PERL_ASYNC_CHECK();
4083 }
4084 }
4085# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4086 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4087 STATUS_NATIVE_CHILD_SET((childpid && childpid != -1) ? argflags : -1);
4088# else
4089 STATUS_NATIVE_CHILD_SET((childpid > 0) ? argflags : -1);
4090# endif
4091 XPUSHi(childpid);
4092 RETURN;
4093#else
4094 DIE(aTHX_ PL_no_func, "wait");
4095#endif
4096}
4097
4098PP(pp_waitpid)
4099{
4100#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
4101 dVAR; dSP; dTARGET;
4102 const int optype = POPi;
4103 const Pid_t pid = TOPi;
4104 Pid_t result;
4105 int argflags;
4106
4107 if (PL_signals & PERL_SIGNALS_UNSAFE_FLAG)
4108 result = wait4pid(pid, &argflags, optype);
4109 else {
4110 while ((result = wait4pid(pid, &argflags, optype)) == -1 &&
4111 errno == EINTR) {
4112 PERL_ASYNC_CHECK();
4113 }
4114 }
4115# if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
4116 /* 0 and -1 are both error returns (the former applies to WNOHANG case) */
4117 STATUS_NATIVE_CHILD_SET((result && result != -1) ? argflags : -1);
4118# else
4119 STATUS_NATIVE_CHILD_SET((result > 0) ? argflags : -1);
4120# endif
4121 SETi(result);
4122 RETURN;
4123#else
4124 DIE(aTHX_ PL_no_func, "waitpid");
4125#endif
4126}
4127
4128PP(pp_system)
4129{
4130 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4131#if defined(__LIBCATAMOUNT__)
4132 PL_statusvalue = -1;
4133 SP = ORIGMARK;
4134 XPUSHi(-1);
4135#else
4136 I32 value;
4137 int result;
4138
4139 if (PL_tainting) {
4140 TAINT_ENV();
4141 while (++MARK <= SP) {
4142 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4143 if (PL_tainted)
4144 break;
4145 }
4146 MARK = ORIGMARK;
4147 TAINT_PROPER("system");
4148 }
4149 PERL_FLUSHALL_FOR_CHILD;
4150#if (defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(OS2) || defined(PERL_MICRO)
4151 {
4152 Pid_t childpid;
4153 int pp[2];
4154 I32 did_pipes = 0;
4155#if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4156 sigset_t newset, oldset;
4157#endif
4158
4159 if (PerlProc_pipe(pp) >= 0)
4160 did_pipes = 1;
4161#if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4162 sigemptyset(&newset);
4163 sigaddset(&newset, SIGCHLD);
4164 sigprocmask(SIG_BLOCK, &newset, &oldset);
4165#endif
4166 while ((childpid = PerlProc_fork()) == -1) {
4167 if (errno != EAGAIN) {
4168 value = -1;
4169 SP = ORIGMARK;
4170 XPUSHi(value);
4171 if (did_pipes) {
4172 PerlLIO_close(pp[0]);
4173 PerlLIO_close(pp[1]);
4174 }
4175#if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4176 sigprocmask(SIG_SETMASK, &oldset, NULL);
4177#endif
4178 RETURN;
4179 }
4180 sleep(5);
4181 }
4182 if (childpid > 0) {
4183 Sigsave_t ihand,qhand; /* place to save signals during system() */
4184 int status;
4185
4186 if (did_pipes)
4187 PerlLIO_close(pp[1]);
4188#ifndef PERL_MICRO
4189 rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand);
4190 rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand);
4191#endif
4192 do {
4193 result = wait4pid(childpid, &status, 0);
4194 } while (result == -1 && errno == EINTR);
4195#ifndef PERL_MICRO
4196#ifdef HAS_SIGPROCMASK
4197 sigprocmask(SIG_SETMASK, &oldset, NULL);
4198#endif
4199 (void)rsignal_restore(SIGINT, &ihand);
4200 (void)rsignal_restore(SIGQUIT, &qhand);
4201#endif
4202 STATUS_NATIVE_CHILD_SET(result == -1 ? -1 : status);
4203 do_execfree(); /* free any memory child malloced on fork */
4204 SP = ORIGMARK;
4205 if (did_pipes) {
4206 int errkid;
4207 unsigned n = 0;
4208 SSize_t n1;
4209
4210 while (n < sizeof(int)) {
4211 n1 = PerlLIO_read(pp[0],
4212 (void*)(((char*)&errkid)+n),
4213 (sizeof(int)) - n);
4214 if (n1 <= 0)
4215 break;
4216 n += n1;
4217 }
4218 PerlLIO_close(pp[0]);
4219 if (n) { /* Error */
4220 if (n != sizeof(int))
4221 DIE(aTHX_ "panic: kid popen errno read, n=%u", n);
4222 errno = errkid; /* Propagate errno from kid */
4223 STATUS_NATIVE_CHILD_SET(-1);
4224 }
4225 }
4226 XPUSHi(STATUS_CURRENT);
4227 RETURN;
4228 }
4229#if (defined(HAS_SIGPROCMASK) && !defined(PERL_MICRO))
4230 sigprocmask(SIG_SETMASK, &oldset, NULL);
4231#endif
4232 if (did_pipes) {
4233 PerlLIO_close(pp[0]);
4234#if defined(HAS_FCNTL) && defined(F_SETFD)
4235 fcntl(pp[1], F_SETFD, FD_CLOEXEC);
4236#endif
4237 }
4238 if (PL_op->op_flags & OPf_STACKED) {
4239 SV * const really = *++MARK;
4240 value = (I32)do_aexec5(really, MARK, SP, pp[1], did_pipes);
4241 }
4242 else if (SP - MARK != 1)
4243 value = (I32)do_aexec5(NULL, MARK, SP, pp[1], did_pipes);
4244 else {
4245 value = (I32)do_exec3(SvPVx_nolen(sv_mortalcopy(*SP)), pp[1], did_pipes);
4246 }
4247 PerlProc__exit(-1);
4248 }
4249#else /* ! FORK or VMS or OS/2 */
4250 PL_statusvalue = 0;
4251 result = 0;
4252 if (PL_op->op_flags & OPf_STACKED) {
4253 SV * const really = *++MARK;
4254# if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4255 value = (I32)do_aspawn(really, MARK, SP);
4256# else
4257 value = (I32)do_aspawn(really, (void **)MARK, (void **)SP);
4258# endif
4259 }
4260 else if (SP - MARK != 1) {
4261# if defined(WIN32) || defined(OS2) || defined(__SYMBIAN32__) || defined(__VMS)
4262 value = (I32)do_aspawn(NULL, MARK, SP);
4263# else
4264 value = (I32)do_aspawn(NULL, (void **)MARK, (void **)SP);
4265# endif
4266 }
4267 else {
4268 value = (I32)do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4269 }
4270 if (PL_statusvalue == -1) /* hint that value must be returned as is */
4271 result = 1;
4272 STATUS_NATIVE_CHILD_SET(value);
4273 do_execfree();
4274 SP = ORIGMARK;
4275 XPUSHi(result ? value : STATUS_CURRENT);
4276#endif /* !FORK or VMS or OS/2 */
4277#endif
4278 RETURN;
4279}
4280
4281PP(pp_exec)
4282{
4283 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
4284 I32 value;
4285
4286 if (PL_tainting) {
4287 TAINT_ENV();
4288 while (++MARK <= SP) {
4289 (void)SvPV_nolen_const(*MARK); /* stringify for taint check */
4290 if (PL_tainted)
4291 break;
4292 }
4293 MARK = ORIGMARK;
4294 TAINT_PROPER("exec");
4295 }
4296 PERL_FLUSHALL_FOR_CHILD;
4297 if (PL_op->op_flags & OPf_STACKED) {
4298 SV * const really = *++MARK;
4299 value = (I32)do_aexec(really, MARK, SP);
4300 }
4301 else if (SP - MARK != 1)
4302#ifdef VMS
4303 value = (I32)vms_do_aexec(NULL, MARK, SP);
4304#else
4305# ifdef __OPEN_VM
4306 {
4307 (void ) do_aspawn(NULL, MARK, SP);
4308 value = 0;
4309 }
4310# else
4311 value = (I32)do_aexec(NULL, MARK, SP);
4312# endif
4313#endif
4314 else {
4315#ifdef VMS
4316 value = (I32)vms_do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4317#else
4318# ifdef __OPEN_VM
4319 (void) do_spawn(SvPVx_nolen(sv_mortalcopy(*SP)));
4320 value = 0;
4321# else
4322 value = (I32)do_exec(SvPVx_nolen(sv_mortalcopy(*SP)));
4323# endif
4324#endif
4325 }
4326
4327 SP = ORIGMARK;
4328 XPUSHi(value);
4329 RETURN;
4330}
4331
4332PP(pp_getppid)
4333{
4334#ifdef HAS_GETPPID
4335 dVAR; dSP; dTARGET;
4336 XPUSHi( getppid() );
4337 RETURN;
4338#else
4339 DIE(aTHX_ PL_no_func, "getppid");
4340#endif
4341}
4342
4343PP(pp_getpgrp)
4344{
4345#ifdef HAS_GETPGRP
4346 dVAR; dSP; dTARGET;
4347 Pid_t pgrp;
4348 const Pid_t pid =
4349 (MAXARG < 1) ? 0 : TOPs ? SvIVx(POPs) : ((void)POPs, 0);
4350
4351#ifdef BSD_GETPGRP
4352 pgrp = (I32)BSD_GETPGRP(pid);
4353#else
4354 if (pid != 0 && pid != PerlProc_getpid())
4355 DIE(aTHX_ "POSIX getpgrp can't take an argument");
4356 pgrp = getpgrp();
4357#endif
4358 XPUSHi(pgrp);
4359 RETURN;
4360#else
4361 DIE(aTHX_ PL_no_func, "getpgrp()");
4362#endif
4363}
4364
4365PP(pp_setpgrp)
4366{
4367#ifdef HAS_SETPGRP
4368 dVAR; dSP; dTARGET;
4369 Pid_t pgrp;
4370 Pid_t pid;
4371 pgrp = MAXARG == 2 && (TOPs||POPs) ? POPi : 0;
4372 if (MAXARG > 0) pid = TOPs && TOPi;
4373 else {
4374 pid = 0;
4375 XPUSHi(-1);
4376 }
4377
4378 TAINT_PROPER("setpgrp");
4379#ifdef BSD_SETPGRP
4380 SETi( BSD_SETPGRP(pid, pgrp) >= 0 );
4381#else
4382 if ((pgrp != 0 && pgrp != PerlProc_getpid())
4383 || (pid != 0 && pid != PerlProc_getpid()))
4384 {
4385 DIE(aTHX_ "setpgrp can't take arguments");
4386 }
4387 SETi( setpgrp() >= 0 );
4388#endif /* USE_BSDPGRP */
4389 RETURN;
4390#else
4391 DIE(aTHX_ PL_no_func, "setpgrp()");
4392#endif
4393}
4394
4395#if defined(__GLIBC__) && ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) || (__GLIBC__ > 2))
4396# define PRIORITY_WHICH_T(which) (__priority_which_t)which
4397#else
4398# define PRIORITY_WHICH_T(which) which
4399#endif
4400
4401PP(pp_getpriority)
4402{
4403#ifdef HAS_GETPRIORITY
4404 dVAR; dSP; dTARGET;
4405 const int who = POPi;
4406 const int which = TOPi;
4407 SETi( getpriority(PRIORITY_WHICH_T(which), who) );
4408 RETURN;
4409#else
4410 DIE(aTHX_ PL_no_func, "getpriority()");
4411#endif
4412}
4413
4414PP(pp_setpriority)
4415{
4416#ifdef HAS_SETPRIORITY
4417 dVAR; dSP; dTARGET;
4418 const int niceval = POPi;
4419 const int who = POPi;
4420 const int which = TOPi;
4421 TAINT_PROPER("setpriority");
4422 SETi( setpriority(PRIORITY_WHICH_T(which), who, niceval) >= 0 );
4423 RETURN;
4424#else
4425 DIE(aTHX_ PL_no_func, "setpriority()");
4426#endif
4427}
4428
4429#undef PRIORITY_WHICH_T
4430
4431/* Time calls. */
4432
4433PP(pp_time)
4434{
4435 dVAR; dSP; dTARGET;
4436#ifdef BIG_TIME
4437 XPUSHn( time(NULL) );
4438#else
4439 XPUSHi( time(NULL) );
4440#endif
4441 RETURN;
4442}
4443
4444PP(pp_tms)
4445{
4446#ifdef HAS_TIMES
4447 dVAR;
4448 dSP;
4449 EXTEND(SP, 4);
4450#ifndef VMS
4451 (void)PerlProc_times(&PL_timesbuf);
4452#else
4453 (void)PerlProc_times((tbuffer_t *)&PL_timesbuf); /* time.h uses different name for */
4454 /* struct tms, though same data */
4455 /* is returned. */
4456#endif
4457
4458 mPUSHn(((NV)PL_timesbuf.tms_utime)/(NV)PL_clocktick);
4459 if (GIMME == G_ARRAY) {
4460 mPUSHn(((NV)PL_timesbuf.tms_stime)/(NV)PL_clocktick);
4461 mPUSHn(((NV)PL_timesbuf.tms_cutime)/(NV)PL_clocktick);
4462 mPUSHn(((NV)PL_timesbuf.tms_cstime)/(NV)PL_clocktick);
4463 }
4464 RETURN;
4465#else
4466# ifdef PERL_MICRO
4467 dSP;
4468 mPUSHn(0.0);
4469 EXTEND(SP, 4);
4470 if (GIMME == G_ARRAY) {
4471 mPUSHn(0.0);
4472 mPUSHn(0.0);
4473 mPUSHn(0.0);
4474 }
4475 RETURN;
4476# else
4477 DIE(aTHX_ "times not implemented");
4478# endif
4479#endif /* HAS_TIMES */
4480}
4481
4482/* The 32 bit int year limits the times we can represent to these
4483 boundaries with a few days wiggle room to account for time zone
4484 offsets
4485*/
4486/* Sat Jan 3 00:00:00 -2147481748 */
4487#define TIME_LOWER_BOUND -67768100567755200.0
4488/* Sun Dec 29 12:00:00 2147483647 */
4489#define TIME_UPPER_BOUND 67767976233316800.0
4490
4491PP(pp_gmtime)
4492{
4493 dVAR;
4494 dSP;
4495 Time64_T when;
4496 struct TM tmbuf;
4497 struct TM *err;
4498 const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
4499 static const char * const dayname[] =
4500 {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
4501 static const char * const monname[] =
4502 {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
4503 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
4504
4505 if (MAXARG < 1 || (!TOPs && ((void)POPs, 1))) {
4506 time_t now;
4507 (void)time(&now);
4508 when = (Time64_T)now;
4509 }
4510 else {
4511 NV input = Perl_floor(POPn);
4512 when = (Time64_T)input;
4513 if (when != input) {
4514 /* diag_listed_as: gmtime(%f) too large */
4515 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4516 "%s(%.0" NVff ") too large", opname, input);
4517 }
4518 }
4519
4520 if ( TIME_LOWER_BOUND > when ) {
4521 /* diag_listed_as: gmtime(%f) too small */
4522 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4523 "%s(%.0" NVff ") too small", opname, when);
4524 err = NULL;
4525 }
4526 else if( when > TIME_UPPER_BOUND ) {
4527 /* diag_listed_as: gmtime(%f) too small */
4528 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4529 "%s(%.0" NVff ") too large", opname, when);
4530 err = NULL;
4531 }
4532 else {
4533 if (PL_op->op_type == OP_LOCALTIME)
4534 err = S_localtime64_r(&when, &tmbuf);
4535 else
4536 err = S_gmtime64_r(&when, &tmbuf);
4537 }
4538
4539 if (err == NULL) {
4540 /* XXX %lld broken for quads */
4541 Perl_ck_warner(aTHX_ packWARN(WARN_OVERFLOW),
4542 "%s(%.0" NVff ") failed", opname, when);
4543 }
4544
4545 if (GIMME != G_ARRAY) { /* scalar context */
4546 SV *tsv;
4547 /* XXX newSVpvf()'s %lld type is broken, so cheat with a double */
4548 double year = (double)tmbuf.tm_year + 1900;
4549
4550 EXTEND(SP, 1);
4551 EXTEND_MORTAL(1);
4552 if (err == NULL)
4553 RETPUSHUNDEF;
4554
4555 tsv = Perl_newSVpvf(aTHX_ "%s %s %2d %02d:%02d:%02d %.0f",
4556 dayname[tmbuf.tm_wday],
4557 monname[tmbuf.tm_mon],
4558 tmbuf.tm_mday,
4559 tmbuf.tm_hour,
4560 tmbuf.tm_min,
4561 tmbuf.tm_sec,
4562 year);
4563 mPUSHs(tsv);
4564 }
4565 else { /* list context */
4566 if ( err == NULL )
4567 RETURN;
4568
4569 EXTEND(SP, 9);
4570 EXTEND_MORTAL(9);
4571 mPUSHi(tmbuf.tm_sec);
4572 mPUSHi(tmbuf.tm_min);
4573 mPUSHi(tmbuf.tm_hour);
4574 mPUSHi(tmbuf.tm_mday);
4575 mPUSHi(tmbuf.tm_mon);
4576 mPUSHn(tmbuf.tm_year);
4577 mPUSHi(tmbuf.tm_wday);
4578 mPUSHi(tmbuf.tm_yday);
4579 mPUSHi(tmbuf.tm_isdst);
4580 }
4581 RETURN;
4582}
4583
4584PP(pp_alarm)
4585{
4586#ifdef HAS_ALARM
4587 dVAR; dSP; dTARGET;
4588 int anum;
4589 anum = POPi;
4590 anum = alarm((unsigned int)anum);
4591 if (anum < 0)
4592 RETPUSHUNDEF;
4593 PUSHi(anum);
4594 RETURN;
4595#else
4596 DIE(aTHX_ PL_no_func, "alarm");
4597#endif
4598}
4599
4600PP(pp_sleep)
4601{
4602 dVAR; dSP; dTARGET;
4603 I32 duration;
4604 Time_t lasttime;
4605 Time_t when;
4606
4607 (void)time(&lasttime);
4608 if (MAXARG < 1 || (!TOPs && !POPs))
4609 PerlProc_pause();
4610 else {
4611 duration = POPi;
4612 PerlProc_sleep((unsigned int)duration);
4613 }
4614 (void)time(&when);
4615 XPUSHi(when - lasttime);
4616 RETURN;
4617}
4618
4619/* Shared memory. */
4620/* Merged with some message passing. */
4621
4622PP(pp_shmwrite)
4623{
4624#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4625 dVAR; dSP; dMARK; dTARGET;
4626 const int op_type = PL_op->op_type;
4627 I32 value;
4628
4629 switch (op_type) {
4630 case OP_MSGSND:
4631 value = (I32)(do_msgsnd(MARK, SP) >= 0);
4632 break;
4633 case OP_MSGRCV:
4634 value = (I32)(do_msgrcv(MARK, SP) >= 0);
4635 break;
4636 case OP_SEMOP:
4637 value = (I32)(do_semop(MARK, SP) >= 0);
4638 break;
4639 default:
4640 value = (I32)(do_shmio(op_type, MARK, SP) >= 0);
4641 break;
4642 }
4643
4644 SP = MARK;
4645 PUSHi(value);
4646 RETURN;
4647#else
4648 return Perl_pp_semget(aTHX);
4649#endif
4650}
4651
4652/* Semaphores. */
4653
4654PP(pp_semget)
4655{
4656#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4657 dVAR; dSP; dMARK; dTARGET;
4658 const int anum = do_ipcget(PL_op->op_type, MARK, SP);
4659 SP = MARK;
4660 if (anum == -1)
4661 RETPUSHUNDEF;
4662 PUSHi(anum);
4663 RETURN;
4664#else
4665 DIE(aTHX_ "System V IPC is not implemented on this machine");
4666#endif
4667}
4668
4669PP(pp_semctl)
4670{
4671#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
4672 dVAR; dSP; dMARK; dTARGET;
4673 const int anum = do_ipcctl(PL_op->op_type, MARK, SP);
4674 SP = MARK;
4675 if (anum == -1)
4676 RETSETUNDEF;
4677 if (anum != 0) {
4678 PUSHi(anum);
4679 }
4680 else {
4681 PUSHp(zero_but_true, ZBTLEN);
4682 }
4683 RETURN;
4684#else
4685 return Perl_pp_semget(aTHX);
4686#endif
4687}
4688
4689/* I can't const this further without getting warnings about the types of
4690 various arrays passed in from structures. */
4691static SV *
4692S_space_join_names_mortal(pTHX_ char *const *array)
4693{
4694 SV *target;
4695
4696 PERL_ARGS_ASSERT_SPACE_JOIN_NAMES_MORTAL;
4697
4698 if (array && *array) {
4699 target = newSVpvs_flags("", SVs_TEMP);
4700 while (1) {
4701 sv_catpv(target, *array);
4702 if (!*++array)
4703 break;
4704 sv_catpvs(target, " ");
4705 }
4706 } else {
4707 target = sv_mortalcopy(&PL_sv_no);
4708 }
4709 return target;
4710}
4711
4712/* Get system info. */
4713
4714PP(pp_ghostent)
4715{
4716#if defined(HAS_GETHOSTBYNAME) || defined(HAS_GETHOSTBYADDR) || defined(HAS_GETHOSTENT)
4717 dVAR; dSP;
4718 I32 which = PL_op->op_type;
4719 register char **elem;
4720 register SV *sv;
4721#ifndef HAS_GETHOST_PROTOS /* XXX Do we need individual probes? */
4722 struct hostent *gethostbyaddr(Netdb_host_t, Netdb_hlen_t, int);
4723 struct hostent *gethostbyname(Netdb_name_t);
4724 struct hostent *gethostent(void);
4725#endif
4726 struct hostent *hent = NULL;
4727 unsigned long len;
4728
4729 EXTEND(SP, 10);
4730 if (which == OP_GHBYNAME) {
4731#ifdef HAS_GETHOSTBYNAME
4732 const char* const name = POPpbytex;
4733 hent = PerlSock_gethostbyname(name);
4734#else
4735 DIE(aTHX_ PL_no_sock_func, "gethostbyname");
4736#endif
4737 }
4738 else if (which == OP_GHBYADDR) {
4739#ifdef HAS_GETHOSTBYADDR
4740 const int addrtype = POPi;
4741 SV * const addrsv = POPs;
4742 STRLEN addrlen;
4743 const char *addr = (char *)SvPVbyte(addrsv, addrlen);
4744
4745 hent = PerlSock_gethostbyaddr(addr, (Netdb_hlen_t) addrlen, addrtype);
4746#else
4747 DIE(aTHX_ PL_no_sock_func, "gethostbyaddr");
4748#endif
4749 }
4750 else
4751#ifdef HAS_GETHOSTENT
4752 hent = PerlSock_gethostent();
4753#else
4754 DIE(aTHX_ PL_no_sock_func, "gethostent");
4755#endif
4756
4757#ifdef HOST_NOT_FOUND
4758 if (!hent) {
4759#ifdef USE_REENTRANT_API
4760# ifdef USE_GETHOSTENT_ERRNO
4761 h_errno = PL_reentrant_buffer->_gethostent_errno;
4762# endif
4763#endif
4764 STATUS_UNIX_SET(h_errno);
4765 }
4766#endif
4767
4768 if (GIMME != G_ARRAY) {
4769 PUSHs(sv = sv_newmortal());
4770 if (hent) {
4771 if (which == OP_GHBYNAME) {
4772 if (hent->h_addr)
4773 sv_setpvn(sv, hent->h_addr, hent->h_length);
4774 }
4775 else
4776 sv_setpv(sv, (char*)hent->h_name);
4777 }
4778 RETURN;
4779 }
4780
4781 if (hent) {
4782 mPUSHs(newSVpv((char*)hent->h_name, 0));
4783 PUSHs(space_join_names_mortal(hent->h_aliases));
4784 mPUSHi(hent->h_addrtype);
4785 len = hent->h_length;
4786 mPUSHi(len);
4787#ifdef h_addr
4788 for (elem = hent->h_addr_list; elem && *elem; elem++) {
4789 mXPUSHp(*elem, len);
4790 }
4791#else
4792 if (hent->h_addr)
4793 mPUSHp(hent->h_addr, len);
4794 else
4795 PUSHs(sv_mortalcopy(&PL_sv_no));
4796#endif /* h_addr */
4797 }
4798 RETURN;
4799#else
4800 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4801#endif
4802}
4803
4804PP(pp_gnetent)
4805{
4806#if defined(HAS_GETNETBYNAME) || defined(HAS_GETNETBYADDR) || defined(HAS_GETNETENT)
4807 dVAR; dSP;
4808 I32 which = PL_op->op_type;
4809 register SV *sv;
4810#ifndef HAS_GETNET_PROTOS /* XXX Do we need individual probes? */
4811 struct netent *getnetbyaddr(Netdb_net_t, int);
4812 struct netent *getnetbyname(Netdb_name_t);
4813 struct netent *getnetent(void);
4814#endif
4815 struct netent *nent;
4816
4817 if (which == OP_GNBYNAME){
4818#ifdef HAS_GETNETBYNAME
4819 const char * const name = POPpbytex;
4820 nent = PerlSock_getnetbyname(name);
4821#else
4822 DIE(aTHX_ PL_no_sock_func, "getnetbyname");
4823#endif
4824 }
4825 else if (which == OP_GNBYADDR) {
4826#ifdef HAS_GETNETBYADDR
4827 const int addrtype = POPi;
4828 const Netdb_net_t addr = (Netdb_net_t) (U32)POPu;
4829 nent = PerlSock_getnetbyaddr(addr, addrtype);
4830#else
4831 DIE(aTHX_ PL_no_sock_func, "getnetbyaddr");
4832#endif
4833 }
4834 else
4835#ifdef HAS_GETNETENT
4836 nent = PerlSock_getnetent();
4837#else
4838 DIE(aTHX_ PL_no_sock_func, "getnetent");
4839#endif
4840
4841#ifdef HOST_NOT_FOUND
4842 if (!nent) {
4843#ifdef USE_REENTRANT_API
4844# ifdef USE_GETNETENT_ERRNO
4845 h_errno = PL_reentrant_buffer->_getnetent_errno;
4846# endif
4847#endif
4848 STATUS_UNIX_SET(h_errno);
4849 }
4850#endif
4851
4852 EXTEND(SP, 4);
4853 if (GIMME != G_ARRAY) {
4854 PUSHs(sv = sv_newmortal());
4855 if (nent) {
4856 if (which == OP_GNBYNAME)
4857 sv_setiv(sv, (IV)nent->n_net);
4858 else
4859 sv_setpv(sv, nent->n_name);
4860 }
4861 RETURN;
4862 }
4863
4864 if (nent) {
4865 mPUSHs(newSVpv(nent->n_name, 0));
4866 PUSHs(space_join_names_mortal(nent->n_aliases));
4867 mPUSHi(nent->n_addrtype);
4868 mPUSHi(nent->n_net);
4869 }
4870
4871 RETURN;
4872#else
4873 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4874#endif
4875}
4876
4877PP(pp_gprotoent)
4878{
4879#if defined(HAS_GETPROTOBYNAME) || defined(HAS_GETPROTOBYNUMBER) || defined(HAS_GETPROTOENT)
4880 dVAR; dSP;
4881 I32 which = PL_op->op_type;
4882 register SV *sv;
4883#ifndef HAS_GETPROTO_PROTOS /* XXX Do we need individual probes? */
4884 struct protoent *getprotobyname(Netdb_name_t);
4885 struct protoent *getprotobynumber(int);
4886 struct protoent *getprotoent(void);
4887#endif
4888 struct protoent *pent;
4889
4890 if (which == OP_GPBYNAME) {
4891#ifdef HAS_GETPROTOBYNAME
4892 const char* const name = POPpbytex;
4893 pent = PerlSock_getprotobyname(name);
4894#else
4895 DIE(aTHX_ PL_no_sock_func, "getprotobyname");
4896#endif
4897 }
4898 else if (which == OP_GPBYNUMBER) {
4899#ifdef HAS_GETPROTOBYNUMBER
4900 const int number = POPi;
4901 pent = PerlSock_getprotobynumber(number);
4902#else
4903 DIE(aTHX_ PL_no_sock_func, "getprotobynumber");
4904#endif
4905 }
4906 else
4907#ifdef HAS_GETPROTOENT
4908 pent = PerlSock_getprotoent();
4909#else
4910 DIE(aTHX_ PL_no_sock_func, "getprotoent");
4911#endif
4912
4913 EXTEND(SP, 3);
4914 if (GIMME != G_ARRAY) {
4915 PUSHs(sv = sv_newmortal());
4916 if (pent) {
4917 if (which == OP_GPBYNAME)
4918 sv_setiv(sv, (IV)pent->p_proto);
4919 else
4920 sv_setpv(sv, pent->p_name);
4921 }
4922 RETURN;
4923 }
4924
4925 if (pent) {
4926 mPUSHs(newSVpv(pent->p_name, 0));
4927 PUSHs(space_join_names_mortal(pent->p_aliases));
4928 mPUSHi(pent->p_proto);
4929 }
4930
4931 RETURN;
4932#else
4933 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
4934#endif
4935}
4936
4937PP(pp_gservent)
4938{
4939#if defined(HAS_GETSERVBYNAME) || defined(HAS_GETSERVBYPORT) || defined(HAS_GETSERVENT)
4940 dVAR; dSP;
4941 I32 which = PL_op->op_type;
4942 register SV *sv;
4943#ifndef HAS_GETSERV_PROTOS /* XXX Do we need individual probes? */
4944 struct servent *getservbyname(Netdb_name_t, Netdb_name_t);
4945 struct servent *getservbyport(int, Netdb_name_t);
4946 struct servent *getservent(void);
4947#endif
4948 struct servent *sent;
4949
4950 if (which == OP_GSBYNAME) {
4951#ifdef HAS_GETSERVBYNAME
4952 const char * const proto = POPpbytex;
4953 const char * const name = POPpbytex;
4954 sent = PerlSock_getservbyname(name, (proto && !*proto) ? NULL : proto);
4955#else
4956 DIE(aTHX_ PL_no_sock_func, "getservbyname");
4957#endif
4958 }
4959 else if (which == OP_GSBYPORT) {
4960#ifdef HAS_GETSERVBYPORT
4961 const char * const proto = POPpbytex;
4962 unsigned short port = (unsigned short)POPu;
4963#ifdef HAS_HTONS
4964 port = PerlSock_htons(port);
4965#endif
4966 sent = PerlSock_getservbyport(port, (proto && !*proto) ? NULL : proto);
4967#else
4968 DIE(aTHX_ PL_no_sock_func, "getservbyport");
4969#endif
4970 }
4971 else
4972#ifdef HAS_GETSERVENT
4973 sent = PerlSock_getservent();
4974#else
4975 DIE(aTHX_ PL_no_sock_func, "getservent");
4976#endif
4977
4978 EXTEND(SP, 4);
4979 if (GIMME != G_ARRAY) {
4980 PUSHs(sv = sv_newmortal());
4981 if (sent) {
4982 if (which == OP_GSBYNAME) {
4983#ifdef HAS_NTOHS
4984 sv_setiv(sv, (IV)PerlSock_ntohs(sent->s_port));
4985#else
4986 sv_setiv(sv, (IV)(sent->s_port));
4987#endif
4988 }
4989 else
4990 sv_setpv(sv, sent->s_name);
4991 }
4992 RETURN;
4993 }
4994
4995 if (sent) {
4996 mPUSHs(newSVpv(sent->s_name, 0));
4997 PUSHs(space_join_names_mortal(sent->s_aliases));
4998#ifdef HAS_NTOHS
4999 mPUSHi(PerlSock_ntohs(sent->s_port));
5000#else
5001 mPUSHi(sent->s_port);
5002#endif
5003 mPUSHs(newSVpv(sent->s_proto, 0));
5004 }
5005
5006 RETURN;
5007#else
5008 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5009#endif
5010}
5011
5012PP(pp_shostent)
5013{
5014 dVAR; dSP;
5015 const int stayopen = TOPi;
5016 switch(PL_op->op_type) {
5017 case OP_SHOSTENT:
5018#ifdef HAS_SETHOSTENT
5019 PerlSock_sethostent(stayopen);
5020#else
5021 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5022#endif
5023 break;
5024#ifdef HAS_SETNETENT
5025 case OP_SNETENT:
5026 PerlSock_setnetent(stayopen);
5027#else
5028 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5029#endif
5030 break;
5031 case OP_SPROTOENT:
5032#ifdef HAS_SETPROTOENT
5033 PerlSock_setprotoent(stayopen);
5034#else
5035 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5036#endif
5037 break;
5038 case OP_SSERVENT:
5039#ifdef HAS_SETSERVENT
5040 PerlSock_setservent(stayopen);
5041#else
5042 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5043#endif
5044 break;
5045 }
5046 RETSETYES;
5047}
5048
5049PP(pp_ehostent)
5050{
5051 dVAR; dSP;
5052 switch(PL_op->op_type) {
5053 case OP_EHOSTENT:
5054#ifdef HAS_ENDHOSTENT
5055 PerlSock_endhostent();
5056#else
5057 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5058#endif
5059 break;
5060 case OP_ENETENT:
5061#ifdef HAS_ENDNETENT
5062 PerlSock_endnetent();
5063#else
5064 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5065#endif
5066 break;
5067 case OP_EPROTOENT:
5068#ifdef HAS_ENDPROTOENT
5069 PerlSock_endprotoent();
5070#else
5071 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5072#endif
5073 break;
5074 case OP_ESERVENT:
5075#ifdef HAS_ENDSERVENT
5076 PerlSock_endservent();
5077#else
5078 DIE(aTHX_ PL_no_sock_func, PL_op_desc[PL_op->op_type]);
5079#endif
5080 break;
5081 case OP_SGRENT:
5082#if defined(HAS_GROUP) && defined(HAS_SETGRENT)
5083 setgrent();
5084#else
5085 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5086#endif
5087 break;
5088 case OP_EGRENT:
5089#if defined(HAS_GROUP) && defined(HAS_ENDGRENT)
5090 endgrent();
5091#else
5092 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5093#endif
5094 break;
5095 case OP_SPWENT:
5096#if defined(HAS_PASSWD) && defined(HAS_SETPWENT)
5097 setpwent();
5098#else
5099 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5100#endif
5101 break;
5102 case OP_EPWENT:
5103#if defined(HAS_PASSWD) && defined(HAS_ENDPWENT)
5104 endpwent();
5105#else
5106 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5107#endif
5108 break;
5109 }
5110 EXTEND(SP,1);
5111 RETPUSHYES;
5112}
5113
5114PP(pp_gpwent)
5115{
5116#ifdef HAS_PASSWD
5117 dVAR; dSP;
5118 I32 which = PL_op->op_type;
5119 register SV *sv;
5120 struct passwd *pwent = NULL;
5121 /*
5122 * We currently support only the SysV getsp* shadow password interface.
5123 * The interface is declared in <shadow.h> and often one needs to link
5124 * with -lsecurity or some such.
5125 * This interface is used at least by Solaris, HP-UX, IRIX, and Linux.
5126 * (and SCO?)
5127 *
5128 * AIX getpwnam() is clever enough to return the encrypted password
5129 * only if the caller (euid?) is root.
5130 *
5131 * There are at least three other shadow password APIs. Many platforms
5132 * seem to contain more than one interface for accessing the shadow
5133 * password databases, possibly for compatibility reasons.
5134 * The getsp*() is by far he simplest one, the other two interfaces
5135 * are much more complicated, but also very similar to each other.
5136 *
5137 * <sys/types.h>
5138 * <sys/security.h>
5139 * <prot.h>
5140 * struct pr_passwd *getprpw*();
5141 * The password is in
5142 * char getprpw*(...).ufld.fd_encrypt[]
5143 * Mention HAS_GETPRPWNAM here so that Configure probes for it.
5144 *
5145 * <sys/types.h>
5146 * <sys/security.h>
5147 * <prot.h>
5148 * struct es_passwd *getespw*();
5149 * The password is in
5150 * char *(getespw*(...).ufld.fd_encrypt)
5151 * Mention HAS_GETESPWNAM here so that Configure probes for it.
5152 *
5153 * <userpw.h> (AIX)
5154 * struct userpw *getuserpw();
5155 * The password is in
5156 * char *(getuserpw(...)).spw_upw_passwd
5157 * (but the de facto standard getpwnam() should work okay)
5158 *
5159 * Mention I_PROT here so that Configure probes for it.
5160 *
5161 * In HP-UX for getprpw*() the manual page claims that one should include
5162 * <hpsecurity.h> instead of <sys/security.h>, but that is not needed
5163 * if one includes <shadow.h> as that includes <hpsecurity.h>,
5164 * and pp_sys.c already includes <shadow.h> if there is such.
5165 *
5166 * Note that <sys/security.h> is already probed for, but currently
5167 * it is only included in special cases.
5168 *
5169 * In Digital UNIX/Tru64 if using the getespw*() (which seems to be
5170 * be preferred interface, even though also the getprpw*() interface
5171 * is available) one needs to link with -lsecurity -ldb -laud -lm.
5172 * One also needs to call set_auth_parameters() in main() before
5173 * doing anything else, whether one is using getespw*() or getprpw*().
5174 *
5175 * Note that accessing the shadow databases can be magnitudes
5176 * slower than accessing the standard databases.
5177 *
5178 * --jhi
5179 */
5180
5181# if defined(__CYGWIN__) && defined(USE_REENTRANT_API)
5182 /* Cygwin 1.5.3-1 has buggy getpwnam_r() and getpwuid_r():
5183 * the pw_comment is left uninitialized. */
5184 PL_reentrant_buffer->_pwent_struct.pw_comment = NULL;
5185# endif
5186
5187 switch (which) {
5188 case OP_GPWNAM:
5189 {
5190 const char* const name = POPpbytex;
5191 pwent = getpwnam(name);
5192 }
5193 break;
5194 case OP_GPWUID:
5195 {
5196 Uid_t uid = POPi;
5197 pwent = getpwuid(uid);
5198 }
5199 break;
5200 case OP_GPWENT:
5201# ifdef HAS_GETPWENT
5202 pwent = getpwent();
5203#ifdef POSIX_BC /* In some cases pw_passwd has invalid addresses */
5204 if (pwent) pwent = getpwnam(pwent->pw_name);
5205#endif
5206# else
5207 DIE(aTHX_ PL_no_func, "getpwent");
5208# endif
5209 break;
5210 }
5211
5212 EXTEND(SP, 10);
5213 if (GIMME != G_ARRAY) {
5214 PUSHs(sv = sv_newmortal());
5215 if (pwent) {
5216 if (which == OP_GPWNAM)
5217# if Uid_t_sign <= 0
5218 sv_setiv(sv, (IV)pwent->pw_uid);
5219# else
5220 sv_setuv(sv, (UV)pwent->pw_uid);
5221# endif
5222 else
5223 sv_setpv(sv, pwent->pw_name);
5224 }
5225 RETURN;
5226 }
5227
5228 if (pwent) {
5229 mPUSHs(newSVpv(pwent->pw_name, 0));
5230
5231 sv = newSViv(0);
5232 mPUSHs(sv);
5233 /* If we have getspnam(), we try to dig up the shadow
5234 * password. If we are underprivileged, the shadow
5235 * interface will set the errno to EACCES or similar,
5236 * and return a null pointer. If this happens, we will
5237 * use the dummy password (usually "*" or "x") from the
5238 * standard password database.
5239 *
5240 * In theory we could skip the shadow call completely
5241 * if euid != 0 but in practice we cannot know which
5242 * security measures are guarding the shadow databases
5243 * on a random platform.
5244 *
5245 * Resist the urge to use additional shadow interfaces.
5246 * Divert the urge to writing an extension instead.
5247 *
5248 * --jhi */
5249 /* Some AIX setups falsely(?) detect some getspnam(), which
5250 * has a different API than the Solaris/IRIX one. */
5251# if defined(HAS_GETSPNAM) && !defined(_AIX)
5252 {
5253 dSAVE_ERRNO;
5254 const struct spwd * const spwent = getspnam(pwent->pw_name);
5255 /* Save and restore errno so that
5256 * underprivileged attempts seem
5257 * to have never made the unsuccessful
5258 * attempt to retrieve the shadow password. */
5259 RESTORE_ERRNO;
5260 if (spwent && spwent->sp_pwdp)
5261 sv_setpv(sv, spwent->sp_pwdp);
5262 }
5263# endif
5264# ifdef PWPASSWD
5265 if (!SvPOK(sv)) /* Use the standard password, then. */
5266 sv_setpv(sv, pwent->pw_passwd);
5267# endif
5268
5269# ifndef INCOMPLETE_TAINTS
5270 /* passwd is tainted because user himself can diddle with it.
5271 * admittedly not much and in a very limited way, but nevertheless. */
5272 SvTAINTED_on(sv);
5273# endif
5274
5275# if Uid_t_sign <= 0
5276 mPUSHi(pwent->pw_uid);
5277# else
5278 mPUSHu(pwent->pw_uid);
5279# endif
5280
5281# if Uid_t_sign <= 0
5282 mPUSHi(pwent->pw_gid);
5283# else
5284 mPUSHu(pwent->pw_gid);
5285# endif
5286 /* pw_change, pw_quota, and pw_age are mutually exclusive--
5287 * because of the poor interface of the Perl getpw*(),
5288 * not because there's some standard/convention saying so.
5289 * A better interface would have been to return a hash,
5290 * but we are accursed by our history, alas. --jhi. */
5291# ifdef PWCHANGE
5292 mPUSHi(pwent->pw_change);
5293# else
5294# ifdef PWQUOTA
5295 mPUSHi(pwent->pw_quota);
5296# else
5297# ifdef PWAGE
5298 mPUSHs(newSVpv(pwent->pw_age, 0));
5299# else
5300 /* I think that you can never get this compiled, but just in case. */
5301 PUSHs(sv_mortalcopy(&PL_sv_no));
5302# endif
5303# endif
5304# endif
5305
5306 /* pw_class and pw_comment are mutually exclusive--.
5307 * see the above note for pw_change, pw_quota, and pw_age. */
5308# ifdef PWCLASS
5309 mPUSHs(newSVpv(pwent->pw_class, 0));
5310# else
5311# ifdef PWCOMMENT
5312 mPUSHs(newSVpv(pwent->pw_comment, 0));
5313# else
5314 /* I think that you can never get this compiled, but just in case. */
5315 PUSHs(sv_mortalcopy(&PL_sv_no));
5316# endif
5317# endif
5318
5319# ifdef PWGECOS
5320 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_gecos, 0)));
5321# else
5322 PUSHs(sv = sv_mortalcopy(&PL_sv_no));
5323# endif
5324# ifndef INCOMPLETE_TAINTS
5325 /* pw_gecos is tainted because user himself can diddle with it. */
5326 SvTAINTED_on(sv);
5327# endif
5328
5329 mPUSHs(newSVpv(pwent->pw_dir, 0));
5330
5331 PUSHs(sv = sv_2mortal(newSVpv(pwent->pw_shell, 0)));
5332# ifndef INCOMPLETE_TAINTS
5333 /* pw_shell is tainted because user himself can diddle with it. */
5334 SvTAINTED_on(sv);
5335# endif
5336
5337# ifdef PWEXPIRE
5338 mPUSHi(pwent->pw_expire);
5339# endif
5340 }
5341 RETURN;
5342#else
5343 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5344#endif
5345}
5346
5347PP(pp_ggrent)
5348{
5349#ifdef HAS_GROUP
5350 dVAR; dSP;
5351 const I32 which = PL_op->op_type;
5352 const struct group *grent;
5353
5354 if (which == OP_GGRNAM) {
5355 const char* const name = POPpbytex;
5356 grent = (const struct group *)getgrnam(name);
5357 }
5358 else if (which == OP_GGRGID) {
5359 const Gid_t gid = POPi;
5360 grent = (const struct group *)getgrgid(gid);
5361 }
5362 else
5363#ifdef HAS_GETGRENT
5364 grent = (struct group *)getgrent();
5365#else
5366 DIE(aTHX_ PL_no_func, "getgrent");
5367#endif
5368
5369 EXTEND(SP, 4);
5370 if (GIMME != G_ARRAY) {
5371 SV * const sv = sv_newmortal();
5372
5373 PUSHs(sv);
5374 if (grent) {
5375 if (which == OP_GGRNAM)
5376#if Gid_t_sign <= 0
5377 sv_setiv(sv, (IV)grent->gr_gid);
5378#else
5379 sv_setuv(sv, (UV)grent->gr_gid);
5380#endif
5381 else
5382 sv_setpv(sv, grent->gr_name);
5383 }
5384 RETURN;
5385 }
5386
5387 if (grent) {
5388 mPUSHs(newSVpv(grent->gr_name, 0));
5389
5390#ifdef GRPASSWD
5391 mPUSHs(newSVpv(grent->gr_passwd, 0));
5392#else
5393 PUSHs(sv_mortalcopy(&PL_sv_no));
5394#endif
5395
5396#if Gid_t_sign <= 0
5397 mPUSHi(grent->gr_gid);
5398#else
5399 mPUSHu(grent->gr_gid);
5400#endif
5401
5402#if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
5403 /* In UNICOS/mk (_CRAYMPP) the multithreading
5404 * versions (getgrnam_r, getgrgid_r)
5405 * seem to return an illegal pointer
5406 * as the group members list, gr_mem.
5407 * getgrent() doesn't even have a _r version
5408 * but the gr_mem is poisonous anyway.
5409 * So yes, you cannot get the list of group
5410 * members if building multithreaded in UNICOS/mk. */
5411 PUSHs(space_join_names_mortal(grent->gr_mem));
5412#endif
5413 }
5414
5415 RETURN;
5416#else
5417 DIE(aTHX_ PL_no_func, PL_op_desc[PL_op->op_type]);
5418#endif
5419}
5420
5421PP(pp_getlogin)
5422{
5423#ifdef HAS_GETLOGIN
5424 dVAR; dSP; dTARGET;
5425 char *tmps;
5426 EXTEND(SP, 1);
5427 if (!(tmps = PerlProc_getlogin()))
5428 RETPUSHUNDEF;
5429 sv_setpv_mg(TARG, tmps);
5430 PUSHs(TARG);
5431 RETURN;
5432#else
5433 DIE(aTHX_ PL_no_func, "getlogin");
5434#endif
5435}
5436
5437/* Miscellaneous. */
5438
5439PP(pp_syscall)
5440{
5441#ifdef HAS_SYSCALL
5442 dVAR; dSP; dMARK; dORIGMARK; dTARGET;
5443 register I32 items = SP - MARK;
5444 unsigned long a[20];
5445 register I32 i = 0;
5446 I32 retval = -1;
5447
5448 if (PL_tainting) {
5449 while (++MARK <= SP) {
5450 if (SvTAINTED(*MARK)) {
5451 TAINT;
5452 break;
5453 }
5454 }
5455 MARK = ORIGMARK;
5456 TAINT_PROPER("syscall");
5457 }
5458
5459 /* This probably won't work on machines where sizeof(long) != sizeof(int)
5460 * or where sizeof(long) != sizeof(char*). But such machines will
5461 * not likely have syscall implemented either, so who cares?
5462 */
5463 while (++MARK <= SP) {
5464 if (SvNIOK(*MARK) || !i)
5465 a[i++] = SvIV(*MARK);
5466 else if (*MARK == &PL_sv_undef)
5467 a[i++] = 0;
5468 else
5469 a[i++] = (unsigned long)SvPV_force_nolen(*MARK);
5470 if (i > 15)
5471 break;
5472 }
5473 switch (items) {
5474 default:
5475 DIE(aTHX_ "Too many args to syscall");
5476 case 0:
5477 DIE(aTHX_ "Too few args to syscall");
5478 case 1:
5479 retval = syscall(a[0]);
5480 break;
5481 case 2:
5482 retval = syscall(a[0],a[1]);
5483 break;
5484 case 3:
5485 retval = syscall(a[0],a[1],a[2]);
5486 break;
5487 case 4:
5488 retval = syscall(a[0],a[1],a[2],a[3]);
5489 break;
5490 case 5:
5491 retval = syscall(a[0],a[1],a[2],a[3],a[4]);
5492 break;
5493 case 6:
5494 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5]);
5495 break;
5496 case 7:
5497 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
5498 break;
5499 case 8:
5500 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
5501 break;
5502#ifdef atarist
5503 case 9:
5504 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
5505 break;
5506 case 10:
5507 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
5508 break;
5509 case 11:
5510 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5511 a[10]);
5512 break;
5513 case 12:
5514 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5515 a[10],a[11]);
5516 break;
5517 case 13:
5518 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5519 a[10],a[11],a[12]);
5520 break;
5521 case 14:
5522 retval = syscall(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],
5523 a[10],a[11],a[12],a[13]);
5524 break;
5525#endif /* atarist */
5526 }
5527 SP = ORIGMARK;
5528 PUSHi(retval);
5529 RETURN;
5530#else
5531 DIE(aTHX_ PL_no_func, "syscall");
5532#endif
5533}
5534
5535#ifdef FCNTL_EMULATE_FLOCK
5536
5537/* XXX Emulate flock() with fcntl().
5538 What's really needed is a good file locking module.
5539*/
5540
5541static int
5542fcntl_emulate_flock(int fd, int operation)
5543{
5544 int res;
5545 struct flock flock;
5546
5547 switch (operation & ~LOCK_NB) {
5548 case LOCK_SH:
5549 flock.l_type = F_RDLCK;
5550 break;
5551 case LOCK_EX:
5552 flock.l_type = F_WRLCK;
5553 break;
5554 case LOCK_UN:
5555 flock.l_type = F_UNLCK;
5556 break;
5557 default:
5558 errno = EINVAL;
5559 return -1;
5560 }
5561 flock.l_whence = SEEK_SET;
5562 flock.l_start = flock.l_len = (Off_t)0;
5563
5564 res = fcntl(fd, (operation & LOCK_NB) ? F_SETLK : F_SETLKW, &flock);
5565 if (res == -1 && ((errno == EAGAIN) || (errno == EACCES)))
5566 errno = EWOULDBLOCK;
5567 return res;
5568}
5569
5570#endif /* FCNTL_EMULATE_FLOCK */
5571
5572#ifdef LOCKF_EMULATE_FLOCK
5573
5574/* XXX Emulate flock() with lockf(). This is just to increase
5575 portability of scripts. The calls are not completely
5576 interchangeable. What's really needed is a good file
5577 locking module.
5578*/
5579
5580/* The lockf() constants might have been defined in <unistd.h>.
5581 Unfortunately, <unistd.h> causes troubles on some mixed
5582 (BSD/POSIX) systems, such as SunOS 4.1.3.
5583
5584 Further, the lockf() constants aren't POSIX, so they might not be
5585 visible if we're compiling with _POSIX_SOURCE defined. Thus, we'll
5586 just stick in the SVID values and be done with it. Sigh.
5587*/
5588
5589# ifndef F_ULOCK
5590# define F_ULOCK 0 /* Unlock a previously locked region */
5591# endif
5592# ifndef F_LOCK
5593# define F_LOCK 1 /* Lock a region for exclusive use */
5594# endif
5595# ifndef F_TLOCK
5596# define F_TLOCK 2 /* Test and lock a region for exclusive use */
5597# endif
5598# ifndef F_TEST
5599# define F_TEST 3 /* Test a region for other processes locks */
5600# endif
5601
5602static int
5603lockf_emulate_flock(int fd, int operation)
5604{
5605 int i;
5606 Off_t pos;
5607 dSAVE_ERRNO;
5608
5609 /* flock locks entire file so for lockf we need to do the same */
5610 pos = PerlLIO_lseek(fd, (Off_t)0, SEEK_CUR); /* get pos to restore later */
5611 if (pos > 0) /* is seekable and needs to be repositioned */
5612 if (PerlLIO_lseek(fd, (Off_t)0, SEEK_SET) < 0)
5613 pos = -1; /* seek failed, so don't seek back afterwards */
5614 RESTORE_ERRNO;
5615
5616 switch (operation) {
5617
5618 /* LOCK_SH - get a shared lock */
5619 case LOCK_SH:
5620 /* LOCK_EX - get an exclusive lock */
5621 case LOCK_EX:
5622 i = lockf (fd, F_LOCK, 0);
5623 break;
5624
5625 /* LOCK_SH|LOCK_NB - get a non-blocking shared lock */
5626 case LOCK_SH|LOCK_NB:
5627 /* LOCK_EX|LOCK_NB - get a non-blocking exclusive lock */
5628 case LOCK_EX|LOCK_NB:
5629 i = lockf (fd, F_TLOCK, 0);
5630 if (i == -1)
5631 if ((errno == EAGAIN) || (errno == EACCES))
5632 errno = EWOULDBLOCK;
5633 break;
5634
5635 /* LOCK_UN - unlock (non-blocking is a no-op) */
5636 case LOCK_UN:
5637 case LOCK_UN|LOCK_NB:
5638 i = lockf (fd, F_ULOCK, 0);
5639 break;
5640
5641 /* Default - can't decipher operation */
5642 default:
5643 i = -1;
5644 errno = EINVAL;
5645 break;
5646 }
5647
5648 if (pos > 0) /* need to restore position of the handle */
5649 PerlLIO_lseek(fd, pos, SEEK_SET); /* ignore error here */
5650
5651 return (i);
5652}
5653
5654#endif /* LOCKF_EMULATE_FLOCK */
5655
5656/*
5657 * Local variables:
5658 * c-indentation-style: bsd
5659 * c-basic-offset: 4
5660 * indent-tabs-mode: t
5661 * End:
5662 *
5663 * ex: set ts=8 sts=4 sw=4 noet:
5664 */