Changeset: 75d46c94583a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=75d46c94583a
Modified Files:
        tools/merovingian/daemon/connections.c
        tools/merovingian/daemon/connections.h
        tools/merovingian/daemon/merovingian.c
Branch: listenaddr
Log Message:

Code deduplication.


diffs (210 lines):

diff --git a/tools/merovingian/daemon/connections.c 
b/tools/merovingian/daemon/connections.c
--- a/tools/merovingian/daemon/connections.c
+++ b/tools/merovingian/daemon/connections.c
@@ -25,22 +25,22 @@
 #include "connections.h"
 
 err
-openConnectionTCP(int *ret, bool bind_ipv6, const char *bindaddr, unsigned 
short port, FILE *log)
+openConnectionIP(int *ret, bool udp, bool bind_ipv6, const char *bindaddr, 
unsigned short port, FILE *log)
 {
        struct addrinfo *result = NULL, *rp = NULL;
        int sock = -1, check = 0;
        int on = 1;
        char sport[16];
+       char host[512] = "";
        int e = 0;
 
-       snprintf(sport, 16, "%hu", port);
-
        struct addrinfo hints = (struct addrinfo) {
                .ai_family = bind_ipv6 ? AF_INET6 : AF_INET,
-               .ai_socktype = SOCK_STREAM,
+               .ai_socktype = udp ? SOCK_DGRAM : SOCK_STREAM,
                .ai_flags = AI_PASSIVE,
-               .ai_protocol = IPPROTO_TCP,
+               .ai_protocol = udp ? 0 : IPPROTO_TCP,
        };
+       snprintf(sport, sizeof(sport), "%hu", port);
 
        check = getaddrinfo(bindaddr, sport, &hints, &result);
        if (bindaddr == NULL)
@@ -66,109 +66,62 @@ openConnectionTCP(int *ret, bool bind_ip
                        (void) setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY,
                                                          (const char *) 
&(int){0}, sizeof(int));
 
-               if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
-                                          (const char *) &on, sizeof on) < 0) {
-                       e = errno;
-                       closesocket(sock);
-                       continue;
-               }
+               if (!udp) {
+                       if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
+                                                  (const char *) &on, sizeof 
on) < 0) {
+                               e = errno;
+                               closesocket(sock);
+                               sock = -1;
+                               continue;
+                       }
 #ifdef SO_EXCLUSIVEADDRUSE
-               (void) setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
-                                                 (const char *) &on, sizeof 
on);
+                       (void) setsockopt(sock, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
+                                                         (const char *) &on, 
sizeof on);
 #endif
 #ifdef SO_EXCLBIND
-               (void) setsockopt(sock, SOL_SOCKET, SO_EXCLBIND,
-                                                 (const char *) &on, sizeof 
on);
+                       (void) setsockopt(sock, SOL_SOCKET, SO_EXCLBIND,
+                                                         (const char *) &on, 
sizeof on);
 #endif
+               }
 
-               if (bind(sock, rp->ai_addr, rp->ai_addrlen) != -1)
-                       break; /* working */
-               e = errno;
-               closesocket(sock);
+               if (bind(sock, rp->ai_addr, rp->ai_addrlen) == -1) {
+                       e = errno;
+                       closesocket(sock);
+                       sock = -1;
+                       continue;
+               }
+               if (getnameinfo(rp->ai_addr, rp->ai_addrlen,
+                                               host, sizeof(host),
+                                               sport, sizeof(sport),
+                                               NI_NUMERICSERV | (udp ? 
NI_DGRAM : 0)) != 0) {
+                       host[0] = 0;
+                       snprintf(sport, sizeof(sport), "%hu", port);
+               }
+               break;                                  /* working */
        }
        freeaddrinfo(result);
