debug_return;
}
-/*
- * Sets/clears an entry in the defaults structure
- * If a variable that takes a value is used in a boolean
- * context with op == 0, disable that variable.
- * Eg. you may want to turn off logging to a file for some hosts.
- * This is only meaningful for variables that are *optional*.
- */
-bool
-set_default(const char *var, const char *val, int op, bool quiet)
+static bool
+set_default_entry(struct sudo_defs_types *def, const char *val, int op, bool quiet)
{
- struct sudo_defs_types *cur;
- int num;
- debug_decl(set_default, SUDOERS_DEBUG_DEFAULTS)
+ debug_decl(set_default_entry, SUDOERS_DEBUG_DEFAULTS)
- for (cur = sudo_defs_table, num = 0; cur->name; cur++, num++) {
- if (strcmp(var, cur->name) == 0)
- break;
- }
- if (!cur->name) {
- if (!quiet)
- sudo_warnx(U_("unknown defaults entry `%s'"), var);
- debug_return_bool(false);
- }
-
- switch (cur->type & T_MASK) {
+ switch (def->type & T_MASK) {
case T_LOGFAC:
- if (!store_syslogfac(val, cur, op)) {
+ if (!store_syslogfac(val, def, op)) {
if (!quiet) {
if (val)
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
else
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
}
debug_return_bool(false);
}
break;
case T_LOGPRI:
- if (!store_syslogpri(val, cur, op)) {
+ if (!store_syslogpri(val, def, op)) {
if (!quiet) {
if (val)
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
else
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
}
debug_return_bool(false);
}
case T_STR:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (ISSET(cur->type, T_PATH) && val && *val != '/') {
- if (!quiet)
- sudo_warnx(U_("values for `%s' must start with a '/'"), var);
+ if (ISSET(def->type, T_PATH) && val && *val != '/') {
+ if (!quiet) {
+ sudo_warnx(U_("values for `%s' must start with a '/'"),
+ def->name);
+ }
debug_return_bool(false);
}
- switch (store_str(val, cur, op)) {
+ switch (store_str(val, def, op)) {
case true:
/* OK */
break;
case false:
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
/* FALLTHROUGH */
default:
case T_INT:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (!store_int(val, cur, op)) {
+ if (!store_int(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
case T_UINT:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (!store_uint(val, cur, op)) {
+ if (!store_uint(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
case T_FLOAT:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (!store_float(val, cur, op)) {
+ if (!store_float(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
case T_MODE:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (!store_mode(val, cur, op)) {
+ if (!store_mode(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
break;
case T_FLAG:
if (val) {
- if (!quiet)
- sudo_warnx(U_("option `%s' does not take a value"), var);
+ if (!quiet) {
+ sudo_warnx(U_("option `%s' does not take a value"),
+ def->name);
+ }
debug_return_bool(false);
}
- cur->sd_un.flag = op;
- if (cur->callback)
- debug_return_bool(cur->callback(&cur->sd_un));
+ def->sd_un.flag = op;
+ if (def->callback)
+ debug_return_bool(def->callback(&def->sd_un));
break;
case T_LIST:
if (!val) {
/* Check for bogus boolean usage or lack of a value. */
- if (!ISSET(cur->type, T_BOOL) || op != false) {
+ if (!ISSET(def->type, T_BOOL) || op != false) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
}
- if (!store_list(val, cur, op)) {
+ if (!store_list(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
break;
case T_TUPLE:
- if (!val && !ISSET(cur->type, T_BOOL)) {
+ if (!val && !ISSET(def->type, T_BOOL)) {
if (!quiet)
- sudo_warnx(U_("no value specified for `%s'"), var);
+ sudo_warnx(U_("no value specified for `%s'"), def->name);
debug_return_bool(false);
}
- if (!store_tuple(val, cur, op)) {
+ if (!store_tuple(val, def, op)) {
if (!quiet) {
sudo_warnx(U_("value `%s' is invalid for option `%s'"),
- val, var);
+ val, def->name);
}
debug_return_bool(false);
}
debug_return_bool(true);
}
+/*
+ * Sets/clears an entry in the defaults structure
+ * If a variable that takes a value is used in a boolean
+ * context with op == 0, disable that variable.
+ * Eg. you may want to turn off logging to a file for some hosts.
+ * This is only meaningful for variables that are *optional*.
+ */
+bool
+set_default(const char *var, const char *val, int op, bool quiet)
+{
+ struct sudo_defs_types *cur;
+ int num;
+ debug_decl(set_default, SUDOERS_DEBUG_DEFAULTS)
+
+ for (cur = sudo_defs_table, num = 0; cur->name; cur++, num++) {
+ if (strcmp(var, cur->name) == 0)
+ break;
+ }
+ if (!cur->name) {
+ if (!quiet)
+ sudo_warnx(U_("unknown defaults entry `%s'"), var);
+ debug_return_bool(false);
+ }
+
+ debug_return_bool(set_default_entry(cur, val, op, quiet));
+}
+
/*
* Set default options to compiled-in values.
* Any of these may be overridden at runtime by a "Defaults" file.
bool
check_defaults(int what, bool quiet)
{
- struct sudo_defs_types *cur;
+ struct sudo_defs_types *cur, tmp;
struct defaults *def;
bool rc = true;
debug_decl(check_defaults, SUDOERS_DEBUG_DEFAULTS)
sudo_warnx(U_("unknown defaults entry `%s'"), def->var);
rc = false;
}
+ /* Don't actually set the defaults value, just checking. */
+ tmp = *cur;
+ tmp.callback = NULL;
+ if (!set_default_entry(&tmp, def->val, def->op, quiet))
+ rc = false;
}
debug_return_bool(rc);
}