aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/dhcpd.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 9ad95954d..3c2a9cb4e 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -27,6 +27,7 @@
//usage: "DHCP server\n"
//usage: "\n -f Run in foreground"
//usage: "\n -S Log to syslog too"
+//usage: "\n -I ADDR Local address"
//usage: IF_FEATURE_UDHCP_PORT(
//usage: "\n -P N Use port N (default 67)"
//usage: )
@@ -302,6 +303,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
unsigned num_ips;
unsigned opt;
struct option_set *option;
+ char *str_I = str_I;
IF_FEATURE_UDHCP_PORT(char *str_P;)
#if ENABLE_FEATURE_UDHCP_PORT
@@ -312,8 +314,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1
opt_complementary = "vv";
#endif
- opt = getopt32(argv, "fSv"
- IF_FEATURE_UDHCP_PORT("P:", &str_P)
+ opt = getopt32(argv, "fSI:v"
+ IF_FEATURE_UDHCP_PORT("P:")
+ , &str_I
+ IF_FEATURE_UDHCP_PORT(, &str_P)
IF_UDHCP_VERBOSE(, &dhcp_verbose)
);
if (!(opt & 1)) { /* no -f */
@@ -326,8 +330,13 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
openlog(applet_name, LOG_PID, LOG_DAEMON);
logmode |= LOGMODE_SYSLOG;
}
+ if (opt & 4) { /* -I */
+ len_and_sockaddr *lsa = xhost_and_af2sockaddr(str_I, 0, AF_INET);
+ server_config.server_nip = lsa->u.sin.sin_addr.s_addr;
+ free(lsa);
+ }
#if ENABLE_FEATURE_UDHCP_PORT
- if (opt & 8) { /* -P */
+ if (opt & 16) { /* -P */
SERVER_PORT = xatou16(str_P);
CLIENT_PORT = SERVER_PORT + 1;
}
@@ -367,7 +376,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
if (udhcp_read_interface(server_config.interface,
&server_config.ifindex,
- &server_config.server_nip,
+ (server_config.server_nip == 0 ? &server_config.server_nip : NULL),
server_config.server_mac)
) {
retval = 1;