move a couple of functions from common code (options.c) to udhcpd private
code (files.c) to make udhcpc a little smaller.
This commit is contained in:
parent
28de951b02
commit
b6f71645f4
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -7,8 +7,8 @@
|
||||
#include <string.h>
|
||||
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user