Call @xfree@ rather than @free@. Add option to change the listen(2)
authormdw <mdw>
Fri, 22 Feb 2002 23:44:44 +0000 (23:44 +0000)
committermdw <mdw>
Fri, 22 Feb 2002 23:44:44 +0000 (23:44 +0000)
parameter.

socket.c

index 1b7e214..60d3d84 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: socket.c,v 1.7 2001/06/22 19:37:00 mdw Exp $
+ * $Id: socket.c,v 1.8 2002/02/22 23:44:44 mdw Exp $
  *
  * Socket source and target definitions
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: socket.c,v $
+ * Revision 1.8  2002/02/22 23:44:44  mdw
+ * Call @xfree@ rather than @free@.  Add option to change the listen(2)
+ * parameter.
+ *
  * Revision 1.7  2001/06/22 19:37:00  mdw
  * New @conn_init@ interface.
  *
 typedef struct ssource_opts {
   unsigned opt;
   unsigned conn;
+  unsigned listen;
 } ssource_opts;
 
-static ssource_opts ssgo = { 256, 0 };
+static ssource_opts ssgo = { 256, 0, 5 };
 
 #define SOCKOPT_LIMIT 0u
 #define SOCKOPT_NOLIMIT 1u
@@ -256,7 +261,7 @@ static void stept_close(endpt *e)
     REFFD_DEC(ee->e.out);
   }
 
-  free(ee->desc);
+  xfree(ee->desc);
   fw_dec();
   DESTROY(ee);
 }
@@ -337,6 +342,18 @@ static int ssource_option(source *s, scanner *sc)
     CONF_ACCEPT;
   }
 
+  if (strcmp(sc->d.buf, "listen") == 0) {
+    token(sc);
+    if (sc->t == '=')
+      token(sc);
+    if (sc->t != CTOK_WORD || !isdigit((unsigned char)sc->d.buf[0]))
+      error(sc, "parse error, expected number");
+    sso->listen = atoi(sc->d.buf);
+    if (sso->listen == 0)
+      error(sc, "argument of `listen' must be positive");
+    CONF_ACCEPT;
+  }
+
   if (strcmp(sc->d.buf, "logging") == 0 ||
       strcmp(sc->d.buf, "log") == 0) {
     addr_opts *ao = ss ? ss->ao : &gao;
@@ -518,7 +535,7 @@ static void ss_listen(ssource *ss)
 
   /* --- Set it to listen for connections --- */
 
-  if (listen(fd, 5)) {
+  if (listen(fd, ss->o.listen)) {
     fw_log(-1, "[%s] couldn't listen on socket: %s",
           ss->s.desc, strerror(errno));
     goto fail_1;
@@ -618,7 +635,7 @@ static void ssource_destroy(source *s)
     ss->a->ops->freeopts(ss->ao);
   else
     DESTROY(ss->ao);
-  free(ss->s.desc);
+  xfree(ss->s.desc);
   ss->a->ops->destroy(ss->a);
   ss->t->ops->destroy(ss->t);
   source_remove(&ss->s);
@@ -696,7 +713,7 @@ static void starget_destroy(target *t)
 {
   starget *st = (starget *)t;
   st->a->ops->destroy(st->a);
-  free(st->t.desc);
+  xfree(st->t.desc);
   DESTROY(st);
 }