diff --git a/include/usage.h b/include/usage.h index 363b01cdd..21980eeba 100644 --- a/include/usage.h +++ b/include/usage.h @@ -2931,9 +2931,10 @@ "Adjust filesystem options on ext[23] filesystems.\n\n" #define udhcpc_trivial_usage \ - "[-fbnqv] [-c CLIENTID] [-H HOSTNAME] [-i INTERFACE]\n[-p pidfile] [-r IP] [-s script]" + "[-Cfbnqv] [-c CLIENTID] [-H HOSTNAME] [-i INTERFACE]\n[-p pidfile] [-r IP] [-s script]" #define udhcpc_full_usage \ - "\t-c,\t--clientid=CLIENTID\tClient identifier\n" \ + "\t-c,\t--clientid=CLIENTID\tSet client identifier\n" \ + "\t-C,\t--clientid-none\tSuppress default client identifier\n" \ "\t-H,\t--hostname=HOSTNAME\tClient hostname\n" \ "\t-h,\t \tAlias for -H\n" \ "\t-f,\t--foreground\tDo not fork after getting lease\n" \ diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c index c5e1c210b..2695b06ed 100644 --- a/networking/udhcp/clientpacket.c +++ b/networking/udhcp/clientpacket.c @@ -76,7 +76,8 @@ static void init_packet(struct dhcpMessage *packet, char type) init_header(packet, type); memcpy(packet->chaddr, client_config.arp, 6); - add_option_string(packet->options, client_config.clientid); + if (client_config.clientid) + add_option_string(packet->options, client_config.clientid); if (client_config.hostname) add_option_string(packet->options, client_config.hostname); if (client_config.fqdn) add_option_string(packet->options, client_config.fqdn); add_option_string(packet->options, (uint8_t *) &vendor_id); diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index eeaf5531d..35ae757e7 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -77,7 +77,8 @@ static void __attribute__ ((noreturn)) show_usage(void) { printf( "Usage: udhcpc [OPTIONS]\n\n" -" -c, --clientid=CLIENTID Client identifier\n" +" -c, --clientid=CLIENTID Set client identifier\n" +" -C, --clientid-none Suppress default client identifier\n" " -H, --hostname=HOSTNAME Client hostname\n" " -h Alias for -H\n" " -F, --fqdn=FQDN Client fully qualified domain name\n" @@ -193,9 +194,11 @@ int main(int argc, char *argv[]) long now; int max_fd; int sig; + int no_clientid = 0; static const struct option arg_options[] = { {"clientid", required_argument, 0, 'c'}, + {"clientid-none", no_argument, 0, 'C'}, {"foreground", no_argument, 0, 'f'}, {"background", no_argument, 0, 'b'}, {"hostname", required_argument, 0, 'H'}, @@ -214,11 +217,12 @@ int main(int argc, char *argv[]) /* get options */ while (1) { int option_index = 0; - c = getopt_long(argc, argv, "c:fbH:h:F:i:np:qr:s:v", arg_options, &option_index); + c = getopt_long(argc, argv, "c:CfbH:h:F:i:np:qr:s:v", arg_options, &option_index); if (c == -1) break; switch (c) { case 'c': + if (no_clientid) show_usage(); len = strlen(optarg) > 255 ? 255 : strlen(optarg); if (client_config.clientid) free(client_config.clientid); client_config.clientid = xmalloc(len + 2); @@ -227,6 +231,10 @@ int main(int argc, char *argv[]) client_config.clientid[OPT_DATA] = '\0'; strncpy(client_config.clientid + OPT_DATA, optarg, len); break; + case 'C': + if (client_config.clientid) show_usage(); + no_clientid = 1; + break; case 'f': client_config.foreground = 1; break; @@ -293,7 +301,8 @@ int main(int argc, char *argv[]) NULL, client_config.arp) < 0) return 1; - if (!client_config.clientid) { + /* if not set, and not suppressed, setup the default client ID */ + if (!client_config.clientid && !no_clientid) { client_config.clientid = xmalloc(6 + 3); client_config.clientid[OPT_CODE] = DHCP_CLIENT_ID; client_config.clientid[OPT_LEN] = 7;