/* -*-c-*-
*
- * $Id: endpt.c,v 1.1 1999/07/26 23:33:01 mdw Exp $
+ * $Id: endpt.c,v 1.2 1999/10/22 22:46:17 mdw Exp $
*
* Generic endpoint abstraction
*
/*----- Revision history --------------------------------------------------*
*
* $Log: endpt.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:01 mdw
* Infrastructure for the new design.
*
e = a; a = b; b = e;
}
- /* --- Attach the non-file endpoint to the file and run away --- */
+ /* --- Attach the non-file endpoint to the file and run away --- *
+ *
+ * Leave it as the non-file's responsibility to close the other endpoint
+ * when it's ready. It should also close itself at that time.
+ */
b->ops->attach(b, a->in, a->out);
- a->ops->close(a);
- b->ops->close(b);
+ b->ops->file(b, a);
if (t->next)
t->next->prev = t->prev;
if (t->prev)
/* -*-c-*-
*
- * $Id: endpt.h,v 1.1 1999/07/26 23:33:01 mdw Exp $
+ * $Id: endpt.h,v 1.2 1999/10/22 22:46:17 mdw Exp $
*
* Generic endpoint abstraction
*
/*----- Revision history --------------------------------------------------*
*
* $Log: endpt.h,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:01 mdw
* Infrastructure for the new design.
*
void (*attach)(endpt */*e*/, reffd */*in*/, reffd */*out*/);
+ /* --- @file@ --- *
+ *
+ * Arguments: @endpt *e@ = pointer to endpoint in question
+ * @endpt *f@ = pointer to a file endpoint
+ *
+ * Returns: ---
+ *
+ * Use: Informs a non-file endpoint of a file endpoint which will
+ * want to be closed when it's finished with. At that time, the
+ * endpoint should arrange to have both itself and its partner
+ * closed. If no file is registered, the endpoint manager will
+ * close both endpoints itself.
+ */
+
+ void (*file)(endpt */*e*/, endpt */*f*/);
+
/* --- @wclose@ --- *
*
* Arguments: @endpt *e@ = endpoint to be partially closed
/* -*-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);
}