mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-29 13:28:14 +00:00
[master] Emit better error messages for command line issues
When emitting an error message due to a bad command line try to include information about the argument that is at fault.
This commit is contained in:
parent
4ce21cb630
commit
b2cb745bd4
5
RELNOTES
5
RELNOTES
@ -130,6 +130,11 @@ by Eric Young (eay@cryptsoft.com).
|
|||||||
patch.
|
patch.
|
||||||
[ISC-Bugs #41267]
|
[ISC-Bugs #41267]
|
||||||
|
|
||||||
|
- When handling an incorrect command line for dhcpd, dhclient or dhcrelay
|
||||||
|
print out a specific error message about the first error in addition
|
||||||
|
to the usage string. This may be disabled by editing includes/site.h.
|
||||||
|
[ISC-Bugs #40321]
|
||||||
|
|
||||||
Changes since 4.3.3b1
|
Changes since 4.3.3b1
|
||||||
- None
|
- None
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
DHCP Client. */
|
DHCP Client. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2015 by Internet Systems Consortium, Inc. ("ISC")
|
* Copyright (c) 2004-2016 by Internet Systems Consortium, Inc. ("ISC")
|
||||||
* Copyright (c) 1995-2003 by Internet Software Consortium
|
* Copyright (c) 1995-2003 by Internet Software Consortium
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
@ -97,8 +97,6 @@ char *progname = NULL;
|
|||||||
|
|
||||||
void run_stateless(int exit_mode);
|
void run_stateless(int exit_mode);
|
||||||
|
|
||||||
static void usage(void);
|
|
||||||
|
|
||||||
static isc_result_t write_duid(struct data_string *duid);
|
static isc_result_t write_duid(struct data_string *duid);
|
||||||
static void add_reject(struct packet *packet);
|
static void add_reject(struct packet *packet);
|
||||||
|
|
||||||
@ -110,6 +108,57 @@ static int check_option_values(struct universe *universe, unsigned int opt,
|
|||||||
static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb,
|
static void dhclient_ddns_cb_free(dhcp_ddns_cb_t *ddns_cb,
|
||||||
char* file, int line);
|
char* file, int line);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* \brief Print the generic usage message
|
||||||
|
*
|
||||||
|
* If the user has provided an incorrect command line print out
|
||||||
|
* the description of the command line. The arguments provide
|
||||||
|
* a way for the caller to request more specific information about
|
||||||
|
* the error be printed as well. Mostly this will be that some
|
||||||
|
* comamnd doesn't include its argument.
|
||||||
|
*
|
||||||
|
* \param sfmt - The basic string and format for the specific error
|
||||||
|
* \param sarg - Generally the offending argument from the comamnd line.
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UNIT_TEST
|
||||||
|
/* These are only used when we call usage() from the main routine
|
||||||
|
* which isn't compiled when building for unit tests
|
||||||
|
*/
|
||||||
|
static const char use_noarg[] = "No argument for command: %s";
|
||||||
|
static const char use_v6command[] = "Command not used for DHCPv4: %s";
|
||||||
|
#endif /* !UNIT_TEST */
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(const char *sfmt, const char *sarg)
|
||||||
|
{
|
||||||
|
log_info("%s %s", message, PACKAGE_VERSION);
|
||||||
|
log_info(copyright);
|
||||||
|
log_info(arr);
|
||||||
|
log_info(url);
|
||||||
|
|
||||||
|
/* If desired print out the specific error message */
|
||||||
|
#ifdef PRINT_SPECIFIC_CL_ERRORS
|
||||||
|
if (sfmt != NULL)
|
||||||
|
log_error(sfmt, sarg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
log_fatal("Usage: %s "
|
||||||
|
#ifdef DHCPv6
|
||||||
|
"[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
|
||||||
|
#else /* DHCPv6 */
|
||||||
|
"[-I1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
|
||||||
|
#endif /* DHCPv6 */
|
||||||
|
" [-s server-addr] [-cf config-file]\n"
|
||||||
|
" [-df duid-file] [-lf lease-file]\n"
|
||||||
|
" [-pf pid-file] [--no-pid] [-e VAR=val]\n"
|
||||||
|
" [-sf script-file] [interface]",
|
||||||
|
isc_file_basename(progname));
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef UNIT_TEST
|
#ifndef UNIT_TEST
|
||||||
int
|
int
|
||||||
main(int argc, char **argv) {
|
main(int argc, char **argv) {
|
||||||
@ -208,7 +257,7 @@ main(int argc, char **argv) {
|
|||||||
exit_mode = 1;
|
exit_mode = 1;
|
||||||
} else if (!strcmp(argv[i], "-p")) {
|
} else if (!strcmp(argv[i], "-p")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
local_port = validate_port(argv[i]);
|
local_port = validate_port(argv[i]);
|
||||||
log_debug("binding to user-specified port %d",
|
log_debug("binding to user-specified port %d",
|
||||||
ntohs(local_port));
|
ntohs(local_port));
|
||||||
@ -217,28 +266,28 @@ main(int argc, char **argv) {
|
|||||||
quiet = 0;
|
quiet = 0;
|
||||||
} else if (!strcmp(argv[i], "-pf")) {
|
} else if (!strcmp(argv[i], "-pf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhclient_pid = argv[i];
|
path_dhclient_pid = argv[i];
|
||||||
no_dhclient_pid = 1;
|
no_dhclient_pid = 1;
|
||||||
} else if (!strcmp(argv[i], "--no-pid")) {
|
} else if (!strcmp(argv[i], "--no-pid")) {
|
||||||
no_pid_file = ISC_TRUE;
|
no_pid_file = ISC_TRUE;
|
||||||
} else if (!strcmp(argv[i], "-cf")) {
|
} else if (!strcmp(argv[i], "-cf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhclient_conf = argv[i];
|
path_dhclient_conf = argv[i];
|
||||||
no_dhclient_conf = 1;
|
no_dhclient_conf = 1;
|
||||||
} else if (!strcmp(argv[i], "-df")) {
|
} else if (!strcmp(argv[i], "-df")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhclient_duid = argv[i];
|
path_dhclient_duid = argv[i];
|
||||||
} else if (!strcmp(argv[i], "-lf")) {
|
} else if (!strcmp(argv[i], "-lf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhclient_db = argv[i];
|
path_dhclient_db = argv[i];
|
||||||
no_dhclient_db = 1;
|
no_dhclient_db = 1;
|
||||||
} else if (!strcmp(argv[i], "-sf")) {
|
} else if (!strcmp(argv[i], "-sf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhclient_script = argv[i];
|
path_dhclient_script = argv[i];
|
||||||
no_dhclient_script = 1;
|
no_dhclient_script = 1;
|
||||||
} else if (!strcmp(argv[i], "-1")) {
|
} else if (!strcmp(argv[i], "-1")) {
|
||||||
@ -247,11 +296,11 @@ main(int argc, char **argv) {
|
|||||||
quiet = 1;
|
quiet = 1;
|
||||||
} else if (!strcmp(argv[i], "-s")) {
|
} else if (!strcmp(argv[i], "-s")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
server = argv[i];
|
server = argv[i];
|
||||||
} else if (!strcmp(argv[i], "-g")) {
|
} else if (!strcmp(argv[i], "-g")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
mockup_relay = argv[i];
|
mockup_relay = argv[i];
|
||||||
} else if (!strcmp(argv[i], "-nw")) {
|
} else if (!strcmp(argv[i], "-nw")) {
|
||||||
nowait = 1;
|
nowait = 1;
|
||||||
@ -264,7 +313,7 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i], "-e")) {
|
} else if (!strcmp(argv[i], "-e")) {
|
||||||
struct string_list *tmp;
|
struct string_list *tmp;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
tmp = dmalloc(strlen(argv[i]) + sizeof *tmp, MDL);
|
tmp = dmalloc(strlen(argv[i]) + sizeof *tmp, MDL);
|
||||||
if (!tmp)
|
if (!tmp)
|
||||||
log_fatal("No memory for %s", argv[i]);
|
log_fatal("No memory for %s", argv[i]);
|
||||||
@ -275,7 +324,7 @@ main(int argc, char **argv) {
|
|||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
} else if (!strcmp(argv[i], "-S")) {
|
} else if (!strcmp(argv[i], "-S")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -283,7 +332,7 @@ main(int argc, char **argv) {
|
|||||||
stateless = 1;
|
stateless = 1;
|
||||||
} else if (!strcmp(argv[i], "-N")) {
|
} else if (!strcmp(argv[i], "-N")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -293,7 +342,7 @@ main(int argc, char **argv) {
|
|||||||
wanted_ia_na++;
|
wanted_ia_na++;
|
||||||
} else if (!strcmp(argv[i], "-T")) {
|
} else if (!strcmp(argv[i], "-T")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -303,7 +352,7 @@ main(int argc, char **argv) {
|
|||||||
wanted_ia_ta++;
|
wanted_ia_ta++;
|
||||||
} else if (!strcmp(argv[i], "-P")) {
|
} else if (!strcmp(argv[i], "-P")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -313,7 +362,7 @@ main(int argc, char **argv) {
|
|||||||
wanted_ia_pd++;
|
wanted_ia_pd++;
|
||||||
} else if (!strcmp(argv[i], "-R")) {
|
} else if (!strcmp(argv[i], "-R")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -322,13 +371,13 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i], "-D")) {
|
} else if (!strcmp(argv[i], "-D")) {
|
||||||
duid_v4 = 1;
|
duid_v4 = 1;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
if (!strcasecmp(argv[i], "LL")) {
|
if (!strcasecmp(argv[i], "LL")) {
|
||||||
duid_type = DUID_LL;
|
duid_type = DUID_LL;
|
||||||
} else if (!strcasecmp(argv[i], "LLT")) {
|
} else if (!strcasecmp(argv[i], "LLT")) {
|
||||||
duid_type = DUID_LLT;
|
duid_type = DUID_LLT;
|
||||||
} else {
|
} else {
|
||||||
usage();
|
usage("Unknown argument to -D: %s", argv[i]);
|
||||||
}
|
}
|
||||||
} else if (!strcmp(argv[i], "-i")) {
|
} else if (!strcmp(argv[i], "-i")) {
|
||||||
/* enable DUID support for DHCPv4 clients */
|
/* enable DUID support for DHCPv4 clients */
|
||||||
@ -348,9 +397,10 @@ main(int argc, char **argv) {
|
|||||||
IGNORE_RET(write(STDERR_FILENO, "\n", 1));
|
IGNORE_RET(write(STDERR_FILENO, "\n", 1));
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if (argv[i][0] == '-') {
|
} else if (argv[i][0] == '-') {
|
||||||
usage();
|
usage("Unknown command: %s", argv[i]);
|
||||||
} else if (interfaces_requested < 0) {
|
} else if (interfaces_requested < 0) {
|
||||||
usage();
|
usage("No interfaces comamnd -n and "
|
||||||
|
" requested interface %s", argv[i]);
|
||||||
} else {
|
} else {
|
||||||
struct interface_info *tmp = NULL;
|
struct interface_info *tmp = NULL;
|
||||||
|
|
||||||
@ -379,7 +429,7 @@ main(int argc, char **argv) {
|
|||||||
|
|
||||||
/* Support only one (requested) interface for Prefix Delegation. */
|
/* Support only one (requested) interface for Prefix Delegation. */
|
||||||
if (wanted_ia_pd && (interfaces_requested != 1)) {
|
if (wanted_ia_pd && (interfaces_requested != 1)) {
|
||||||
usage();
|
usage("PD %s only supports one requested interface", "-P");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!no_dhclient_conf && (s = getenv("PATH_DHCLIENT_CONF"))) {
|
if (!no_dhclient_conf && (s = getenv("PATH_DHCLIENT_CONF"))) {
|
||||||
@ -517,7 +567,8 @@ main(int argc, char **argv) {
|
|||||||
if (release_mode || (wanted_ia_na > 0) ||
|
if (release_mode || (wanted_ia_na > 0) ||
|
||||||
wanted_ia_ta || wanted_ia_pd ||
|
wanted_ia_ta || wanted_ia_pd ||
|
||||||
(interfaces_requested != 1)) {
|
(interfaces_requested != 1)) {
|
||||||
usage();
|
usage("Stateless commnad: %s incompatibile with "
|
||||||
|
"other commands", "-S");
|
||||||
}
|
}
|
||||||
run_stateless(exit_mode);
|
run_stateless(exit_mode);
|
||||||
return 0;
|
return 0;
|
||||||
@ -761,27 +812,6 @@ main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
#endif /* !UNIT_TEST */
|
#endif /* !UNIT_TEST */
|
||||||
|
|
||||||
static void usage()
|
|
||||||
{
|
|
||||||
log_info("%s %s", message, PACKAGE_VERSION);
|
|
||||||
log_info(copyright);
|
|
||||||
log_info(arr);
|
|
||||||
log_info(url);
|
|
||||||
|
|
||||||
|
|
||||||
log_fatal("Usage: %s "
|
|
||||||
#ifdef DHCPv6
|
|
||||||
"[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
|
|
||||||
#else /* DHCPv6 */
|
|
||||||
"[-I1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
|
|
||||||
#endif /* DHCPv6 */
|
|
||||||
" [-s server-addr] [-cf config-file]\n"
|
|
||||||
" [-df duid-file] [-lf lease-file]\n"
|
|
||||||
" [-pf pid-file] [--no-pid] [-e VAR=val]\n"
|
|
||||||
" [-sf script-file] [interface]",
|
|
||||||
isc_file_basename(progname));
|
|
||||||
}
|
|
||||||
|
|
||||||
void run_stateless(int exit_mode)
|
void run_stateless(int exit_mode)
|
||||||
{
|
{
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
@ -793,7 +823,7 @@ void run_stateless(int exit_mode)
|
|||||||
discover_interfaces(DISCOVER_REQUESTED);
|
discover_interfaces(DISCOVER_REQUESTED);
|
||||||
|
|
||||||
if (!interfaces)
|
if (!interfaces)
|
||||||
usage();
|
usage("No interfaces available for stateless command: %s", "-S");
|
||||||
|
|
||||||
/* Parse the dhclient.conf file. */
|
/* Parse the dhclient.conf file. */
|
||||||
read_client_conf();
|
read_client_conf();
|
||||||
|
@ -305,6 +305,13 @@
|
|||||||
from a single server and there won't be a difference. */
|
from a single server and there won't be a difference. */
|
||||||
/* #define USE_ORIGINAL_CLIENT_LEASE_WEIGHTS */
|
/* #define USE_ORIGINAL_CLIENT_LEASE_WEIGHTS */
|
||||||
|
|
||||||
|
/* Print out specific error messages for dhclient, dhcpd
|
||||||
|
or dhcrelay when processing an incorrect command line. This
|
||||||
|
is included for those that might require the exact error
|
||||||
|
messages, as we don't expect that is necessary it is on by
|
||||||
|
default. */
|
||||||
|
#define PRINT_SPECIFIC_CL_ERRORS
|
||||||
|
|
||||||
/* Include definitions for various options. In general these
|
/* Include definitions for various options. In general these
|
||||||
should be left as is, but if you have already defined one
|
should be left as is, but if you have already defined one
|
||||||
of these and prefer your definition you can comment the
|
of these and prefer your definition you can comment the
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
DHCP/BOOTP Relay Agent. */
|
DHCP/BOOTP Relay Agent. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright(c) 2004-2015 by Internet Systems Consortium, Inc.("ISC")
|
* Copyright(c) 2004-2016 by Internet Systems Consortium, Inc.("ISC")
|
||||||
* Copyright(c) 1997-2003 by Internet Software Consortium
|
* Copyright(c) 1997-2003 by Internet Software Consortium
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
@ -167,7 +167,35 @@ char *progname;
|
|||||||
" server0 [ ... serverN]\n\n"
|
" server0 [ ... serverN]\n\n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void usage() {
|
/*!
|
||||||
|
*
|
||||||
|
* \brief Print the generic usage message
|
||||||
|
*
|
||||||
|
* If the user has provided an incorrect command line print out
|
||||||
|
* the description of the command line. The arguments provide
|
||||||
|
* a way for the caller to request more specific information about
|
||||||
|
* the error be printed as well. Mostly this will be that some
|
||||||
|
* comamnd doesn't include its argument.
|
||||||
|
*
|
||||||
|
* \param sfmt - The basic string and format for the specific error
|
||||||
|
* \param sarg - Generally the offending argument from the comamnd line.
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
static const char use_noarg[] = "No argument for command: %s";
|
||||||
|
static const char use_badproto[] = "Protocol already set, %s inappropriate";
|
||||||
|
static const char use_v4command[] = "Command not used for DHCPv6: %s";
|
||||||
|
static const char use_v6command[] = "Command not used for DHCPv4: %s";
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(const char *sfmt, const char *sarg) {
|
||||||
|
|
||||||
|
/* If desired print out the specific error message */
|
||||||
|
#ifdef PRINT_SPECIFIC_CL_ERRORS
|
||||||
|
if (sfmt != NULL)
|
||||||
|
log_error(sfmt, sarg);
|
||||||
|
#endif
|
||||||
|
|
||||||
log_fatal(DHCRELAY_USAGE,
|
log_fatal(DHCRELAY_USAGE,
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
isc_file_basename(progname),
|
isc_file_basename(progname),
|
||||||
@ -236,13 +264,13 @@ main(int argc, char **argv) {
|
|||||||
if (!strcmp(argv[i], "-4")) {
|
if (!strcmp(argv[i], "-4")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_badproto, "-4");
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
} else if (!strcmp(argv[i], "-6")) {
|
} else if (!strcmp(argv[i], "-6")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_badproto, "-6");
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
@ -254,29 +282,29 @@ main(int argc, char **argv) {
|
|||||||
quiet_interface_discovery = 1;
|
quiet_interface_discovery = 1;
|
||||||
} else if (!strcmp(argv[i], "-p")) {
|
} else if (!strcmp(argv[i], "-p")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
local_port = validate_port(argv[i]);
|
local_port = validate_port(argv[i]);
|
||||||
log_debug("binding to user-specified port %d",
|
log_debug("binding to user-specified port %d",
|
||||||
ntohs(local_port));
|
ntohs(local_port));
|
||||||
} else if (!strcmp(argv[i], "-c")) {
|
} else if (!strcmp(argv[i], "-c")) {
|
||||||
int hcount;
|
int hcount;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
hcount = atoi(argv[i]);
|
hcount = atoi(argv[i]);
|
||||||
if (hcount <= 255)
|
if (hcount <= 255)
|
||||||
max_hop_count= hcount;
|
max_hop_count= hcount;
|
||||||
else
|
else
|
||||||
usage();
|
usage("Bad hop count to -c: %s", argv[i]);
|
||||||
} else if (!strcmp(argv[i], "-i")) {
|
} else if (!strcmp(argv[i], "-i")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
#endif
|
#endif
|
||||||
if (++i == argc) {
|
if (++i == argc) {
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
}
|
}
|
||||||
if (strlen(argv[i]) >= sizeof(tmp->name)) {
|
if (strlen(argv[i]) >= sizeof(tmp->name)) {
|
||||||
log_fatal("%s: interface name too long "
|
log_fatal("%s: interface name too long "
|
||||||
@ -295,7 +323,7 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i], "-a")) {
|
} else if (!strcmp(argv[i], "-a")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
@ -304,13 +332,13 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i], "-A")) {
|
} else if (!strcmp(argv[i], "-A")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
#endif
|
#endif
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
|
|
||||||
dhcp_max_agent_option_packet_length = atoi(argv[i]);
|
dhcp_max_agent_option_packet_length = atoi(argv[i]);
|
||||||
|
|
||||||
@ -321,13 +349,13 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i], "-m")) {
|
} else if (!strcmp(argv[i], "-m")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
#endif
|
#endif
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
if (!strcasecmp(argv[i], "append")) {
|
if (!strcasecmp(argv[i], "append")) {
|
||||||
agent_relay_mode = forward_and_append;
|
agent_relay_mode = forward_and_append;
|
||||||
} else if (!strcasecmp(argv[i], "replace")) {
|
} else if (!strcasecmp(argv[i], "replace")) {
|
||||||
@ -337,11 +365,11 @@ main(int argc, char **argv) {
|
|||||||
} else if (!strcasecmp(argv[i], "discard")) {
|
} else if (!strcasecmp(argv[i], "discard")) {
|
||||||
agent_relay_mode = discard;
|
agent_relay_mode = discard;
|
||||||
} else
|
} else
|
||||||
usage();
|
usage("Unknown argument to -m: %s", argv[i]);
|
||||||
} else if (!strcmp(argv[i], "-D")) {
|
} else if (!strcmp(argv[i], "-D")) {
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
@ -350,48 +378,48 @@ main(int argc, char **argv) {
|
|||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
} else if (!strcmp(argv[i], "-I")) {
|
} else if (!strcmp(argv[i], "-I")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
use_if_id = ISC_TRUE;
|
use_if_id = ISC_TRUE;
|
||||||
} else if (!strcmp(argv[i], "-l")) {
|
} else if (!strcmp(argv[i], "-l")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
if (downstreams != NULL)
|
if (downstreams != NULL)
|
||||||
use_if_id = ISC_TRUE;
|
use_if_id = ISC_TRUE;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
sl = parse_downstream(argv[i]);
|
sl = parse_downstream(argv[i]);
|
||||||
sl->next = downstreams;
|
sl->next = downstreams;
|
||||||
downstreams = sl;
|
downstreams = sl;
|
||||||
} else if (!strcmp(argv[i], "-u")) {
|
} else if (!strcmp(argv[i], "-u")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
sl = parse_upstream(argv[i]);
|
sl = parse_upstream(argv[i]);
|
||||||
sl->next = upstreams;
|
sl->next = upstreams;
|
||||||
upstreams = sl;
|
upstreams = sl;
|
||||||
} else if (!strcmp(argv[i], "-s")) {
|
} else if (!strcmp(argv[i], "-s")) {
|
||||||
if (local_family_set && (local_family == AF_INET)) {
|
if (local_family_set && (local_family == AF_INET)) {
|
||||||
usage();
|
usage(use_v6command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET6;
|
local_family = AF_INET6;
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
dhcrelay_sub_id = argv[i];
|
dhcrelay_sub_id = argv[i];
|
||||||
#endif
|
#endif
|
||||||
} else if (!strcmp(argv[i], "-pf")) {
|
} else if (!strcmp(argv[i], "-pf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhcrelay_pid = argv[i];
|
path_dhcrelay_pid = argv[i];
|
||||||
no_dhcrelay_pid = ISC_TRUE;
|
no_dhcrelay_pid = ISC_TRUE;
|
||||||
} else if (!strcmp(argv[i], "--no-pid")) {
|
} else if (!strcmp(argv[i], "--no-pid")) {
|
||||||
@ -408,14 +436,14 @@ main(int argc, char **argv) {
|
|||||||
isc_file_basename(progname));
|
isc_file_basename(progname));
|
||||||
exit(0);
|
exit(0);
|
||||||
} else if (argv[i][0] == '-') {
|
} else if (argv[i][0] == '-') {
|
||||||
usage();
|
usage("Unknown command: %s", argv[i]);
|
||||||
} else {
|
} else {
|
||||||
struct hostent *he;
|
struct hostent *he;
|
||||||
struct in_addr ia, *iap = NULL;
|
struct in_addr ia, *iap = NULL;
|
||||||
|
|
||||||
#ifdef DHCPv6
|
#ifdef DHCPv6
|
||||||
if (local_family_set && (local_family == AF_INET6)) {
|
if (local_family_set && (local_family == AF_INET6)) {
|
||||||
usage();
|
usage(use_v4command, argv[i]);
|
||||||
}
|
}
|
||||||
local_family_set = 1;
|
local_family_set = 1;
|
||||||
local_family = AF_INET;
|
local_family = AF_INET;
|
||||||
@ -527,7 +555,7 @@ main(int argc, char **argv) {
|
|||||||
if (upstreams == NULL || downstreams == NULL) {
|
if (upstreams == NULL || downstreams == NULL) {
|
||||||
log_info("Must specify at least one lower "
|
log_info("Must specify at least one lower "
|
||||||
"and one upper interface.\n");
|
"and one upper interface.\n");
|
||||||
usage();
|
usage(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the initial dhcp option universe. */
|
/* Set up the initial dhcp option universe. */
|
||||||
@ -1195,8 +1223,7 @@ parse_downstream(char *arg) {
|
|||||||
*iid++ = '\0';
|
*iid++ = '\0';
|
||||||
}
|
}
|
||||||
if (strlen(ifname) >= sizeof(ifp->name)) {
|
if (strlen(ifname) >= sizeof(ifp->name)) {
|
||||||
log_error("Interface name '%s' too long", ifname);
|
usage("Interface name '%s' too long", ifname);
|
||||||
usage();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't declare twice. */
|
/* Don't declare twice. */
|
||||||
|
104
server/dhcpd.c
104
server/dhcpd.c
@ -3,7 +3,7 @@
|
|||||||
DHCP Server Daemon. */
|
DHCP Server Daemon. */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2004-2015 by Internet Systems Consortium, Inc. ("ISC")
|
* Copyright (c) 2004-2016 by Internet Systems Consortium, Inc. ("ISC")
|
||||||
* Copyright (c) 1996-2003 by Internet Software Consortium
|
* Copyright (c) 1996-2003 by Internet Software Consortium
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
@ -57,10 +57,6 @@ uid_t set_uid = 0;
|
|||||||
gid_t set_gid = 0;
|
gid_t set_gid = 0;
|
||||||
#endif /* PARANOIA */
|
#endif /* PARANOIA */
|
||||||
|
|
||||||
#ifndef UNIT_TEST
|
|
||||||
static void usage(void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct iaddr server_identifier;
|
struct iaddr server_identifier;
|
||||||
int server_identifier_matched;
|
int server_identifier_matched;
|
||||||
|
|
||||||
@ -137,6 +133,54 @@ static void omapi_listener_start (void *foo)
|
|||||||
|
|
||||||
#ifndef UNIT_TEST
|
#ifndef UNIT_TEST
|
||||||
|
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
* \brief Print the generic usage message
|
||||||
|
*
|
||||||
|
* If the user has provided an incorrect command line print out
|
||||||
|
* the description of the command line. The arguments provide
|
||||||
|
* a way for the caller to request more specific information about
|
||||||
|
* the error be printed as well. Mostly this will be that some
|
||||||
|
* comamnd doesn't include its argument.
|
||||||
|
*
|
||||||
|
* \param sfmt - The basic string and format for the specific error
|
||||||
|
* \param sarg - Generally the offending argument from the comamnd line.
|
||||||
|
*
|
||||||
|
* \return Nothing
|
||||||
|
*/
|
||||||
|
static char use_noarg[] = "No argument for command: %s ";
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(const char *sfmt, const char *sarg) {
|
||||||
|
log_info("%s %s", message, PACKAGE_VERSION);
|
||||||
|
log_info(copyright);
|
||||||
|
log_info(arr);
|
||||||
|
|
||||||
|
/* If desired print out the specific error message */
|
||||||
|
#ifdef PRINT_SPECIFIC_CL_ERRORS
|
||||||
|
if (sfmt != NULL)
|
||||||
|
log_error(sfmt, sarg);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
log_fatal("Usage: %s [-p <UDP port #>] [-f] [-d] [-q] [-t|-T]\n"
|
||||||
|
#ifdef DHCPv6
|
||||||
|
" [-4|-6] [-cf config-file] [-lf lease-file]\n"
|
||||||
|
#else /* !DHCPv6 */
|
||||||
|
" [-cf config-file] [-lf lease-file]\n"
|
||||||
|
#endif /* DHCPv6 */
|
||||||
|
#if defined (PARANOIA)
|
||||||
|
/* meld into the following string */
|
||||||
|
" [-user user] [-group group] [-chroot dir]\n"
|
||||||
|
#endif /* PARANOIA */
|
||||||
|
#if defined (TRACING)
|
||||||
|
" [-tf trace-output-file]\n"
|
||||||
|
" [-play trace-input-file]\n"
|
||||||
|
#endif /* TRACING */
|
||||||
|
" [-pf pid-file] [--no-pid] [-s server]\n"
|
||||||
|
" [if0 [...ifN]]",
|
||||||
|
isc_file_basename(progname));
|
||||||
|
}
|
||||||
|
|
||||||
/* Note: If we add unit tests to test setup_chroot it will
|
/* Note: If we add unit tests to test setup_chroot it will
|
||||||
* need to be moved to be outside the ifndef UNIT_TEST block.
|
* need to be moved to be outside the ifndef UNIT_TEST block.
|
||||||
*/
|
*/
|
||||||
@ -244,7 +288,7 @@ main(int argc, char **argv) {
|
|||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
if (!strcmp (argv [i], "-p")) {
|
if (!strcmp (argv [i], "-p")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
local_port = validate_port (argv [i]);
|
local_port = validate_port (argv [i]);
|
||||||
log_debug ("binding to user-specified port %d",
|
log_debug ("binding to user-specified port %d",
|
||||||
ntohs (local_port));
|
ntohs (local_port));
|
||||||
@ -259,35 +303,35 @@ main(int argc, char **argv) {
|
|||||||
log_perror = -1;
|
log_perror = -1;
|
||||||
} else if (!strcmp (argv [i], "-s")) {
|
} else if (!strcmp (argv [i], "-s")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
server = argv [i];
|
server = argv [i];
|
||||||
#if defined (PARANOIA)
|
#if defined (PARANOIA)
|
||||||
} else if (!strcmp (argv [i], "-user")) {
|
} else if (!strcmp (argv [i], "-user")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
set_user = argv [i];
|
set_user = argv [i];
|
||||||
} else if (!strcmp (argv [i], "-group")) {
|
} else if (!strcmp (argv [i], "-group")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
set_group = argv [i];
|
set_group = argv [i];
|
||||||
} else if (!strcmp (argv [i], "-chroot")) {
|
} else if (!strcmp (argv [i], "-chroot")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
set_chroot = argv [i];
|
set_chroot = argv [i];
|
||||||
#endif /* PARANOIA */
|
#endif /* PARANOIA */
|
||||||
} else if (!strcmp (argv [i], "-cf")) {
|
} else if (!strcmp (argv [i], "-cf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhcpd_conf = argv [i];
|
path_dhcpd_conf = argv [i];
|
||||||
no_dhcpd_conf = 1;
|
no_dhcpd_conf = 1;
|
||||||
} else if (!strcmp (argv [i], "-lf")) {
|
} else if (!strcmp (argv [i], "-lf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhcpd_db = argv [i];
|
path_dhcpd_db = argv [i];
|
||||||
no_dhcpd_db = 1;
|
no_dhcpd_db = 1;
|
||||||
} else if (!strcmp (argv [i], "-pf")) {
|
} else if (!strcmp (argv [i], "-pf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
path_dhcpd_pid = argv [i];
|
path_dhcpd_pid = argv [i];
|
||||||
no_dhcpd_pid = 1;
|
no_dhcpd_pid = 1;
|
||||||
} else if (!strcmp(argv[i], "--no-pid")) {
|
} else if (!strcmp(argv[i], "--no-pid")) {
|
||||||
@ -338,16 +382,16 @@ main(int argc, char **argv) {
|
|||||||
#if defined (TRACING)
|
#if defined (TRACING)
|
||||||
} else if (!strcmp (argv [i], "-tf")) {
|
} else if (!strcmp (argv [i], "-tf")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
traceoutfile = argv [i];
|
traceoutfile = argv [i];
|
||||||
} else if (!strcmp (argv [i], "-play")) {
|
} else if (!strcmp (argv [i], "-play")) {
|
||||||
if (++i == argc)
|
if (++i == argc)
|
||||||
usage ();
|
usage(use_noarg, argv[i-1]);
|
||||||
traceinfile = argv [i];
|
traceinfile = argv [i];
|
||||||
trace_replay_init ();
|
trace_replay_init ();
|
||||||
#endif /* TRACING */
|
#endif /* TRACING */
|
||||||
} else if (argv [i][0] == '-') {
|
} else if (argv [i][0] == '-') {
|
||||||
usage ();
|
usage("Unknown command %s", argv[i]);
|
||||||
} else {
|
} else {
|
||||||
struct interface_info *tmp =
|
struct interface_info *tmp =
|
||||||
(struct interface_info *)0;
|
(struct interface_info *)0;
|
||||||
@ -1166,34 +1210,6 @@ void postdb_startup (void)
|
|||||||
schedule_all_ipv6_lease_timeouts();
|
schedule_all_ipv6_lease_timeouts();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print usage message. */
|
|
||||||
#ifndef UNIT_TEST
|
|
||||||
static void
|
|
||||||
usage(void) {
|
|
||||||
log_info("%s %s", message, PACKAGE_VERSION);
|
|
||||||
log_info(copyright);
|
|
||||||
log_info(arr);
|
|
||||||
|
|
||||||
log_fatal("Usage: %s [-p <UDP port #>] [-f] [-d] [-q] [-t|-T]\n"
|
|
||||||
#ifdef DHCPv6
|
|
||||||
" [-4|-6] [-cf config-file] [-lf lease-file]\n"
|
|
||||||
#else /* !DHCPv6 */
|
|
||||||
" [-cf config-file] [-lf lease-file]\n"
|
|
||||||
#endif /* DHCPv6 */
|
|
||||||
#if defined (PARANOIA)
|
|
||||||
/* meld into the following string */
|
|
||||||
" [-user user] [-group group] [-chroot dir]\n"
|
|
||||||
#endif /* PARANOIA */
|
|
||||||
#if defined (TRACING)
|
|
||||||
" [-tf trace-output-file]\n"
|
|
||||||
" [-play trace-input-file]\n"
|
|
||||||
#endif /* TRACING */
|
|
||||||
" [-pf pid-file] [--no-pid] [-s server]\n"
|
|
||||||
" [if0 [...ifN]]",
|
|
||||||
isc_file_basename(progname));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void lease_pinged (from, packet, length)
|
void lease_pinged (from, packet, length)
|
||||||
struct iaddr from;
|
struct iaddr from;
|
||||||
u_int8_t *packet;
|
u_int8_t *packet;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user