udhcpd: allow "domain" to be a list of DNS servers, not just one
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 2 Feb 2007 01:16:08 +0000 (01:16 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 2 Feb 2007 01:16:08 +0000 (01:16 -0000)
networking/udhcp/files.c
networking/udhcp/options.c

index 9ade4ae6d1c9c4bb4e2991b834f7b08b1bba9152..775f829dd8d4d7113f4ef9a0bb6c28f3909fee4b 100644 (file)
@@ -101,19 +101,8 @@ static void attach_option(struct option_set **opt_list,
 {
        struct option_set *existing, *new, **curr;
 
-       /* add it to an existing option */
        existing = find_option(*opt_list, option->code);
-       if (existing) {
-               DEBUG("Attaching option %s to existing member of list", option->name);
-               if (option->flags & OPTION_LIST) {
-                       if (existing->data[OPT_LEN] + length <= 255) {
-                               existing->data = realloc(existing->data,
-                                               existing->data[OPT_LEN] + length + 2);
-                               memcpy(existing->data + existing->data[OPT_LEN] + 2, buffer, length);
-                               existing->data[OPT_LEN] += length;
-                       } /* else, ignore the data, we could put this in a second option in the future */
-               } /* else, ignore the new data */
-       } else {
+       if (!existing) {
                DEBUG("Attaching option %s to list", option->name);
 
                /* make a new option */
@@ -129,7 +118,26 @@ static void attach_option(struct option_set **opt_list,
 
                new->next = *curr;
                *curr = new;
+               return;
        }
+
+       /* add it to an existing option */
+       DEBUG("Attaching option %s to existing member of list", option->name);
+       if (option->flags & OPTION_LIST) {
+               if (existing->data[OPT_LEN] + length <= 255) {
+                       existing->data = xrealloc(existing->data,
+                                       existing->data[OPT_LEN] + length + 3);
+                       if ((option->flags & TYPE_MASK) == OPTION_STRING) {
+                               if (existing->data[OPT_LEN] + length >= 255)
+                                       return;
+                               /* add space separator between STRING options in a list */
+                               existing->data[existing->data[OPT_LEN] + 2] = ' ';
+                               existing->data[OPT_LEN]++;
+                       }
+                       memcpy(existing->data + existing->data[OPT_LEN] + 2, buffer, length);
+                       existing->data[OPT_LEN] += length;
+               } /* else, ignore the data, we could put this in a second option in the future */
+       } /* else, ignore the new data */
 }
 
 
index 4a46da57928c68a1a43acfac88a7caab1bc44c72..bda6efc7e5cebb37a78f0a44faaefd44881590a9 100644 (file)
@@ -23,7 +23,7 @@ const struct dhcp_option dhcp_options[] = {
        {"lprsvr",      OPTION_IP | OPTION_LIST,                0x09},
        {"hostname",    OPTION_STRING | OPTION_REQ,             0x0c},
        {"bootsize",    OPTION_U16,                             0x0d},
-       {"domain",      OPTION_STRING | OPTION_REQ,             0x0f},
+       {"domain",      OPTION_STRING | OPTION_LIST | OPTION_REQ, 0x0f},
        {"swapsvr",     OPTION_IP,                              0x10},
        {"rootpath",    OPTION_STRING,                          0x11},
        {"ipttl",       OPTION_U8,                              0x17},