X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=doio.c;h=73217bfb07cc5a1988929d64bbbed35e629b7970;hb=cf2649810f00335bd657355d81bcc9384a620135;hp=7457c90718eb2f112594412d40e81bcb508cb556;hpb=5c144d81801caa5e8317f6a38b40eb08257c47ea;p=p5sagit%2Fp5-mst-13.2.git diff --git a/doio.c b/doio.c index 7457c90..73217bf 100644 --- a/doio.c +++ b/doio.c @@ -71,7 +71,7 @@ Perl_do_open9(pTHX_ GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawperm, PerlIO *supplied_fp, SV *svs, I32 num_svs) { - (void)num_svs; + PERL_UNUSED_ARG(num_svs); return do_openn(gv, name, len, as_raw, rawmode, rawperm, supplied_fp, &svs, 1); } @@ -82,7 +82,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, I32 num_svs) { dVAR; - register IO *io = GvIOn(gv); + register IO * const io = GvIOn(gv); PerlIO *saveifp = Nullfp; PerlIO *saveofp = Nullfp; int savefd = -1; @@ -213,7 +213,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, SAVEFREEPV(type); /* Lose leading and trailing white space */ - /*SUPPRESS 530*/ for (; isSPACE(*type); type++) ; while (tend > type && isSPACE(tend[-1])) *--tend = '\0'; @@ -253,7 +252,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } type++; } - /*SUPPRESS 530*/ for (type++; isSPACE(*type); type++) ; if (!num_svs) { name = type; @@ -341,7 +339,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, if (num_svs > 1) { Perl_croak(aTHX_ "More than one argument to '%c&' open",IoTYPE(io)); } - /*SUPPRESS 530*/ for (; isSPACE(*type); type++) ; if (num_svs && (SvIOK(*svp) || (SvPOK(*svp) && looks_like_number(*svp)))) { fd = SvUV(*svp); @@ -418,10 +415,8 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } } /* & */ else { - /*SUPPRESS 530*/ for (; isSPACE(*type); type++) ; if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) { - /*SUPPRESS 530*/ type++; fp = PerlIO_stdout(); IoTYPE(io) = IoTYPE_STD; @@ -443,7 +438,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, goto unknown_open_mode; } /* IoTYPE_WRONLY */ else if (*type == IoTYPE_RDONLY) { - /*SUPPRESS 530*/ for (type++; isSPACE(*type); type++) ; mode[0] = 'r'; #ifdef HAS_STRLCAT @@ -461,7 +455,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, goto duplicity; } if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) { - /*SUPPRESS 530*/ type++; fp = PerlIO_stdin(); IoTYPE(io) = IoTYPE_STD; @@ -491,8 +484,8 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, *--tend = '\0'; while (tend > type && isSPACE(tend[-1])) *--tend = '\0'; - /*SUPPRESS 530*/ - for (; isSPACE(*type); type++) ; + for (; isSPACE(*type); type++) + ; name = type; len = tend-type; } @@ -541,8 +534,8 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, goto unknown_open_mode; name = type; IoTYPE(io) = IoTYPE_RDONLY; - /*SUPPRESS 530*/ - for (; isSPACE(*name); name++) ; + for (; isSPACE(*name); name++) + ; mode[0] = 'r'; #ifdef HAS_STRLCAT @@ -573,7 +566,10 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw, } } if (!fp) { - if (ckWARN(WARN_NEWLINE) && IoTYPE(io) == IoTYPE_RDONLY && strchr(name, '\n')) + if (IoTYPE(io) == IoTYPE_RDONLY && ckWARN(WARN_NEWLINE) + && strchr(name, '\n') + + ) Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "open"); goto say_false; } @@ -780,7 +776,7 @@ Perl_nextargv(pTHX_ register GV *gv) STRLEN oldlen; sv = av_shift(GvAV(gv)); SAVEFREESV(sv); - sv_setsv(GvSV(gv),sv); + sv_setsv(GvSVn(gv),sv); SvSETMAGIC(GvSV(gv)); PL_oldname = SvPVx(GvSV(gv), oldlen); if (do_open(gv,PL_oldname,oldlen,PL_inplace!=0,O_RDONLY,0,Nullfp)) { @@ -852,7 +848,8 @@ Perl_nextargv(pTHX_ register GV *gv) do_close(gv,FALSE); (void)PerlLIO_unlink(SvPVX_const(sv)); (void)PerlLIO_rename(PL_oldname,SvPVX_const(sv)); - do_open(gv,SvPVX(sv),SvCUR(sv),PL_inplace!=0,O_RDONLY,0,Nullfp); + do_open(gv,(char*)SvPVX_const(sv),SvCUR(sv),PL_inplace!=0, + O_RDONLY,0,Nullfp); #endif /* DOSISH */ #else (void)UNLINK(SvPVX_const(sv)); @@ -888,11 +885,12 @@ Perl_nextargv(pTHX_ register GV *gv) 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)) + if (!do_open(PL_argvoutgv,(char*)SvPVX_const(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)) + if (!do_open(PL_argvoutgv,(char*)SvPVX_const(sv),SvCUR(sv), + PL_inplace!=0,O_WRONLY|O_CREAT|OPEN_EXCL,0666, + Nullfp)) #endif { if (ckWARN_d(WARN_INPLACE)) @@ -1084,7 +1082,7 @@ Perl_do_eof(pTHX_ GV *gv) if (!io) return TRUE; - else if (ckWARN(WARN_IO) && (IoTYPE(io) == IoTYPE_WRONLY)) + else if ((IoTYPE(io) == IoTYPE_WRONLY) && ckWARN(WARN_IO)) report_evil_fh(gv, io, OP_phoney_OUTPUT_ONLY); while (IoIFP(io)) { @@ -1176,7 +1174,7 @@ Perl_mode_from_discipline(pTHX_ SV *discp) int mode = O_BINARY; if (discp) { STRLEN len; - const char *s = SvPV(discp,len); + const char *s = SvPV_const(discp,len); while (*s) { if (*s == ':') { switch (s[1]) { @@ -1303,19 +1301,6 @@ Perl_do_print(pTHX_ register SV *sv, PerlIO *fp) /* assuming fp is checked earlier */ if (!sv) return TRUE; - if (PL_ofmt) { - if (SvGMAGICAL(sv)) - mg_get(sv); - if (SvIOK(sv) && SvIVX(sv) != 0) { - PerlIO_printf(fp, PL_ofmt, (NV)SvIVX(sv)); - return !PerlIO_error(fp); - } - if ( (SvNOK(sv) && SvNVX(sv) != 0.0) - || (looks_like_number(sv) && sv_2nv(sv) != 0.0) ) { - PerlIO_printf(fp, PL_ofmt, SvNVX(sv)); - return !PerlIO_error(fp); - } - } switch (SvTYPE(sv)) { case SVt_NULL: if (ckWARN(WARN_UNINITIALIZED)) @@ -1423,7 +1408,6 @@ Perl_my_lstat(pTHX) { dSP; SV *sv; - STRLEN n_a; if (PL_op->op_flags & OPf_REF) { EXTEND(SP,1); if (cGVOP_gv == PL_defgv) { @@ -1437,8 +1421,8 @@ Perl_my_lstat(pTHX) return (PL_laststatval = -1); } } - else if (ckWARN(WARN_IO) && PL_laststype != OP_LSTAT - && (PL_op->op_private & OPpFT_STACKED)) + else if (PL_laststype != OP_LSTAT + && (PL_op->op_private & OPpFT_STACKED) && ckWARN(WARN_IO)) Perl_croak(aTHX_ no_prev_lstat); PL_laststype = OP_LSTAT; @@ -1451,9 +1435,9 @@ Perl_my_lstat(pTHX) return (PL_laststatval = -1); } /* XXX Do really need to be calling SvPV() all these times? */ - sv_setpv(PL_statname,SvPV(sv, n_a)); - PL_laststatval = PerlLIO_lstat(SvPV(sv, n_a),&PL_statcache); - if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(SvPV(sv, n_a), '\n')) + sv_setpv(PL_statname,SvPV_nolen_const(sv)); + PL_laststatval = PerlLIO_lstat(SvPV_nolen_const(sv),&PL_statcache); + if (PL_laststatval < 0 && ckWARN(WARN_NEWLINE) && strchr(SvPV_nolen_const(sv), '\n')) Perl_warner(aTHX_ packWARN(WARN_NEWLINE), PL_warn_nl, "lstat"); return PL_laststatval; } @@ -1474,22 +1458,21 @@ Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp, #if defined(MACOS_TRADITIONAL) || defined(SYMBIAN) Perl_croak(aTHX_ "exec? I'm not *that* kind of operating system"); #else - register char **a; - const char *tmps = Nullch; - STRLEN n_a; - if (sp > mark) { - New(401,PL_Argv, sp - mark + 1, char*); + char **a; + const char *tmps = Nullch; + Newx(PL_Argv, sp - mark + 1, char*); a = PL_Argv; + while (++mark <= sp) { if (*mark) - *a++ = SvPVx(*mark, n_a); + *a++ = (char*)SvPV_nolen_const(*mark); else *a++ = ""; } *a = Nullch; if (really) - tmps = SvPV(really, n_a); + tmps = SvPV_nolen_const(really); if ((!really && *PL_Argv[0] != '/') || (really && *tmps != '/')) /* will execvp use PATH? */ TAINT_ENV(); /* testing IFS here is overkill, probably */ @@ -1517,14 +1500,10 @@ Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp, void Perl_do_execfree(pTHX) { - if (PL_Argv) { - Safefree(PL_Argv); - PL_Argv = Null(char **); - } - if (PL_Cmd) { - Safefree(PL_Cmd); - PL_Cmd = Nullch; - } + Safefree(PL_Argv); + PL_Argv = Null(char **); + Safefree(PL_Cmd); + PL_Cmd = Nullch; } #if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(SYMBIAN) && !defined(MACOS_TRADITIONAL) @@ -1629,7 +1608,7 @@ Perl_do_exec3(pTHX_ char *cmd, int fd, int do_report) } } - New(402,PL_Argv, (s - cmd) / 2 + 2, char*); + Newx(PL_Argv, (s - cmd) / 2 + 2, char*); PL_Cmd = savepvn(cmd, s-cmd); a = PL_Argv; for (s = PL_Cmd; *s;) { @@ -1673,8 +1652,7 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp) register I32 tot = 0; const char *what; const char *s; - SV **oldmark = mark; - STRLEN n_a; + SV ** const oldmark = mark; #define APPLY_TAINT_PROPER() \ STMT_START { \ @@ -1700,10 +1678,33 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp) APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { - const char *name = SvPVx(*mark, n_a); - APPLY_TAINT_PROPER(); - if (PerlLIO_chmod(name, val)) - tot--; + GV* gv; + if (SvTYPE(*mark) == SVt_PVGV) { + gv = (GV*)*mark; + do_fchmod: + if (GvIO(gv) && IoIFP(GvIOp(gv))) { +#ifdef HAS_FCHMOD + APPLY_TAINT_PROPER(); + if (fchmod(PerlIO_fileno(IoIFP(GvIOn(gv))), val)) + tot--; +#else + Perl_die(aTHX_ PL_no_func, "fchmod"); +#endif + } + else { + tot--; + } + } + else if (SvROK(*mark) && SvTYPE(SvRV(*mark)) == SVt_PVGV) { + gv = (GV*)SvRV(*mark); + goto do_fchmod; + } + else { + const char *name = SvPV_nolen_const(*mark); + APPLY_TAINT_PROPER(); + if (PerlLIO_chmod(name, val)) + tot--; + } } } break; @@ -1718,10 +1719,33 @@ Perl_apply(pTHX_ I32 type, register SV **mark, register SV **sp) APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { - const char *name = SvPVx(*mark, n_a); - APPLY_TAINT_PROPER(); - if (PerlLIO_chown(name, val, val2)) - tot--; + GV* gv; + if (SvTYPE(*mark) == SVt_PVGV) { + gv = (GV*)*mark; + do_fchown: + if (GvIO(gv) && IoIFP(GvIOp(gv))) { +#ifdef HAS_FCHOWN + APPLY_TAINT_PROPER(); + if (fchown(PerlIO_fileno(IoIFP(GvIOn(gv))), val, val2)) + tot--; +#else + Perl_die(aTHX_ PL_no_func, "fchown"); +#endif + } + else { + tot--; + } + } + else if (SvROK(*mark) && SvTYPE(SvRV(*mark)) == SVt_PVGV) { + gv = (GV*)SvRV(*mark); + goto do_fchown; + } + else { + const char *name = SvPV_nolen_const(*mark); + APPLY_TAINT_PROPER(); + if (PerlLIO_chown(name, val, val2)) + tot--; + } } } break; @@ -1738,7 +1762,7 @@ nothing in the core. APPLY_TAINT_PROPER(); if (mark == sp) break; - s = SvPVx_const(*++mark, n_a); + s = SvPVx_nolen_const(*++mark); if (isALPHA(*s)) { if (*s == 'S' && s[1] == 'I' && s[2] == 'G') s += 3; @@ -1808,17 +1832,17 @@ nothing in the core. APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { - s = SvPVx_const(*mark, n_a); + s = SvPV_nolen_const(*mark); APPLY_TAINT_PROPER(); if (PL_euid || PL_unsafe) { - if (UNLINK(s)) + if (UNLINK((char *)s)) tot--; } else { /* don't let root wipe out directories without -U */ if (PerlLIO_lstat(s,&PL_statbuf) < 0 || S_ISDIR(PL_statbuf.st_mode)) tot--; else { - if (UNLINK(s)) + if (UNLINK((char *)s)) tot--; } } @@ -1862,8 +1886,7 @@ nothing in the core. APPLY_TAINT_PROPER(); tot = sp - mark; while (++mark <= sp) { - STRLEN n_a; - const char *name = SvPVx(*mark, n_a); + char *name = SvPV_nolen(*mark); APPLY_TAINT_PROPER(); if (PerlLIO_utime(name, utbufp)) tot--; @@ -2006,7 +2029,7 @@ Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp) const I32 id = SvIVx(*++mark); const I32 n = (optype == OP_SEMCTL) ? SvIVx(*++mark) : 0; const I32 cmd = SvIVx(*++mark); - (void)sp; + PERL_UNUSED_ARG(sp); astr = *++mark; infosize = 0; @@ -2060,14 +2083,14 @@ Perl_do_ipcctl(pTHX_ I32 optype, SV **mark, SV **sp) if (infosize) { - STRLEN len; if (getinfo) { - SvPV_force(astr, len); + SvPV_force_nolen(astr); a = SvGROW(astr, infosize+1); } else { + STRLEN len; a = SvPV(astr, len); if (len != infosize) Perl_croak(aTHX_ "Bad arg length for %s, is %lu, should be %ld", @@ -2125,15 +2148,15 @@ Perl_do_msgsnd(pTHX_ SV **mark, SV **sp) { #ifdef HAS_MSG SV *mstr; - char *mbuf; + const char *mbuf; I32 msize, flags; STRLEN len; const I32 id = SvIVx(*++mark); - (void)sp; + PERL_UNUSED_ARG(sp); mstr = *++mark; flags = SvIVx(*++mark); - mbuf = SvPV(mstr, len); + mbuf = SvPV_const(mstr, len); if ((msize = len - sizeof(long)) < 0) Perl_croak(aTHX_ "Arg too short for msgsnd"); SETERRNO(0,0); @@ -2151,9 +2174,8 @@ Perl_do_msgrcv(pTHX_ SV **mark, SV **sp) char *mbuf; long mtype; I32 msize, flags, ret; - STRLEN len; const I32 id = SvIVx(*++mark); - (void)sp; + PERL_UNUSED_ARG(sp); mstr = *++mark; /* suppress warning when reading into undef var --jhi */ @@ -2162,7 +2184,7 @@ Perl_do_msgrcv(pTHX_ SV **mark, SV **sp) msize = SvIVx(*++mark); mtype = (long)SvIVx(*++mark); flags = SvIVx(*++mark); - SvPV_force(mstr, len); + SvPV_force_nolen(mstr); mbuf = SvGROW(mstr, sizeof(long)+msize+1); SETERRNO(0,0); @@ -2186,13 +2208,13 @@ Perl_do_semop(pTHX_ SV **mark, SV **sp) { #ifdef HAS_SEM SV *opstr; - char *opbuf; + const char *opbuf; STRLEN opsize; const I32 id = SvIVx(*++mark); - (void)sp; + PERL_UNUSED_ARG(sp); opstr = *++mark; - opbuf = SvPV(opstr, opsize); + opbuf = SvPV_const(opstr, opsize); if (opsize < 3 * SHORTSIZE || (opsize % (3 * SHORTSIZE))) { SETERRNO(EINVAL,LIB_INVARG); @@ -2208,7 +2230,7 @@ Perl_do_semop(pTHX_ SV **mark, SV **sp) struct sembuf *temps, *t; I32 result; - New (0, temps, nsops, struct sembuf); + Newx (temps, nsops, struct sembuf); t = temps; while (i--) { t->sem_num = *o++; @@ -2241,10 +2263,9 @@ Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) SV *mstr; char *shm; I32 mpos, msize; - STRLEN len; struct shmid_ds shmds; const I32 id = SvIVx(*++mark); - (void)sp; + PERL_UNUSED_ARG(sp); mstr = *++mark; mpos = SvIVx(*++mark); @@ -2264,7 +2285,7 @@ Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) /* suppress warning when reading into undef var (tchrist 3/Mar/00) */ if (! SvOK(mstr)) sv_setpvn(mstr, "", 0); - SvPV_force(mstr, len); + SvPV_force_nolen(mstr); mbuf = SvGROW(mstr, msize+1); Copy(shm + mpos, mbuf, msize, char); @@ -2278,8 +2299,9 @@ Perl_do_shmio(pTHX_ I32 optype, SV **mark, SV **sp) } else { I32 n; + STRLEN len; - const char *mbuf = SvPV(mstr, len); + const char *mbuf = SvPV_const(mstr, len); if ((n = len) > msize) n = msize; Copy(mbuf, shm + mpos, n, char); @@ -2324,7 +2346,8 @@ Perl_start_glob (pTHX_ SV *tmpglob, IO *io) #include char rslt[NAM$C_MAXRSS+1+sizeof(unsigned short int)] = {'\0','\0'}; char vmsspec[NAM$C_MAXRSS+1]; - char *rstr = rslt + sizeof(unsigned short int), *begin, *end, *cp; + char * const rstr = rslt + sizeof(unsigned short int); + char *begin, *end, *cp; $DESCRIPTOR(dfltdsc,"SYS$DISK:[]*.*;"); PerlIO *tmpfp; STRLEN i; @@ -2437,7 +2460,7 @@ Perl_start_glob (pTHX_ SV *tmpglob, IO *io) #endif /* !CSH */ #endif /* !DOSISH */ #endif /* MACOS_TRADITIONAL */ - (void)do_open(PL_last_in_gv, SvPVX(tmpcmd), SvCUR(tmpcmd), + (void)do_open(PL_last_in_gv, (char*)SvPVX_const(tmpcmd), SvCUR(tmpcmd), FALSE, O_RDONLY, 0, Nullfp); fp = IoIFP(io); #endif /* !VMS */