summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-05-20 13:07:19 +0200
committerTom Gundersen <teg@jklm.no>2014-05-20 23:31:22 +0200
commit32008a9636b3781112d349e77ee9e3279104b01c (patch)
treee514e89f89c5fb43151fbc746c67cc6ff5577a85
parent20b958bf157dfb2f521b191ef7158035bcaa3003 (diff)
sd-dhcp: refactor parse_options
Similar to the previous patch, exchange a length and a pointer with only one offset variable. Also fix the type of the options to be uint8_t[], rather than uint8_t*.
-rw-r--r--src/libsystemd-network/dhcp-option.c82
1 files changed, 41 insertions, 41 deletions
diff --git a/src/libsystemd-network/dhcp-option.c b/src/libsystemd-network/dhcp-option.c
index 7bf8812676..68950923dd 100644
--- a/src/libsystemd-network/dhcp-option.c
+++ b/src/libsystemd-network/dhcp-option.c
@@ -60,86 +60,86 @@ int dhcp_option_append(uint8_t options[], size_t size, size_t *offset,
return 0;
}
-static int parse_options(const uint8_t *buf, size_t buflen, uint8_t *overload,
+static int parse_options(const uint8_t options[], size_t buflen, uint8_t *overload,
uint8_t *message_type, dhcp_option_cb_t cb,
- void *user_data)
-{
- const uint8_t *code = buf;
- const uint8_t *len;
+ void *user_data) {
+ uint8_t code, len;
+ size_t offset = 0;
- while (buflen > 0) {
- switch (*code) {
+ while (offset < buflen) {
+ switch (options[offset]) {
case DHCP_OPTION_PAD:
- buflen -= 1;
- code++;
+ offset++;
+
break;
case DHCP_OPTION_END:
return 0;
case DHCP_OPTION_MESSAGE_TYPE:
- if (buflen < 3)
+ if (buflen < offset + 3)
return -ENOBUFS;
- buflen -= 3;
- len = code + 1;
- if (*len != 1)
+ len = options[++offset];
+ if (len != 1)
return -EINVAL;
if (message_type)
- *message_type = *(len + 1);
+ *message_type = options[++offset];
+ else
+ offset++;
- code += 3;
+ offset++;
break;
case DHCP_OPTION_OVERLOAD:
- if (buflen < 3)
+ if (buflen < offset + 3)
return -ENOBUFS;
- buflen -= 3;
- len = code + 1;
- if (*len != 1)
+ len = options[++offset];
+ if (len != 1)
return -EINVAL;
if (overload)
- *overload = *(len + 1);
+ *overload = options[++offset];
+ else
+ offset++;
- code += 3;
+ offset++;
break;
default:
- if (buflen < 3)
+ if (buflen < offset + 3)
return -ENOBUFS;
- len = code + 1;
+ code = options[offset];
+ len = options[++offset];
- if (buflen < (size_t)*len + 2)
+ if (buflen < ++offset + len)
return -EINVAL;
- buflen -= *len + 2;
if (cb)
- cb(*code, *len, len + 1, user_data);
+ cb(code, len, &options[offset], user_data);
- code += *len + 2;
+ offset += len;
break;
}
}
- if (buflen)
+ if (offset < buflen)
return -EINVAL;
return 0;
}
int dhcp_option_parse(DHCPMessage *message, size_t len,
- dhcp_option_cb_t cb, void *user_data)
-{
+ dhcp_option_cb_t cb, void *user_data) {
uint8_t overload = 0;
uint8_t message_type = 0;
- int res;
+ int r;
if (!message)
return -EINVAL;
@@ -149,23 +149,23 @@ int dhcp_option_parse(DHCPMessage *message, size_t len,
len -= sizeof(DHCPMessage);
- res = parse_options(message->options, len, &overload, &message_type,
- cb, user_data);
- if (res < 0)
- return res;
+ r = parse_options(message->options, len, &overload, &message_type,
+ cb, user_data);
+ if (r < 0)
+ return r;
if (overload & DHCP_OVERLOAD_FILE) {
- res = parse_options(message->file, sizeof(message->file),
+ r = parse_options(message->file, sizeof(message->file),
NULL, &message_type, cb, user_data);
- if (res < 0)
- return res;
+ if (r < 0)
+ return r;
}
if (overload & DHCP_OVERLOAD_SNAME) {
- res = parse_options(message->sname, sizeof(message->sname),
+ r = parse_options(message->sname, sizeof(message->sname),
NULL, &message_type, cb, user_data);
- if (res < 0)
- return res;
+ if (r < 0)
+ return r;
}
if (message_type)