diff options
Diffstat (limited to 'networking/udhcp/files.c')
-rw-r--r-- | networking/udhcp/files.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 5026598d7..63c90647d 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c | |||
@@ -71,7 +71,7 @@ static int read_yn(const char *line, void *arg) | |||
71 | 71 | ||
72 | 72 | ||
73 | /* find option 'code' in opt_list */ | 73 | /* find option 'code' in opt_list */ |
74 | struct option_set *find_option(struct option_set *opt_list, char code) | 74 | struct option_set *find_option(struct option_set *opt_list, uint8_t code) |
75 | { | 75 | { |
76 | while (opt_list && opt_list->data[OPT_CODE] < code) | 76 | while (opt_list && opt_list->data[OPT_CODE] < code) |
77 | opt_list = opt_list->next; | 77 | opt_list = opt_list->next; |
@@ -154,31 +154,29 @@ static int read_opt(const char *const_line, void *arg) | |||
154 | { | 154 | { |
155 | struct option_set **opt_list = arg; | 155 | struct option_set **opt_list = arg; |
156 | char *opt, *val, *endptr; | 156 | char *opt, *val, *endptr; |
157 | const struct dhcp_option *option; | ||
158 | int retval = 0, length; | ||
159 | char buffer[8]; | ||
160 | char *line; | 157 | char *line; |
158 | const struct dhcp_option *option; | ||
159 | int retval, length, idx; | ||
160 | char buffer[8] __attribute__((aligned(4))); | ||
161 | uint16_t *result_u16 = (uint16_t *) buffer; | 161 | uint16_t *result_u16 = (uint16_t *) buffer; |
162 | uint32_t *result_u32 = (uint32_t *) buffer; | 162 | uint32_t *result_u32 = (uint32_t *) buffer; |
163 | 163 | ||
164 | /* Cheat, the only const line we'll actually get is "" */ | 164 | /* Cheat, the only const line we'll actually get is "" */ |
165 | line = (char *) const_line; | 165 | line = (char *) const_line; |
166 | opt = strtok(line, " \t="); | 166 | opt = strtok(line, " \t="); |
167 | if (!opt) return 0; | 167 | if (!opt) |
168 | return 0; | ||
168 | 169 | ||
169 | option = dhcp_options; | 170 | idx = index_in_strings(opt, dhcp_option_strings); /* NB: was strcasecmp! */ |
170 | while (1) { | 171 | if (idx < 0) |
171 | if (!option->code) | 172 | return 0; |
172 | return 0; | 173 | option = &dhcp_options[idx]; |
173 | if (!strcasecmp(option->opt_name, opt)) | ||
174 | break; | ||
175 | option++; | ||
176 | } | ||
177 | 174 | ||
175 | retval = 0; | ||
178 | do { | 176 | do { |
179 | val = strtok(NULL, ", \t"); | 177 | val = strtok(NULL, ", \t"); |
180 | if (!val) break; | 178 | if (!val) break; |
181 | length = option_lengths[option->flags & TYPE_MASK]; | 179 | length = dhcp_option_lengths[option->flags & TYPE_MASK]; |
182 | retval = 0; | 180 | retval = 0; |
183 | opt = buffer; /* new meaning for variable opt */ | 181 | opt = buffer; /* new meaning for variable opt */ |
184 | switch (option->flags & TYPE_MASK) { | 182 | switch (option->flags & TYPE_MASK) { |