dnsproxy: Set recipient address when sending msg to DNS server
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Mon, 17 Sep 2012 13:43:51 +0000 (16:43 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Wed, 26 Sep 2012 09:32:46 +0000 (12:32 +0300)
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.

src/dnsproxy.c

index 6003e9a..77106c8 100644 (file)
@@ -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);