This patch adds support for setting a unsigned integer value. --- dlm_controld/config.c | 25 ++++++++++++++++ dlm_controld/dlm_daemon.h | 6 ++++ dlm_controld/main.c | 60 ++++++++++++++++++++++----------------- 3 files changed, 65 insertions(+), 26 deletions(-)
diff --git a/dlm_controld/config.c b/dlm_controld/config.c index 3ba8a53b..ec269168 100644 --- a/dlm_controld/config.c +++ b/dlm_controld/config.c @@ -156,6 +156,19 @@ static void get_val_int(char *line, int *val_out) *val_out = atoi(val); } +static void get_val_uint(char *line, unsigned int *val_out) +{ + char key[MAX_LINE]; + char val[MAX_LINE]; + int rv; + + rv = sscanf(line, "%[^=]=%s", key, val); + if (rv != 2) + return; + + *val_out = strtoul(val, NULL, 0); +} + static void get_val_str(char *line, char *val_out) { char key[MAX_LINE]; @@ -171,6 +184,7 @@ static void get_val_str(char *line, char *val_out) void set_opt_file(int update) { + unsigned int uval = 0; struct dlm_option *o; FILE *file; char line[MAX_LINE]; @@ -238,6 +252,17 @@ void set_opt_file(int update) log_debug("config file %s = %d cli_set %d use %d", o->name, o->file_int, o->cli_set, o->use_int); + } else if (o->req_arg == req_arg_uint) { + get_val_uint(line, &uval); + + o->file_uint = uval; + + if (!o->cli_set) + o->use_uint = o->file_uint; + + log_debug("config file %s = %u cli_set %d use %u", + o->name, o->file_uint, o->cli_set, o->use_uint); + } else if (o->req_arg == req_arg_bool) { get_val_int(line, &val); diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h index 5b9a52da..47557a7c 100644 --- a/dlm_controld/dlm_daemon.h +++ b/dlm_controld/dlm_daemon.h @@ -86,6 +86,7 @@ enum { req_arg_bool = 1, req_arg_int = 2, req_arg_str = 3, + req_arg_uint = 4, }; enum { @@ -125,22 +126,27 @@ struct dlm_option { int use_int; char *use_str; + unsigned int use_uint; int default_int; const char *default_str; + unsigned int default_uint; int cli_set; int cli_int; char *cli_str; + unsigned int cli_uint; int file_set; int file_int; char *file_str; + unsigned int file_uint; }; EXTERN struct dlm_option dlm_options[dlm_options_max]; #define opt(x) dlm_options[x].use_int #define opts(x) dlm_options[x].use_str +#define optu(x) dlm_options[x].use_uint /* DLM_LOCKSPACE_LEN: maximum lockspace name length, from linux/dlmconstants.h. diff --git a/dlm_controld/main.c b/dlm_controld/main.c index 8be6a4bc..6129b8a6 100644 --- a/dlm_controld/main.c +++ b/dlm_controld/main.c @@ -1678,6 +1678,8 @@ static void print_usage(void) printf(" [%d]\n", o->default_int); else if (o->req_arg == req_arg_bool) printf(" [%d]\n", o->default_int); + else if (o->req_arg == req_arg_uint) + printf(" [%u]\n", o->default_uint); else if (o->req_arg == no_arg && !o->default_int) printf(" [0]\n"); else @@ -1688,7 +1690,8 @@ static void print_usage(void) } static void set_opt_default(int ind, const char *name, char letter, int arg_type, - int default_int, const char *default_str, const char *desc) + int default_int, const char *default_str, + unsigned int default_uint, const char *desc) { dlm_options[ind].name = name; dlm_options[ind].letter = letter; @@ -1696,135 +1699,137 @@ static void set_opt_default(int ind, const char *name, char letter, int arg_type dlm_options[ind].desc = desc; dlm_options[ind].default_int = default_int; dlm_options[ind].default_str = default_str; + dlm_options[ind].default_uint = default_uint; dlm_options[ind].use_int = default_int; dlm_options[ind].use_str = (char *)default_str; + dlm_options[ind].use_uint = default_uint; } static void set_opt_defaults(void) { set_opt_default(daemon_debug_ind, "daemon_debug", 'D', no_arg, - 0, NULL, + 0, NULL, 0, "enable debugging to stderr and don't fork"); set_opt_default(foreground_ind, "foreground", '\0', no_arg, - 0, NULL, + 0, NULL, 0, "don't fork"); set_opt_default(log_debug_ind, "log_debug", 'K', no_arg, - 0, NULL, + 0, NULL, 0, "enable kernel dlm debugging messages"); set_opt_default(timewarn_ind, "timewarn", '\0', req_arg_int, - 0, NULL, + 0, NULL, 0, ""); /* do not advertise */ set_opt_default(protocol_ind, "protocol", 'r', req_arg_str, - -1, "detect", + -1, "detect", 0, "dlm kernel lowcomms protocol: tcp, sctp, detect"); set_opt_default(bind_all_ind, "bind_all", '\0', req_arg_int, - 0, NULL, + 0, NULL, 0, ""); /* do not advertise */ set_opt_default(debug_logfile_ind, "debug_logfile", 'L', no_arg, - 0, NULL, + 0, NULL, 0, "write debugging to log file"); set_opt_default(enable_fscontrol_ind, "enable_fscontrol", '\0', req_arg_bool, - 0, NULL, + 0, NULL, 0, ""); /* do not advertise */ set_opt_default(enable_plock_ind, "enable_plock", 'p', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable posix lock support for cluster fs"); set_opt_default(plock_debug_ind, "plock_debug", 'P', no_arg, - 0, NULL, + 0, NULL, 0, "enable plock debugging"); set_opt_default(plock_rate_limit_ind, "plock_rate_limit", 'l', req_arg_int, - 0, NULL, + 0, NULL, 0, "limit rate of plock operations (0 for none)"); set_opt_default(plock_ownership_ind, "plock_ownership", 'o', req_arg_bool, - 0, NULL, + 0, NULL, 0, "enable/disable plock ownership"); set_opt_default(drop_resources_time_ind, "drop_resources_time", 't', req_arg_int, - 10000, NULL, + 10000, NULL, 0, "plock ownership drop resources time (milliseconds)"); set_opt_default(drop_resources_count_ind, "drop_resources_count", 'c', req_arg_int, - 10, NULL, + 10, NULL, 0, "plock ownership drop resources count"); set_opt_default(drop_resources_age_ind, "drop_resources_age", 'a', req_arg_int, - 10000, NULL, + 10000, NULL, 0, "plock ownership drop resources age (milliseconds)"); set_opt_default(post_join_delay_ind, "post_join_delay", 'j', req_arg_int, - 30, NULL, + 30, NULL, 0, "seconds to delay fencing after cluster join"); set_opt_default(enable_fencing_ind, "enable_fencing", 'f', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable fencing"); set_opt_default(enable_concurrent_fencing_ind, "enable_concurrent_fencing", '\0', req_arg_bool, - 0, NULL, + 0, NULL, 0, "enable/disable concurrent fencing"); set_opt_default(enable_startup_fencing_ind, "enable_startup_fencing", 's', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable startup fencing"); set_opt_default(repeat_failed_fencing_ind, "repeat_failed_fencing", '\0', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable retrying after fencing fails"); set_opt_default(enable_quorum_fencing_ind, "enable_quorum_fencing", 'q', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable quorum requirement for fencing"); set_opt_default(enable_quorum_lockspace_ind, "enable_quorum_lockspace", '\0', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable quorum requirement for lockspace operations"); set_opt_default(enable_helper_ind, "enable_helper", '\0', req_arg_bool, - 1, NULL, + 1, NULL, 0, "enable/disable helper process for running commands"); set_opt_default(help_ind, "help", 'h', no_arg, - -1, NULL, + -1, NULL, 0, "print this help, then exit"); set_opt_default(version_ind, "version", 'V', no_arg, - -1, NULL, + -1, NULL, 0, "Print program version information, then exit"); } @@ -1972,6 +1977,9 @@ static void set_opt_cli(int argc, char **argv) } else if (o->req_arg == req_arg_bool) { o->cli_int = atoi(arg_str) ? 1 : 0; o->use_int = o->cli_int; + } else if (o->req_arg == req_arg_uint) { + o->cli_uint = strtoul(arg_str, NULL, 0); + o->use_uint = o->cli_uint; } } -- 2.26.2