add $VERSION
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 2f065ed..58271c8 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -247,7 +247,7 @@ S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
     Gid_t egid = getegid();
     int res;
 
-    MUTEX_LOCK(&PL_cred_mutex);
+    LOCK_CRED_MUTEX;
 #if !defined(HAS_SETREUID) && !defined(HAS_SETRESUID)
     Perl_croak(aTHX_ "switching effective uid is not implemented");
 #else
@@ -293,7 +293,7 @@ S_emulate_eaccess(pTHX_ const char* path, Mode_t mode)
 #endif
 #endif
        Perl_croak(aTHX_ "leaving effective gid failed");
-    MUTEX_UNLOCK(&PL_cred_mutex);
+    UNLOCK_CRED_MUTEX;
 
     return res;
 }
@@ -1095,8 +1095,6 @@ PP(pp_getc)
        gv = PL_stdingv;
     else
        gv = (GV*)POPs;
-    if (!gv)
-       gv = PL_argvgv;
 
     if (mg = SvTIED_mg((SV*)gv, 'q')) {
        I32 gimme = GIMME_V;
@@ -1273,15 +1271,15 @@ PP(pp_leavewrite)
     fp = IoOFP(io);
     if (!fp) {
        if (ckWARN2(WARN_CLOSED,WARN_IO)) {
-           SV* sv = sv_newmortal();
-           gv_efullname3(sv, gv, Nullch);
-           if (IoIFP(io))
+           if (IoIFP(io)) {
+               SV* sv = sv_newmortal();
+               gv_efullname3(sv, gv, Nullch);
                Perl_warner(aTHX_ WARN_IO,
                            "Filehandle %s opened only for input",
                            SvPV_nolen(sv));
+           }
            else if (ckWARN(WARN_CLOSED))
-               Perl_warner(aTHX_ WARN_CLOSED,
-                           "Write on closed filehandle %s", SvPV_nolen(sv));
+               report_closed_fh(gv, io, "write", "filehandle");
        }
        PUSHs(&PL_sv_no);
     }
@@ -1354,14 +1352,14 @@ PP(pp_prtf)
     }
     else if (!(fp = IoOFP(io))) {
        if (ckWARN2(WARN_CLOSED,WARN_IO))  {
-           gv_efullname3(sv, gv, Nullch);
-           if (IoIFP(io))
+           if (IoIFP(io)) {
+               gv_efullname3(sv, gv, Nullch);
                Perl_warner(aTHX_ WARN_IO,
                            "Filehandle %s opened only for input",
                            SvPV(sv,n_a));
+           }
            else if (ckWARN(WARN_CLOSED))
-               Perl_warner(aTHX_ WARN_CLOSED,
-                           "printf on closed filehandle %s", SvPV(sv,n_a));
+               report_closed_fh(gv, io, "printf", "filehandle");
        }
        SETERRNO(EBADF,IoIFP(io)?RMS$_FAC:RMS$_IFI);
        goto just_say_no;
@@ -1631,9 +1629,9 @@ PP(pp_send)
        length = -1;
        if (ckWARN(WARN_CLOSED)) {
            if (PL_op->op_type == OP_SYSWRITE)
-               Perl_warner(aTHX_ WARN_CLOSED, "Syswrite on closed filehandle");
+               report_closed_fh(gv, io, "syswrite", "filehandle");
            else
-               Perl_warner(aTHX_ WARN_CLOSED, "Send on closed socket");
+               report_closed_fh(gv, io, "send", "socket");
        }
     }
     else if (PL_op->op_type == OP_SYSWRITE) {
@@ -1703,10 +1701,28 @@ PP(pp_eof)
     GV *gv;
     MAGIC *mg;
 
-    if (MAXARG <= 0)
-       gv = PL_last_in_gv;
+    if (MAXARG <= 0) {
+       if (PL_op->op_flags & OPf_SPECIAL) {    /* eof() */
+           IO *io;
+           gv = PL_last_in_gv = PL_argvgv;
+           io = GvIO(gv);
+           if (io && !IoIFP(io)) {
+               if ((IoFLAGS(io) & IOf_START) && av_len(GvAVn(gv)) < 0) {
+                   IoLINES(io) = 0;
+                   IoFLAGS(io) &= ~IOf_START;
+                   do_open(gv, "-", 1, FALSE, O_RDONLY, 0, Nullfp);
+                   sv_setpvn(GvSV(gv), "-", 1);
+                   SvSETMAGIC(GvSV(gv));
+               }
+               else if (!nextargv(gv))
+                   RETPUSHYES;
+           }
+       }
+       else
+           gv = PL_last_in_gv;                 /* eof */
+    }
     else
-       gv = PL_last_in_gv = (GV*)POPs;
+       gv = PL_last_in_gv = (GV*)POPs;         /* eof(FH) */
 
     if (gv && (mg = SvTIED_mg((SV*)gv, 'q'))) {
        PUSHMARK(SP);
@@ -1968,8 +1984,12 @@ PP(pp_flock)
        (void)PerlIO_flush(fp);
        value = (I32)(PerlLIO_flock(PerlIO_fileno(fp), argtype) >= 0);
     }
-    else
+    else {
        value = 0;
+       SETERRNO(EBADF,RMS$_IFI);
+       if (ckWARN(WARN_CLOSED))
+           report_closed_fh(gv, GvIO(gv), "flock", "filehandle");
+    }
     PUSHi(value);
     RETURN;
 #else
@@ -2122,7 +2142,7 @@ PP(pp_bind)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "bind() on closed fd");
+       report_closed_fh(gv, io, "bind", "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2152,7 +2172,7 @@ PP(pp_connect)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "connect() on closed fd");
+       report_closed_fh(gv, io, "connect", "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2178,7 +2198,7 @@ PP(pp_listen)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "listen() on closed fd");
+       report_closed_fh(gv, io, "listen", "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2232,7 +2252,7 @@ PP(pp_accept)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "accept() on closed fd");
+       report_closed_fh(ggv, ggv ? GvIO(ggv) : 0, "accept", "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
 
 badexit:
@@ -2259,7 +2279,7 @@ PP(pp_shutdown)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "shutdown() on closed fd");
+       report_closed_fh(gv, io, "shutdown", "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
     RETPUSHUNDEF;
 #else
@@ -2338,7 +2358,9 @@ PP(pp_ssockopt)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "[gs]etsockopt() on closed fd");
+       report_closed_fh(gv, io,
+                        optype == OP_GSOCKOPT ? "getsockopt" : "setsockopt",
+                        "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
     RETPUSHUNDEF;
@@ -2411,7 +2433,10 @@ PP(pp_getpeername)
 
 nuts:
     if (ckWARN(WARN_CLOSED))
-       Perl_warner(aTHX_ WARN_CLOSED, "get{sock, peer}name() on closed fd");
+       report_closed_fh(gv, io,
+                        optype == OP_GETSOCKNAME ? "getsockname"
+                                                 : "getpeername",
+                        "socket");
     SETERRNO(EBADF,SS$_IVCHAN);
 nuts2:
     RETPUSHUNDEF;
@@ -3584,7 +3609,7 @@ PP(pp_fork)
     PUSHi(childpid);
     RETURN;
 #else
-#  if defined(USE_ITHREADS) && defined(WIN32)
+#  if defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
     djSP; dTARGET;
     Pid_t childpid;
 
@@ -3782,7 +3807,7 @@ PP(pp_exec)
 #endif
     }
 
-#ifdef USE_ITHREADS
+#if !defined(HAS_FORK) && defined(USE_ITHREADS) && defined(PERL_IMPLICIT_SYS)
     if (value >= 0)
        my_exit(value);
 #endif