This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
84a647f02417e07279cc2562ba8ed46befdf8e05
[perl5.git] / doio.c
1 /*    doio.c
2  *
3  *    Copyright (c) 1991-2000, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 /*
11  * "Far below them they saw the white waters pour into a foaming bowl, and
12  * then swirl darkly about a deep oval basin in the rocks, until they found
13  * their way out again through a narrow gate, and flowed away, fuming and
14  * chattering, into calmer and more level reaches."
15  */
16
17 #include "EXTERN.h"
18 #define PERL_IN_DOIO_C
19 #include "perl.h"
20
21 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
22 #ifndef HAS_SEM
23 #include <sys/ipc.h>
24 #endif
25 #ifdef HAS_MSG
26 #include <sys/msg.h>
27 #endif
28 #ifdef HAS_SHM
29 #include <sys/shm.h>
30 # ifndef HAS_SHMAT_PROTOTYPE
31     extern Shmat_t shmat (int, char *, int);
32 # endif
33 #endif
34 #endif
35
36 #ifdef I_UTIME
37 #  if defined(_MSC_VER) || defined(__MINGW32__)
38 #    include <sys/utime.h>
39 #  else
40 #    include <utime.h>
41 #  endif
42 #endif
43
44 #ifdef O_EXCL
45 #  define OPEN_EXCL O_EXCL
46 #else
47 #  define OPEN_EXCL 0
48 #endif
49
50 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
51 #include <signal.h>
52 #endif
53
54 /* XXX If this causes problems, set i_unistd=undef in the hint file.  */
55 #ifdef I_UNISTD
56 #  include <unistd.h>
57 #endif
58
59 bool
60 Perl_do_open(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
61              int rawmode, int rawperm, PerlIO *supplied_fp)
62 {
63     return do_open9(gv, name, len, as_raw, rawmode, rawperm,
64                     supplied_fp, Nullsv, 0);
65 }
66
67 bool
68 Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
69               int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs,
70               I32 num_svs)
71 {
72     register IO *io = GvIOn(gv);
73     PerlIO *saveifp = Nullfp;
74     PerlIO *saveofp = Nullfp;
75     char savetype = IoTYPE_CLOSED;
76     int writing = 0;
77     PerlIO *fp;
78     int fd;
79     int result;
80     bool was_fdopen = FALSE;
81     bool in_raw = 0, in_crlf = 0, out_raw = 0, out_crlf = 0;
82     char *type  = NULL;
83     char *deftype = NULL;
84     char mode[4];               /* stdio file mode ("r\0", "rb\0", "r+b\0" etc.) */
85
86     Zero(mode,sizeof(mode),char);
87     PL_forkprocess = 1;         /* assume true if no fork */
88
89     /* Collect default raw/crlf info from the op */
90     if (PL_op && PL_op->op_type == OP_OPEN) {
91         /* set up disciplines */
92         U8 flags = PL_op->op_private;
93         in_raw = (flags & OPpOPEN_IN_RAW);
94         in_crlf = (flags & OPpOPEN_IN_CRLF);
95         out_raw = (flags & OPpOPEN_OUT_RAW);
96         out_crlf = (flags & OPpOPEN_OUT_CRLF);
97     }
98
99     /* If currently open - close before we re-open */
100     if (IoIFP(io)) {
101         fd = PerlIO_fileno(IoIFP(io));
102         if (IoTYPE(io) == IoTYPE_STD)
103             result = 0;
104         else if (fd <= PL_maxsysfd) {
105             saveifp = IoIFP(io);
106             saveofp = IoOFP(io);
107             savetype = IoTYPE(io);
108             result = 0;
109         }
110         else if (IoTYPE(io) == IoTYPE_PIPE)
111             result = PerlProc_pclose(IoIFP(io));
112         else if (IoIFP(io) != IoOFP(io)) {
113             if (IoOFP(io)) {
114                 result = PerlIO_close(IoOFP(io));
115                 PerlIO_close(IoIFP(io)); /* clear stdio, fd already closed */
116             }
117             else
118                 result = PerlIO_close(IoIFP(io));
119         }
120         else
121             result = PerlIO_close(IoIFP(io));
122         if (result == EOF && fd > PL_maxsysfd)
123             PerlIO_printf(Perl_error_log,
124                           "Warning: unable to close filehandle %s properly.\n",
125                           GvENAME(gv));
126         IoOFP(io) = IoIFP(io) = Nullfp;
127     }
128
129     if (as_raw) {
130         /* sysopen style args, i.e. integer mode and permissions */
131
132 #if defined(USE_64_BIT_RAWIO) && defined(O_LARGEFILE)
133         rawmode |= O_LARGEFILE;
134 #endif
135
136 #ifndef O_ACCMODE
137 #define O_ACCMODE 3             /* Assume traditional implementation */
138 #endif
139
140         switch (result = rawmode & O_ACCMODE) {
141         case O_RDONLY:
142              IoTYPE(io) = IoTYPE_RDONLY;
143              break;
144         case O_WRONLY:
145              IoTYPE(io) = IoTYPE_WRONLY;
146              break;
147         case O_RDWR:
148         default:
149              IoTYPE(io) = IoTYPE_RDWR;
150              break;
151         }
152
153         writing = (result > 0);
154         fd = PerlLIO_open3(name, rawmode, rawperm);
155
156         if (fd == -1)
157             fp = NULL;
158         else {
159             STRLEN ix = 0;
160             if (result == O_RDONLY) {
161                 mode[ix++] = 'r';
162             }
163 #ifdef O_APPEND
164             else if (rawmode & O_APPEND) {
165                 mode[ix++] = 'a';
166                 if (result != O_WRONLY)
167                     mode[ix++] = '+';
168             }
169 #endif
170             else {
171                 if (result == O_WRONLY)
172                     mode[ix++] = 'w';
173                 else {
174                     mode[ix++] = 'r';
175                     mode[ix++] = '+';
176                 }
177             }
178             if (rawmode & O_BINARY)
179                 mode[ix++] = 'b';
180             mode[ix] = '\0';
181             fp = PerlIO_fdopen(fd, mode);
182             if (!fp)
183                 PerlLIO_close(fd);
184         }
185     }
186     else {
187         /* Regular (non-sys) open */
188         char *oname = name;
189         STRLEN olen = len;
190         char *tend;
191         int dodup = 0;
192
193         type = savepvn(name, len);
194         tend = type+len;
195         SAVEFREEPV(type);
196         /* Loose trailing white space */
197         while (tend > type && isSPACE(tend[-1]))
198             *tend-- = '\0';
199         if (num_svs) {
200             /* New style explict name, type is just mode and discipline/layer info */
201             STRLEN l;
202             name = SvPV(svs, l) ;
203             len = (I32)l;
204             name = savepvn(name, len);
205             SAVEFREEPV(name);
206             /*SUPPRESS 530*/
207             for (; isSPACE(*type); type++) ;
208         }
209         else {
210             name = type;
211             len  = tend-type;
212         }
213         IoTYPE(io) = *type;
214         if (*type == IoTYPE_RDWR && (!num_svs || tend > type+1 && tend[-1] != IoTYPE_PIPE)) { /* scary */
215             mode[1] = *type++;
216             writing = 1;
217         }
218
219         if (*type == IoTYPE_PIPE) {
220             if (num_svs) {
221                 if (type[1] != IoTYPE_STD) {
222                   unknown_desr:
223                     Perl_croak(aTHX_ "Unknown open() mode '%.*s'", (int)olen, oname);
224                 }
225                 type++;
226             }
227             /*SUPPRESS 530*/
228             for (type++; isSPACE(*type); type++) ;
229             if (!num_svs) {
230                 name = type;
231                 len = tend-type;
232             }
233             if (*name == '\0') { /* command is missing 19990114 */
234                 dTHR;
235                 if (ckWARN(WARN_PIPE))
236                     Perl_warner(aTHX_ WARN_PIPE, "Missing command in piped open");
237                 errno = EPIPE;
238                 goto say_false;
239             }
240             if (strNE(name,"-") || num_svs)
241                 TAINT_ENV();
242             TAINT_PROPER("piped open");
243             if (!num_svs && name[len-1] == '|') {
244                 dTHR;
245                 name[--len] = '\0' ;
246                 if (ckWARN(WARN_PIPE))
247                     Perl_warner(aTHX_ WARN_PIPE, "Can't open bidirectional pipe");
248             }
249             mode[0] = 'w';
250             writing = 1;
251             if (out_raw)
252                 strcat(mode, "b");
253             else if (out_crlf)
254                 strcat(mode, "t");
255             fp = PerlProc_popen(name,mode);
256         }
257         else if (*type == IoTYPE_WRONLY) {
258             TAINT_PROPER("open");
259             type++;
260             if (*type == IoTYPE_WRONLY) {
261                 /* Two IoTYPE_WRONLYs in a row make for an IoTYPE_APPEND. */
262                 mode[0] = IoTYPE(io) = IoTYPE_APPEND;
263                 type++;
264             }
265             else
266                 mode[0] = 'w';
267             writing = 1;
268
269             if (out_raw)
270                 strcat(mode, "b");
271             else if (out_crlf)
272                 strcat(mode, "t");
273
274             if (*type == '&') {
275                 name = type;
276               duplicity:
277                 if (num_svs)
278                     goto unknown_desr;
279                 dodup = 1;
280                 name++;
281                 if (*name == '=') {
282                     dodup = 0;
283                     name++;
284                 }
285                 if (!*name && supplied_fp)
286                     fp = supplied_fp;
287                 else {
288                     /*SUPPRESS 530*/
289                     for (; isSPACE(*name); name++) ;
290                     if (isDIGIT(*name))
291                         fd = atoi(name);
292                     else {
293                         IO* thatio;
294                         gv = gv_fetchpv(name,FALSE,SVt_PVIO);
295                         thatio = GvIO(gv);
296                         if (!thatio) {
297 #ifdef EINVAL
298                             SETERRNO(EINVAL,SS$_IVCHAN);
299 #endif
300                             goto say_false;
301                         }
302                         if (IoIFP(thatio)) {
303                             PerlIO *fp = IoIFP(thatio);
304                             /* Flush stdio buffer before dup. --mjd
305                              * Unfortunately SEEK_CURing 0 seems to
306                              * be optimized away on most platforms;
307                              * only Solaris and Linux seem to flush
308                              * on that. --jhi */
309 #ifdef USE_SFIO
310                             /* sfio fails to clear error on next
311                                sfwrite, contrary to documentation.
312                                -- Nick Clark */
313                             if (PerlIO_seek(fp, 0, SEEK_CUR) == -1)
314                                 PerlIO_clearerr(fp);
315 #endif
316                             /* On the other hand, do all platforms
317                              * take gracefully to flushing a read-only
318                              * filehandle?  Perhaps we should do
319                              * fsetpos(src)+fgetpos(dst)?  --nik */
320                             PerlIO_flush(fp);
321                             fd = PerlIO_fileno(fp);
322                             /* When dup()ing STDIN, STDOUT or STDERR
323                              * explicitly set appropriate access mode */
324                             if (IoIFP(thatio) == PerlIO_stdout()
325                                 || IoIFP(thatio) == PerlIO_stderr())
326                                 IoTYPE(io) = IoTYPE_WRONLY;
327                             else if (IoIFP(thatio) == PerlIO_stdin())
328                                 IoTYPE(io) = IoTYPE_RDONLY;
329                             /* When dup()ing a socket, say result is
330                              * one as well */
331                             else if (IoTYPE(thatio) == IoTYPE_SOCKET)
332                                 IoTYPE(io) = IoTYPE_SOCKET;
333                         }
334                         else
335                             fd = -1;
336                     }
337                     if (dodup)
338                         fd = PerlLIO_dup(fd);
339                     else
340                         was_fdopen = TRUE;
341                     if (!(fp = PerlIO_fdopen(fd,mode))) {
342                         if (dodup)
343                             PerlLIO_close(fd);
344                     }
345                 }
346             }
347             else {
348                 /*SUPPRESS 530*/
349                 for (; isSPACE(*type); type++) ;
350                 if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) {
351                     /*SUPPRESS 530*/
352                     type++;
353                     fp = PerlIO_stdout();
354                     IoTYPE(io) = IoTYPE_STD;
355                 }
356                 else  {
357                     fp = PerlIO_open((num_svs ? name : type), mode);
358                 }
359             }
360         }
361         else if (*type == IoTYPE_RDONLY) {
362             /*SUPPRESS 530*/
363             for (type++; isSPACE(*type); type++) ;
364             mode[0] = 'r';
365             if (in_raw)
366                 strcat(mode, "b");
367             else if (in_crlf)
368                 strcat(mode, "t");
369
370             if (*type == '&') {
371                 name = type;
372                 goto duplicity;
373             }
374             if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) {
375                 /*SUPPRESS 530*/
376                 type++;
377                 fp = PerlIO_stdin();
378                 IoTYPE(io) = IoTYPE_STD;
379             }
380             else
381                 fp = PerlIO_open((num_svs ? name : type), mode);
382         }
383         else if ((num_svs && type[0] == IoTYPE_STD && type[1] == IoTYPE_PIPE) ||
384                  (!num_svs && tend > type+1 && tend[-1] == IoTYPE_PIPE)) {
385             if (num_svs) {
386                 type += 2;   /* skip over '-|' */
387             }
388             else {
389                 *--tend = '\0';
390                 while (tend > type && isSPACE(tend[-1]))
391                     *--tend = '\0';
392                 /*SUPPRESS 530*/
393                 for (; isSPACE(*type); type++) ;
394                 name = type;
395                 len  = tend-type;
396             }
397             if (*name == '\0') { /* command is missing 19990114 */
398                 dTHR;
399                 if (ckWARN(WARN_PIPE))
400                     Perl_warner(aTHX_ WARN_PIPE, "Missing command in piped open");
401                 errno = EPIPE;
402                 goto say_false;
403             }
404             if (strNE(name,"-") || num_svs)
405                 TAINT_ENV();
406             TAINT_PROPER("piped open");
407             mode[0] = 'r';
408             if (in_raw)
409                 strcat(mode, "b");
410             else if (in_crlf)
411                 strcat(mode, "t");
412             fp = PerlProc_popen(name,mode);
413             IoTYPE(io) = IoTYPE_PIPE;
414         }
415         else {
416             if (num_svs)
417                 goto unknown_desr;
418             name = type;
419             IoTYPE(io) = IoTYPE_RDONLY;
420             /*SUPPRESS 530*/
421             for (; isSPACE(*name); name++) ;
422             if (strEQ(name,"-")) {
423                 fp = PerlIO_stdin();
424                 IoTYPE(io) = IoTYPE_STD;
425             }
426             else {
427                 mode[0] = 'r';
428                 if (in_raw)
429                     strcat(mode, "b");
430                 else if (in_crlf)
431                     strcat(mode, "t");
432                 fp = PerlIO_open(name,mode);
433             }
434         }
435     }
436     if (!fp) {
437         dTHR;
438         if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == IoTYPE_RDONLY && strchr(name, '\n'))
439             Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "open");
440         goto say_false;
441     }
442     if (IoTYPE(io) &&
443       IoTYPE(io) != IoTYPE_PIPE && IoTYPE(io) != IoTYPE_STD) {
444         dTHR;
445         if (PerlLIO_fstat(PerlIO_fileno(fp),&PL_statbuf) < 0) {
446             (void)PerlIO_close(fp);
447             goto say_false;
448         }
449         if (S_ISSOCK(PL_statbuf.st_mode))
450             IoTYPE(io) = IoTYPE_SOCKET; /* in case a socket was passed in to us */
451 #ifdef HAS_SOCKET
452         else if (
453 #ifdef S_IFMT
454             !(PL_statbuf.st_mode & S_IFMT)
455 #else
456             !PL_statbuf.st_mode
457 #endif
458             && IoTYPE(io) != IoTYPE_WRONLY  /* Dups of STD* filehandles already have */
459             && IoTYPE(io) != IoTYPE_RDONLY  /* type so they aren't marked as sockets */
460         ) {                                 /* on OS's that return 0 on fstat()ed pipe */
461             char tmpbuf[256];
462             Sock_size_t buflen = sizeof tmpbuf;
463             if (PerlSock_getsockname(PerlIO_fileno(fp), (struct sockaddr *)tmpbuf,
464                             &buflen) >= 0
465                   || errno != ENOTSOCK)
466                 IoTYPE(io) = IoTYPE_SOCKET; /* some OS's return 0 on fstat()ed socket */
467                                 /* but some return 0 for streams too, sigh */
468         }
469 #endif
470     }
471     if (saveifp) {              /* must use old fp? */
472         fd = PerlIO_fileno(saveifp);
473         if (saveofp) {
474             PerlIO_flush(saveofp);              /* emulate PerlIO_close() */
475             if (saveofp != saveifp) {   /* was a socket? */
476                 PerlIO_close(saveofp);
477                 if (fd > 2)
478                     Safefree(saveofp);
479             }
480         }
481         if (fd != PerlIO_fileno(fp)) {
482             Pid_t pid;
483             SV *sv;
484
485             PerlLIO_dup2(PerlIO_fileno(fp), fd);
486             LOCK_FDPID_MUTEX;
487             sv = *av_fetch(PL_fdpid,PerlIO_fileno(fp),TRUE);
488             (void)SvUPGRADE(sv, SVt_IV);
489             pid = SvIVX(sv);
490             SvIVX(sv) = 0;
491             sv = *av_fetch(PL_fdpid,fd,TRUE);
492             UNLOCK_FDPID_MUTEX;
493             (void)SvUPGRADE(sv, SVt_IV);
494             SvIVX(sv) = pid;
495             if (!was_fdopen)
496                 PerlIO_close(fp);
497
498         }
499         fp = saveifp;
500         PerlIO_clearerr(fp);
501     }
502 #if defined(HAS_FCNTL) && defined(F_SETFD)
503     {
504         int save_errno = errno;
505         fd = PerlIO_fileno(fp);
506         fcntl(fd,F_SETFD,fd > PL_maxsysfd); /* can change errno */
507         errno = save_errno;
508     }
509 #endif
510     IoIFP(io) = fp;
511     if (!num_svs) {
512         /* Need to supply default type info from open.pm */
513         type = NULL;
514     }
515     if (type) {
516         while (isSPACE(*type)) type++;
517         if (*type) {
518         }
519     }
520
521     IoFLAGS(io) &= ~IOf_NOLINE;
522     if (writing) {
523         dTHR;
524         if (IoTYPE(io) == IoTYPE_SOCKET
525             || (IoTYPE(io) == IoTYPE_WRONLY && S_ISCHR(PL_statbuf.st_mode)) )
526         {
527             mode[0] = 'w';
528             if (!(IoOFP(io) = PerlIO_fdopen(PerlIO_fileno(fp),mode))) {
529                 PerlIO_close(fp);
530                 IoIFP(io) = Nullfp;
531                 goto say_false;
532             }
533         }
534         else
535             IoOFP(io) = fp;
536     }
537     return TRUE;
538
539 say_false:
540     IoIFP(io) = saveifp;
541     IoOFP(io) = saveofp;
542     IoTYPE(io) = savetype;
543     return FALSE;
544 }
545
546 PerlIO *
547 Perl_nextargv(pTHX_ register GV *gv)
548 {
549     register SV *sv;
550 #ifndef FLEXFILENAMES
551     int filedev;
552     int fileino;
553 #endif
554     Uid_t fileuid;
555     Gid_t filegid;
556     IO *io = GvIOp(gv);
557
558     if (!PL_argvoutgv)
559         PL_argvoutgv = gv_fetchpv("ARGVOUT",TRUE,SVt_PVIO);
560     if (io && (IoFLAGS(io) & IOf_ARGV) && (IoFLAGS(io) & IOf_START)) {
561         IoFLAGS(io) &= ~IOf_START;
562         if (PL_inplace) {
563             if (!PL_argvout_stack)
564                 PL_argvout_stack = newAV();
565             av_push(PL_argvout_stack, SvREFCNT_inc(PL_defoutgv));
566         }
567     }
568     if (PL_filemode & (S_ISUID|S_ISGID)) {
569         PerlIO_flush(IoIFP(GvIOn(PL_argvoutgv)));  /* chmod must follow last write */
570 #ifdef HAS_FCHMOD
571         (void)fchmod(PL_lastfd,PL_filemode);
572 #else
573         (void)PerlLIO_chmod(PL_oldname,PL_filemode);
574 #endif
575     }
576     PL_filemode = 0;
577     while (av_len(GvAV(gv)) >= 0) {
578         dTHR;
579         STRLEN oldlen;
580         sv = av_shift(GvAV(gv));
581         SAVEFREESV(sv);
582         sv_setsv(GvSV(gv),sv);
583         SvSETMAGIC(GvSV(gv));
584         PL_oldname = SvPVx(GvSV(gv), oldlen);
585         if (do_open(gv,PL_oldname,oldlen,PL_inplace!=0,O_RDONLY,0,Nullfp)) {
586             if (PL_inplace) {
587                 TAINT_PROPER("inplace open");
588                 if (oldlen == 1 && *PL_oldname == '-') {
589                     setdefout(gv_fetchpv("STDOUT",TRUE,SVt_PVIO));
590                     return IoIFP(GvIOp(gv));
591                 }
592 #ifndef FLEXFILENAMES
593                 filedev = PL_statbuf.st_dev;
594                 fileino = PL_statbuf.st_ino;
595 #endif
596                 PL_filemode = PL_statbuf.st_mode;
597                 fileuid = PL_statbuf.st_uid;
598                 filegid = PL_statbuf.st_gid;
599                 if (!S_ISREG(PL_filemode)) {
600                     if (ckWARN_d(WARN_INPLACE)) 
601                         Perl_warner(aTHX_ WARN_INPLACE,
602                             "Can't do inplace edit: %s is not a regular file",
603                             PL_oldname );
604                     do_close(gv,FALSE);
605                     continue;
606                 }
607                 if (*PL_inplace) {
608                     char *star = strchr(PL_inplace, '*');
609                     if (star) {
610                         char *begin = PL_inplace;
611                         sv_setpvn(sv, "", 0);
612                         do {
613                             sv_catpvn(sv, begin, star - begin);
614                             sv_catpvn(sv, PL_oldname, oldlen);
615                             begin = ++star;
616                         } while ((star = strchr(begin, '*')));
617                         if (*begin)
618                             sv_catpv(sv,begin);
619                     }
620                     else {
621                         sv_catpv(sv,PL_inplace);
622                     }
623 #ifndef FLEXFILENAMES
624                     if (PerlLIO_stat(SvPVX(sv),&PL_statbuf) >= 0
625                       && PL_statbuf.st_dev == filedev
626                       && PL_statbuf.st_ino == fileino
627 #ifdef DJGPP
628                       || (_djstat_fail_bits & _STFAIL_TRUENAME)!=0
629 #endif
630                       )
631                     {
632                         if (ckWARN_d(WARN_INPLACE))     
633                             Perl_warner(aTHX_ WARN_INPLACE,
634                               "Can't do inplace edit: %s would not be unique",
635                               SvPVX(sv));
636                         do_close(gv,FALSE);
637                         continue;
638                     }
639 #endif
640 #ifdef HAS_RENAME
641 #if !defined(DOSISH) && !defined(__CYGWIN__)
642                     if (PerlLIO_rename(PL_oldname,SvPVX(sv)) < 0) {
643                         if (ckWARN_d(WARN_INPLACE))     
644                             Perl_warner(aTHX_ WARN_INPLACE,
645                               "Can't rename %s to %s: %s, skipping file",
646                               PL_oldname, SvPVX(sv), Strerror(errno) );
647                         do_close(gv,FALSE);
648                         continue;
649                     }
650 #else
651                     do_close(gv,FALSE);
652                     (void)PerlLIO_unlink(SvPVX(sv));
653                     (void)PerlLIO_rename(PL_oldname,SvPVX(sv));
654                     do_open(gv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,O_RDONLY,0,Nullfp);
655 #endif /* DOSISH */
656 #else
657                     (void)UNLINK(SvPVX(sv));
658                     if (link(PL_oldname,SvPVX(sv)) < 0) {
659                         if (ckWARN_d(WARN_INPLACE))     
660                             Perl_warner(aTHX_ WARN_INPLACE,
661                               "Can't rename %s to %s: %s, skipping file",
662                               PL_oldname, SvPVX(sv), Strerror(errno) );
663                         do_close(gv,FALSE);
664                         continue;
665                     }
666                     (void)UNLINK(PL_oldname);
667 #endif
668                 }
669                 else {
670 #if !defined(DOSISH) && !defined(AMIGAOS)
671 #  ifndef VMS  /* Don't delete; use automatic file versioning */
672                     if (UNLINK(PL_oldname) < 0) {
673                         if (ckWARN_d(WARN_INPLACE))     
674                             Perl_warner(aTHX_ WARN_INPLACE,
675                               "Can't remove %s: %s, skipping file",
676                               PL_oldname, Strerror(errno) );
677                         do_close(gv,FALSE);
678                         continue;
679                     }
680 #  endif
681 #else
682                     Perl_croak(aTHX_ "Can't do inplace edit without backup");
683 #endif
684                 }
685
686                 sv_setpvn(sv,">",!PL_inplace);
687                 sv_catpvn(sv,PL_oldname,oldlen);
688                 SETERRNO(0,0);          /* in case sprintf set errno */
689 #ifdef VMS
690                 if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,
691                  O_WRONLY|O_CREAT|O_TRUNC,0,Nullfp))
692 #else
693                 if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,
694                              O_WRONLY|O_CREAT|OPEN_EXCL,0666,Nullfp))
695 #endif
696                 {
697                     if (ckWARN_d(WARN_INPLACE)) 
698                         Perl_warner(aTHX_ WARN_INPLACE, "Can't do inplace edit on %s: %s",
699                           PL_oldname, Strerror(errno) );
700                     do_close(gv,FALSE);
701                     continue;
702                 }
703                 setdefout(PL_argvoutgv);
704                 PL_lastfd = PerlIO_fileno(IoIFP(GvIOp(PL_argvoutgv)));
705                 (void)PerlLIO_fstat(PL_lastfd,&PL_statbuf);
706 #ifdef HAS_FCHMOD
707                 (void)fchmod(PL_lastfd,PL_filemode);
708 #else
709 #  if !(defined(WIN32) && defined(__BORLANDC__))
710                 /* Borland runtime creates a readonly file! */
711                 (void)PerlLIO_chmod(PL_oldname,PL_filemode);
712 #  endif
713 #endif
714                 if (fileuid != PL_statbuf.st_uid || filegid != PL_statbuf.st_gid) {
715 #ifdef HAS_FCHOWN
716                     (void)fchown(PL_lastfd,fileuid,filegid);
717 #else
718 #ifdef HAS_CHOWN
719                     (void)PerlLIO_chown(PL_oldname,fileuid,filegid);
720 #endif
721 #endif
722                 }
723             }
724             return IoIFP(GvIOp(gv));
725         }
726         else {
727             dTHR;
728             if (ckWARN_d(WARN_INPLACE)) {
729                 int eno = errno;
730                 if (PerlLIO_stat(PL_oldname, &PL_statbuf) >= 0
731                     && !S_ISREG(PL_statbuf.st_mode))    
732                 {
733                     Perl_warner(aTHX_ WARN_INPLACE,
734                                 "Can't do inplace edit: %s is not a regular file",
735                                 PL_oldname);
736                 }
737                 else
738                     Perl_warner(aTHX_ WARN_INPLACE, "Can't open %s: %s",
739                                 PL_oldname, Strerror(eno));
740             }
741         }
742     }
743     if (io && (IoFLAGS(io) & IOf_ARGV))
744         IoFLAGS(io) |= IOf_START;
745     if (PL_inplace) {
746         (void)do_close(PL_argvoutgv,FALSE);
747         if (io && (IoFLAGS(io) & IOf_ARGV)
748             && PL_argvout_stack && AvFILLp(PL_argvout_stack) >= 0)
749         {
750             GV *oldout = (GV*)av_pop(PL_argvout_stack);
751             setdefout(oldout);
752             SvREFCNT_dec(oldout);
753             return Nullfp;
754         }
755         setdefout(gv_fetchpv("STDOUT",TRUE,SVt_PVIO));
756     }
757     return Nullfp;
758 }
759
760 #ifdef HAS_PIPE
761 void
762 Perl_do_pipe(pTHX_ SV *sv, GV *rgv, GV *wgv)
763 {
764     register IO *rstio;
765     register IO *wstio;
766     int fd[2];
767
768     if (!rgv)
769         goto badexit;
770     if (!wgv)
771         goto badexit;
772
773     rstio = GvIOn(rgv);
774     wstio = GvIOn(wgv);
775
776     if (IoIFP(rstio))
777         do_close(rgv,FALSE);
778     if (IoIFP(wstio))
779         do_close(wgv,FALSE);
780
781     if (PerlProc_pipe(fd) < 0)
782         goto badexit;
783     IoIFP(rstio) = PerlIO_fdopen(fd[0], "r");
784     IoOFP(wstio) = PerlIO_fdopen(fd[1], "w");
785     IoIFP(wstio) = IoOFP(wstio);
786     IoTYPE(rstio) = IoTYPE_RDONLY;
787     IoTYPE(wstio) = IoTYPE_WRONLY;
788     if (!IoIFP(rstio) || !IoOFP(wstio)) {
789         if (IoIFP(rstio)) PerlIO_close(IoIFP(rstio));
790         else PerlLIO_close(fd[0]);
791         if (IoOFP(wstio)) PerlIO_close(IoOFP(wstio));
792         else PerlLIO_close(fd[1]);
793         goto badexit;
794     }
795
796     sv_setsv(sv,&PL_sv_yes);
797     return;
798
799 badexit:
800     sv_setsv(sv,&PL_sv_undef);
801     return;
802 }
803 #endif
804
805 /* explicit renamed to avoid C++ conflict    -- kja */
806 bool
807 Perl_do_close(pTHX_ GV *gv, bool not_implicit)
808 {
809     bool retval;
810     IO *io;
811
812     if (!gv)
813         gv = PL_argvgv;
814     if (!gv || SvTYPE(gv) != SVt_PVGV) {
815         if (not_implicit)
816             SETERRNO(EBADF,SS$_IVCHAN);
817         return FALSE;
818     }
819     io = GvIO(gv);
820     if (!io) {          /* never opened */
821         if (not_implicit) {
822             dTHR;
823             if (ckWARN(WARN_UNOPENED)) /* no check for closed here */
824                 report_evil_fh(gv, io, PL_op->op_type);
825             SETERRNO(EBADF,SS$_IVCHAN);
826         }
827         return FALSE;
828     }
829     retval = io_close(io, not_implicit);
830     if (not_implicit) {
831         IoLINES(io) = 0;
832         IoPAGE(io) = 0;
833         IoLINES_LEFT(io) = IoPAGE_LEN(io);
834     }
835     IoTYPE(io) = IoTYPE_CLOSED;
836     return retval;
837 }
838
839 bool
840 Perl_io_close(pTHX_ IO *io, bool not_implicit)
841 {
842     bool retval = FALSE;
843     int status;
844
845     if (IoIFP(io)) {
846         if (IoTYPE(io) == IoTYPE_PIPE) {
847             status = PerlProc_pclose(IoIFP(io));
848             if (not_implicit) {
849                 STATUS_NATIVE_SET(status);
850                 retval = (STATUS_POSIX == 0);
851             }
852             else {
853                 retval = (status != -1);
854             }
855         }
856         else if (IoTYPE(io) == IoTYPE_STD)
857             retval = TRUE;
858         else {
859             if (IoOFP(io) && IoOFP(io) != IoIFP(io)) {          /* a socket */
860                 retval = (PerlIO_close(IoOFP(io)) != EOF);
861                 PerlIO_close(IoIFP(io));        /* clear stdio, fd already closed */
862             }
863             else
864                 retval = (PerlIO_close(IoIFP(io)) != EOF);
865         }
866         IoOFP(io) = IoIFP(io) = Nullfp;
867     }
868     else if (not_implicit) {
869         SETERRNO(EBADF,SS$_IVCHAN);
870     }
871
872     return retval;
873 }
874
875 bool
876 Perl_do_eof(pTHX_ GV *gv)
877 {
878     dTHR;
879     register IO *io;
880     int ch;
881
882     io = GvIO(gv);
883
884     if (!io)
885         return TRUE;
886     else if (ckWARN(WARN_IO)
887              && (IoTYPE(io) == IoTYPE_WRONLY || IoIFP(io) == PerlIO_stdout()
888                  || IoIFP(io) == PerlIO_stderr()))
889     {
890         /* integrate to report_evil_fh()? */
891         char *name = NULL;
892         if (isGV(gv)) {
893             SV* sv = sv_newmortal();
894             gv_efullname4(sv, gv, Nullch, FALSE);
895             name = SvPV_nolen(sv);
896         }
897         if (name && *name)
898             Perl_warner(aTHX_ WARN_IO,
899                         "Filehandle %s opened only for output", name);
900         else
901             Perl_warner(aTHX_ WARN_IO,
902                         "Filehandle opened only for output");
903     }
904
905     while (IoIFP(io)) {
906
907         if (PerlIO_has_cntptr(IoIFP(io))) {     /* (the code works without this) */
908             if (PerlIO_get_cnt(IoIFP(io)) > 0)  /* cheat a little, since */
909                 return FALSE;                   /* this is the most usual case */
910         }
911
912         ch = PerlIO_getc(IoIFP(io));
913         if (ch != EOF) {
914             (void)PerlIO_ungetc(IoIFP(io),ch);
915             return FALSE;
916         }
917         if (PerlIO_has_cntptr(IoIFP(io)) && PerlIO_canset_cnt(IoIFP(io))) {
918             if (PerlIO_get_cnt(IoIFP(io)) < -1)
919                 PerlIO_set_cnt(IoIFP(io),-1);
920         }
921         if (PL_op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */
922             if (!nextargv(PL_argvgv))   /* get another fp handy */
923                 return TRUE;
924         }
925         else
926             return TRUE;                /* normal fp, definitely end of file */
927     }
928     return TRUE;
929 }
930
931 Off_t
932 Perl_do_tell(pTHX_ GV *gv)
933 {
934     register IO *io;
935     register PerlIO *fp;
936
937     if (gv && (io = GvIO(gv)) && (fp = IoIFP(io))) {
938 #ifdef ULTRIX_STDIO_BOTCH
939         if (PerlIO_eof(fp))
940             (void)PerlIO_seek(fp, 0L, 2);       /* ultrix 1.2 workaround */
941 #endif
942         return PerlIO_tell(fp);
943     }
944     {
945         dTHR;
946         if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
947             report_evil_fh(gv, io, PL_op->op_type);
948     }
949     SETERRNO(EBADF,RMS$_IFI);
950     return (Off_t)-1;
951 }
952
953 bool
954 Perl_do_seek(pTHX_ GV *gv, Off_t pos, int whence)
955 {
956     register IO *io;
957     register PerlIO *fp;
958
959     if (gv && (io = GvIO(gv)) && (fp = IoIFP(io))) {
960 #ifdef ULTRIX_STDIO_BOTCH
961         if (PerlIO_eof(fp))
962             (void)PerlIO_seek(fp, 0L, 2);       /* ultrix 1.2 workaround */
963 #endif
964         return PerlIO_seek(fp, pos, whence) >= 0;
965     }
966     {
967         dTHR;
968         if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
969             report_evil_fh(gv, io, PL_op->op_type);
970     }
971     SETERRNO(EBADF,RMS$_IFI);
972     return FALSE;
973 }
974
975 Off_t
976 Perl_do_sysseek(pTHX_ GV *gv, Off_t pos, int whence)
977 {
978     register IO *io;
979     register PerlIO *fp;
980
981     if (gv && (io = GvIO(gv)) && (fp = IoIFP(io)))
982         return PerlLIO_lseek(PerlIO_fileno(fp), pos, whence);
983     {
984         dTHR;
985         if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
986             report_evil_fh(gv, io, PL_op->op_type);
987     }
988     SETERRNO(EBADF,RMS$_IFI);
989     return (Off_t)-1;
990 }
991
992 int
993 Perl_mode_from_discipline(pTHX_ SV *discp)
994 {
995     int mode = O_BINARY;
996     if (discp) {
997         STRLEN len;
998         char *s = SvPV(discp,len);
999         while (*s) {
1000             if (*s == ':') {
1001                 switch (s[1]) {
1002                 case 'r':
1003                     if (len > 3 && strnEQ(s+1, "raw", 3)
1004                         && (!s[4] || s[4] == ':' || isSPACE(s[4])))
1005                     {
1006                         mode = O_BINARY;
1007                         s += 4;
1008                         len -= 4;
1009                         break;
1010                     }
1011                     /* FALL THROUGH */
1012                 case 'c':
1013                     if (len > 4 && strnEQ(s+1, "crlf", 4)
1014                         && (!s[5] || s[5] == ':' || isSPACE(s[5])))
1015                     {
1016                         mode = O_TEXT;
1017                         s += 5;
1018                         len -= 5;
1019                         break;
1020                     }
1021                     /* FALL THROUGH */
1022                 default:
1023                     goto fail_discipline;
1024                 }
1025             }
1026             else if (isSPACE(*s)) {
1027                 ++s;
1028                 --len;
1029             }
1030             else {
1031                 char *end;
1032 fail_discipline:
1033                 end = strchr(s+1, ':');
1034                 if (!end)
1035                     end = s+len;
1036                 Perl_croak(aTHX_ "Unknown discipline '%.*s'", end-s, s);
1037             }
1038         }
1039     }
1040     return mode;
1041 }
1042
1043 int
1044 Perl_do_binmode(pTHX_ PerlIO *fp, int iotype, int mode)
1045 {
1046 #ifdef DOSISH
1047 #  if defined(atarist) || defined(__MINT__)
1048     if (!PerlIO_flush(fp)) {
1049         if (mode & O_BINARY)
1050             ((FILE*)fp)->_flag |= _IOBIN;
1051         else
1052             ((FILE*)fp)->_flag &= ~ _IOBIN;
1053         return 1;
1054     }
1055     return 0;
1056 #  else
1057     if (PerlLIO_setmode(PerlIO_fileno(fp), mode) != -1) {
1058 #    if defined(WIN32) && defined(__BORLANDC__)
1059         /* The translation mode of the stream is maintained independent
1060          * of the translation mode of the fd in the Borland RTL (heavy
1061          * digging through their runtime sources reveal).  User has to
1062          * set the mode explicitly for the stream (though they don't
1063          * document this anywhere). GSAR 97-5-24
1064          */
1065         PerlIO_seek(fp,0L,0);
1066         if (mode & O_BINARY)
1067             ((FILE*)fp)->flags |= _F_BIN;
1068         else
1069             ((FILE*)fp)->flags &= ~ _F_BIN;
1070 #    endif
1071         return 1;
1072     }
1073     else
1074         return 0;
1075 #  endif
1076 #else
1077 #  if defined(USEMYBINMODE)
1078     if (my_binmode(fp, iotype, mode) != FALSE)
1079         return 1;
1080     else
1081         return 0;
1082 #  else
1083     return 1;
1084 #  endif
1085 #endif
1086 }
1087
1088 #if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
1089         /* code courtesy of William Kucharski */
1090 #define HAS_CHSIZE
1091
1092 I32 my_chsize(fd, length)
1093 I32 fd;                 /* file descriptor */
1094 Off_t length;           /* length to set file to */
1095 {
1096     struct flock fl;
1097     struct stat filebuf;
1098
1099     if (PerlLIO_fstat(fd, &filebuf) < 0)
1100         return -1;
1101
1102     if (filebuf.st_size < length) {
1103
1104         /* extend file length */
1105
1106         if ((PerlLIO_lseek(fd, (length - 1), 0)) < 0)
1107             return -1;
1108
1109         /* write a "0" byte */
1110
1111         if ((PerlLIO_write(fd, "", 1)) != 1)
1112             return -1;
1113     }
1114     else {
1115         /* truncate length */
1116
1117         fl.l_whence = 0;
1118         fl.l_len = 0;
1119         fl.l_start = length;
1120         fl.l_type = F_WRLCK;    /* write lock on file space */
1121
1122         /*
1123         * This relies on the UNDOCUMENTED F_FREESP argument to
1124         * fcntl(2), which truncates the file so that it ends at the
1125         * position indicated by fl.l_start.
1126         *
1127         * Will minor miracles never cease?
1128         */
1129
1130         if (fcntl(fd, F_FREESP, &fl) < 0)
1131             return -1;
1132
1133     }
1134
1135     return 0;
1136 }
1137 #endif /* F_FREESP */
1138
1139 bool
1140 Perl_do_print(pTHX_ register SV *sv, PerlIO *fp)
1141 {
1142     register char *tmps;
1143     STRLEN len;
1144
1145     /* assuming fp is checked earlier */
1146     if (!sv)
1147         return TRUE;
1148     if (PL_ofmt) {
1149         if (SvGMAGICAL(sv))
1150             mg_get(sv);
1151         if (SvIOK(sv) && SvIVX(sv) != 0) {
1152             PerlIO_printf(fp, PL_ofmt, (NV)SvIVX(sv));
1153             return !PerlIO_error(fp);
1154         }
1155         if (  (SvNOK(sv) && SvNVX(sv) != 0.0)
1156            || (looks_like_number(sv) && sv_2nv(sv) != 0.0) ) {
1157             PerlIO_printf(fp, PL_ofmt, SvNVX(sv));
1158             return !PerlIO_error(fp);
1159         }
1160     }
1161     switch (SvTYPE(sv)) {
1162     case SVt_NULL:
1163         {
1164             dTHR;
1165             if (ckWARN(WARN_UNINITIALIZED))
1166                 report_uninit();
1167         }
1168         return TRUE;
1169     case SVt_IV:
1170         if (SvIOK(sv)) {
1171             if (SvGMAGICAL(sv))
1172                 mg_get(sv);
1173             if (SvIsUV(sv))
1174                 PerlIO_printf(fp, "%"UVuf, (UV)SvUVX(sv));
1175             else
1176                 PerlIO_printf(fp, "%"IVdf, (IV)SvIVX(sv));
1177             return !PerlIO_error(fp);
1178         }
1179         /* FALL THROUGH */
1180     default:
1181 #if 0
1182         /* XXX Fix this when the I/O disciplines arrive. XXX */
1183         if (DO_UTF8(sv))
1184             sv_utf8_downgrade(sv, FALSE);
1185 #endif
1186         tmps = SvPV(sv, len);
1187         break;
1188     }
1189     /* To detect whether the process is about to overstep its
1190      * filesize limit we would need getrlimit().  We could then
1191      * also transparently raise the limit with setrlimit() --
1192      * but only until the system hard limit/the filesystem limit,
1193      * at which we would get EPERM.  Note that when using buffered
1194      * io the write failure can be delayed until the flush/close. --jhi */
1195     if (len && (PerlIO_write(fp,tmps,len) == 0))
1196         return FALSE;
1197     return !PerlIO_error(fp);
1198 }
1199
1200 I32
1201 Perl_my_stat(pTHX)
1202 {
1203     djSP;
1204     IO *io;
1205     GV* gv;
1206
1207     if (PL_op->op_flags & OPf_REF) {
1208         EXTEND(SP,1);
1209         gv = cGVOP_gv;
1210       do_fstat:
1211         io = GvIO(gv);
1212         if (io && IoIFP(io)) {
1213             PL_statgv = gv;
1214             sv_setpv(PL_statname,"");
1215             PL_laststype = OP_STAT;
1216             return (PL_laststatval = PerlLIO_fstat(PerlIO_fileno(IoIFP(io)), &PL_statcache));
1217         }
1218         else {
1219             if (gv == PL_defgv)
1220                 return PL_laststatval;
1221             if (ckWARN2(WARN_UNOPENED,WARN_CLOSED))
1222                 report_evil_fh(gv, io, PL_op->op_type);
1223             PL_statgv = Nullgv;
1224             sv_setpv(PL_statname,"");
1225             return (PL_laststatval = -1);
1226         }
1227     }
1228     else {
1229         SV* sv = POPs;
1230         char *s;
1231         STRLEN n_a;
1232         PUTBACK;
1233         if (SvTYPE(sv) == SVt_PVGV) {
1234             gv = (GV*)sv;
1235             goto do_fstat;
1236         }
1237         else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) {
1238             gv = (GV*)SvRV(sv);
1239             goto do_fstat;
1240         }
1241
1242         s = SvPV(sv, n_a);
1243         PL_statgv = Nullgv;
1244         sv_setpv(PL_statname, s);
1245         PL_laststype = OP_STAT;
1246         PL_laststatval = PerlLIO_stat(s, &PL_statcache);
1247         if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(s, '\n'))
1248             Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "stat");
1249         return PL_laststatval;
1250     }
1251 }
1252
1253 I32
1254 Perl_my_lstat(pTHX)
1255 {
1256     djSP;
1257     SV *sv;
1258     STRLEN n_a;
1259     if (PL_op->op_flags & OPf_REF) {
1260         EXTEND(SP,1);
1261         if (cGVOP_gv == PL_defgv) {
1262             if (PL_laststype != OP_LSTAT)
1263                 Perl_croak(aTHX_ "The stat preceding -l _ wasn't an lstat");
1264             return PL_laststatval;
1265         }
1266         Perl_croak(aTHX_ "You can't use -l on a filehandle");
1267     }
1268
1269     PL_laststype = OP_LSTAT;
1270     PL_statgv = Nullgv;
1271     sv = POPs;
1272     PUTBACK;
1273     sv_setpv(PL_statname,SvPV(sv, n_a));
1274     PL_laststatval = PerlLIO_lstat(SvPV(sv, n_a),&PL_statcache);
1275     if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(SvPV(sv, n_a), '\n'))
1276         Perl_warner(aTHX_ WARN_NEWLINE, PL_warn_nl, "lstat");
1277     return PL_laststatval;
1278 }
1279
1280 bool
1281 Perl_do_aexec(pTHX_ SV *really, register SV **mark, register SV **sp)
1282 {
1283     return do_aexec5(really, mark, sp, 0, 0);
1284 }
1285
1286 bool
1287 Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp,
1288                int fd, int do_report)
1289 {
1290 #ifdef MACOS_TRADITIONAL
1291     Perl_croak(aTHX_ "exec? I'm not *that* kind of operating system");
1292 #else
1293     register char **a;
1294     char *tmps;
1295     STRLEN n_a;
1296
1297     if (sp > mark) {
1298         dTHR;
1299         New(401,PL_Argv, sp - mark + 1, char*);
1300         a = PL_Argv;
1301         while (++mark <= sp) {
1302             if (*mark)
1303                 *a++ = SvPVx(*mark, n_a);
1304             else
1305                 *a++ = "";
1306         }
1307         *a = Nullch;
1308         if (*PL_Argv[0] != '/') /* will execvp use PATH? */
1309             TAINT_ENV();                /* testing IFS here is overkill, probably */
1310         if (really && *(tmps = SvPV(really, n_a)))
1311             PerlProc_execvp(tmps,PL_Argv);
1312         else
1313             PerlProc_execvp(PL_Argv[0],PL_Argv);
1314         if (ckWARN(WARN_EXEC))
1315             Perl_warner(aTHX_ WARN_EXEC, "Can't exec \"%s\": %s",
1316                 PL_Argv[0], Strerror(errno));
1317         if (do_report) {
1318             int e = errno;
1319
1320             PerlLIO_write(fd, (void*)&e, sizeof(int));
1321             PerlLIO_close(fd);
1322         }
1323     }
1324     do_execfree();
1325 #endif
1326     return FALSE;
1327 }
1328
1329 void
1330 Perl_do_execfree(pTHX)
1331 {
1332     if (PL_Argv) {
1333         Safefree(PL_Argv);
1334         PL_Argv = Null(char **);
1335     }
1336     if (PL_Cmd) {
1337         Safefree(PL_Cmd);
1338         PL_Cmd = Nullch;
1339     }
1340 }
1341
1342 #if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
1343
1344 bool
1345 Perl_do_exec(pTHX_ char *cmd)
1346 {
1347     return do_exec3(cmd,0,0);
1348 }
1349
1350 bool
1351 Perl_do_exec3(pTHX_ char *cmd, int fd, int do_report)
1352 {
1353     register char **a;
1354     register char *s;
1355     char flags[10];
1356
1357     while (*cmd && isSPACE(*cmd))
1358         cmd++;
1359
1360     /* save an extra exec if possible */
1361
1362 #ifdef CSH
1363     if (strnEQ(cmd,PL_cshname,PL_cshlen) && strnEQ(cmd+PL_cshlen," -c",3)) {
1364         strcpy(flags,"-c");
1365         s = cmd+PL_cshlen+3;
1366         if (*s == 'f') {
1367             s++;
1368             strcat(flags,"f");
1369         }
1370         if (*s == ' ')
1371             s++;
1372         if (*s++ == '\'') {
1373             char *ncmd = s;
1374
1375             while (*s)
1376                 s++;
1377             if (s[-1] == '\n')
1378                 *--s = '\0';
1379             if (s[-1] == '\'') {
1380                 *--s = '\0';
1381                 PerlProc_execl(PL_cshname,"csh", flags,ncmd,(char*)0);
1382                 *s = '\'';
1383                 return FALSE;
1384             }
1385         }
1386     }
1387 #endif /* CSH */
1388
1389     /* see if there are shell metacharacters in it */
1390
1391     if (*cmd == '.' && isSPACE(cmd[1]))
1392         goto doshell;
1393
1394     if (strnEQ(cmd,"exec",4) && isSPACE(cmd[4]))
1395         goto doshell;
1396
1397     for (s = cmd; *s && isALNUM(*s); s++) ;     /* catch VAR=val gizmo */
1398     if (*s == '=')
1399         goto doshell;
1400
1401     for (s = cmd; *s; s++) {
1402         if (*s != ' ' && !isALPHA(*s) && strchr("$&*(){}[]'\";\\|?<>~`\n",*s)) {
1403             if (*s == '\n' && !s[1]) {
1404                 *s = '\0';
1405                 break;
1406             }
1407             /* handle the 2>&1 construct at the end */
1408             if (*s == '>' && s[1] == '&' && s[2] == '1'
1409                 && s > cmd + 1 && s[-1] == '2' && isSPACE(s[-2])
1410                 && (!s[3] || isSPACE(s[3])))
1411             {
1412                 char *t = s + 3;
1413
1414                 while (*t && isSPACE(*t))
1415                     ++t;
1416                 if (!*t && (dup2(1,2) != -1)) {
1417                     s[-2] = '\0';
1418                     break;
1419                 }
1420             }
1421           doshell:
1422             PerlProc_execl(PL_sh_path, "sh", "-c", cmd, (char*)0);
1423             return FALSE;
1424         }
1425     }
1426
1427     New(402,PL_Argv, (s - cmd) / 2 + 2, char*);
1428     PL_Cmd = savepvn(cmd, s-cmd);
1429     a = PL_Argv;
1430     for (s = PL_Cmd; *s;) {
1431         while (*s && isSPACE(*s)) s++;
1432         if (*s)
1433             *(a++) = s;
1434         while (*s && !isSPACE(*s)) s++;
1435         if (*s)
1436             *s++ = '\0';
1437     }
1438     *a = Nullch;
1439     if (PL_Argv[0]) {
1440         PerlProc_execvp(PL_Argv[0],PL_Argv);
1441         if (errno == ENOEXEC) {         /* for system V NIH syndrome */
1442             do_execfree();
1443             goto doshell;
1444         }
1445         {
1446             dTHR;
1447             int e = errno;
1448
1449             if (ckWARN(WARN_EXEC))
1450                 Perl_warner(aTHX_ WARN_EXEC, "Can't exec \"%s\": %s",
1451                     PL_Argv[0], Strerror(errno));
1452             if (do_report) {
1453                 PerlLIO_write(fd, (void*)&e, sizeof(int));
1454                 PerlLIO_close(fd);
1455             }
1456         }
1457     }
1458     do_execfree();
1459     return FALSE;
1460 }
1461
1462 #endif /* OS2 || WIN32 */
1463
1464 I32
1465 Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp)
1466 {
1467     dTHR;
1468     register I32 val;
1469     register I32 val2;
1470     register I32 tot = 0;
1471     char *what;
1472     char *s;
1473     SV **oldmark = mark;
1474     STRLEN n_a;
1475
1476 #define APPLY_TAINT_PROPER() \
1477     STMT_START {                                                        \
1478         if (PL_tainted) { TAINT_PROPER(what); }                         \
1479     } STMT_END
1480
1481     /* This is a first heuristic; it doesn't catch tainting magic. */
1482     if (PL_tainting) {
1483         while (++mark <= sp) {
1484             if (SvTAINTED(*mark)) {
1485                 TAINT;
1486                 break;
1487             }
1488         }
1489         mark = oldmark;
1490     }
1491     switch (type) {
1492     case OP_CHMOD:
1493         what = "chmod";
1494         APPLY_TAINT_PROPER();
1495         if (++mark <= sp) {
1496             val = SvIVx(*mark);
1497             APPLY_TAINT_PROPER();
1498             tot = sp - mark;
1499             while (++mark <= sp) {
1500                 char *name = SvPVx(*mark, n_a);
1501                 APPLY_TAINT_PROPER();
1502                 if (PerlLIO_chmod(name, val))
1503                     tot--;
1504             }
1505         }
1506         break;
1507 #ifdef HAS_CHOWN
1508     case OP_CHOWN:
1509         what = "chown";
1510         APPLY_TAINT_PROPER();
1511         if (sp - mark > 2) {
1512             val = SvIVx(*++mark);
1513             val2 = SvIVx(*++mark);
1514             APPLY_TAINT_PROPER();
1515             tot = sp - mark;
1516             while (++mark <= sp) {
1517                 char *name = SvPVx(*mark, n_a);
1518                 APPLY_TAINT_PROPER();
1519                 if (PerlLIO_chown(name, val, val2))
1520                     tot--;
1521             }
1522         }
1523         break;
1524 #endif
1525 /*
1526 XXX Should we make lchown() directly available from perl?
1527 For now, we'll let Configure test for HAS_LCHOWN, but do
1528 nothing in the core.
1529     --AD  5/1998
1530 */
1531 #ifdef HAS_KILL
1532     case OP_KILL:
1533         what = "kill";
1534         APPLY_TAINT_PROPER();
1535         if (mark == sp)
1536             break;
1537         s = SvPVx(*++mark, n_a);
1538         if (isUPPER(*s)) {
1539             if (*s == 'S' && s[1] == 'I' && s[2] == 'G')
1540                 s += 3;
1541             if (!(val = whichsig(s)))
1542                 Perl_croak(aTHX_ "Unrecognized signal name \"%s\"",s);
1543         }
1544         else
1545             val = SvIVx(*mark);
1546         APPLY_TAINT_PROPER();
1547         tot = sp - mark;
1548 #ifdef VMS
1549         /* kill() doesn't do process groups (job trees?) under VMS */
1550         if (val < 0) val = -val;
1551         if (val == SIGKILL) {
1552 #           include <starlet.h>
1553             /* Use native sys$delprc() to insure that target process is
1554              * deleted; supervisor-mode images don't pay attention to
1555              * CRTL's emulation of Unix-style signals and kill()
1556              */
1557             while (++mark <= sp) {
1558                 I32 proc = SvIVx(*mark);
1559                 register unsigned long int __vmssts;
1560                 APPLY_TAINT_PROPER();
1561                 if (!((__vmssts = sys$delprc(&proc,0)) & 1)) {
1562                     tot--;
1563                     switch (__vmssts) {
1564                         case SS$_NONEXPR:
1565                         case SS$_NOSUCHNODE:
1566                             SETERRNO(ESRCH,__vmssts);
1567                             break;
1568                         case SS$_NOPRIV:
1569                             SETERRNO(EPERM,__vmssts);
1570                             break;
1571                         default:
1572                             SETERRNO(EVMSERR,__vmssts);
1573                     }
1574                 }
1575             }
1576             break;
1577         }
1578 #endif
1579         if (val < 0) {
1580             val = -val;
1581             while (++mark <= sp) {
1582                 I32 proc = SvIVx(*mark);
1583                 APPLY_TAINT_PROPER();
1584 #ifdef HAS_KILLPG
1585                 if (PerlProc_killpg(proc,val))  /* BSD */
1586 #else
1587                 if (PerlProc_kill(-proc,val))   /* SYSV */
1588 #endif
1589                     tot--;
1590             }
1591         }
1592         else {
1593             while (++mark <= sp) {
1594                 I32 proc = SvIVx(*mark);
1595                 APPLY_TAINT_PROPER();
1596                 if (PerlProc_kill(proc, val))
1597                     tot--;
1598             }
1599         }
1600         break;
1601 #endif
1602     case OP_UNLINK:
1603         what = "unlink";
1604         APPLY_TAINT_PROPER();
1605         tot = sp - mark;
1606         while (++mark <= sp) {
1607             s = SvPVx(*mark, n_a);
1608             APPLY_TAINT_PROPER();
1609             if (PL_euid || PL_unsafe) {
1610                 if (UNLINK(s))
1611                     tot--;
1612             }
1613             else {      /* don't let root wipe out directories without -U */
1614                 if (PerlLIO_lstat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode))
1615                     tot--;
1616                 else {
1617                     if (UNLINK(s))
1618                         tot--;
1619                 }
1620             }
1621         }
1622         break;
1623 #ifdef HAS_UTIME
1624     case OP_UTIME:
1625         what = "utime";
1626         APPLY_TAINT_PROPER();
1627         if (sp - mark > 2) {
1628 #if defined(I_UTIME) || defined(VMS)
1629             struct utimbuf utbuf;
1630 #else
1631             struct {
1632                 Time_t  actime;
1633                 Time_t  modtime;
1634             } utbuf;
1635 #endif
1636
1637             Zero(&utbuf, sizeof utbuf, char);
1638 #ifdef BIG_TIME
1639             utbuf.actime = (Time_t)SvNVx(*++mark);      /* time accessed */
1640             utbuf.modtime = (Time_t)SvNVx(*++mark);     /* time modified */
1641 #else
1642             utbuf.actime = (Time_t)SvIVx(*++mark);      /* time accessed */
1643             utbuf.modtime = (Time_t)SvIVx(*++mark);     /* time modified */
1644 #endif
1645             APPLY_TAINT_PROPER();
1646             tot = sp - mark;
1647             while (++mark <= sp) {
1648                 char *name = SvPVx(*mark, n_a);
1649                 APPLY_TAINT_PROPER();
1650                 if (PerlLIO_utime(name, &utbuf))
1651                     tot--;
1652             }
1653         }
1654         else
1655             tot = 0;
1656         break;
1657 #endif
1658     }
1659     return tot;
1660
1661 #undef APPLY_TAINT_PROPER
1662 }
1663
1664 /* Do the permissions allow some operation?  Assumes statcache already set. */
1665 #ifndef VMS /* VMS' cando is in vms.c */
1666 bool
1667 Perl_cando(pTHX_ Mode_t mode, Uid_t effective, register Stat_t *statbufp)
1668 /* Note: we use `effective' both for uids and gids.
1669  * Here we are betting on Uid_t being equal or wider than Gid_t.  */
1670 {
1671 #ifdef DOSISH
1672     /* [Comments and code from Len Reed]
1673      * MS-DOS "user" is similar to UNIX's "superuser," but can't write
1674      * to write-protected files.  The execute permission bit is set
1675      * by the Miscrosoft C library stat() function for the following:
1676      *          .exe files
1677      *          .com files
1678      *          .bat files
1679      *          directories
1680      * All files and directories are readable.
1681      * Directories and special files, e.g. "CON", cannot be
1682      * write-protected.
1683      * [Comment by Tom Dinger -- a directory can have the write-protect
1684      *          bit set in the file system, but DOS permits changes to
1685      *          the directory anyway.  In addition, all bets are off
1686      *          here for networked software, such as Novell and
1687      *          Sun's PC-NFS.]
1688      */
1689
1690      /* Atari stat() does pretty much the same thing. we set x_bit_set_in_stat
1691       * too so it will actually look into the files for magic numbers
1692       */
1693      return (mode & statbufp->st_mode) ? TRUE : FALSE;
1694
1695 #else /* ! DOSISH */
1696     if ((effective ? PL_euid : PL_uid) == 0) {  /* root is special */
1697         if (mode == S_IXUSR) {
1698             if (statbufp->st_mode & 0111 || S_ISDIR(statbufp->st_mode))
1699                 return TRUE;
1700         }
1701         else
1702             return TRUE;                /* root reads and writes anything */
1703         return FALSE;
1704     }
1705     if (statbufp->st_uid == (effective ? PL_euid : PL_uid) ) {
1706         if (statbufp->st_mode & mode)
1707             return TRUE;        /* ok as "user" */
1708     }
1709     else if (ingroup(statbufp->st_gid,effective)) {
1710         if (statbufp->st_mode & mode >> 3)
1711             return TRUE;        /* ok as "group" */
1712     }
1713     else if (statbufp->st_mode & mode >> 6)
1714         return TRUE;    /* ok as "other" */
1715     return FALSE;
1716 #endif /* ! DOSISH */
1717 }
1718 #endif /* ! VMS */
1719
1720 bool
1721 Perl_ingroup(pTHX_ Gid_t testgid, Uid_t effective)
1722 {
1723 #ifdef MACOS_TRADITIONAL
1724     /* This is simply not correct for AppleShare, but fix it yerself. */
1725     return TRUE;
1726 #else
1727     if (testgid == (effective ? PL_egid : PL_gid))
1728         return TRUE;
1729 #ifdef HAS_GETGROUPS
1730 #ifndef NGROUPS
1731 #define NGROUPS 32
1732 #endif
1733     {
1734         Groups_t gary[NGROUPS];
1735         I32 anum;
1736
1737         anum = getgroups(NGROUPS,gary);
1738         while (--anum >= 0)
1739             if (gary[anum] == testgid)
1740                 return TRUE;
1741     }
1742 #endif
1743     return FALSE;
1744 #endif
1745 }
1746
1747 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
1748
1749 I32
1750 Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
1751 {
1752     dTHR;
1753     key_t key;
1754     I32 n, flags;
1755
1756     key = (key_t)SvNVx(*++mark);
1757     n = (optype == OP_MSGGET) ? 0 : SvIVx(*++mark);
1758     flags = SvIVx(*++mark);
1759     SETERRNO(0,0);
1760     switch (optype)
1761     {
1762 #ifdef HAS_MSG
1763     case OP_MSGGET:
1764         return msgget(key, flags);
1765 #endif
1766 #ifdef HAS_SEM
1767     case OP_SEMGET:
1768         return semget(key, n, flags);
1769 #endif
1770 #ifdef HAS_SHM
1771     case OP_SHMGET:
1772         return shmget(key, n, flags);
1773 #endif
1774 #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
1775     default:
1776         Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
1777 #endif
1778     }
1779     return -1;                  /* should never happen */
1780 }
1781
1782 I32
1783 Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp)
1784 {
1785     dTHR;
1786     SV *astr;
1787     char *a;
1788     I32 id, n, cmd, infosize, getinfo;
1789     I32 ret = -1;
1790
1791     id = SvIVx(*++mark);
1792     n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0;
1793     cmd = SvIVx(*++mark);
1794     astr = *++mark;
1795     infosize = 0;
1796     getinfo = (cmd == IPC_STAT);
1797
1798     switch (optype)
1799     {
1800 #ifdef HAS_MSG
1801     case OP_MSGCTL:
1802         if (cmd == IPC_STAT || cmd == IPC_SET)
1803             infosize = sizeof(struct msqid_ds);
1804         break;
1805 #endif
1806 #ifdef HAS_SHM
1807     case OP_SHMCTL:
1808         if (cmd == IPC_STAT || cmd == IPC_SET)
1809             infosize = sizeof(struct shmid_ds);
1810         break;
1811 #endif
1812 #ifdef HAS_SEM
1813     case OP_SEMCTL:
1814 #ifdef Semctl
1815         if (cmd == IPC_STAT || cmd == IPC_SET)
1816             infosize = sizeof(struct semid_ds);
1817         else if (cmd == GETALL || cmd == SETALL)
1818         {
1819             struct semid_ds semds;
1820             union semun semun;
1821 #ifdef EXTRA_F_IN_SEMUN_BUF
1822             semun.buff = &semds;
1823 #else
1824             semun.buf = &semds;
1825 #endif
1826             getinfo = (cmd == GETALL);
1827             if (Semctl(id, 0, IPC_STAT, semun) == -1)
1828                 return -1;
1829             infosize = semds.sem_nsems * sizeof(short);
1830                 /* "short" is technically wrong but much more portable
1831                    than guessing about u_?short(_t)? */
1832         }
1833 #else
1834         Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
1835 #endif
1836         break;
1837 #endif
1838 #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
1839     default:
1840         Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
1841 #endif
1842     }
1843
1844     if (infosize)
1845     {
1846         STRLEN len;
1847         if (getinfo)
1848         {
1849             SvPV_force(astr, len);
1850             a = SvGROW(astr, infosize+1);
1851         }
1852         else
1853         {
1854             a = SvPV(astr, len);
1855             if (len != infosize)
1856                 Perl_croak(aTHX_ "Bad arg length for %s, is %lu, should be %ld",
1857                       PL_op_desc[optype],
1858                       (unsigned long)len,
1859                       (long)infosize);
1860         }
1861     }
1862     else
1863     {
1864         IV i = SvIV(astr);
1865         a = INT2PTR(char *,i);          /* ouch */
1866     }
1867     SETERRNO(0,0);
1868     switch (optype)
1869     {
1870 #ifdef HAS_MSG
1871     case OP_MSGCTL:
1872         ret = msgctl(id, cmd, (struct msqid_ds *)a);
1873         break;
1874 #endif
1875 #ifdef HAS_SEM
1876     case OP_SEMCTL: {
1877 #ifdef Semctl
1878             union semun unsemds;
1879
1880 #ifdef EXTRA_F_IN_SEMUN_BUF
1881             unsemds.buff = (struct semid_ds *)a;
1882 #else
1883             unsemds.buf = (struct semid_ds *)a;
1884 #endif
1885             ret = Semctl(id, n, cmd, unsemds);
1886 #else
1887             Perl_croak(aTHX_ "%s not implemented", PL_op_desc[optype]);
1888 #endif
1889         }
1890         break;
1891 #endif
1892 #ifdef HAS_SHM
1893     case OP_SHMCTL:
1894         ret = shmctl(id, cmd, (struct shmid_ds *)a);
1895         break;
1896 #endif
1897     }
1898     if (getinfo && ret >= 0) {
1899         SvCUR_set(astr, infosize);
1900         *SvEND(astr) = '\0';
1901         SvSETMAGIC(astr);
1902     }
1903     return ret;
1904 }
1905
1906 I32
1907 Perl_do_msgsnd(pTHX_ SV **mark, SV **sp)
1908 {
1909 #ifdef HAS_MSG
1910     dTHR;
1911     SV *mstr;
1912     char *mbuf;
1913     I32 id, msize, flags;
1914     STRLEN len;
1915
1916     id = SvIVx(*++mark);
1917     mstr = *++mark;
1918     flags = SvIVx(*++mark);
1919     mbuf = SvPV(mstr, len);
1920     if ((msize = len - sizeof(long)) < 0)
1921         Perl_croak(aTHX_ "Arg too short for msgsnd");
1922     SETERRNO(0,0);
1923     return msgsnd(id, (struct msgbuf *)mbuf, msize, flags);
1924 #else
1925     Perl_croak(aTHX_ "msgsnd not implemented");
1926 #endif
1927 }
1928
1929 I32
1930 Perl_do_msgrcv(pTHX_ SV **mark, SV **sp)
1931 {
1932 #ifdef HAS_MSG
1933     dTHR;
1934     SV *mstr;
1935     char *mbuf;
1936     long mtype;
1937     I32 id, msize, flags, ret;
1938     STRLEN len;
1939
1940     id = SvIVx(*++mark);
1941     mstr = *++mark;
1942     /* suppress warning when reading into undef var --jhi */
1943     if (! SvOK(mstr))
1944         sv_setpvn(mstr, "", 0);
1945     msize = SvIVx(*++mark);
1946     mtype = (long)SvIVx(*++mark);
1947     flags = SvIVx(*++mark);
1948     SvPV_force(mstr, len);
1949     mbuf = SvGROW(mstr, sizeof(long)+msize+1);
1950
1951     SETERRNO(0,0);
1952     ret = msgrcv(id, (struct msgbuf *)mbuf, msize, mtype, flags);
1953     if (ret >= 0) {
1954         SvCUR_set(mstr, sizeof(long)+ret);
1955         *SvEND(mstr) = '\0';
1956 #ifndef INCOMPLETE_TAINTS
1957         /* who knows who has been playing with this message? */
1958         SvTAINTED_on(mstr);
1959 #endif
1960     }
1961     return ret;
1962 #else
1963     Perl_croak(aTHX_ "msgrcv not implemented");
1964 #endif
1965 }
1966
1967 I32
1968 Perl_do_semop(pTHX_ SV **mark, SV **sp)
1969 {
1970 #ifdef HAS_SEM
1971     dTHR;
1972     SV *opstr;
1973     char *opbuf;
1974     I32 id;
1975     STRLEN opsize;
1976
1977     id = SvIVx(*++mark);
1978     opstr = *++mark;
1979     opbuf = SvPV(opstr, opsize);
1980     if (opsize < sizeof(struct sembuf)
1981         || (opsize % sizeof(struct sembuf)) != 0) {
1982         SETERRNO(EINVAL,LIB$_INVARG);
1983         return -1;
1984     }
1985     SETERRNO(0,0);
1986     return semop(id, (struct sembuf *)opbuf, opsize/sizeof(struct sembuf));
1987 #else
1988     Perl_croak(aTHX_ "semop not implemented");
1989 #endif
1990 }
1991
1992 I32
1993 Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp)
1994 {
1995 #ifdef HAS_SHM
1996     dTHR;
1997     SV *mstr;
1998     char *mbuf, *shm;
1999     I32 id, mpos, msize;
2000     STRLEN len;
2001     struct shmid_ds shmds;
2002
2003     id = SvIVx(*++mark);
2004     mstr = *++mark;
2005     mpos = SvIVx(*++mark);
2006     msize = SvIVx(*++mark);
2007     SETERRNO(0,0);
2008     if (shmctl(id, IPC_STAT, &shmds) == -1)
2009         return -1;
2010     if (mpos < 0 || msize < 0 || mpos + msize > shmds.shm_segsz) {
2011         SETERRNO(EFAULT,SS$_ACCVIO);            /* can't do as caller requested */
2012         return -1;
2013     }
2014     shm = (char *)shmat(id, (char*)NULL, (optype == OP_SHMREAD) ? SHM_RDONLY : 0);
2015     if (shm == (char *)-1)      /* I hate System V IPC, I really do */
2016         return -1;
2017     if (optype == OP_SHMREAD) {
2018         /* suppress warning when reading into undef var (tchrist 3/Mar/00) */
2019         if (! SvOK(mstr))
2020             sv_setpvn(mstr, "", 0);
2021         SvPV_force(mstr, len);
2022         mbuf = SvGROW(mstr, msize+1);
2023
2024         Copy(shm + mpos, mbuf, msize, char);
2025         SvCUR_set(mstr, msize);
2026         *SvEND(mstr) = '\0';
2027         SvSETMAGIC(mstr);
2028 #ifndef INCOMPLETE_TAINTS
2029         /* who knows who has been playing with this shared memory? */
2030         SvTAINTED_on(mstr);
2031 #endif
2032     }
2033     else {
2034         I32 n;
2035
2036         mbuf = SvPV(mstr, len);
2037         if ((n = len) > msize)
2038             n = msize;
2039         Copy(mbuf, shm + mpos, n, char);
2040         if (n < msize)
2041             memzero(shm + mpos + n, msize - n);
2042     }
2043     return shmdt(shm);
2044 #else
2045     Perl_croak(aTHX_ "shm I/O not implemented");
2046 #endif
2047 }
2048
2049 #endif /* SYSV IPC */
2050