dhcpc: refactor xmalloc_optname_optval to shrink binary size
function old new delta
len_of_option_as_string 14 13 -1
dhcp_option_lengths 14 13 -1
udhcp_str2optset 641 637 -4
static.xmalloc_optname_optval 777 718 -59
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-65) Total: -65 bytes
Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 6422181..102178a 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -208,9 +208,8 @@
case OPTION_IP:
case OPTION_IP_PAIR:
dest += sprint_nip(dest, "", option);
- if (type == OPTION_IP)
- break;
- dest += sprint_nip(dest, "/", option + 4);
+ if (type == OPTION_IP_PAIR)
+ dest += sprint_nip(dest, "/", option + 4);
break;
// case OPTION_BOOLEAN:
// dest += sprintf(dest, *option ? "yes" : "no");
@@ -312,7 +311,7 @@
* IPv4MaskLen <= 32,
* 6rdPrefixLen <= 128,
* 6rdPrefixLen + (32 - IPv4MaskLen) <= 128
- * (2nd condition need no check - it follows from 1st and 3rd).
+ * (2nd condition needs no check - it follows from 1st and 3rd).
* Else, return envvar with empty value ("optname=")
*/
if (len >= (1 + 1 + 16 + 4)
@@ -326,17 +325,12 @@
/* 6rdPrefix */
dest += sprint_nip6(dest, /* "", */ option);
option += 16;
- len -= 1 + 1 + 16 + 4;
- /* "+ 4" above corresponds to the length of IPv4 addr
- * we consume in the loop below */
- while (1) {
- /* 6rdBRIPv4Address(es) */
- dest += sprint_nip(dest, " ", option);
- option += 4;
- len -= 4; /* do we have yet another 4+ bytes? */
- if (len < 0)
- break; /* no */
- }
+ len -= 1 + 1 + 16;
+ *dest++ = ' ';
+ /* 6rdBRIPv4Address(es), use common IPv4 logic to process them */
+ type = OPTION_IP;
+ optlen = 4;
+ continue;
}
return ret;
@@ -358,23 +352,18 @@
*/
option++;
len--;
+ if (option[-1] == 1) {
+ /* use common IPv4 logic to process IP addrs */
+ type = OPTION_IP;
+ optlen = 4;
+ continue;
+ }
if (option[-1] == 0) {
dest = dname_dec(option, len, ret);
if (dest) {
free(ret);
return dest;
}
- } else
- if (option[-1] == 1) {
- const char *pfx = "";
- while (1) {
- len -= 4;
- if (len < 0)
- break;
- dest += sprint_nip(dest, pfx, option);
- pfx = " ";
- option += 4;
- }
}
return ret;
#endif