MM_Unix patch for use under CVS
[p5sagit/p5-mst-13.2.git] / pp_sys.c
index 6f8b449..bc22763 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
 # include <sys/resource.h>
 #endif
 
-/* Put this after #includes because fork and vfork prototypes may
-   conflict.
-*/
-#ifndef HAS_VFORK
-#   define vfork fork
-#endif
-
 #if defined(HAS_SOCKET) && !defined(VMS) /* VMS handles sockets via vmsish.h */
 # include <sys/socket.h>
 # include <netdb.h>
@@ -91,6 +84,20 @@ extern int h_errno;
 #include <sys/file.h>
 #endif
 
+/* Put this after #includes because fork and vfork prototypes may conflict. */
+#ifndef HAS_VFORK
+#   define vfork fork
+#endif
+
+/* Put this after #includes because <unistd.h> defines _XOPEN_*. */
+#ifndef Sock_size_t
+#  if _XOPEN_VERSION >= 5 || defined(_XOPEN_SOURCE_EXTENDED)
+#    define Sock_size_t Size_t
+#  else
+#    define Sock_size_t int
+#  endif
+#endif
+
 #if !defined(HAS_MKDIR) || !defined(HAS_RMDIR)
 static int dooneliner _((char *cmd, char *filename));
 #endif
@@ -155,10 +162,17 @@ PP(pp_backtick)
     dSP; dTARGET;
     PerlIO *fp;
     char *tmps = POPp;
+    I32 gimme = GIMME_V;
+
     TAINT_PROPER("``");
     fp = my_popen(tmps, "r");
     if (fp) {
-       if (GIMME == G_SCALAR) {
+       if (gimme == G_VOID) {
+           while (PerlIO_read(fp, buf, sizeof buf) > 0)
+               /*SUPPRESS 530*/
+               ;
+       }
+       else if (gimme == G_SCALAR) {
            sv_setpv(TARG, ""); /* note that this preserves previous buffer */
            while (sv_gets(TARG, fp, SvCUR(TARG)) != Nullch)
                /*SUPPRESS 530*/
@@ -188,7 +202,7 @@ PP(pp_backtick)
     }
     else {
        STATUS_NATIVE_SET(-1);
-       if (GIMME == G_SCALAR)
+       if (gimme == G_SCALAR)
            RETPUSHUNDEF;
     }
 
@@ -320,7 +334,7 @@ PP(pp_close)
     else
        gv = (GV*)POPs;
     EXTEND(SP, 1);
-    PUSHs( do_close(gv, TRUE) ? &sv_yes : &sv_no );
+    PUSHs(boolSV(do_close(gv, TRUE)));
     RETURN;
 }
 
@@ -483,7 +497,7 @@ PP(pp_tie)
     Zero(&myop, 1, BINOP);
     myop.op_last = (OP *) &myop;
     myop.op_next = Nullop;
-    myop.op_flags = OPf_KNOW|OPf_STACKED;
+    myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
     CATCH_SET(TRUE);
 
     ENTER;
@@ -594,7 +608,7 @@ PP(pp_dbmopen)
     Zero(&myop, 1, BINOP);
     myop.op_last = (OP *) &myop;
     myop.op_next = Nullop;
-    myop.op_flags = OPf_KNOW|OPf_STACKED;
+    myop.op_flags = OPf_WANT_SCALAR | OPf_STACKED;
     CATCH_SET(TRUE);
 
     ENTER;
@@ -843,15 +857,16 @@ PP(pp_getc)
        gv = argvgv;
 
     if (SvMAGICAL(gv) && (mg = mg_find((SV*)gv, 'q'))) {
+       I32 gimme = GIMME_V;
        PUSHMARK(SP);
        XPUSHs(mg->mg_obj);
        PUTBACK;
        ENTER;
-       perl_call_method("GETC", GIMME);
+       perl_call_method("GETC", gimme);
        LEAVE;
        SPAGAIN;
-       if (GIMME == G_SCALAR)
-           SvSetSV_nosteal(TARG, TOPs);
+       if (gimme == G_SCALAR)
+           SvSetMagicSV_nosteal(TARG, TOPs);
        RETURN;
     }
     if (!gv || do_eof(gv)) /* make sure we have fp with something */
@@ -875,7 +890,7 @@ GV *gv;
 OP *retop;
 {
     register CONTEXT *cx;
-    I32 gimme = GIMME;
+    I32 gimme = GIMME_V;
     AV* padlist = CvPADLIST(cv);
     SV** svp = AvARRAY(padlist);
 
@@ -1140,7 +1155,7 @@ PP(pp_sysread)
     GV *gv;
     IO *io;
     char *buffer;
-    int length;
+    SSize_t length;
     Sock_size_t bufsize;
     SV *bufsv;
     STRLEN blen;
@@ -1334,7 +1349,7 @@ PP(pp_eof)
        gv = last_in_gv;
     else
        gv = last_in_gv = (GV*)POPs;
-    PUSHs(!gv || do_eof(gv) ? &sv_yes : &sv_no);
+    PUSHs(boolSV(!gv || do_eof(gv)));
     RETURN;
 }
 
@@ -1359,7 +1374,7 @@ PP(pp_seek)
     long offset = POPl;
 
     gv = last_in_gv = (GV*)POPs;
-    PUSHs( do_seek(gv, offset, whence) ? &sv_yes : &sv_no );
+    PUSHs(boolSV(do_seek(gv, offset, whence)));
     RETURN;
 }
 
@@ -1950,6 +1965,7 @@ PP(pp_stat)
 {
     dSP;
     GV *tmpgv;
+    I32 gimme;
     I32 max = 13;
 
     if (op->op_flags & OPf_REF) {
@@ -1991,17 +2007,15 @@ PP(pp_stat)
        }
     }
 
-    if (GIMME != G_ARRAY) {
-       EXTEND(SP, 1);
-       if (max)
-           RETPUSHYES;
-       else
-           RETPUSHUNDEF;
+    gimme = GIMME_V;
+    if (gimme != G_ARRAY) {
+       if (gimme != G_VOID)
+           XPUSHs(boolSV(max));
+       RETURN;
     }
     if (max) {
        EXTEND(SP, max);
        EXTEND_MORTAL(max);
-
        PUSHs(sv_2mortal(newSViv((I32)statcache.st_dev)));
        PUSHs(sv_2mortal(newSViv((I32)statcache.st_ino)));
        PUSHs(sv_2mortal(newSViv((I32)statcache.st_mode)));
@@ -2714,7 +2728,7 @@ PP(pp_mkdir)
 
     TAINT_PROPER("mkdir");
 #ifdef HAS_MKDIR
-    SETi( mkdir(tmps, mode) >= 0 );
+    SETi( Mkdir(tmps, mode) >= 0 );
 #else
     SETi( dooneliner("mkdir", tmps) );
     oldumask = umask(0);
@@ -3977,7 +3991,7 @@ PP(pp_gpwent)
 PP(pp_spwent)
 {
     dSP;
-#ifdef HAS_PASSWD
+#if defined(HAS_PASSWD) && !defined(CYGWIN32)
     setpwent();
     RETPUSHYES;
 #else