static char sccsid
[] = "@(#)popen.c 1.7 (Berkeley) %G%";
#define tst(a,b) (*mode == 'r'? (b) : (a))
static int popen_pid
[20];
#define mask(s) (1<<((s)-1))
register myside
, hisside
, pid
;
myside
= tst(p
[WTR
], p
[RDR
]);
hisside
= tst(p
[RDR
], p
[WTR
]);
if((pid
= vfork()) == 0) {
/* myside and hisside reverse roles in child */
dup2(hisside
, tst(0, 1));
execl("/bin/csh", "sh", "-c", cmd
, 0);
return(fdopen(myside
, mode
));
omask
= sigblock(mask(SIGINT
)|mask(SIGQUIT
)|mask(SIGHUP
));
while((r
= wait(&status
)) != popen_pid
[f
] && r
!= -1 && errno
!= EINTR
)