svn commit: trunk/busybox/networking/udhcp

landley at busybox.net landley at busybox.net
Thu Sep 8 03:22:10 UTC 2005


Author: landley
Date: 2005-09-07 20:22:09 -0700 (Wed, 07 Sep 2005)
New Revision: 11387

Log:
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...


Modified:
   trunk/busybox/networking/udhcp/options.c


Changeset:
Modified: trunk/busybox/networking/udhcp/options.c
===================================================================
--- trunk/busybox/networking/udhcp/options.c	2005-09-08 03:21:02 UTC (rev 11386)
+++ trunk/busybox/networking/udhcp/options.c	2005-09-08 03:22:09 UTC (rev 11387)
@@ -149,37 +149,26 @@
 /* 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;
+	struct dhcp_option *dh;
 
-	for (i = 0; dhcp_options[i].code; i++)
-		if (dhcp_options[i].code == code) {
-			length = option_lengths[dhcp_options[i].flags & TYPE_MASK];
+	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;
 }
 
 




More information about the busybox-cvs mailing list