diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 73a3bbc6e..33cd25aff 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -15,8 +15,8 @@ #include "static_leases.h" #include "dhcpd.h" -#include "files.h" #include "options.h" +#include "files.h" #include "common.h" /* @@ -93,6 +93,52 @@ static int read_yn(const char *line, void *arg) } +/* 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; + } +} + /* read a dhcp option and add it to opt_list */ static int read_opt(const char *const_line, void *arg) { diff --git a/networking/udhcp/files.h b/networking/udhcp/files.h index 279738adf..4af61b005 100644 --- a/networking/udhcp/files.h +++ b/networking/udhcp/files.h @@ -14,4 +14,7 @@ int read_config(const char *file); void write_leases(void); void read_leases(const char *file); +struct option_set *find_option(struct option_set *opt_list, char code); +void attach_option(struct option_set **opt_list, struct dhcp_option *option, char *buffer, int length); + #endif diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c index 000f86c79..e81d0a757 100644 --- a/networking/udhcp/options.c +++ b/networking/udhcp/options.c @@ -7,8 +7,8 @@ #include #include "dhcpd.h" -#include "files.h" #include "options.h" +#include "files.h" #include "common.h" @@ -171,49 +171,3 @@ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data) 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; - } -} diff --git a/networking/udhcp/options.h b/networking/udhcp/options.h index fbe54c884..4948bac00 100644 --- a/networking/udhcp/options.h +++ b/networking/udhcp/options.h @@ -34,7 +34,5 @@ uint8_t *get_option(struct dhcpMessage *packet, int code); int end_option(uint8_t *optionptr); int add_option_string(uint8_t *optionptr, uint8_t *string); int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data); -struct option_set *find_option(struct option_set *opt_list, char code); -void attach_option(struct option_set **opt_list, struct dhcp_option *option, char *buffer, int length); #endif