LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File dhcp-4.2.2-dhclient-send-hostname-rml.diff of Package dhcp.219 (Project openSUSE:12.1:Update)

diff --git a/client/dhclient.8 b/client/dhclient.8
index 6306b08..1394c38 100644
--- a/client/dhclient.8
+++ b/client/dhclient.8
@@ -60,6 +60,10 @@ dhclient - Dynamic Host Configuration Protocol Client
 .I LL|LLT
 ]
 [
+.B -H
+.I hostname
+]
+[
 .B -p
 .I port
 ]
@@ -299,6 +303,10 @@ PID file.  When shutdown via this method
 .B dhclient-script(8)
 will be executed with the specific reason for calling the script set.
 .TP
+.BI \-H \ hostname
+This flag may be used to specify a client hostname that should be sent to
+the DHCP server. Note, that this option is a SUSE/Novell extension.
+.TP
 .BI \-p \ port
 The UDP port number on which the DHCP client should listen and transmit.
 If unspecified,
diff --git a/client/dhclient.c b/client/dhclient.c
index 9b53f07..9fd7ccc 100644
--- a/client/dhclient.c
+++ b/client/dhclient.c
@@ -119,6 +119,7 @@ main(int argc, char **argv) {
 	int no_dhclient_db = 0;
 	int no_dhclient_pid = 0;
 	int no_dhclient_script = 0;
+	char *dhclient_hostname = NULL;
 #ifdef DHCPv6
 	int local_family_set = 0;
 #endif /* DHCPv6 */
@@ -231,6 +232,22 @@ main(int argc, char **argv) {
 			if (++i == argc)
 				usage();
 			mockup_relay = argv[i];
+		} else if (!strcmp (argv[i], "-H")) {
+			size_t len;
+			if (++i == argc || !argv[i] || *(argv[i]) == '\0')
+				usage ();
+			len = strlen (argv[i]);
+			if (len > HOST_NAME_MAX) {
+				log_error("-H option host-name string \"%s\" is too long:"
+				          "maximum length is %d characters",
+					  argv[i], HOST_NAME_MAX);
+				exit(1);
+			} else if(check_domain_name(argv[i], len, 0) != 0) {
+				log_error("suspect host-name in -H \"%s\"",
+				          argv[i]);
+				exit(1);
+			}
+			dhclient_hostname = argv [i];
 		} else if (!strcmp(argv[i], "-nw")) {
 			nowait = 1;
 		} else if (!strcmp(argv[i], "-n")) {
@@ -484,6 +501,35 @@ main(int argc, char **argv) {
 	/* Parse the dhclient.conf file. */
 	read_client_conf();
 
+	/* If the user specified a hostname, send it here and now */
+	if ((dhclient_hostname != NULL) && (*dhclient_hostname != '\0') ) {
+		struct parse *cfile = NULL;
+		char buf[HOST_NAME_MAX + 40];
+		int len;
+
+		snprintf (buf, sizeof(buf), "send host-name \"%s\";",
+				dhclient_hostname);
+		len = strlen(buf);
+
+		status = new_parse (&cfile, -1, buf, len,
+					"host-name option", 0);
+		if (status != ISC_R_SUCCESS)
+			log_fatal ("Cannot parse send host-name statement!");
+
+		for (;;) {
+			const char *val = NULL;
+			int token;
+
+			token = peek_token (&val, (unsigned *)0, cfile);
+			if (token == END_OF_FILE)
+				break;
+
+			parse_client_statement (cfile, NULL,
+						&top_level_config);
+		}
+		end_parse (&cfile);
+	}
+
 	/* Parse the lease database. */
 	read_client_leases();
 
@@ -708,9 +754,9 @@ static void usage()
 
 	log_fatal("Usage: dhclient "
 #ifdef DHCPv6
-		  "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>] [-D LL|LLT]\n"
+		  "[-4|-6] [-SNTP1dvrx] [-nw] [-H <hostname>] [-p <port>] [-D LL|LLT]\n"
 #else /* DHCPv6 */
-		  "[-1dvrx] [-nw] [-p <port>]\n"
+		  "[-1dvrx] [-nw] [-H <hostname>] [-p <port>]\n"
 #endif /* DHCPv6 */
 		  "                [-s server-addr] [-cf config-file] "
 		  "[-lf lease-file]\n"