After clamd is manualy killed or has crashed for any reason, it may be
unable to bind() another TCP socket because the old one is buzy by
closing socket.

Clamd should use SO_REUSEADDR socket option before binding (see
attached patch for 20031020 snapshot)


--- tcpserver.c.old     Mon Oct 27 17:52:08 2003
+++ tcpserver.c Mon Oct 27 17:55:39 2003
@@ -37,11 +37,13 @@
        struct cfgstruct *cpt;
        struct cfgstruct *taddr;
        char *estr;
+       int true = 1;
 
     memset((char *) &server, 0, sizeof(server));
     server.sin_family = AF_INET;
     server.sin_port = htons(cfgopt(copt, "TCPSocket")->numarg);
 
+
     if (taddr = cfgopt(copt, "TCPAddr"))
     {
        server.sin_addr.s_addr = inet_addr( taddr->strarg );
@@ -56,6 +58,11 @@
        //fprintf(stderr, "ERROR: socket() error: %s\n", estr);
        logg("!socket() error: %s\n", estr);
        exit(1);
+    }
+
+    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
+                  (void *) &true, sizeof(true)) == -1) {
+      logg("setsocktopt(SO_REUSEADDR) error: %s\n", strerror(errno));
     }
 
     if(bind(sockfd, (struct sockaddr *) &server, sizeof(struct sockaddr_in)) == -1) {

Reply via email to