/* -*-c-*-
*
- * $Id: exec.c,v 1.1 1999/07/26 23:33:32 mdw Exp $
+ * $Id: exec.c,v 1.2 1999/10/22 22:46:17 mdw Exp $
*
* Source and target for executable programs
*
/*----- Revision history --------------------------------------------------*
*
* $Log: exec.c,v $
+ * 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.
*
endpt e;
struct xept *next, *prev;
pid_t kid;
+ endpt *f;
const char *desc;
int st;
xargs *xa;
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();
else
xept_list = xe->next;
+ if (xe->f)
+ xe->f->ops->close(xe->f);
x_tidy(xe->xa, xe->xo);
fw_dec();
DESTROY(xe);
/* --- 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 -------------------------*/
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);
}