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