From: Todd C. Miller Date: Fri, 5 Mar 2010 22:14:19 +0000 (-0500) Subject: Simplify conversion of command line args to name=value pairs. X-Git-Tag: SUDO_1_8_0~844 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ff6832e160f562bb4c64f8408cd2cafee9a94c5;p=sudo Simplify conversion of command line args to name=value pairs. --- diff --git a/src/parse_args.c b/src/parse_args.c index 2a630e5fc..c03dffb7c 100644 --- a/src/parse_args.c +++ b/src/parse_args.c @@ -72,52 +72,37 @@ static void usage_excl(int) __attribute__((__noreturn__)); /* * Mapping of command line flags to name/value settings. */ -struct name_value_pair { +static struct sudo_settings { const char *name; const char *value; -}; -static struct sudo_settings { - struct name_value_pair a; - struct name_value_pair c; - struct name_value_pair D; - struct name_value_pair E; - struct name_value_pair g; - struct name_value_pair H; - struct name_value_pair i; - struct name_value_pair k; - struct name_value_pair p; - struct name_value_pair r; - struct name_value_pair t; - struct name_value_pair u; -} sudo_settings = { +} sudo_settings[] = { +#define ARG_BSDAUTH_TYPE 0 { "bsdauth_type" }, +#define ARG_LOGIN_CLASS 1 { "login_class" }, +#define ARG_DEBUG_LEVEL 2 { "debug_level" }, +#define ARG_PRESERVE_ENVIRONMENT 3 { "preserve_environment" }, +#define ARG_RUNAS_GROUP 4 { "runas_group" }, +#define ARG_SET_HOME 5 { "set_home" }, +#define ARG_LOGIN_SHELL 6 { "login_shell" }, +#define ARG_IGNORE_TICKET 7 { "ignore_ticket" }, +#define ARG_PROMPT 8 { "prompt" }, +#define ARG_SELINUX_ROLE 9 { "selinux_role" }, +#define ARG_SELINUX_TYPE 10 { "selinux_type" }, - { "runas_user" } -}; -static struct name_value_pair *setting_pairs[] = { - &sudo_settings.a, - &sudo_settings.c, - &sudo_settings.D, - &sudo_settings.E, - &sudo_settings.g, - &sudo_settings.H, - &sudo_settings.i, - &sudo_settings.k, - &sudo_settings.p, - &sudo_settings.r, - &sudo_settings.t, - &sudo_settings.u +#define ARG_RUNAS_USER 11 + { "runas_user" }, +#define NUM_SETTINGS 12 + { NULL } }; -#define settings_size (sizeof(setting_pairs) / sizeof(setting_pairs[0])) /* * Command line argument parsing. @@ -170,7 +155,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, break; #ifdef HAVE_BSD_AUTH_H case 'a': - sudo_settings.a.value = optarg; + sudo_settings[ARG_BSDAUTH_TYPE].value = optarg; break; #endif case 'b': @@ -184,7 +169,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, break; #ifdef HAVE_LOGIN_CAP_H case 'c': - sudo_settings.c.value = optarg; + sudo_settings[ARG_LOGIN_CLASS].value = optarg; break; #endif case 'D': @@ -192,10 +177,10 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, warningx("the argument to -D must be between 1 and 9 inclusive"); usage(1); } - sudo_settings.D.value = optarg; + sudo_settings[ARG_DEBUG_LEVEL].value = optarg; break; case 'E': - sudo_settings.c.value = "true"; + sudo_settings[ARG_PRESERVE_ENVIRONMENT].value = "true"; break; case 'e': if (mode && mode != MODE_EDIT) @@ -205,10 +190,10 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, break; case 'g': runas_group = optarg; - sudo_settings.g.value = optarg; + sudo_settings[ARG_RUNAS_GROUP].value = optarg; break; case 'H': - sudo_settings.H.value = optarg; + sudo_settings[ARG_SET_HOME].value = "true"; break; case 'h': if (mode && mode != MODE_HELP) { @@ -219,15 +204,15 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, valid_flags = 0; break; case 'i': - sudo_settings.i.value = "true"; + sudo_settings[ARG_LOGIN_SHELL].value = "true"; SET(flags, MODE_LOGIN_SHELL); break; case 'k': - sudo_settings.k.value = "true"; + sudo_settings[ARG_IGNORE_TICKET].value = "true"; SET(flags, MODE_INVALIDATE); break; case 'K': - sudo_settings.k.value = "true"; + sudo_settings[ARG_IGNORE_TICKET].value = "true"; if (mode && mode != MODE_KILL) usage_excl(1); mode = MODE_KILL; @@ -250,14 +235,14 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, SET(flags, MODE_PRESERVE_GROUPS); break; case 'p': - sudo_settings.i.value = optarg; + sudo_settings[ARG_PROMPT].value = optarg; break; #ifdef HAVE_SELINUX case 'r': - sudo_settings.r.value = optarg; + sudo_settings[ARG_SELINUX_ROLE].value = optarg; break; case 't': - sudo_settings.t.value = optarg; + sudo_settings[ARG_SELINUX_TYPE].value = optarg; break; #endif case 'S': @@ -274,7 +259,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, break; case 'u': runas_user = optarg; - sudo_settings.u.value = optarg; + sudo_settings[ARG_RUNAS_USER].value = optarg; break; case 'v': if (mode && mode != MODE_VALIDATE) @@ -314,7 +299,7 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, if (ISSET(flags, MODE_INVALIDATE) && *nargc == 0) { mode = MODE_INVALIDATE; /* -k by itself */ CLR(flags, MODE_INVALIDATE); - sudo_settings.k.value = NULL; + sudo_settings[ARG_IGNORE_TICKET].value = NULL; valid_flags = 0; } else { mode = MODE_RUN; /* running a command */ @@ -369,13 +354,13 @@ parse_args(int argc, char **argv, int *nargc, char ***nargv, char ***settingsp, /* * Format setting_pairs into settings array. */ - settings = emalloc2(settings_size + 1, sizeof (char *)); - for (i = 0, j = 0; i < settings_size; i++) { - if (setting_pairs[i]->value) { - sudo_debug(9, "settings: %s=%s", setting_pairs[i]->name, - setting_pairs[i]->value); - settings[j++] = fmt_string(setting_pairs[i]->name, - setting_pairs[i]->value); + settings = emalloc2(NUM_SETTINGS + 1, sizeof (char *)); + for (i = 0, j = 0; i < NUM_SETTINGS; i++) { + if (sudo_settings[i].value) { + sudo_debug(9, "settings: %s=%s", sudo_settings[i].name, + sudo_settings[i].value); + settings[j++] = fmt_string(sudo_settings[i].name, + sudo_settings[i].value); } } settings[j] = NULL;