Add more resilient TCP listening function.
authorfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Wed, 6 Sep 2006 00:30:25 +0000 (00:30 +0000)
committerfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Wed, 6 Sep 2006 00:30:25 +0000 (00:30 +0000)
git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@691 959494ce-11ee-0310-bf91-de5d638817bd

daemon/net.c
daemon/net.h
daemon/ui.c

index a017840..0f7be54 100644 (file)
@@ -605,6 +605,35 @@ struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, v
     return(NULL);
 }
 
+struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data)
+{
+    struct sockaddr_in addr;
+#ifdef HAVE_IPV6
+    struct sockaddr_in6 addr6;
+#endif
+    struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *);
+    struct socket *ret;
+    
+    if(local)
+       csfunc = netcslistenlocal;
+    else
+       csfunc = netcslisten;
+#ifdef HAVE_IPV6
+    memset(&addr6, 0, sizeof(addr6));
+    addr6.sin6_family = AF_INET6;
+    addr6.sin6_port = htons(port);
+    addr6.sin6_addr = in6addr_any;
+    if((ret = csfunc(SOCK_STREAM, (struct sockaddr *)&addr6, sizeof(addr6), func, data)) != NULL)
+       return(ret);
+    if((ret == NULL) && (errno != EAFNOSUPPORT))
+       return(NULL);
+#endif
+    memset(&addr, 0, sizeof(addr));
+    addr.sin_family = AF_INET;
+    addr.sin_port = htons(port);
+    return(csfunc(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), func, data));
+}
+
 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen)
 {
     struct socket *sk;
index 106ac81..3f04ab1 100644 (file)
@@ -92,6 +92,7 @@ void putsock(struct socket *sk);
 void getsock(struct socket *sk);
 struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data);
 struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data);
+struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data);
 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data);
 int pollsocks(int timeout);
 void sockqueue(struct socket *sk, void *data, size_t size);
index d2bae9c..4484a1d 100644 (file)
@@ -2038,41 +2038,11 @@ static void preinit(int hup)
     }
 }
 
-#ifdef HAVE_IPV6
-static struct sockaddr *getnameforport(int port, socklen_t *len)
-{
-    static struct sockaddr_in6 addr;
-    
-    memset(&addr, 0, sizeof(addr));
-    addr.sin6_family = AF_INET6;
-    addr.sin6_port = htons(port);
-    addr.sin6_addr = in6addr_any;
-    if(len != NULL)
-       *len = sizeof(addr);
-    return((struct sockaddr *)&addr);
-}
-#else
-static struct sockaddr *getnameforport(int port, socklen_t *len)
-{
-    static struct sockaddr_in addr;
-    
-    memset(&addr, 0, sizeof(addr));
-    addr.sin_family = AF_INET;
-    addr.sin_port = htons(port);
-    if(len != NULL)
-       *len = sizeof(addr);
-    return((struct sockaddr *)&addr);
-}
-#endif
-
 static int portupdate(struct configvar *var, void *uudata)
 {
-    struct sockaddr *addr;
-    socklen_t addrlen;
     struct socket *newsock;
     
-    addr = getnameforport(var->val.num, &addrlen);
-    if((uisocket = netcslistenlocal(SOCK_STREAM, addr, addrlen, uiaccept, NULL)) == NULL)
+    if((uisocket = netcstcplisten(var->val.num, 1, uiaccept, NULL)) == NULL)
     {
        flog(LOG_WARNING, "could not create new UI socket, reverting to old: %s", strerror(errno));
        return(0);
@@ -2085,8 +2055,6 @@ static int portupdate(struct configvar *var, void *uudata)
 
 static int init(int hup)
 {
-    struct sockaddr *addr;
-    socklen_t addrlen;
     struct uiuser *user, *next;
     
     if(hup)
@@ -2102,8 +2070,7 @@ static int init(int hup)
     {
        if(uisocket != NULL)
            putsock(uisocket);
-       addr = getnameforport(confgetint("ui", "port"), &addrlen);
-       if((uisocket = netcslistenlocal(SOCK_STREAM, addr, addrlen, uiaccept, NULL)) == NULL)
+       if((uisocket = netcstcplisten(confgetint("ui", "port"), 1, uiaccept, NULL)) == NULL)
        {
            flog(LOG_CRIT, "could not create UI socket: %s", strerror(errno));
            return(1);