← Commit list

6b5bd0e5a

Glenn L McGrath
Glenn L McGrath
2002-12-08
SOURCE BUG Duration: 6s

Subject

Support using ip in udhcpc scripts. Slightly modified version of patch by Bastian Blank

SOURCE BUG

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)

→ Bu hatanin tam hikayesini ve duzeltme diffini gor

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

networking/udhcp/Config.in+9 -0
@@ -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
networking/udhcp/options.c+6 -1
@@ -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},
networking/udhcp/options.h+3 -0
@@ -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];
networking/udhcp/script.c+44 -0
@@ -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;