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