coproc
if (coproc.write >= 0 && coproc.write == fd) {
if (coproc.job && coproc.write >= 0)
coproc.write = pv[1];
coproc.job = (void *) 0;
if (coproc.readw >= 0)
ksh_dup2(coproc.readw, 1, false);
coproc.read = pv[0];
coproc.readw = pv[1]; /* closed before first read */
coproc.njobs = 0;
++coproc.id;
coproc.readw);
coproc.read = coproc.readw = coproc.write = -1;
coproc.njobs = 0;
coproc.id = 0;
if (coproc.read >= 0 && fd == coproc.read) {
close(coproc.read);
coproc.read = -1;
if (coproc.readw >= 0 && coproc.read >= 0 && fd == coproc.read) {
close(coproc.readw);
coproc.readw = -1;
if (coproc.write >= 0 && fd == coproc.write) {
close(coproc.write);
coproc.write = -1;
int fd = (mode & R_OK) ? coproc.read : coproc.write;
if (!reuse || coproc.readw < 0 || coproc.read < 0) {
if (coproc.read >= 0) {
close(coproc.read);
coproc.read = -1;
if (coproc.readw >= 0) {
close(coproc.readw);
coproc.readw = -1;
if (coproc.write >= 0) {
close(coproc.write);
coproc.write = -1;
if (coproc.job == j) {
coproc.job = (void *) 0;
coproc_write_close(coproc.write);
if (j->coproc_id && j->coproc_id == coproc.id
&& --coproc.njobs == 0)
coproc_readw_close(coproc.read);
j->coproc_id = coproc.id;
coproc.njobs++; /* n jobs using co-process output */
coproc.job = (void *) j; /* j using co-process input */
EXTERN struct coproc coproc;
replace_coproc_handler(int coproc, undef_handler_t handler)
LIST_INIT(&undefined_handlers[coproc]);
install_coproc_handler(coproc, handler);
install_coproc_handler_static(int coproc, struct undefined_handler *uh)
LIST_INSERT_HEAD(&undefined_handlers[coproc], uh, uh_link);
install_coproc_handler(int coproc, undef_handler_t handler)
KASSERT(coproc >= 0 && coproc < NUM_UNKNOWN_HANDLERS);
install_coproc_handler_static(coproc, uh);