]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: dns: give ability to dns_init_resolvers() to close a socket when requested
authorBaptiste Assmann <bedis9@gmail.com>
Thu, 2 Feb 2017 21:44:15 +0000 (22:44 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 3 Feb 2017 06:21:32 +0000 (07:21 +0100)
The function dns_init_resolvers() is used to initialize socket used to
send DNS queries.
This patch gives the function the ability to close a socket before
re-opening it.

[wt: this needs to be backported to 1.7 for next fix]

include/proto/dns.h
src/dns.c
src/haproxy.c

index c62834f94e464e3b75bbf37299229d27b03e2ab6..c7cd3564b2becbabcc7c22b428073bbe42514088 100644 (file)
@@ -30,7 +30,7 @@ int dns_str_to_dn_label_len(const char *string);
 int dns_hostname_validation(const char *string, char **err);
 int dns_build_query(int query_id, int query_type, char *hostname_dn, int hostname_dn_len, char *buf, int bufsize);
 struct task *dns_process_resolve(struct task *t);
-int dns_init_resolvers(void);
+int dns_init_resolvers(int close_socket);
 uint16_t dns_rnd16(void);
 int dns_validate_dns_response(unsigned char *resp, unsigned char *bufend, struct dns_response_packet *dns_p);
 int dns_get_ip_from_response(struct dns_response_packet *dns_p,
index 2a333f1d31bcd6928b1bcd70b6a6501247b8945f..5542b17c6f87f0c3fdf8bfc17f329f395439dfca 100644 (file)
--- a/src/dns.c
+++ b/src/dns.c
@@ -919,11 +919,13 @@ unsigned short dns_response_get_query_id(unsigned char *resp)
  * parses resolvers sections and initializes:
  *  - task (time events) for each resolvers section
  *  - the datagram layer (network IO events) for each nameserver
+ * It takes one argument:
+ *  - close_first takes 2 values: 0 or 1. If 1, the connection is closed first.
  * returns:
  *  0 in case of error
  *  1 when no error
  */
-int dns_init_resolvers(void)
+int dns_init_resolvers(int close_socket)
 {
        struct dns_resolvers *curr_resolvers;
        struct dns_nameserver *curnameserver;
@@ -961,7 +963,19 @@ int dns_init_resolvers(void)
                curr_resolvers->t = t;
 
                list_for_each_entry(curnameserver, &curr_resolvers->nameserver_list, list) {
-                       if ((dgram = calloc(1, sizeof(*dgram))) == NULL) {
+                       dgram = NULL;
+
+                       if (close_socket == 1) {
+                               if (curnameserver->dgram) {
+                                       close(curnameserver->dgram->t.sock.fd);
+                                       memset(curnameserver->dgram, '\0', sizeof(*dgram));
+                                       dgram = curnameserver->dgram;
+                               }
+                       }
+
+                       /* allocate memory only if it has not already been allocated
+                        * by a previous call to this function */
+                       if (!dgram && (dgram = calloc(1, sizeof(*dgram))) == NULL) {
                                Alert("Starting [%s/%s] nameserver: out of memory.\n", curr_resolvers->id,
                                                curnameserver->id);
                                return 0;
index 4ad370d655031417acadba2b9bcea9b490bb476e..6a8b5c2450c380c6d14e61aa944a0c5aac81e03c 100644 (file)
@@ -1176,7 +1176,7 @@ static void init(int argc, char **argv)
                exit(1);
 
        /* initialize structures for name resolution */
-       if (!dns_init_resolvers())
+       if (!dns_init_resolvers(0))
                exit(1);
 
        free(err_msg);