summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/files.c48
-rw-r--r--networking/udhcp/files.h3
-rw-r--r--networking/udhcp/options.c48
-rw-r--r--networking/udhcp/options.h2
4 files changed, 51 insertions, 50 deletions
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c
index 73a3bbc..33cd25a 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 279738a..4af61b0 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 000f86c..e81d0a7 100644
--- a/networking/udhcp/options.c
+++ b/networking/udhcp/options.c
@@ -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;
- }
-}
diff --git a/networking/udhcp/options.h b/networking/udhcp/options.h
index fbe54c8..4948bac 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