X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/3280af22f58e7b37514ed104858e2c2fc55ceeeb..10d20342241794db0c535c2739c380f367a9f178:/doio.c diff --git a/doio.c b/doio.c index 886add2..0cdf87d 100644 --- a/doio.c +++ b/doio.c @@ -125,22 +125,42 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe } if (as_raw) { - result = rawmode & 3; - IoTYPE(io) = "<>++"[result]; +#if defined(O_LARGEFILE) + rawmode |= O_LARGEFILE; +#endif + +#ifndef O_ACCMODE +#define O_ACCMODE 3 /* Assume traditional implementation */ +#endif + + switch (result = rawmode & O_ACCMODE) { + case O_RDONLY: + IoTYPE(io) = '<'; + break; + case O_WRONLY: + IoTYPE(io) = '>'; + break; + case O_RDWR: + default: + IoTYPE(io) = '+'; + break; + } + writing = (result > 0); fd = PerlLIO_open3(name, rawmode, rawperm); + if (fd == -1) fp = NULL; else { char *fpmode; - if (result == 0) + if (result == O_RDONLY) fpmode = "r"; #ifdef O_APPEND else if (rawmode & O_APPEND) - fpmode = (result == 1) ? "a" : "a+"; + fpmode = (result == O_WRONLY) ? "a" : "a+"; #endif else - fpmode = (result == 1) ? "w" : "r+"; + fpmode = (result == O_WRONLY) ? "w" : "r+"; fp = PerlIO_fdopen(fd, fpmode); if (!fp) PerlLIO_close(fd); @@ -172,9 +192,10 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe TAINT_ENV(); TAINT_PROPER("piped open"); if (name[strlen(name)-1] == '|') { + dTHR; name[strlen(name)-1] = '\0' ; - if (PL_dowarn) - warn("Can't do bidirectional pipe"); + if (ckWARN(WARN_PIPE)) + warner(WARN_PIPE, "Can't do bidirectional pipe"); } fp = PerlProc_popen(name,"w"); writing = 1; @@ -283,8 +304,9 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe } } if (!fp) { - if (PL_dowarn && IoTYPE(io) == '<' && strchr(name, '\n')) - warn(warn_nl, "open"); + dTHR; + if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == '<' && strchr(name, '\n')) + warner(WARN_NEWLINE, PL_warn_nl, "open"); goto say_false; } if (IoTYPE(io) && @@ -301,7 +323,7 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe #ifdef S_IFMT !(PL_statbuf.st_mode & S_IFMT) #else - !statbuf.st_mode + !PL_statbuf.st_mode #endif ) { char tmpbuf[256]; @@ -388,7 +410,7 @@ nextargv(register GV *gv) #ifdef HAS_FCHMOD (void)fchmod(PL_lastfd,PL_filemode); #else - (void)PerlLIO_chmod(oldname,filemode); + (void)PerlLIO_chmod(PL_oldname,PL_filemode); #endif } PL_filemode = 0; @@ -400,7 +422,7 @@ nextargv(register GV *gv) sv_setsv(GvSV(gv),sv); SvSETMAGIC(GvSV(gv)); PL_oldname = SvPVx(GvSV(gv), oldlen); - if (do_open(gv,PL_oldname,oldlen,PL_inplace!=0,0,0,Nullfp)) { + if (do_open(gv,PL_oldname,oldlen,PL_inplace!=0,O_RDONLY,0,Nullfp)) { if (PL_inplace) { TAINT_PROPER("inplace open"); if (oldlen == 1 && *PL_oldname == '-') { @@ -408,8 +430,8 @@ nextargv(register GV *gv) return IoIFP(GvIOp(gv)); } #ifndef FLEXFILENAMES - filedev = statbuf.st_dev; - fileino = statbuf.st_ino; + filedev = PL_statbuf.st_dev; + fileino = PL_statbuf.st_ino; #endif PL_filemode = PL_statbuf.st_mode; fileuid = PL_statbuf.st_uid; @@ -437,9 +459,9 @@ nextargv(register GV *gv) sv_catpv(sv,PL_inplace); } #ifndef FLEXFILENAMES - if (PerlLIO_stat(SvPVX(sv),&statbuf) >= 0 - && statbuf.st_dev == filedev - && statbuf.st_ino == fileino + if (PerlLIO_stat(SvPVX(sv),&PL_statbuf) >= 0 + && PL_statbuf.st_dev == filedev + && PL_statbuf.st_ino == fileino #ifdef DJGPP || (_djstat_fail_bits & _STFAIL_TRUENAME)!=0 #endif @@ -461,18 +483,18 @@ nextargv(register GV *gv) #else do_close(gv,FALSE); (void)PerlLIO_unlink(SvPVX(sv)); - (void)PerlLIO_rename(oldname,SvPVX(sv)); - do_open(gv,SvPVX(sv),SvCUR(sv),inplace!=0,0,0,Nullfp); + (void)PerlLIO_rename(PL_oldname,SvPVX(sv)); + do_open(gv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,O_RDONLY,0,Nullfp); #endif /* DOSISH */ #else (void)UNLINK(SvPVX(sv)); - if (link(oldname,SvPVX(sv)) < 0) { + if (link(PL_oldname,SvPVX(sv)) < 0) { warn("Can't rename %s to %s: %s, skipping file", - oldname, SvPVX(sv), Strerror(errno) ); + PL_oldname, SvPVX(sv), Strerror(errno) ); do_close(gv,FALSE); continue; } - (void)UNLINK(oldname); + (void)UNLINK(PL_oldname); #endif } else { @@ -493,8 +515,13 @@ nextargv(register GV *gv) sv_setpvn(sv,">",!PL_inplace); sv_catpvn(sv,PL_oldname,oldlen); SETERRNO(0,0); /* in case sprintf set errno */ +#ifdef VMS + if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0, + O_WRONLY|O_CREAT|O_TRUNC,0,Nullfp)) { +#else if (!do_open(PL_argvoutgv,SvPVX(sv),SvCUR(sv),PL_inplace!=0, O_WRONLY|O_CREAT|OPEN_EXCL,0666,Nullfp)) { +#endif warn("Can't do inplace edit on %s: %s", PL_oldname, Strerror(errno) ); do_close(gv,FALSE); @@ -508,7 +535,7 @@ nextargv(register GV *gv) #else # if !(defined(WIN32) && defined(__BORLANDC__)) /* Borland runtime creates a readonly file! */ - (void)PerlLIO_chmod(oldname,filemode); + (void)PerlLIO_chmod(PL_oldname,PL_filemode); # endif #endif if (fileuid != PL_statbuf.st_uid || filegid != PL_statbuf.st_gid) { @@ -516,7 +543,7 @@ nextargv(register GV *gv) (void)fchown(PL_lastfd,fileuid,filegid); #else #ifdef HAS_CHOWN - (void)PerlLIO_chown(oldname,fileuid,filegid); + (void)PerlLIO_chown(PL_oldname,fileuid,filegid); #endif #endif } @@ -596,8 +623,10 @@ do_close(GV *gv, bool not_implicit) io = GvIO(gv); if (!io) { /* never opened */ if (not_implicit) { - if (PL_dowarn) - warn("Close on unopened file <%s>",GvENAME(gv)); + dTHR; + if (ckWARN(WARN_UNOPENED)) + warner(WARN_UNOPENED, + "Close on unopened file <%s>",GvENAME(gv)); SETERRNO(EBADF,SS$_IVCHAN); } return FALSE; @@ -671,7 +700,7 @@ do_eof(GV *gv) if (PerlIO_get_cnt(IoIFP(io)) < -1) PerlIO_set_cnt(IoIFP(io),-1); } - if (op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */ + if (PL_op->op_flags & OPf_SPECIAL) { /* not necessarily a real EOF yet? */ if (!nextargv(PL_argvgv)) /* get another fp handy */ return TRUE; } @@ -681,7 +710,7 @@ do_eof(GV *gv) return TRUE; } -long +Off_t do_tell(GV *gv) { register IO *io; @@ -694,14 +723,17 @@ do_tell(GV *gv) #endif return PerlIO_tell(fp); } - if (PL_dowarn) - warn("tell() on unopened file"); + { + dTHR; + if (ckWARN(WARN_UNOPENED)) + warner(WARN_UNOPENED, "tell() on unopened file"); + } SETERRNO(EBADF,RMS$_IFI); - return -1L; + return (Off_t)-1; } bool -do_seek(GV *gv, long int pos, int whence) +do_seek(GV *gv, Off_t pos, int whence) { register IO *io; register PerlIO *fp; @@ -713,22 +745,28 @@ do_seek(GV *gv, long int pos, int whence) #endif return PerlIO_seek(fp, pos, whence) >= 0; } - if (PL_dowarn) - warn("seek() on unopened file"); + { + dTHR; + if (ckWARN(WARN_UNOPENED)) + warner(WARN_UNOPENED, "seek() on unopened file"); + } SETERRNO(EBADF,RMS$_IFI); return FALSE; } -long -do_sysseek(GV *gv, long int pos, int whence) +Off_t +do_sysseek(GV *gv, Off_t pos, int whence) { register IO *io; register PerlIO *fp; if (gv && (io = GvIO(gv)) && (fp = IoIFP(io))) return PerlLIO_lseek(PerlIO_fileno(fp), pos, whence); - if (PL_dowarn) - warn("sysseek() on unopened file"); + { + dTHR; + if (ckWARN(WARN_UNOPENED)) + warner(WARN_UNOPENED, "sysseek() on unopened file"); + } SETERRNO(EBADF,RMS$_IFI); return -1L; } @@ -848,8 +886,11 @@ do_print(register SV *sv, PerlIO *fp) } switch (SvTYPE(sv)) { case SVt_NULL: - if (PL_dowarn) - warn(warn_uninit); + { + dTHR; + if (ckWARN(WARN_UNINITIALIZED)) + warner(WARN_UNINITIALIZED, PL_warn_uninit); + } return TRUE; case SVt_IV: if (SvIOK(sv)) { @@ -875,7 +916,7 @@ my_stat(ARGSproto) IO *io; GV* tmpgv; - if (op->op_flags & OPf_REF) { + if (PL_op->op_flags & OPf_REF) { EXTEND(SP,1); tmpgv = cGVOP->op_gv; do_fstat: @@ -889,8 +930,8 @@ my_stat(ARGSproto) else { if (tmpgv == PL_defgv) return PL_laststatval; - if (PL_dowarn) - warn("Stat on unopened file <%s>", + if (ckWARN(WARN_UNOPENED)) + warner(WARN_UNOPENED, "Stat on unopened file <%s>", GvENAME(tmpgv)); PL_statgv = Nullgv; sv_setpv(PL_statname,""); @@ -915,8 +956,8 @@ my_stat(ARGSproto) sv_setpv(PL_statname, s); PL_laststype = OP_STAT; PL_laststatval = PerlLIO_stat(s, &PL_statcache); - if (PL_laststatval < 0 && PL_dowarn && strchr(s, '\n')) - warn(warn_nl, "stat"); + if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(s, '\n')) + warner(WARN_NEWLINE, PL_warn_nl, "stat"); return PL_laststatval; } } @@ -926,7 +967,7 @@ my_lstat(ARGSproto) { djSP; SV *sv; - if (op->op_flags & OPf_REF) { + if (PL_op->op_flags & OPf_REF) { EXTEND(SP,1); if (cGVOP->op_gv == PL_defgv) { if (PL_laststype != OP_LSTAT) @@ -944,10 +985,10 @@ my_lstat(ARGSproto) #ifdef HAS_LSTAT PL_laststatval = PerlLIO_lstat(SvPV(sv, PL_na),&PL_statcache); #else - laststatval = PerlLIO_stat(SvPV(sv, na),&statcache); + PL_laststatval = PerlLIO_stat(SvPV(sv, PL_na),&PL_statcache); #endif - if (PL_laststatval < 0 && PL_dowarn && strchr(SvPV(sv, PL_na), '\n')) - warn(warn_nl, "lstat"); + if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(SvPV(sv, PL_na), '\n')) + warner(WARN_NEWLINE, PL_warn_nl, "lstat"); return PL_laststatval; } @@ -974,8 +1015,9 @@ do_aexec(SV *really, register SV **mark, register SV **sp) PerlProc_execvp(tmps,PL_Argv); else PerlProc_execvp(PL_Argv[0],PL_Argv); - if (PL_dowarn) - warn("Can't exec \"%s\": %s", PL_Argv[0], Strerror(errno)); + if (ckWARN(WARN_EXEC)) + warner(WARN_EXEC, "Can't exec \"%s\": %s", + PL_Argv[0], Strerror(errno)); } do_execfree(); return FALSE; @@ -1077,8 +1119,12 @@ do_exec(char *cmd) do_execfree(); goto doshell; } - if (PL_dowarn) - warn("Can't exec \"%s\": %s", PL_Argv[0], Strerror(errno)); + { + dTHR; + if (ckWARN(WARN_EXEC)) + warner(WARN_EXEC, "Can't exec \"%s\": %s", + PL_Argv[0], Strerror(errno)); + } } do_execfree(); return FALSE; @@ -1238,7 +1284,7 @@ nothing in the core. #ifdef HAS_LSTAT if (PerlLIO_lstat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode)) #else - if (PerlLIO_stat(s,&statbuf) < 0 || S_ISDIR(statbuf.st_mode)) + if (PerlLIO_stat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode)) #endif tot--; else { @@ -1398,7 +1444,7 @@ do_ipcget(I32 optype, SV **mark, SV **sp) #endif #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM) default: - croak("%s not implemented", op_desc[optype]); + croak("%s not implemented", PL_op_desc[optype]); #endif } return -1; /* should never happen */ @@ -1455,7 +1501,7 @@ do_ipcctl(I32 optype, SV **mark, SV **sp) #endif #if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM) default: - croak("%s not implemented", op_desc[optype]); + croak("%s not implemented", PL_op_desc[optype]); #endif } @@ -1472,7 +1518,9 @@ do_ipcctl(I32 optype, SV **mark, SV **sp) a = SvPV(astr, len); if (len != infosize) croak("Bad arg length for %s, is %lu, should be %ld", - op_desc[optype], (unsigned long)len, (long)infosize); + PL_op_desc[optype], + (unsigned long)len, + (long)infosize); } } else