diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-02 01:16:08 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-02-02 01:16:08 +0000 |
commit | c4d606e3678333fe07348904d1e2222cf43c5e31 (patch) | |
tree | 927d83d07d37b508ca6d507763c0dbbf0641ee5a /networking | |
parent | de55b5d014ac8800f0e7bfffa9a74d93beec28af (diff) | |
download | busybox-c4d606e3678333fe07348904d1e2222cf43c5e31.tar.gz |
udhcpd: allow "domain" to be a list of DNS servers, not just one
Diffstat (limited to 'networking')
-rw-r--r-- | networking/udhcp/files.c | 32 | ||||
-rw-r--r-- | networking/udhcp/options.c | 2 |
2 files changed, 21 insertions, 13 deletions
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 9ade4ae6d..775f829dd 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -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 */ } diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c index 4a46da579..bda6efc7e 100644 --- a/networking/udhcp/options.c +++ b/networking/udhcp/options.c @@ -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}, |