X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/48bb1f76fd805b19aa32a374a8a9d8106ab7f420..e68b88bf4ad78f86ac74c52adba87d27c59ed121:/exec.c diff --git a/exec.c b/exec.c index 1900017..284bba4 100644 --- a/exec.c +++ b/exec.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: exec.c,v 1.1 1999/07/26 23:33:32 mdw Exp $ + * $Id: exec.c,v 1.3 2000/07/01 11:28:52 mdw Exp $ * * Source and target for executable programs * @@ -29,6 +29,14 @@ /*----- Revision history --------------------------------------------------* * * $Log: exec.c,v $ + * Revision 1.3 2000/07/01 11:28:52 mdw + * Use new mLib selbuf features. + * + * Revision 1.2 1999/10/22 22:46:17 mdw + * When a non-file endpoint is attached to a file, keep the file endpoint + * open until the nonfile is done. This stops socket sources from + * resetting their connection limits too early. + * * Revision 1.1 1999/07/26 23:33:32 mdw * New sources and targets. * @@ -146,6 +154,7 @@ typedef struct xept { endpt e; struct xept *next, *prev; pid_t kid; + endpt *f; const char *desc; int st; xargs *xa; @@ -627,12 +636,22 @@ static void xept_attach(endpt *e, reffd *in, reffd *out) return; } +/* --- @xept_file@ --- */ + +static void xept_file(endpt *e, endpt *f) +{ + xept *xe = (xept *)e; + xe->f = f; +} + /* --- @xept_close@ --- */ static void xept_close(endpt *e) { xept *xe = (xept *)e; if (xe->kid == -1) { + if (xe->f) + xe->f->ops->close(xe->f); x_tidy(xe->xa, xe->xo); DESTROY(xe); fw_dec(); @@ -678,6 +697,8 @@ static void xept_destroy(xept *xe) else xept_list = xe->next; + if (xe->f) + xe->f->ops->close(xe->f); x_tidy(xe->xa, xe->xo); fw_dec(); DESTROY(xe); @@ -730,8 +751,8 @@ static void xept_error(char *p, void *v) if (p) fw_log(-1, "[%s] pid %i: %s", xe->desc, xe->kid, p); else { - selbuf_disable(&xe->err); close(xe->err.reader.fd); + selbuf_destroy(&xe->err); xe->e.f |= XEF_CLOSE; if (xe->e.f & XEF_EXIT) xept_destroy(xe); @@ -740,7 +761,7 @@ static void xept_error(char *p, void *v) /* --- Endpoint operations --- */ -static endpt_ops xept_ops = { xept_attach, 0, xept_close }; +static endpt_ops xept_ops = { xept_attach, xept_file, 0, xept_close }; /*----- General operations on sources and targets -------------------------*/ @@ -1007,6 +1028,7 @@ static endpt *exec_endpt(xdata *x, const char *desc) xe->xa = x->xa; xe->xa->ref++; xe->xo = x->xo; xe->xo->ref++; xe->kid = -1; + xe->f = 0; xe->desc = desc; return (&xe->e); }