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

Use same algorithm for determining IPv4/v6 in monetdbd as in mserver5.
localhost/all is both v4 and v6 (or whichever is available).
127.0.0.1/0.0.0.0 is only v4.
::1/:: is only v6.
hostname is whatever the system (DNS) tells us.


diffs (126 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,7 +25,7 @@
 #include "connections.h"
 
 err
-openConnectionIP(int *socks, bool udp, bool bind_ipv6, const char *bindaddr, 
unsigned short port, FILE *log)
+openConnectionIP(int *socks, bool udp, const char *bindaddr, unsigned short 
port, FILE *log)
 {
        struct addrinfo *result = NULL, *rp = NULL;
        int sock = -1, check = 0;
@@ -35,9 +35,10 @@ openConnectionIP(int *socks, bool udp, b
        char host[512] = "";
        int e = 0;
        const char *msghost = bindaddr ? bindaddr : "any"; /* for messages */
+       int ipv6_vs6only = -1;
 
        struct addrinfo hints = (struct addrinfo) {
-               .ai_family = bind_ipv6 ? AF_INET6 : AF_INET,
+               .ai_family = AF_INET6,
                .ai_socktype = udp ? SOCK_DGRAM : SOCK_STREAM,
                .ai_flags = AI_PASSIVE | AI_NUMERICSERV,
                .ai_protocol = udp ? 0 : IPPROTO_TCP,
@@ -46,6 +47,38 @@ openConnectionIP(int *socks, bool udp, b
 
        socks[0] = socks[1] = -1;
 
+       if (bindaddr == NULL || strcmp(bindaddr, "localhost") == 0) {
+               hints.ai_family = AF_INET6;
+               hints.ai_flags |= AI_NUMERICHOST;
+               ipv6_vs6only = 0;
+               bindaddr = "::1";
+               strcpy_len(host, "localhost", sizeof(host));
+       } else if (strcmp(bindaddr, "all") == 0) {
+               hints.ai_family = AF_INET6;
+               ipv6_vs6only = 0;
+               bindaddr = NULL;
+       } else if (strcmp(bindaddr, "::") == 0) {
+               hints.ai_family = AF_INET6;
+               ipv6_vs6only = 1;
+               bindaddr = NULL;
+       } else if (strcmp(bindaddr, "0.0.0.0") == 0) {
+               hints.ai_family = AF_INET;
+               hints.ai_flags |= AI_NUMERICHOST;
+               bindaddr = NULL;
+       } else if (strcmp(bindaddr, "::1") == 0) {
+               hints.ai_family = AF_INET6;
+               hints.ai_flags |= AI_NUMERICHOST;
+               ipv6_vs6only = 1;
+               strcpy_len(host, "localhost", sizeof(host));
+       } else if (strcmp(bindaddr, "127.0.0.1") == 0) {
+               hints.ai_family = AF_INET;
+               hints.ai_flags |= AI_NUMERICHOST;
+               strcpy_len(host, "localhost", sizeof(host));
+       } else {
+               hints.ai_family = AF_INET6;
+               ipv6_vs6only = 0;
+       }
+
        for (;;) {                                      /* max twice */
                check = getaddrinfo(bindaddr, sport, &hints, &result);
                if (check != 0)
@@ -122,9 +155,12 @@ openConnectionIP(int *socks, bool udp, b
                        break;                                  /* working */
                }
                freeaddrinfo(result);
-               if (hints.ai_family == AF_INET6)
+               if (ipv6_vs6only == 0) {
+                       ipv6_vs6only = -1;
                        hints.ai_family = AF_INET;
-               else
+                       if (bindaddr && strcmp(bindaddr, "::1") == 0)
+                               bindaddr = "127.0.0.1";
+               } else
                        break;
        }
 
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,7 +11,7 @@
 
 #include "merovingian.h"
 
-err openConnectionIP(int *socks, bool udp, bool use_ipv6, const char 
*bindaddr, unsigned short port, FILE *log);
+err openConnectionIP(int *socks, bool udp, 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
@@ -350,7 +350,6 @@ main(int argc, char *argv[])
        FILE *oerr = NULL;
        int thret;
        bool merodontfork = false;
-       bool use_ipv6 = false;
        confkeyval ckv[] = {
                {"logfile",       strdup("merovingian.log"), 0,                
STR},
                {"pidfile",       strdup("merovingian.pid"), 0,                
STR},
@@ -655,12 +654,6 @@ main(int argc, char *argv[])
        }
        host = kv->val;
 
-       use_ipv6 = (strcmp(host, "127.0.0.1") != 0 && strcmp(host, "0.0.0.0") 
!= 0);
-
-       if (strcmp(host, "all") == 0) {
-               host = NULL;
-       }
-
        kv = findConfKey(_mero_props, "port");
        if (kv->ival <= 0 || kv->ival > 65535) {
                Mfprintf(stderr, "invalid port number: %s, defaulting to %s\n",
@@ -970,9 +963,9 @@ main(int argc, char *argv[])
        Mfprintf(stdout, "monitoring dbfarm %s\n", dbfarm);
 
        /* open up connections */
-       if ((e = openConnectionIP(socks, false, use_ipv6, host, port, stdout)) 
== NO_ERR &&
+       if ((e = openConnectionIP(socks, false, host, port, stdout)) == NO_ERR 
&&
                (e = openConnectionUNIX(&socks[2], mapi_usock, 0, stdout)) == 
NO_ERR &&
-               (!discovery || (e = openConnectionIP(discsocks, true, use_ipv6, 
host, port, _mero_discout)) == NO_ERR) &&
+               (!discovery || (e = openConnectionIP(discsocks, true, 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