diff options
author | Rob Landley | 2005-09-08 03:22:09 +0000 |
---|---|---|
committer | Rob Landley | 2005-09-08 03:22:09 +0000 |
commit | 230b411de87219f8a59e5d4061d7908cd44ed4d7 (patch) | |
tree | 53edbc78f93d74f86d9c76ed0536161aac7d4392 /networking/udhcp/options.c | |
parent | 658d2cf98616e377fdcf8cde380fec10d966a689 (diff) | |
download | busybox-230b411de87219f8a59e5d4061d7908cd44ed4d7.zip busybox-230b411de87219f8a59e5d4061d7908cd44ed4d7.tar.gz |
Fix the warning by rewriting the function to be smaller and simpler.
I'd appreciate somebody on a __BIG_ENDIAN platform testing this out; I haven't
got the hardware...
Diffstat (limited to 'networking/udhcp/options.c')
-rw-r--r-- | networking/udhcp/options.c | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/networking/udhcp/options.c b/networking/udhcp/options.c index ae98194..000f86c 100644 --- a/networking/udhcp/options.c +++ b/networking/udhcp/options.c @@ -149,37 +149,26 @@ int add_option_string(uint8_t *optionptr, uint8_t *string) /* add a one to four byte option to a packet */ int add_simple_option(uint8_t *optionptr, uint8_t code, uint32_t data) { - char length = 0; - int i; - uint8_t option[2 + 4]; - uint8_t *u8; - uint16_t *u16; - uint32_t *u32; - uint32_t aligned; - u8 = (uint8_t *) &aligned; - u16 = (uint16_t *) &aligned; - u32 = &aligned; - - for (i = 0; dhcp_options[i].code; i++) - if (dhcp_options[i].code == code) { - length = option_lengths[dhcp_options[i].flags & TYPE_MASK]; + struct dhcp_option *dh; + + for (dh=dhcp_options; dh->code; dh++) { + if (dh->code == code) { + uint8_t option[6], len; + + option[OPT_CODE] = code; + len = option_lengths[dh->flags & TYPE_MASK]; + option[OPT_LEN] = len; + if (__BYTE_ORDER == __BIG_ENDIAN) + data <<= 8 * (4 - len); + /* This memcpy is for broken processors which can't + * handle a simple unaligned 32-bit assignment */ + memcpy(&option[OPT_DATA], &data, 4); + return add_option_string(optionptr, option); } - - if (!length) { - DEBUG(LOG_ERR, "Could not add option 0x%02x", code); - return 0; } - option[OPT_CODE] = code; - option[OPT_LEN] = length; - - switch (length) { - case 1: *u8 = data; break; - case 2: *u16 = data; break; - case 4: *u32 = data; break; - } - memcpy(option + 2, &aligned, length); - return add_option_string(optionptr, option); + DEBUG(LOG_ERR, "Could not add option 0x%02x", code); + return 0; } |