Sisyphus repository
Last update: 1 october 2023 | SRPMs: 18631 | Visits: 37764901
en ru br
ALT Linux repos
S:4.4.3.P1-alt1
5.0: 3.0.7-alt1
4.1: 3.0.6-alt2.M41.1
4.0: 3.0.6-alt1
3.0: 3.0.2-alt1

Group :: System/Servers
RPM: dhcp

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs and FR  Repocop 

Patch: 0026-dhclient-Add-onetime-and-nounicast-options.patch
Download


From 0 Mon Sep 17 00:00:00 2001
From: Mikhail Efremov <sem@altlinux.org>
Date: Wed, 30 Aug 2017 17:36:11 +0300
Subject: [PATCH 26] dhclient: Add --onetime and --nounicast options
Thanks gremlin@.
diff --git a/dhcp/client/dhclient.8 b/dhcp/client/dhclient.8
index defaced..defaced 100644
--- a/dhcp/client/dhclient.8
+++ b/dhcp/client/dhclient.8
@@ -94,6 +94,12 @@ dhclient - Dynamic Host Configuration Protocol Client
 .B -1
 ]
 [
+.B --onetime
+]
+[
+.B --nounicast
+]
+[
 .B -r
 |
 .B -x
@@ -297,6 +303,9 @@ sets the maximum duration of the initial exchange to
 .I timeout
 (from dhclient.conf with a default of sixty seconds).
 .TP
+.BI \--onetime,\ \-onetime
+Similar to above, but on successful configuration exit with code 0.
+.TP
 .BI \-d
 .\" This is not intuitive.
 Force
@@ -398,6 +407,10 @@ combination with the
 .B -w
 flag.
 .TP
+.BI \--nounicast,\ \-nounicast
+Do not send unicast requests for refreshing the configuration.
+Makes sense when connected to the switch acting as a DHCP Relay.
+.TP
 .BI \-e \ VAR=value
 Define additional environment variables for the environment where
 .B dhclient-script
diff --git a/dhcp/client/dhclient.c b/dhcp/client/dhclient.c
index defaced..defaced 100644
--- a/dhcp/client/dhclient.c
+++ b/dhcp/client/dhclient.c
@@ -100,6 +100,8 @@ int dfd[2] = { -1, -1 };
 struct string_list *client_env = NULL;
 int client_env_count = 0;
 int onetry = 0;
+int onetime = 0;		/* get address and exit; implies onetry */
+int do_unicast = 1;
 int quiet = 1;
 int nowait = 0;
 int stateless = 0;
@@ -195,6 +197,7 @@ static const char use_v6command[] = "Command not used for DHCPv4: %s";
 #endif
 
 #define DHCLIENT_USAGEC \
+"                [--nounicast] [--onetime]\n" \
 "                [-s server-addr] [-cf config-file]\n" \
 "                [-df duid-file] [-lf lease-file]\n" \
 "                [-pf pid-file] [--no-pid] [-e VAR=val]\n" \
@@ -447,6 +450,10 @@ main(int argc, char **argv) {
 			no_dhclient_script = 1;
 		} else if (!strcmp(argv[i], "-1")) {
 			onetry = 1;
+		} else if (!strcmp(argv[i], "--onetime") || !strcmp(argv[i], "-onetime")) {
+			onetime = onetry = 1;
+		} else if (!strcmp(argv[i], "--nounicast") || !strcmp(argv[i], "-nounicast")) {
+			do_unicast = 0;
 		} else if (!strcmp(argv[i], "-q")) {
 			quiet = 1;
 		} else if (!strcmp(argv[i], "-s")) {
@@ -1982,6 +1989,12 @@ void bind_lease (client)
 	      (long)(client->active->renewal - cur_time));
 	client->state = S_BOUND;
 	reinitialize_interfaces();
+
+	if (onetime)
+	{
+		exit(0);
+	}
+
 	detach();
 #if defined (NSUPDATE)
 	if (client->config->do_forward_update)
@@ -2016,7 +2029,7 @@ void state_bound (cpp)
 				   client, (struct option_state *)0,
 				   client -> active -> options,
 				   &global_scope, oc, MDL)) {
-		if (ds.len > 3) {
+		if (ds.len > 3 && do_unicast) {
 			memcpy (client -> destination.iabuf, ds.data, 4);
 			client -> destination.len = 4;
 		} else
@@ -3198,6 +3211,7 @@ void send_request (cpp)
 	   broadcast the DHCPREQUEST rather than unicasting. */
 	if (client -> state == S_REQUESTING ||
 	    client -> state == S_REBOOTING ||
+	    !do_unicast ||
 	    cur_time > client -> active -> rebind)
 		destination.sin_addr = sockaddr_broadcast.sin_addr;
 	else
 
design & coding: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
current maintainer: Michael Shigorin