X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fudhcp%2Foptions.c;h=6526472297ed7b24c89d61fde99fad9ffec0af42;hb=e40c04b82695c1cde8ad9ed1e2aa1756463d73a7;hp=000f86c79abd79064bd221d191707271b5f423fe;hpb=230b411de87219f8a59e5d4061d7908cd44ed4d7;p=oweals%2Fbusybox.git diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c index 000f86c79..652647229 100644 --- a/networking/udhcp/options.c +++ b/networking/udhcp/options.c @@ -1,3 +1,4 @@ +/* vi: set sw=4 ts=4: */ /* * options.c -- DHCP server option packet tools * Rewrite by Russ Dill July 2001 @@ -6,10 +7,10 @@ #include #include +#include "common.h" #include "dhcpd.h" -#include "files.h" #include "options.h" -#include "common.h" +#include "files.h" /* supported options are easily added here */ @@ -72,12 +73,12 @@ uint8_t *get_option(struct dhcpMessage *packet, int code) length = 308; while (!done) { if (i >= length) { - LOG(LOG_WARNING, "bogus packet, option fields too long."); + bb_error_msg("Bogus packet, option fields too long"); return NULL; } if (optionptr[i + OPT_CODE] == code) { if (i + 1 + optionptr[i + OPT_LEN] >= length) { - LOG(LOG_WARNING, "bogus packet, option fields too long."); + bb_error_msg("Bogus packet, option fields too long"); return NULL; } return optionptr + i + 2; @@ -88,7 +89,7 @@ uint8_t *get_option(struct dhcpMessage *packet, int code) break; case DHCP_OPTION_OVER: if (i + 1 + optionptr[i + OPT_LEN] >= length) { - LOG(LOG_WARNING, "bogus packet, option fields too long."); + bb_error_msg("Bogus packet, option fields too long"); return NULL; } over = optionptr[i + 3]; @@ -136,10 +137,11 @@ int add_option_string(uint8_t *optionptr, uint8_t *string) /* end position + string length + option code/length + end option */ if (end + string[OPT_LEN] + 2 + 1 >= 308) { - LOG(LOG_ERR, "Option 0x%02x did not fit into the packet!", string[OPT_CODE]); + bb_error_msg("Option 0x%02x did not fit into the packet", + string[OPT_CODE]); return 0; } - DEBUG(LOG_INFO, "adding option 0x%02x", string[OPT_CODE]); + DEBUG("adding option 0x%02x", string[OPT_CODE]); memcpy(optionptr + end, string, string[OPT_LEN] + 2); optionptr[end + string[OPT_LEN] + 2] = DHCP_END; return string[OPT_LEN] + 2; @@ -154,12 +156,11 @@ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data) for (dh=dhcp_options; dh->code; dh++) { if (dh->code == code) { uint8_t option[6], len; - + option[OPT_CODE] = code; len = option_lengths[dh->flags & TYPE_MASK]; option[OPT_LEN] = len; - if (__BYTE_ORDER == __BIG_ENDIAN) - data <<= 8 * (4 - len); + if (BB_BIG_ENDIAN) data <<= 8 * (4 - len); /* This memcpy is for broken processors which can't * handle a simple unaligned 32-bit assignment */ memcpy(&option[OPT_DATA], &data, 4); @@ -167,53 +168,6 @@ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data) } } - DEBUG(LOG_ERR, "Could not add option 0x%02x", code); + bb_error_msg("Could not add option 0x%02x", code); return 0; } - - -/* find option 'code' in opt_list */ -struct option_set *find_option(struct option_set *opt_list, char code) -{ - while (opt_list && opt_list->data[OPT_CODE] < code) - opt_list = opt_list->next; - - if (opt_list && opt_list->data[OPT_CODE] == code) return opt_list; - else return NULL; -} - - -/* add an option to the opt_list */ -void attach_option(struct option_set **opt_list, struct dhcp_option *option, char *buffer, int length) -{ - struct option_set *existing, *new, **curr; - - /* add it to an existing option */ - if ((existing = find_option(*opt_list, option->code))) { - DEBUG(LOG_INFO, "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 { - DEBUG(LOG_INFO, "Attaching option %s to list", option->name); - - /* make a new option */ - new = xmalloc(sizeof(struct option_set)); - new->data = xmalloc(length + 2); - new->data[OPT_CODE] = option->code; - new->data[OPT_LEN] = length; - memcpy(new->data + 2, buffer, length); - - curr = opt_list; - while (*curr && (*curr)->data[OPT_CODE] < option->code) - curr = &(*curr)->next; - - new->next = *curr; - *curr = new; - } -}