diff options
-rw-r--r-- | networking/udhcp/files.c | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 5cb4683..f24f01c 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -71,83 +71,84 @@ static int read_yn(const char *line, void *arg) /* read a dhcp option and add it to opt_list */ static int read_opt(const char *const_line, void *arg) { - char line[READ_CONFIG_BUF_SIZE]; + char line[READ_CONFIG_BUF_SIZE]; struct option_set **opt_list = arg; char *opt, *val, *endptr; - struct dhcp_option *option; - int retval = 0, length; - char buffer[256]; /* max opt length */ + struct dhcp_option *option; + int retval = 0, length; + char buffer[256]; /* max opt length */ u_int16_t result_u16; u_int32_t result_u32; - void *valptr; + void *valptr; - if ((opt = strtok(strcpy(line, const_line), " \t="))) { + if (!(opt = strtok(strcpy(line, const_line), " \t="))) return 0; for (option = dhcp_options; option->code; option++) if (!strcasecmp(option->name, opt)) break; - if (option->code) do { + if (!option->code) return 0; + + do { val = strtok(NULL, ", \t"); if(!val) break; - length = option_lengths[option->flags & TYPE_MASK]; + length = option_lengths[option->flags & TYPE_MASK]; valptr = NULL; - switch (option->flags & TYPE_MASK) { - case OPTION_IP: - retval = read_ip(val, buffer); - break; - case OPTION_IP_PAIR: - retval = read_ip(val, buffer); - if (!(val = strtok(NULL, ", \t/-"))) retval = 0; - if (retval) retval = read_ip(val, buffer + 4); - break; - case OPTION_STRING: - length = strlen(val); - if (length > 0) { - if (length > 254) length = 254; + switch (option->flags & TYPE_MASK) { + case OPTION_IP: + retval = read_ip(val, buffer); + break; + case OPTION_IP_PAIR: + retval = read_ip(val, buffer); + if (!(val = strtok(NULL, ", \t/-"))) retval = 0; + if (retval) retval = read_ip(val, buffer + 4); + break; + case OPTION_STRING: + length = strlen(val); + if (length > 0) { + if (length > 254) length = 254; endptr = buffer + length; endptr[0] = 0; valptr = val; - } - break; - case OPTION_BOOLEAN: - retval = read_yn(val, buffer); - break; - case OPTION_U8: - buffer[0] = strtoul(val, &endptr, 0); + } + break; + case OPTION_BOOLEAN: + retval = read_yn(val, buffer); + break; + case OPTION_U8: + buffer[0] = strtoul(val, &endptr, 0); valptr = buffer; - break; - case OPTION_U16: - result_u16 = htons(strtoul(val, &endptr, 0)); + break; + case OPTION_U16: + result_u16 = htons(strtoul(val, &endptr, 0)); valptr = &result_u16; - break; - case OPTION_S16: - result_u16 = htons(strtol(val, &endptr, 0)); + break; + case OPTION_S16: + result_u16 = htons(strtol(val, &endptr, 0)); valptr = &result_u16; - break; - case OPTION_U32: - result_u32 = htonl(strtoul(val, &endptr, 0)); + break; + case OPTION_U32: + result_u32 = htonl(strtoul(val, &endptr, 0)); valptr = &result_u32; - break; - case OPTION_S32: - result_u32 = htonl(strtol(val, &endptr, 0)); + break; + case OPTION_S32: + result_u32 = htonl(strtol(val, &endptr, 0)); valptr = &result_u32; - break; - default: + break; + default: retval = 0; - break; - } - if(valptr) { + break; + } + if (valptr) { memcpy(buffer, valptr, length); retval = (endptr[0] == '\0'); } - if (retval) - attach_option(opt_list, option, buffer, length); + if (retval) + attach_option(opt_list, option, buffer, length); else break; } while (option->flags & OPTION_LIST); - } return retval; } |