dhcpc: refactor xmalloc_optname_optval to shrink binary size
No binary (build failed)
—
(log yok)
| @@ -78,7 +78,7 @@ struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet { | |
| /*** Options ***/ | |
| enum { | |
| - | OPTION_IP = 1, |
| + | OPTION_IP = 0, |
| OPTION_IP_PAIR, | |
| OPTION_STRING, | |
| /* Opts of STRING_HOST type will be sanitized before they are passed | |
| @@ -208,9 +208,8 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ | |
| 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 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ | |
| * 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 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ | |
| /* 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 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ | |
| */ | |
| 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 | |