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 "static_leases.h"
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
#include "files.h"
|
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "files.h"
|
||||||
#include "common.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 */
|
/* read a dhcp option and add it to opt_list */
|
||||||
static int read_opt(const char *const_line, void *arg)
|
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 write_leases(void);
|
||||||
void read_leases(const char *file);
|
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
|
#endif
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
#include "files.h"
|
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "files.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
|
||||||
@ -171,49 +171,3 @@ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data)
|
|||||||
return 0;
|
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 end_option(uint8_t *optionptr);
|
||||||
int add_option_string(uint8_t *optionptr, uint8_t *string);
|
int add_option_string(uint8_t *optionptr, uint8_t *string);
|
||||||
int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data);
|
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
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user