From: Pavel Šimerda Date: Wed, 8 Oct 2014 16:17:56 +0000 (+0200) Subject: backends: handle priority, weight and ttl from backends X-Git-Url: https://www.sourceware.org/git/?a=commitdiff_plain;h=0307b14d4cd3ef7f2e1a36e6ee0d88348d3e3a28;p=netresolve.git backends: handle priority, weight and ttl from backends --- diff --git a/backends/any.c b/backends/any.c index acd84a3..24c70dd 100644 --- a/backends/any.c +++ b/backends/any.c @@ -38,7 +38,7 @@ start(netresolve_query_t query, char **settings) return; } - netresolve_backend_add_path(query, AF_INET, &inaddr_any, 0, 0, 0, 0, 0, 0); - netresolve_backend_add_path(query, AF_INET6, &in6addr_any, 0, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, AF_INET, &inaddr_any, 0, 0, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, AF_INET6, &in6addr_any, 0, 0, 0, 0, 0, 0, 0); netresolve_backend_finished(query); } diff --git a/backends/aresdns.c b/backends/aresdns.c index decd968..0004bfa 100644 --- a/backends/aresdns.c +++ b/backends/aresdns.c @@ -91,6 +91,7 @@ host_callback(void *arg, int status, int timeouts, struct hostent *he) int port = -1; int priority = 0; int weight = 0; + int ttl = 0; if (srv) { socktype = netresolve_backend_get_socktype(query); @@ -107,7 +108,7 @@ host_callback(void *arg, int status, int timeouts, struct hostent *he) priv->ptfd = netresolve_backend_add_timeout(query, partial_timeout, 0); if (priv->ptfd == -1) error("timer: %s", strerror(errno)); - netresolve_backend_apply_hostent(query, he, socktype, protocol, port, priority, weight); + netresolve_backend_apply_hostent(query, he, socktype, protocol, port, priority, weight, ttl); break; default: error("ares: %s\n", ares_strerror(status)); diff --git a/backends/exec.c b/backends/exec.c index dde7fb4..7c62e64 100644 --- a/backends/exec.c +++ b/backends/exec.c @@ -124,11 +124,11 @@ received_line(netresolve_query_t query, struct priv_exec *priv, const char *line if (!strncmp(addrprefix, line, addrprefixlen)) { if (netresolve_backend_parse_address(line + addrprefixlen, &address, &family, &ifindex)) - netresolve_backend_add_path(query, family, &address, ifindex, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, family, &address, ifindex, 0, 0, 0, 0, 0, 0); } else if (!strncmp(pathprefix, line, pathprefixlen)) { if (netresolve_backend_parse_path(line + pathprefixlen, &address, &family, &ifindex, &socktype, &protocol, &port)) - netresolve_backend_add_path(query, family, &address, ifindex, socktype, protocol, port, 0, 0); + netresolve_backend_add_path(query, family, &address, ifindex, socktype, protocol, port, 0, 0, 0); } return false; diff --git a/backends/getaddrinfo.c b/backends/getaddrinfo.c index e4a29d2..a86c066 100644 --- a/backends/getaddrinfo.c +++ b/backends/getaddrinfo.c @@ -58,7 +58,7 @@ add_addresses(netresolve_query_t query, const struct addrinfo *first) netresolve_backend_add_path(query, ai->ai_family, &address, ifindex, ai->ai_socktype, ai->ai_protocol, port, - 0, 0); + 0, 0, 0); } } diff --git a/backends/hosts.c b/backends/hosts.c index f4f9c67..e77255f 100644 --- a/backends/hosts.c +++ b/backends/hosts.c @@ -158,7 +158,7 @@ start(netresolve_query_t query, char **settings) for (item = list.items; item->name; item++) { if (request_node && strcmp(request_node, item->name)) continue; - netresolve_backend_add_path(query, item->family, &item->address, item->ifindex, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, item->family, &item->address, item->ifindex, 0, 0, 0, 0, 0, 0); count++; } diff --git a/backends/loopback.c b/backends/loopback.c index 0befa7f..3a74feb 100644 --- a/backends/loopback.c +++ b/backends/loopback.c @@ -47,8 +47,8 @@ start(netresolve_query_t query, char **settings) } if (ipv4) - netresolve_backend_add_path(query, AF_INET, &inaddr_loopback, 0, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, AF_INET, &inaddr_loopback, 0, 0, 0, 0, 0, 0, 0); if (ipv6) - netresolve_backend_add_path(query, AF_INET6, &in6addr_loopback, 0, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, AF_INET6, &in6addr_loopback, 0, 0, 0, 0, 0, 0, 0); netresolve_backend_finished(query); } diff --git a/backends/nss.c b/backends/nss.c index 9f93c3c..421ed95 100644 --- a/backends/nss.c +++ b/backends/nss.c @@ -168,9 +168,9 @@ start(netresolve_query_t query, char **settings) status = combine_statuses(status4, status6); if (status == NSS_STATUS_SUCCESS) { if (status4 == NSS_STATUS_SUCCESS) - netresolve_backend_apply_hostent(query, &he4, 0, 0, 0, 0, 0); + netresolve_backend_apply_hostent(query, &he4, 0, 0, 0, 0, 0, 0); if (status6 == NSS_STATUS_SUCCESS) - netresolve_backend_apply_hostent(query, &he6, 0, 0, 0, 0, 0); + netresolve_backend_apply_hostent(query, &he6, 0, 0, 0, 0, 0, 0); } } else if (node && priv->gethostbyname_r) { char buffer[SIZE]; @@ -181,7 +181,7 @@ start(netresolve_query_t query, char **settings) &he, buffer, sizeof buffer, &errnop, &h_errnop)); if (status == NSS_STATUS_SUCCESS) { - netresolve_backend_apply_hostent(query, &he, 0, 0, 0, 0, 0); + netresolve_backend_apply_hostent(query, &he, 0, 0, 0, 0, 0, 0); } } diff --git a/backends/numerichost.c b/backends/numerichost.c index dc1a642..45f6d7d 100644 --- a/backends/numerichost.c +++ b/backends/numerichost.c @@ -36,6 +36,6 @@ start(netresolve_query_t query, char **settings) return; } - netresolve_backend_add_path(query, family, &address, ifindex, 0, 0, 0, 0, 0); + netresolve_backend_add_path(query, family, &address, ifindex, 0, 0, 0, 0, 0, 0); netresolve_backend_finished(query); } diff --git a/backends/ubdns.c b/backends/ubdns.c index 6b9ef7b..941b56d 100644 --- a/backends/ubdns.c +++ b/backends/ubdns.c @@ -49,6 +49,7 @@ host_callback(void *arg, int status, struct ub_result* result) int port = -1; int priority = 0; int weight = 0; + int ttl = 0; switch (status) { case 0: @@ -56,7 +57,7 @@ host_callback(void *arg, int status, struct ub_result* result) char **data; for (data = result->data; *data; data++) - netresolve_backend_add_path(query, family, *data, 0, socktype, protocol, port, priority, weight); + netresolve_backend_add_path(query, family, *data, 0, socktype, protocol, port, priority, weight, ttl); } ub_resolve_free(result); break; diff --git a/backends/unix.c b/backends/unix.c index 38264cd..ccd3d44 100644 --- a/backends/unix.c +++ b/backends/unix.c @@ -38,6 +38,6 @@ start(netresolve_query_t query, char **settings) return; } - netresolve_backend_add_path(query, AF_UNIX, node, 0, socktype, 0, 0, 0, 0); + netresolve_backend_add_path(query, AF_UNIX, node, 0, socktype, 0, 0, 0, 0, 0); netresolve_backend_finished(query); } diff --git a/lib/backend.c b/lib/backend.c index be0a0c2..a3bee11 100644 --- a/lib/backend.c +++ b/lib/backend.c @@ -92,6 +92,9 @@ typedef struct { int family; const void *address; int ifindex; + int priority; + int weight; + int32_t ttl; } PathData; static void @@ -102,7 +105,7 @@ path_callback(int socktype, int protocol, int port, void *user_data) netresolve_backend_add_path(data->query, data->family, data->address, data->ifindex, socktype, protocol, port, - 0, 0); + data->priority, data->weight, data->ttl); } static int @@ -120,15 +123,14 @@ void netresolve_backend_add_path(netresolve_query_t query, int family, const void *address, int ifindex, int socktype, int protocol, int portnum, - int priority, int weight) + int priority, int weight, int32_t ttl) { struct netresolve_response *response = &query->response; - struct netresolve_path path; int i; if (family == AF_UNIX && !socktype) { - netresolve_backend_add_path(query, family, address, 0, SOCK_STREAM, 0, 0, 0, 0); - netresolve_backend_add_path(query, family, address, 0, SOCK_DGRAM, 0, 0, 0, 0); + netresolve_backend_add_path(query, family, address, 0, SOCK_STREAM, 0, 0, priority, weight, ttl); + netresolve_backend_add_path(query, family, address, 0, SOCK_DGRAM, 0, 0, priority, weight, ttl); return; } @@ -138,6 +140,9 @@ netresolve_backend_add_path(netresolve_query_t query, .family = family, .address = address, .ifindex = ifindex, + .priority = priority, + .weight = weight, + .ttl = ttl }; netresolve_get_service_info(path_callback, &data, query->request.servname, @@ -150,18 +155,26 @@ netresolve_backend_add_path(netresolve_query_t query, size_t length = family_to_length(family); - memset(&path, 0, sizeof path); - path.node.family = family; + struct netresolve_path path = { + .node = { + .family = family, + .address = { 0 }, + .ifindex = ifindex + }, + .service = { + .socktype = socktype, + .protocol = protocol, + .port = portnum + }, + .priority = priority, + .weight = weight, + .ttl = ttl + }; + if (length) memcpy(path.node.address, address, length); else strncpy(path.node.address, address, sizeof path.node.address); - path.node.ifindex = ifindex; - path.service.socktype = socktype; - path.service.protocol = protocol; - path.service.port = portnum; - path.priority = priority; - path.weight = weight; for (i = 0; i < response->pathcount; i++) if (path_cmp(&path, &response->paths[i]) < 0) @@ -388,7 +401,7 @@ void netresolve_backend_apply_hostent(netresolve_query_t query, const struct hostent *he, int socktype, int protocol, int port, - int priority, int weight) + int priority, int weight, int32_t ttl) { char **addr; @@ -396,7 +409,7 @@ netresolve_backend_apply_hostent(netresolve_query_t query, netresolve_backend_add_path(query, he->h_addrtype, *addr, 0, socktype, protocol, port, - priority, weight); + priority, weight, ttl); if (he->h_name) netresolve_backend_set_canonical_name(query, he->h_name); diff --git a/lib/netresolve-backend.h b/lib/netresolve-backend.h index 4a53635..80f8e49 100644 --- a/lib/netresolve-backend.h +++ b/lib/netresolve-backend.h @@ -48,7 +48,7 @@ bool netresolve_backend_get_dns_srv_lookup(netresolve_query_t query); void netresolve_backend_add_path(netresolve_query_t query, int family, const void *address, int ifindex, int socktype, int protocol, int port, - int priority, int weight); + int priority, int weight, int32_t ttl); void netresolve_backend_set_canonical_name(netresolve_query_t query, const char *canonical_name); /* Tools */ @@ -75,7 +75,7 @@ bool netresolve_backend_parse_path(const char *str, void netresolve_backend_apply_hostent(netresolve_query_t query, const struct hostent *he, int socktype, int protocol, int port, - int priority, int weight); + int priority, int weight, int32_t ttl); /* Backend function prototypes */ void start(netresolve_query_t query, char **settings);