Support using ip in udhcpc scripts. Slightly modified version of patch by Bastian Blank
This commit was genuinely broken at the time (not related to our build system): sysdeps/linux/Config.in "fileutils/Config.in" dosyasini kaynak gosteriyor ama bu dosya repoda hic var olmadi (2002-12-05 - 2003-02-15 arasi orijinal yazar hatasi, 3238ea167 ile duzeltildi)
No binary (build failed)
—
(log yok)
| @@ -38,5 +38,14 @@ config CONFIG_FEATURE_UDHCP_DEBUG | |
| help | |
| Please submit a patch to add help text for this item. | |
| + | config CONFIG_FEATURE_UDHCPC_IP |
| + | bool " Compile udhcpc with ip support" |
| + | default n |
| + | depends on CONFIG_UDHCPC |
| + | help |
| + | Say yes if you are using the ip command instead of route and ifconfig |
| + | in your scripts to bring up the interface. |
| + | This is needed as ip wants the subnet as a bitprefix not an ip value. |
| + | |
| endmenu | |
| @@ -13,11 +13,16 @@ | |
| #include "options.h" | |
| #include "leases.h" | |
| + | #include "config.h" |
| /* supported options are easily added here */ | |
| struct dhcp_option options[] = { | |
| /* name[10] flags code */ | |
| - | {"subnet", OPTION_IP | OPTION_REQ, 0x01}, |
| + | #ifdef CONFIG_FEATURE_UDHCPC_IP |
| + | {"subnet", OPTION_IP | OPTION_REQ | OPTION_PREFIX, 0x01}, |
| + | #else |
| + | {"subnet", OPTION_IP | OPTION_REQ, 0x01}, |
| + | #endif |
| {"timezone", OPTION_S32, 0x02}, | |
| {"router", OPTION_IP | OPTION_LIST | OPTION_REQ, 0x03}, | |
| {"timesvr", OPTION_IP | OPTION_LIST, 0x04}, | |
| @@ -4,6 +4,8 @@ | |
| #include "packet.h" | |
| + | #include "config.h" |
| + | |
| #define TYPE_MASK 0x0F | |
| enum { | |
| @@ -20,6 +22,7 @@ enum { | |
| #define OPTION_REQ 0x10 /* have the client request this option */ | |
| #define OPTION_LIST 0x20 /* There can be a list of 1 or more of these */ | |
| + | #define OPTION_PREFIX 0x40 /* ip wants a prefix instead of a ip for subnet */ |
| struct dhcp_option { | |
| char name[10]; | |
| @@ -37,6 +37,8 @@ | |
| #include "options.h" | |
| #include "debug.h" | |
| + | #include "config.h" |
| + | |
| /* get a rough idea of how long an option will be (rounding up...) */ | |
| static int max_option_length[] = { | |
| [OPTION_IP] = sizeof("255.255.255.255 "), | |
| @@ -62,6 +64,37 @@ static int sprintip(char *dest, char *pre, unsigned char *ip) { | |
| return sprintf(dest, "%s%d.%d.%d.%d ", pre, ip[0], ip[1], ip[2], ip[3]); | |
| } | |
| + | #ifdef CONFIG_FEATURE_UDHCPC_IP |
| + | /* convert a netmask (255.255.255.0) into the length (24) */ |
| + | static int inet_ntom (const char *src, short *dst) |
| + | { |
| + | in_addr_t mask, num; |
| + | |
| + | mask = ntohl(*(unsigned int *)src); |
| + | |
| + | for (num = mask; num & 1; num >>= 1); |
| + | |
| + | if (num != 0 && mask != 0) |
| + | { |
| + | for (num = ~mask; num & 1; num >>= 1); |
| + | if (num) |
| + | return 0; |
| + | } |
| + | |
| + | for (num = 0; mask; mask <<= 1) |
| + | num++; |
| + | |
| + | *dst = num; |
| + | |
| + | return 1; |
| + | } |
| + | |
| + | static int sprintprefix(char *dest, char *pre, unsigned char *ip) { |
| + | short sdest = 0; |
| + | inet_ntom(ip, &sdest); |
| + | return sprintf(dest, "%s%hd ", pre, sdest); |
| + | } |
| + | #endif |
| /* Fill dest with the text of option 'option'. */ | |
| static void fill_options(char *dest, unsigned char *option, struct dhcp_option *type_p) | |
| @@ -84,9 +117,20 @@ static void fill_options(char *dest, unsigned char *option, struct dhcp_option * | |
| *(dest++) = '/'; | |
| option += 4; | |
| optlen = 4; | |
| + | #ifndef CONFIG_FEATURE_UDHCPC_IP |
| case OPTION_IP: /* Works regardless of host byte order. */ | |
| + | #endif |
| dest += sprintip(dest, "", option); | |
| break; | |
| + | #ifdef CONFIG_FEATURE_UDHCPC_IP |
| + | case OPTION_IP: /* Works regardless of host byte order. */ |
| + | if (type_p->flags & OPTION_PREFIX) { |
| + | dest += sprintprefix(dest, "", option); |
| + | } else { |
| + | dest += sprintip(dest, "", option); |
| + | } |
| + | break; |
| + | #endif |
| case OPTION_BOOLEAN: | |
| dest += sprintf(dest, *option ? "yes " : "no "); | |
| break; | |