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