Imported Upstream connman version 1.38
[platform/upstream/connman.git] / gweb / gresolv.c
index 93f156e..954e7cf 100755 (executable)
@@ -28,6 +28,7 @@
 #include <stdarg.h>
 #include <string.h>
 #include <stdlib.h>
+#include <stdio.h>
 #include <resolv.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -181,17 +182,15 @@ static void find_srcaddr(struct sort_result *res)
        if (fd < 0)
                return;
 
-       if (connect(fd, &res->dst.sa, sizeof(res->dst)) < 0) {
-               close(fd);
-               return;
-       }
+       if (connect(fd, &res->dst.sa, sizeof(res->dst)) < 0)
+               goto out;
 
-       if (getsockname(fd, &res->src.sa, &sl) < 0) {
-               close(fd);
-               return;
-       }
+       if (getsockname(fd, &res->src.sa, &sl) < 0)
+               goto out;
 
        res->reachable = true;
+
+out:
        close(fd);
 }
 
@@ -316,7 +315,8 @@ static int match_gai_table(struct sockaddr *sa, const struct gai_table *tbl)
        }
 }
 
-#define DQUAD(_a,_b,_c,_d) ( ((_a)<<24) | ((_b)<<16) | ((_c)<<8) | (_d) )
+#define DQUAD(_a,_b,_c,_d) ( (((uint32_t)_a)<<24) | (((uint32_t)_b)<<16) | \
+                               (((uint32_t)_c)<<8) | ((uint32_t)_d) )
 #define V4MATCH(addr, a,b,c,d, m) ( ((addr) ^ DQUAD(a,b,c,d)) >> (32 - (m)) )
 
 #define RFC3484_SCOPE_LINK     2
@@ -327,7 +327,7 @@ static int addr_scope(struct sockaddr *sa)
 {
        if (sa->sa_family == AF_INET) {
                struct sockaddr_in *sin = (void *)sa;
-               guint32 addr = ntohl(sin->sin_addr.s_addr);
+               uint32_t addr = ntohl(sin->sin_addr.s_addr);
 
                if (V4MATCH(addr, 169,254,0,0, 16) ||
                                        V4MATCH(addr, 127,0,0,0, 8))
@@ -513,7 +513,7 @@ static void sort_and_return_results(struct resolv_lookup *lookup)
                        status = lookup->ipv4_status;
        }
 
-       debug(lookup->resolv, "lookup %p received %d results", lookup, n);
+       debug(lookup->resolv, "lookup %p received %d results", lookup, n-1);
 
        g_queue_remove(lookup->resolv->lookup_queue, lookup);
        destroy_lookup(lookup);
@@ -681,7 +681,10 @@ static void parse_response(struct resolv_nameserver *nameserver,
 
        switch (rcode) {
        case ns_r_noerror:
-               status = G_RESOLV_RESULT_STATUS_SUCCESS;
+               if (count > 0)
+                       status = G_RESOLV_RESULT_STATUS_SUCCESS;
+               else
+                       status = G_RESOLV_RESULT_STATUS_NO_ANSWER;
                break;
        case ns_r_formerr:
                status = G_RESOLV_RESULT_STATUS_FORMAT_ERROR;
@@ -948,12 +951,10 @@ bool g_resolv_add_nameserver(GResolv *resolv, const char *address,
        nameserver->flags = flags;
        nameserver->resolv = resolv;
 
-       debug(resolv, "");
        if (connect_udp_channel(nameserver) < 0) {
                free_nameserver(nameserver);
                return false;
        }
-       debug(resolv, "");
 
        resolv->nameserver_list = g_list_append(resolv->nameserver_list,
                                                                nameserver);
@@ -1055,8 +1056,6 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
        lookup->result_data = user_data;
        lookup->id = resolv->next_lookup_id++;
 
-       debug(resolv, "");
-
        if (resolv->result_family != AF_INET6) {
                if (add_query(lookup, hostname, ns_t_a)) {
                        g_free(lookup);
@@ -1064,8 +1063,6 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
                }
        }
 
-       debug(resolv, "");
-
        if (resolv->result_family != AF_INET) {
                if (add_query(lookup, hostname, ns_t_aaaa)) {
                        if (resolv->result_family != AF_INET6) {
@@ -1079,8 +1076,6 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
                }
        }
 
-       debug(resolv, "");
-
        g_queue_push_tail(resolv->lookup_queue, lookup);
 
        debug(resolv, "lookup %p id %d", lookup, lookup->id);