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) {