X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gweb%2Fgresolv.c;h=954e7cfeff77cc32dd9ed7a329cd81e025b5dbec;hb=dd3cccc5e67548dcc2dd6c6254ed6c97859085d5;hp=864d2adbb67832e113b309c542b494302f15cca0;hpb=003947c67cc263406b97b8f69909cf0ba1786599;p=platform%2Fupstream%2Fconnman.git diff --git a/gweb/gresolv.c b/gweb/gresolv.c index 864d2ad..954e7cf 100644 --- a/gweb/gresolv.c +++ b/gweb/gresolv.c @@ -2,7 +2,7 @@ * * Resolver library with GLib integration * - * Copyright (C) 2009-2012 Intel Corporation. All rights reserved. + * Copyright (C) 2009-2013 Intel Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -44,7 +45,7 @@ struct sort_result { int dst_scope; int src_label; int dst_label; - gboolean reachable; + bool reachable; union { struct sockaddr sa; struct sockaddr_in sin; @@ -126,7 +127,7 @@ static void _debug(GResolv *resolv, const char *file, const char *caller, va_list ap; int len; - if (resolv->debug_func == NULL) + if (!resolv->debug_func) return; va_start(ap, format); @@ -155,13 +156,13 @@ static void destroy_lookup(struct resolv_lookup *lookup) debug(lookup->resolv, "lookup %p id %d ipv4 %p ipv6 %p", lookup, lookup->id, lookup->ipv4_query, lookup->ipv6_query); - if (lookup->ipv4_query != NULL) { + if (lookup->ipv4_query) { g_queue_remove(lookup->resolv->query_queue, lookup->ipv4_query); destroy_query(lookup->ipv4_query); } - if (lookup->ipv6_query != NULL) { + if (lookup->ipv6_query) { g_queue_remove(lookup->resolv->query_queue, lookup->ipv6_query); destroy_query(lookup->ipv6_query); @@ -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; - res->reachable = TRUE; +out: close(fd); } @@ -280,21 +279,21 @@ static const struct gai_table gai_precedences[] = { static unsigned char v4mapped[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }; -static gboolean mask_compare(const unsigned char *one, +static bool mask_compare(const unsigned char *one, const unsigned char *two, int mask) { if (mask > 8) { if (memcmp(one, two, mask / 8)) - return FALSE; + return false; one += mask / 8; two += mask / 8; mask %= 8; } if (mask && ((*one ^ *two) >> (8 - mask))) - return FALSE; + return false; - return TRUE; + return true; } static int match_gai_table(struct sockaddr *sa, const struct gai_table *tbl) @@ -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)) @@ -485,14 +485,14 @@ static void sort_and_return_results(struct resolv_lookup *lookup) for (i = 0; i < lookup->nr_results; i++) { if (lookup->results[i].dst.sa.sa_family == AF_INET) { - if (inet_ntop(AF_INET, + if (!inet_ntop(AF_INET, &lookup->results[i].dst.sin.sin_addr, - buf, sizeof(buf) - 1) == NULL) + buf, sizeof(buf) - 1)) continue; } else if (lookup->results[i].dst.sa.sa_family == AF_INET6) { - if (inet_ntop(AF_INET6, + if (!inet_ntop(AF_INET6, &lookup->results[i].dst.sin6.sin6_addr, - buf, sizeof(buf) - 1) == NULL) + buf, sizeof(buf) - 1)) continue; } else continue; @@ -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); @@ -542,7 +542,7 @@ static gboolean query_timeout(gpointer user_data) g_queue_remove(resolv->query_queue, query); destroy_query(query); - if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL) + if (!lookup->ipv4_query && !lookup->ipv6_query) sort_and_return_results(lookup); return FALSE; @@ -550,13 +550,13 @@ static gboolean query_timeout(gpointer user_data) static void free_nameserver(struct resolv_nameserver *nameserver) { - if (nameserver == NULL) + if (!nameserver) return; if (nameserver->udp_watch > 0) g_source_remove(nameserver->udp_watch); - if (nameserver->udp_channel != NULL) { + if (nameserver->udp_channel) { g_io_channel_shutdown(nameserver->udp_channel, TRUE, NULL); g_io_channel_unref(nameserver->udp_channel); } @@ -582,7 +582,7 @@ static int send_query(GResolv *resolv, const unsigned char *buf, int len) GList *list; int nr_ns; - if (resolv->nameserver_list == NULL) + if (!resolv->nameserver_list) return -ENOENT; for (list = g_list_first(resolv->nameserver_list), nr_ns = 0; @@ -590,7 +590,7 @@ static int send_query(GResolv *resolv, const unsigned char *buf, int len) struct resolv_nameserver *nameserver = list->data; int sk, sent; - if (nameserver->udp_channel == NULL) + if (!nameserver->udp_channel) continue; sk = g_io_channel_unix_get_fd(nameserver->udp_channel); @@ -637,7 +637,7 @@ static void add_result(struct resolv_lookup *lookup, int family, int n = lookup->nr_results++; lookup->results = g_try_realloc(lookup->results, sizeof(struct sort_result) * (n + 1)); - if (lookup->results == NULL) + if (!lookup->results) return; memset(&lookup->results[n], 0, sizeof(struct sort_result)); @@ -665,7 +665,8 @@ static void parse_response(struct resolv_nameserver *nameserver, debug(resolv, "response from %s", nameserver->address); - ns_initparse(buf, len, &msg); + if (ns_initparse(buf, len, &msg) < 0) + return; list = g_queue_find_custom(resolv->query_queue, GUINT_TO_POINTER(ns_msg_id(msg)), compare_query_msgid); @@ -680,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; @@ -713,7 +717,8 @@ static void parse_response(struct resolv_nameserver *nameserver, lookup->ipv4_status = status; for (i = 0; i < count; i++) { - ns_parserr(&msg, ns_s_an, i, &rr); + if (ns_parserr(&msg, ns_s_an, i, &rr) < 0) + continue; if (ns_rr_class(rr) != ns_c_in) continue; @@ -741,7 +746,7 @@ static void parse_response(struct resolv_nameserver *nameserver, g_queue_remove(resolv->query_queue, query); destroy_query(query); - if (lookup->ipv4_query == NULL && lookup->ipv6_query == NULL) + if (!lookup->ipv4_query && !lookup->ipv6_query) sort_and_return_results(lookup); } @@ -807,8 +812,7 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver) char interface[IF_NAMESIZE]; memset(interface, 0, IF_NAMESIZE); - if (if_indextoname(nameserver->resolv->index, - interface) != NULL) { + if (if_indextoname(nameserver->resolv->index, interface)) { if (setsockopt(sk, SOL_SOCKET, SO_BINDTODEVICE, interface, IF_NAMESIZE) < 0) { close(sk); @@ -827,7 +831,7 @@ static int connect_udp_channel(struct resolv_nameserver *nameserver) freeaddrinfo(rp); nameserver->udp_channel = g_io_channel_unix_new(sk); - if (nameserver->udp_channel == NULL) { + if (!nameserver->udp_channel) { close(sk); return -ENOMEM; } @@ -849,7 +853,7 @@ GResolv *g_resolv_new(int index) return NULL; resolv = g_try_new0(GResolv, 1); - if (resolv == NULL) + if (!resolv) return NULL; resolv->ref_count = 1; @@ -859,13 +863,13 @@ GResolv *g_resolv_new(int index) resolv->next_lookup_id = 1; resolv->query_queue = g_queue_new(); - if (resolv->query_queue == NULL) { + if (!resolv->query_queue) { g_free(resolv); return NULL; } resolv->lookup_queue = g_queue_new(); - if (resolv->lookup_queue == NULL) { + if (!resolv->lookup_queue) { g_queue_free(resolv->query_queue); g_free(resolv); return NULL; @@ -881,7 +885,7 @@ GResolv *g_resolv_new(int index) GResolv *g_resolv_ref(GResolv *resolv) { - if (resolv == NULL) + if (!resolv) return NULL; __sync_fetch_and_add(&resolv->ref_count, 1); @@ -894,7 +898,7 @@ void g_resolv_unref(GResolv *resolv) struct resolv_query *query; struct resolv_lookup *lookup; - if (resolv == NULL) + if (!resolv) return; if (__sync_fetch_and_sub(&resolv->ref_count, 1) != 1) @@ -923,24 +927,24 @@ void g_resolv_unref(GResolv *resolv) void g_resolv_set_debug(GResolv *resolv, GResolvDebugFunc func, gpointer user_data) { - if (resolv == NULL) + if (!resolv) return; resolv->debug_func = func; resolv->debug_data = user_data; } -gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address, +bool g_resolv_add_nameserver(GResolv *resolv, const char *address, uint16_t port, unsigned long flags) { struct resolv_nameserver *nameserver; - if (resolv == NULL) - return FALSE; + if (!resolv) + return false; nameserver = g_try_new0(struct resolv_nameserver, 1); - if (nameserver == NULL) - return FALSE; + if (!nameserver) + return false; nameserver->address = g_strdup(address); nameserver->port = port; @@ -949,7 +953,7 @@ gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address, if (connect_udp_channel(nameserver) < 0) { free_nameserver(nameserver); - return FALSE; + return false; } resolv->nameserver_list = g_list_append(resolv->nameserver_list, @@ -957,12 +961,12 @@ gboolean g_resolv_add_nameserver(GResolv *resolv, const char *address, debug(resolv, "setting nameserver %s", address); - return TRUE; + return true; } void g_resolv_flush_nameservers(GResolv *resolv) { - if (resolv == NULL) + if (!resolv) return; flush_nameservers(resolv); @@ -974,7 +978,7 @@ static gint add_query(struct resolv_lookup *lookup, const char *hostname, int ty unsigned char buf[4096]; int len; - if (query == NULL) + if (!query) return -ENOMEM; len = res_mkquery(ns_o_query, hostname, ns_c_in, type, @@ -1013,12 +1017,12 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname, { struct resolv_lookup *lookup; - if (resolv == NULL) + if (!resolv) return 0; debug(resolv, "hostname %s", hostname); - if (resolv->nameserver_list == NULL) { + if (!resolv->nameserver_list) { int i; for (i = 0; i < resolv->res.nscount; i++) { @@ -1039,12 +1043,12 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname, g_resolv_add_nameserver(resolv, buf, 53, 0); } - if (resolv->nameserver_list == NULL) + if (!resolv->nameserver_list) g_resolv_add_nameserver(resolv, "127.0.0.1", 53, 0); } lookup = g_try_new0(struct resolv_lookup, 1); - if (lookup == NULL) + if (!lookup) return 0; lookup->resolv = resolv; @@ -1079,7 +1083,7 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname, return lookup->id; } -gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id) +bool g_resolv_cancel_lookup(GResolv *resolv, guint id) { struct resolv_lookup *lookup; GList *list; @@ -1089,8 +1093,8 @@ gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id) list = g_queue_find_custom(resolv->lookup_queue, GUINT_TO_POINTER(id), compare_lookup_id); - if (list == NULL) - return FALSE; + if (!list) + return false; lookup = list->data; @@ -1099,18 +1103,18 @@ gboolean g_resolv_cancel_lookup(GResolv *resolv, guint id) g_queue_remove(resolv->lookup_queue, lookup); destroy_lookup(lookup); - return TRUE; + return true; } -gboolean g_resolv_set_address_family(GResolv *resolv, int family) +bool g_resolv_set_address_family(GResolv *resolv, int family) { - if (resolv == NULL) - return FALSE; + if (!resolv) + return false; if (family != AF_UNSPEC && family != AF_INET && family != AF_INET6) - return FALSE; + return false; resolv->result_family = family; - return TRUE; + return true; }