From 39eb96e9ffa4ba768223383351dd3c0447163ee5 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Mon, 1 Dec 2008 19:06:24 +0000
Subject: [PATCH] Convert the public config struct to the same binary
 size/construct as in the latest releases to remain ABI compatible.

---
 ares/ares.h         |  1 -
 ares/ares_init.c    | 10 ++++++++--
 ares/ares_private.h |  2 ++
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/ares/ares.h b/ares/ares.h
index e2c7f4c051..0f162e2a12 100644
--- a/ares/ares.h
+++ b/ares/ares.h
@@ -185,7 +185,6 @@ struct ares_options {
   int timeout; /* in seconds or milliseconds, depending on options */
   int tries;
   int ndots;
-  int rotate;
   unsigned short udp_port;
   unsigned short tcp_port;
   int socket_send_buffer_size;
diff --git a/ares/ares_init.c b/ares/ares_init.c
index 7c355c39ee..55c0b93ab1 100644
--- a/ares/ares_init.c
+++ b/ares/ares_init.c
@@ -269,10 +269,14 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
   if (!ARES_CONFIG_CHECK(channel))
     return ARES_ENODATA;
 
+  /* Traditionally the optmask wasn't saved in the channel struct so it was
+     recreated here. ROTATE is the first option that has no struct field of
+     its own in the public config struct */
   (*optmask) = (ARES_OPT_FLAGS|ARES_OPT_TRIES|ARES_OPT_NDOTS|
                 ARES_OPT_UDP_PORT|ARES_OPT_TCP_PORT|ARES_OPT_SOCK_STATE_CB|
                 ARES_OPT_SERVERS|ARES_OPT_DOMAINS|ARES_OPT_LOOKUPS|
-                ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS);
+                ARES_OPT_SORTLIST|ARES_OPT_TIMEOUTMS) |
+    (channel->optmask & ARES_OPT_ROTATE);
 
   /* Copy easy stuff */
   options->flags   = channel->flags;
@@ -355,7 +359,7 @@ static int init_by_options(ares_channel channel,
   if ((optmask & ARES_OPT_NDOTS) && channel->ndots == -1)
     channel->ndots = options->ndots;
   if ((optmask & ARES_OPT_ROTATE) && channel->rotate == -1)
-    channel->rotate = options->rotate;
+    channel->rotate = 1;
   if ((optmask & ARES_OPT_UDP_PORT) && channel->udp_port == -1)
     channel->udp_port = options->udp_port;
   if ((optmask & ARES_OPT_TCP_PORT) && channel->tcp_port == -1)
@@ -431,6 +435,8 @@ static int init_by_options(ares_channel channel,
       channel->nsort = options->nsort;
     }
 
+  channel->optmask = optmask;
+
   return ARES_SUCCESS;
 }
 
diff --git a/ares/ares_private.h b/ares/ares_private.h
index a7be3f0eaf..bae0b077d4 100644
--- a/ares/ares_private.h
+++ b/ares/ares_private.h
@@ -263,6 +263,8 @@ struct ares_channeldata {
   int nsort;
   char *lookups;
 
+  int optmask; /* the option bitfield passed in at init time */
+
   /* Server addresses and communications state */
   struct server_state *servers;
   int nservers;
-- 
GitLab