diff --git a/client/dhclient.8 b/client/dhclient.8 index 7a3c154..e284210 100644 --- a/client/dhclient.8 +++ b/client/dhclient.8 @@ -64,6 +64,10 @@ dhclient - Dynamic Host Configuration Protocol Client .I port ] [ +.B -H +.I hostname +] +[ .B -d ] [ @@ -305,6 +309,10 @@ If a different port is specified on which the client should listen and transmit, the client will also use a different destination port - one less than the specified port. .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 \-s \ server Specify the server IP address or fully qualified domain name to use as a destination for DHCP protocol messages before diff --git a/client/dhclient.c b/client/dhclient.c index dc19e8b..bd02cc9 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -110,6 +110,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 */ @@ -220,6 +221,16 @@ main(int argc, char **argv) { if (++i == argc) usage(); mockup_relay = argv[i]; + } else if (!strcmp (argv[i], "-H")) { + if (++i == argc || !argv[i] || *(argv[i]) == '\0') + usage (); + if (strlen (argv[i]) > 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); + } + dhclient_hostname = argv [i]; } else if (!strcmp(argv[i], "-nw")) { nowait = 1; } else if (!strcmp(argv[i], "-n")) { @@ -468,6 +479,32 @@ 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(); @@ -676,12 +713,12 @@ static void usage() log_error("Usage: dhclient %s %s", #ifdef DHCPv6 - "[-4|-6] [-SNTP1dvrx] [-nw] [-p ] [-D LL|LLT]", + "[-4|-6] [-SNTP1dvrx] [-nw] [-H ] [-p ] [-D LL|LLT]", #else /* DHCPv6 */ - "[-1dvrx] [-nw] [-p ]", + "[-1dvrx] [-nw] [-H ] [-p ]", #endif /* DHCPv6 */ "[-s server]"); - log_error(" [-cf config-file] [-lf lease-file]%s", + log_error(" [-cf config-file] [-lf lease-file] %s", "[-pf pid-file] [-e VAR=val]"); log_fatal(" [-sf script-file] [interface]"); }