boy is this getting boring
[unix-history] / usr / src / usr.bin / mail / popen.c
CommitLineData
e343f97a
KS
1#include <stdio.h>
2#include <signal.h>
ea394d88 3#include <errno.h>
e343f97a
KS
4#define tst(a,b) (*mode == 'r'? (b) : (a))
5#define RDR 0
6#define WTR 1
7static int popen_pid[20];
4bc721c3 8static char *sccsid = "@(#)popen.c 1.6 %G%";
ea394d88 9
4bc721c3
SL
10#ifdef VMUNIX
11#define mask(s) (1<<((s)-1))
12#else
13#define vfork fork
14#endif VMUNIX
d3c349a9
CS
15#ifndef SIGRETRO
16#define sigchild()
17#endif
e343f97a
KS
18
19FILE *
20popen(cmd,mode)
21char *cmd;
22char *mode;
23{
24 int p[2];
25 register myside, hisside, pid;
26
27 if(pipe(p) < 0)
28 return NULL;
29 myside = tst(p[WTR], p[RDR]);
30 hisside = tst(p[RDR], p[WTR]);
31 if((pid = vfork()) == 0) {
32 /* myside and hisside reverse roles in child */
cb9e16fc 33 sigchild();
e343f97a
KS
34 close(myside);
35 dup2(hisside, tst(0, 1));
36 close(hisside);
37 execl("/bin/csh", "sh", "-c", cmd, 0);
38 _exit(1);
39 }
40 if(pid == -1)
41 return NULL;
42 popen_pid[myside] = pid;
43 close(hisside);
44 return(fdopen(myside, mode));
45}
46
47pclose(ptr)
48FILE *ptr;
49{
39c234be 50 register f, r;
4bc721c3 51 int status, omask;
ea394d88 52 extern int errno;
e343f97a
KS
53
54 f = fileno(ptr);
55 fclose(ptr);
ea394d88 56# ifdef VMUNIX
4bc721c3 57 omask = sigblock(mask(SIGINT)|mask(SIGQUIT)|mask(SIGHUP));
ea394d88
KS
58# endif VMUNIX
59 while((r = wait(&status)) != popen_pid[f] && r != -1 && errno != EINTR)
e343f97a
KS
60 ;
61 if(r == -1)
62 status = -1;
ea394d88 63# ifdef VMUNIX
4bc721c3 64 sigsetmask(omask);
ea394d88 65# endif VMUNIX
e343f97a
KS
66 return(status);
67}