fix () and sizeof errors
[unix-history] / usr / src / lib / libc / gen / popen.c
CommitLineData
01a56307
BJ
1/* @(#)popen.c 4.1 (Berkeley) %G% */
2#include <stdio.h>
3#include <signal.h>
4#define tst(a,b) (*mode == 'r'? (b) : (a))
5#define RDR 0
6#define WTR 1
7static int popen_pid[20];
8
9FILE *
10popen(cmd,mode)
11char *cmd;
12char *mode;
13{
14 int p[2];
15 register myside, hisside, pid;
16
17 if(pipe(p) < 0)
18 return NULL;
19 myside = tst(p[WTR], p[RDR]);
20 hisside = tst(p[RDR], p[WTR]);
21 if((pid = vfork()) == 0) {
22 /* myside and hisside reverse roles in child */
23 close(myside);
24 dup2(hisside, tst(0, 1));
25 close(hisside);
26 execl("/bin/sh", "sh", "-c", cmd, 0);
27 _exit(1);
28 }
29 if(pid == -1)
30 return NULL;
31 popen_pid[myside] = pid;
32 close(hisside);
33 return(fdopen(myside, mode));
34}
35
36pclose(ptr)
37FILE *ptr;
38{
39 register f, r, (*hstat)(), (*istat)(), (*qstat)();
40 int status;
41
42 f = fileno(ptr);
43 fclose(ptr);
44 istat = signal(SIGINT, SIG_IGN);
45 qstat = signal(SIGQUIT, SIG_IGN);
46 hstat = signal(SIGHUP, SIG_IGN);
47 while((r = wait(&status)) != popen_pid[f] && r != -1)
48 ;
49 if(r == -1)
50 status = -1;
51 signal(SIGINT, istat);
52 signal(SIGQUIT, qstat);
53 signal(SIGHUP, hstat);
54 return(status);
55}