check buffer size.
[unix-history] / usr / src / usr.bin / mail / popen.c
index d8fdf01..5e58f1f 100644 (file)
@@ -1,3 +1,7 @@
+#ifndef lint
+static char sccsid[] = "@(#)popen.c    1.7 (Berkeley) %G%";
+#endif
+
 #include <stdio.h>
 #include <signal.h>
 #include <errno.h>
 #include <stdio.h>
 #include <signal.h>
 #include <errno.h>
@@ -5,11 +9,15 @@
 #define        RDR     0
 #define        WTR     1
 static int     popen_pid[20];
 #define        RDR     0
 #define        WTR     1
 static int     popen_pid[20];
-static char    *sccsid = "@(#)popen.c  1.2.1.2 %G%";
 
 
-# ifndef VMUNIX
-# define vfork fork
-# endif VMUNIX
+#ifdef VMUNIX
+#define        mask(s) (1<<((s)-1))
+#else
+#define vfork  fork
+#endif VMUNIX
+#ifndef        SIGRETRO
+#define        sigchild()
+#endif
 
 FILE *
 popen(cmd,mode)
 
 FILE *
 popen(cmd,mode)
@@ -25,6 +33,7 @@ char  *mode;
        hisside = tst(p[RDR], p[WTR]);
        if((pid = vfork()) == 0) {
                /* myside and hisside reverse roles in child */
        hisside = tst(p[RDR], p[WTR]);
        if((pid = vfork()) == 0) {
                /* myside and hisside reverse roles in child */
+               sigchild();
                close(myside);
                dup2(hisside, tst(0, 1));
                close(hisside);
                close(myside);
                dup2(hisside, tst(0, 1));
                close(hisside);
@@ -42,24 +51,20 @@ pclose(ptr)
 FILE *ptr;
 {
        register f, r;
 FILE *ptr;
 {
        register f, r;
-       int status;
+       int status, omask;
        extern int errno;
 
        f = fileno(ptr);
        fclose(ptr);
 # ifdef VMUNIX
        extern int errno;
 
        f = fileno(ptr);
        fclose(ptr);
 # ifdef VMUNIX
-       sighold(SIGINT);
-       sighold(SIGQUIT);
-       sighold(SIGHUP);
+       omask = sigblock(mask(SIGINT)|mask(SIGQUIT)|mask(SIGHUP));
 # endif VMUNIX
        while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR)
                ;
        if(r == -1)
                status = -1;
 # ifdef VMUNIX
 # endif VMUNIX
        while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR)
                ;
        if(r == -1)
                status = -1;
 # ifdef VMUNIX
-       sigrelse(SIGINT);
-       sigrelse(SIGQUIT);
-       sigrelse(SIGHUP);
+       sigsetmask(omask);
 # endif VMUNIX
        return(status);
 }
 # endif VMUNIX
        return(status);
 }