summaryrefslogtreecommitdiff
path: root/src/dnsproxy.c
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@linux.intel.com>2012-09-17 16:43:51 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2012-09-26 12:32:46 +0300
commitd7cc1127adb34e32128b0917f458375c3d1b996f (patch)
treec6ef0b451431af37bdbd98b857caf5729b09bb76 /src/dnsproxy.c
parentf6b4a7c12c2a76525714e54c1ced0a85cd425626 (diff)
downloadconnman-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.c14
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);