diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-09-17 16:43:51 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-09-26 12:32:46 +0300 |
commit | d7cc1127adb34e32128b0917f458375c3d1b996f (patch) | |
tree | c6ef0b451431af37bdbd98b857caf5729b09bb76 /src/dnsproxy.c | |
parent | f6b4a7c12c2a76525714e54c1ced0a85cd425626 (diff) | |
download | connman-d7cc1127adb34e32128b0917f458375c3d1b996f.tar.gz connman-d7cc1127adb34e32128b0917f458375c3d1b996f.tar.bz2 connman-d7cc1127adb34e32128b0917f458375c3d1b996f.zip |
dnsproxy: Set recipient address when sending msg to DNS server
There has been cases where send() is returning EINVAL even though
there is a connected the socket. So use sendto() instead and supply
the destination address when sending.
Diffstat (limited to 'src/dnsproxy.c')
-rw-r--r-- | src/dnsproxy.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/dnsproxy.c b/src/dnsproxy.c index 6003e9a6..77106c8b 100644 --- a/src/dnsproxy.c +++ b/src/dnsproxy.c @@ -86,6 +86,8 @@ struct server_data { char *interface; GList *domains; char *server; + struct sockaddr server_addr; + socklen_t server_addr_len; int protocol; GIOChannel *channel; guint watch; @@ -1505,9 +1507,15 @@ static int ns_resolv(struct server_data *server, struct request_data *req, sk = g_io_channel_unix_get_fd(server->channel); - err = send(sk, request, req->request_len, MSG_NOSIGNAL); - if (err < 0) + err = sendto(sk, request, req->request_len, MSG_NOSIGNAL, + &server->server_addr, server->server_addr_len); + if (err < 0) { + DBG("Cannot send message to server %s sock %d " + "protocol %d (%s/%d)", + server->server, sk, server->protocol, + strerror(errno), errno); return -EIO; + } req->numserv++; @@ -2101,6 +2109,8 @@ static struct server_data *create_server(const char *interface, data->domains = g_list_append(data->domains, g_strdup(domain)); data->server = g_strdup(server); data->protocol = protocol; + data->server_addr_len = rp->ai_addrlen; + memcpy(&data->server_addr, rp->ai_addr, rp->ai_addrlen); ret = connect(sk, rp->ai_addr, rp->ai_addrlen); freeaddrinfo(rp); |