#define tst(a,b) (*mode == 'r'? (b) : (a))
static int popen_pid
[20];
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/sh", "sh", "-c", cmd
, 0);
return(fdopen(myside
, mode
));
register f
, r
, (*hstat
)(), (*istat
)(), (*qstat
)();
istat
= signal(SIGINT
, SIG_IGN
);
qstat
= signal(SIGQUIT
, SIG_IGN
);
hstat
= signal(SIGHUP
, SIG_IGN
);
while((r
= wait(&status
)) != popen_pid
[f
] && r
!= -1)