Changeset: 4a2e06782977 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4a2e06782977
Modified Files:
        monetdb5/modules/mal/mal_mapi.c
        tools/merovingian/daemon/connections.c
        tools/merovingian/daemon/discoveryrunner.c
        tools/merovingian/daemon/merovingian.c
        tools/merovingian/daemon/merovingian.h
        tools/merovingian/daemon/proxy.c
Branch: ipv6
Log Message:

Fix discovery on ipv6 and other fixes.


diffs (157 lines):

diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -608,13 +608,12 @@ SERVERlisten(int *Port, str *Usockfile, 
                }
 
                if (bind_ipv6) {
+                       memset(&server_ipv6, 0, sizeof(server_ipv6));
                        server_ipv6.sin6_family = AF_INET6;
                        if (accept_any)
-                               memcpy(server_ipv6.sin6_addr.s6_addr, 
&ipv6_any_addr, sizeof(struct in6_addr));
+                               server_ipv6.sin6_addr = ipv6_any_addr;
                        else
-                               memcpy(server_ipv6.sin6_addr.s6_addr, 
&ipv6_loopback_addr, sizeof(struct in6_addr));
-                       server_ipv6.sin6_flowinfo = 0;
-                       server_ipv6.sin6_scope_id = 0;
+                               server_ipv6.sin6_addr = ipv6_loopback_addr;
                        server = (struct sockaddr*) &server_ipv6;
                        length = (SOCKLEN) sizeof(server_ipv6);
                } else {
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
@@ -33,7 +33,7 @@ openConnectionTCP(int *ret, bool bind_ip
        int sock = -1, check = 0;
        socklen_t length = 0;
        int on = 1;
-       int i = 0, flags = NI_NUMERICSERV;
+       int i = 0;
        char sport[16];
        char host[512];
 
@@ -45,7 +45,6 @@ openConnectionTCP(int *ret, bool bind_ip
                        .ai_flags = AI_PASSIVE,
                        .ai_protocol = IPPROTO_TCP,
                };
-               flags |= NI_NUMERICHOST;
 
                check = getaddrinfo(bindaddr, sport, &hints, &result);
                if (check != 0)
@@ -90,12 +89,11 @@ openConnectionTCP(int *ret, bool bind_ip
                        return(newErr("creation of stream socket failed: %s", 
strerror(errno)));
 
                if (bind_ipv6) {
+                       memset(&server_ipv6, 0, sizeof(server_ipv6));
                        server_ipv6.sin6_family = AF_INET6;
-                       server_ipv6.sin6_flowinfo = 0;
-                       server_ipv6.sin6_scope_id = 0;
                        length = (socklen_t) sizeof(server_ipv6);
                        server_ipv6.sin6_port = htons((unsigned short) ((port) 
& 0xFFFF));
-                       memcpy(server_ipv6.sin6_addr.s6_addr, &ipv6_any_addr, 
sizeof(struct in6_addr));
+                       server_ipv6.sin6_addr = ipv6_any_addr;
                } else {
                        server_ipv4.sin_family = AF_INET;
                        for (i = 0; i < 8; i++)
@@ -125,7 +123,7 @@ openConnectionTCP(int *ret, bool bind_ip
                }
        }
 
-       check = getnameinfo(server, length, host, sizeof(host), sport, 
sizeof(sport), flags);
+       check = getnameinfo(server, length, host, sizeof(host), sport, 
sizeof(sport), NI_NUMERICSERV);
        if (result)
                freeaddrinfo(result);
        if (check != 0) {
diff --git a/tools/merovingian/daemon/discoveryrunner.c 
b/tools/merovingian/daemon/discoveryrunner.c
--- a/tools/merovingian/daemon/discoveryrunner.c
+++ b/tools/merovingian/daemon/discoveryrunner.c
@@ -36,7 +36,7 @@ difuse(char *msg)
        size_t len = strlen(msg) + 1;
        if (_mero_broadcastsock < 0)
                return;
-       sent = sendto(_mero_broadcastsock, msg, len, 0, _mero_broadcastaddr, 
sizeof(*_mero_broadcastaddr));
+       sent = sendto(_mero_broadcastsock, msg, len, 0, _mero_broadcastaddr, 
_mero_broadcastlength);
        if (sent == -1) {
                Mfprintf(_mero_discerr, "error while sending %s message: %s\n",
                                 _mero_broadcastaddr->sa_family == AF_INET ? 
"broadcast" : "multicast", strerror(errno));
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
@@ -122,6 +122,7 @@ const struct in6_addr ipv6_any_addr = IN
 struct sockaddr_in server_ipv4;
 struct sockaddr_in6 server_ipv6;
 struct sockaddr *_mero_broadcastaddr;
+socklen_t _mero_broadcastlength;
 /* hostname of this machine */
 char _mero_hostname[128];
 /* default options read from config file */
@@ -915,7 +916,6 @@ main(int argc, char *argv[])
                if (discovery == 1) {
                        if (use_ipv6) { //as ipv6 does not support broadcast, 
we will use multicast instead
                                int check = -1;
-                               socklen_t length = 0;
                                struct ipv6_mreq mreq;
                                struct addrinfo *multi, hints = (struct 
addrinfo) {
                                        .ai_family = AF_INET6,
@@ -924,24 +924,21 @@ main(int argc, char *argv[])
                                };
 
                                _mero_broadcastaddr = (struct sockaddr*) 
&server_ipv6;
+                               _mero_broadcastlength = (socklen_t) 
sizeof(struct sockaddr_in6);
+
+                               memset(&server_ipv6, 0, sizeof(struct 
sockaddr_in6));
                                server_ipv6.sin6_family = AF_INET6;
-                               server_ipv6.sin6_flowinfo = 0;
-                               server_ipv6.sin6_scope_id = 0;
                                server_ipv6.sin6_port = htons(port);
-                               memcpy(server_ipv6.sin6_addr.s6_addr, 
&ipv6_any_addr, sizeof(struct in6_addr));
-                               length = (socklen_t) sizeof(server_ipv6);
+                               server_ipv6.sin6_addr = ipv6_any_addr;
 
                                _mero_broadcastsock = socket(AF_INET6, 
SOCK_DGRAM
 #ifdef SOCK_CLOEXEC
                                                                                
        | SOCK_CLOEXEC
 #endif
                                                , 0);
-                               if (_mero_broadcastsock == -1 || 
bind(_mero_broadcastsock, (SOCKPTR) &server_ipv6,
-                                                length) != 0) {
+                               if (_mero_broadcastsock == -1) {
                                        Mfprintf(stderr, "cannot create 
multicast package: %s\n", strerror(errno));
                                        closesocket(discsock);
-                                       if (_mero_broadcastsock >= 0)
-                                               
closesocket(_mero_broadcastsock);
                                        discsock = -1;
                                } else if ((check = getaddrinfo("ff02::1", 
NULL, &hints, &multi)) != 0) {
                                        //ipv6 multicast all nodes on the local 
network segment
@@ -967,6 +964,7 @@ main(int argc, char *argv[])
                                }
                        } else {
                                _mero_broadcastaddr = (struct sockaddr*) 
&server_ipv4;
+                               _mero_broadcastlength = (socklen_t) 
sizeof(struct sockaddr_in);
                                server_ipv4.sin_family = AF_INET;
                                server_ipv4.sin_addr.s_addr = 
htonl(INADDR_BROADCAST);
                                /* the target port is our configured port, not 
elegant, but how
diff --git a/tools/merovingian/daemon/merovingian.h 
b/tools/merovingian/daemon/merovingian.h
--- a/tools/merovingian/daemon/merovingian.h
+++ b/tools/merovingian/daemon/merovingian.h
@@ -76,6 +76,7 @@ extern FILE *_mero_ctlerr;
 extern int _mero_broadcastsock;
 extern const struct in6_addr ipv6_any_addr;
 extern struct sockaddr *_mero_broadcastaddr;
+extern socklen_t _mero_broadcastlength;
 extern char _mero_hostname[128];
 extern confkeyval *_mero_db_props;
 extern confkeyval *_mero_props;
diff --git a/tools/merovingian/daemon/proxy.c b/tools/merovingian/daemon/proxy.c
--- a/tools/merovingian/daemon/proxy.c
+++ b/tools/merovingian/daemon/proxy.c
@@ -224,7 +224,8 @@ startProxy(int psock, stream *cfdin, str
                                break;
                        }
                }
-               freeaddrinfo(results);
+               if (results)
+                       freeaddrinfo(results);
                if (rp == NULL)
                        return(newErr("cannot open socket: %s", 
strerror(errno)));
        }
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to