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