add comments on GV_FOO constants, s/8/GV_ADDINEVAL/
[p5sagit/p5-mst-13.2.git] / doio.c
diff --git a/doio.c b/doio.c
index 37d6167..ff8384c 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -258,7 +258,7 @@ do_open(GV *gv, register char *name, I32 len, int as_raw, int rawmode, int rawpe
            else
                fp = PerlIO_open(name,mode);
        }
-       else if (name[len-1] == '|') {
+       else if (len > 1 && name[len-1] == '|') {
            name[--len] = '\0';
            while (len && isSPACE(name[len-1]))
                name[--len] = '\0';
@@ -506,7 +506,7 @@ nextargv(register GV *gv)
                    (void)fchown(lastfd,fileuid,filegid);
 #else
 #ifdef HAS_CHOWN
-                   (void)chown(oldname,fileuid,filegid);
+                   (void)PerlLIO_chown(oldname,fileuid,filegid);
 #endif
 #endif
                }
@@ -579,14 +579,17 @@ do_close(GV *gv, bool not_implicit)
     if (!gv)
        gv = argvgv;
     if (!gv || SvTYPE(gv) != SVt_PVGV) {
-       SETERRNO(EBADF,SS$_IVCHAN);
+       if (not_implicit)
+           SETERRNO(EBADF,SS$_IVCHAN);
        return FALSE;
     }
     io = GvIO(gv);
     if (!io) {         /* never opened */
-       if (dowarn && not_implicit)
-           warn("Close on unopened file <%s>",GvENAME(gv));
-       SETERRNO(EBADF,SS$_IVCHAN);
+       if (not_implicit) {
+           if (dowarn)
+               warn("Close on unopened file <%s>",GvENAME(gv));
+           SETERRNO(EBADF,SS$_IVCHAN);
+       }
        return FALSE;
     }
     retval = io_close(io);
@@ -741,7 +744,7 @@ do_binmode(PerlIO *fp, int iotype, int flag)
         * document this anywhere). GSAR 97-5-24
         */
        PerlIO_seek(fp,0L,0);
-       fp->flags |= _F_BIN;
+       ((FILE*)fp)->flags |= _F_BIN;
 #endif
        return 1;
     }
@@ -1085,7 +1088,9 @@ apply(I32 type, register SV **mark, register SV **sp)
     SV **oldmark = mark;
 
 #define APPLY_TAINT_PROPER() \
-    if (!(tainting && tainted)) {} else { goto taint_proper; }
+    STMT_START {                                               \
+       if (tainting && tainted) { goto taint_proper_label; }   \
+    } STMT_END
 
     /* This is a first heuristic; it doesn't catch tainting magic. */
     if (tainting) {
@@ -1125,7 +1130,7 @@ apply(I32 type, register SV **mark, register SV **sp)
            while (++mark <= sp) {
                char *name = SvPVx(*mark, na);
                APPLY_TAINT_PROPER();
-               if (chown(name, val, val2))
+               if (PerlLIO_chown(name, val, val2))
                    tot--;
            }
        }
@@ -1271,7 +1276,7 @@ nothing in the core.
     }
     return tot;
 
-  taint_proper:
+  taint_proper_label:
     TAINT_PROPER(what);
     return 0;  /* this should never happen */
 
@@ -1430,6 +1435,8 @@ do_ipcctl(I32 optype, SV **mark, SV **sp)
 
             semun.buf = &semds;
            getinfo = (cmd == GETALL);
+           if (Semctl(id, 0, IPC_STAT, semun) == -1)
+               return -1;
            infosize = semds.sem_nsems * sizeof(short);
                /* "short" is technically wrong but much more portable
                   than guessing about u_?short(_t)? */