Annotation of 43BSDTahoe/ucb/Mail/popen.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1980 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that this notice is preserved and that due credit is given
                      7:  * to the University of California at Berkeley. The name of the University
                      8:  * may not be used to endorse or promote products derived from this
                      9:  * software without specific prior written permission. This software
                     10:  * is provided ``as is'' without express or implied warranty.
                     11:  */
                     12: 
                     13: #ifdef notdef
                     14: static char sccsid[] = "@(#)popen.c    5.4 (Berkeley) 2/18/88";
                     15: #endif /* notdef */
                     16: 
                     17: #include <stdio.h>
                     18: #include <sys/signal.h>
                     19: #include <sys/types.h>
                     20: #include <sys/wait.h>
                     21: #include <errno.h>
                     22: 
                     23: #define        tst(a,b)        (*mode == 'r'? (b) : (a))
                     24: #define        RDR     0
                     25: #define        WTR     1
                     26: static int     popen_pid[20];
                     27: 
                     28: FILE *
                     29: popen(cmd,mode)
                     30: char   *cmd;
                     31: char   *mode;
                     32: {
                     33:        int p[2];
                     34:        register myside, hisside, pid;
                     35: 
                     36:        if(pipe(p) < 0)
                     37:                return NULL;
                     38:        myside = tst(p[WTR], p[RDR]);
                     39:        hisside = tst(p[RDR], p[WTR]);
                     40:        if((pid = vfork()) == 0) {
                     41:                /* myside and hisside reverse roles in child */
                     42:                close(myside);
                     43:                dup2(hisside, tst(0, 1));
                     44:                close(hisside);
                     45:                execl("/bin/csh", "sh", "-c", cmd, 0);
                     46:                _exit(1);
                     47:        }
                     48:        if(pid == -1)
                     49:                return NULL;
                     50:        popen_pid[myside] = pid;
                     51:        close(hisside);
                     52:        return(fdopen(myside, mode));
                     53: }
                     54: 
                     55: pclose(ptr)
                     56: FILE *ptr;
                     57: {
                     58:        register f, r;
                     59:        int omask;
                     60:        union wait status;
                     61:        extern int errno;
                     62: 
                     63:        f = fileno(ptr);
                     64:        fclose(ptr);
                     65:        omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGHUP));
                     66:        while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR)
                     67:                ;
                     68:        if(r == -1)
                     69:                status.w_status = -1;
                     70:        sigsetmask(omask);
                     71:        return (status.w_status);
                     72: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.