When a non-file endpoint is attached to a file, keep the file endpoint
[fwd] / exec.c
diff --git a/exec.c b/exec.c
index 1900017..d81aeae 100644 (file)
--- 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.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.
  *
@@ -146,6 +151,7 @@ typedef struct xept {
   endpt e;
   struct xept *next, *prev;
   pid_t kid;
+  endpt *f;
   const char *desc;
   int st;
   xargs *xa;
@@ -627,12 +633,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 +694,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);
@@ -740,7 +758,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 +1025,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);
 }