-       if (rp == NULL) {
-               if (e != 0) { /* results found, tried socket, setsockopt and 
bind calls */
-                       return newErr("binding to stream socket port %hu 
failed: %s", port, strerror(e));
+       if (sock == -1) {
+               if (e != 0) {                   /* results found, error 
occurred */
+                       return newErr("binding to %s socket port %hu failed: 
%s",
+                                                 udp ? "datagram" : "stream", 
port, strerror(e));
                } else { /* no results found, could not translate address */
                        return newErr("cannot translate host %s", bindaddr);
                }
        }
 
-       /* keep queue of 5 */
-       if (listen(sock, 5) == -1) {
-               e = errno;
-               closesocket(sock);
-               return(newErr("failed setting socket to listen: %s", 
strerror(e)));
-       }
-
-       Mfprintf(log, "accepting connections on TCP socket %s:%hu\n", bindaddr 
, port);
-
-       *ret = sock;
-       return(NO_ERR);
-}
-
-err
-openConnectionUDP(int *ret, bool bind_ipv6, const char *bindaddr, unsigned 
short port)
-{
-       struct addrinfo hints;
-       struct addrinfo *result, *rp;
-       int sock = -1;
-
-       char sport[10];
-       char host[512];
-
-       hints = (struct addrinfo) {
-               .ai_family = bind_ipv6 ? AF_INET6 : AF_INET,
-               .ai_socktype = SOCK_DGRAM, /* Datagram socket */
-               .ai_flags = AI_PASSIVE,    /* For wildcard IP address */
-               .ai_protocol = 0,          /* Any protocol */
-               .ai_canonname = NULL,
-               .ai_addr = NULL,
-               .ai_next = NULL,
-       };
+       if (udp) {
+               Mfprintf(log, "listening for UDP messages on %s:%s\n", host, 
sport);
+       } else {
+               /* keep queue of 5 */
+               if (listen(sock, 5) == -1) {
+                       e = errno;
+                       closesocket(sock);
+                       return(newErr("failed setting socket to listen: %s", 
strerror(e)));
+               }
 
-       snprintf(sport, 10, "%hu", port);
-       sock = getaddrinfo(bindaddr, sport, &hints, &result);
-       if (sock != 0)
-               return(newErr("failed getting address info: %s", 
gai_strerror(sock)));
-
-       for (rp = result; rp != NULL; rp = rp->ai_next) {
-               sock = socket(rp->ai_family, rp->ai_socktype
-#ifdef SOCK_CLOEXEC
-                                         | SOCK_CLOEXEC
-#endif
-                                         , rp->ai_protocol);
-               if (sock == -1)
-                       continue;
-#if !defined(SOCK_CLOEXEC) && defined(HAVE_FCNTL)
-               (void) fcntl(sock, F_SETFD, FD_CLOEXEC);
-#endif
-
-               if (bind(sock, rp->ai_addr, rp->ai_addrlen) != -1)
-                       break; /* working */
-
-               closesocket(sock);
+               Mfprintf(log, "accepting connections on TCP socket %s:%s\n", 
host, sport);
        }
 
-       if (rp == NULL) {
-               freeaddrinfo(result);
-               return(newErr("binding to datagram socket port %hu failed: "
-                                       "no available address", port));
-       }
-
-       /* retrieve information from the socket */
-       if(getnameinfo(rp->ai_addr, rp->ai_addrlen,
-                       host, sizeof(host),
-                       sport, sizeof(sport),
-                       NI_NUMERICSERV | NI_DGRAM) == 0) {
-               Mfprintf(_mero_discout, "listening for UDP messages on 
%s:%s\n", host, sport);
-       } else {
-               Mfprintf(_mero_discout, "listening for UDP messages\n");
-       }
-
-       freeaddrinfo(result);
-
        *ret = sock;
        return(NO_ERR);
 }
diff --git a/tools/merovingian/daemon/connections.h 
b/tools/merovingian/daemon/connections.h
--- a/tools/merovingian/daemon/connections.h
+++ b/tools/merovingian/daemon/connections.h
@@ -11,8 +11,7 @@
 
 #include "merovingian.h"
 
-err openConnectionTCP(int *ret, bool use_ipv6, const char *bindaddr, unsigned 
short port, FILE *log);
-err openConnectionUDP(int *ret, bool bind_ipv6, const char *bindaddr, unsigned 
short port);
+err openConnectionIP(int *ret, bool udp, bool use_ipv6, const char *bindaddr, 
unsigned short port, FILE *log);
 err openConnectionUNIX(int *ret, const char *path, int mode, FILE *log);
 
 #endif
diff --git a/tools/merovingian/daemon/merovingian.c 
b/tools/merovingian/daemon/merovingian.c
--- a/tools/merovingian/daemon/merovingian.c
+++ b/tools/merovingian/daemon/merovingian.c
@@ -967,9 +967,9 @@ main(int argc, char *argv[])
        Mfprintf(stdout, "monitoring dbfarm %s\n", dbfarm);
 
        /* open up connections */
-       if ((e = openConnectionTCP(&sock, use_ipv6, host, port, stdout)) == 
NO_ERR &&
+       if ((e = openConnectionIP(&sock, false, use_ipv6, host, port, stdout)) 
== NO_ERR &&
                (e = openConnectionUNIX(&socku, mapi_usock, 0, stdout)) == 
NO_ERR &&
-               (!discovery || (e = openConnectionUDP(&discsock, false, host, 
port)) == NO_ERR) &&
+               (!discovery || (e = openConnectionIP(&discsock, true, false, 
host, port, _mero_discout)) == NO_ERR) &&
                (e = openConnectionUNIX(&unsock, control_usock, S_IRWXO, 
_mero_ctlout)) == NO_ERR) {
                pthread_t ctid = 0;
                pthread_t dtid = 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to