From: Todd C. Miller <Todd.Miller@courtesan.com>
Date: Tue, 30 Dec 2003 22:20:21 +0000 (+0000)
Subject: Create def_* macros for each defaults value so we no longer need
X-Git-Tag: SUDO_1_6_8~295
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ad252765bb52044a1a664168f042f65ecc3deb3;p=sudo

Create def_* macros for each defaults value so we no longer need
the def_{flag,ival,str,list,mode} macros (which have been removed).
This is a step toward more flexible data types in def_data.in.
---

diff --git a/auth/aix_auth.c b/auth/aix_auth.c
index 84a1ccef5..1bbb0df8d 100644
--- a/auth/aix_auth.c
+++ b/auth/aix_auth.c
@@ -79,7 +79,7 @@ aixauth_verify(pw, prompt, auth)
     int reenter = 1;
     int rval = AUTH_FAILURE;
 
-    pass = tgetpass(prompt, def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+    pass = tgetpass(prompt, def_passwd_timeout * 60, tgetpass_flags);
     if (pass) {
 	if (authenticate(pw->pw_name, (char *)pass, &reenter, &message) == 0)
 	    rval = AUTH_SUCCESS;
diff --git a/auth/bsdauth.c b/auth/bsdauth.c
index 22d3d75c9..0b147d554 100644
--- a/auth/bsdauth.c
+++ b/auth/bsdauth.c
@@ -137,9 +137,9 @@ bsdauth_verify(pw, prompt, auth)
      * S/Key.
      */
     if ((s = auth_challenge(as)) == NULL) {
-	pass = tgetpass(prompt, def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+	pass = tgetpass(prompt, def_passwd_timeout * 60, tgetpass_flags);
     } else {
-	pass = tgetpass(s, def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+	pass = tgetpass(s, def_passwd_timeout * 60, tgetpass_flags);
 	if (pass && *pass == '\0') {
 	    if ((prompt = strrchr(s, '\n')))
 		prompt++;
@@ -154,7 +154,7 @@ bsdauth_verify(pw, prompt, auth)
 	    while (isspace(prompt[len]) || prompt[len] == ':')
 		prompt[len--] = '\0';
 	    easprintf(&s, "%s [echo on]: ", prompt);
-	    pass = tgetpass(s, def_ival(I_PASSWD_TIMEOUT) * 60,
+	    pass = tgetpass(s, def_passwd_timeout * 60,
 		tgetpass_flags | TGP_ECHO);
 	    free(s);
 	}
diff --git a/auth/fwtk.c b/auth/fwtk.c
index a27be0c3f..b8b19b539 100644
--- a/auth/fwtk.c
+++ b/auth/fwtk.c
@@ -130,13 +130,13 @@ fwtk_verify(pw, prompt, auth)
     /* Get the password/response from the user. */
     if (strncmp(resp, "challenge ", 10) == 0) {
 	(void) snprintf(buf, sizeof(buf), "%s\nResponse: ", &resp[10]);
-	pass = tgetpass(buf, def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+	pass = tgetpass(buf, def_passwd_timeout * 60, tgetpass_flags);
 	if (pass && *pass == '\0') {
 	    pass = tgetpass("Response [echo on]: ",
-		def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags | TGP_ECHO);
+		def_passwd_timeout * 60, tgetpass_flags | TGP_ECHO);
 	}
     } else if (strncmp(resp, "password", 8) == 0) {
-	pass = tgetpass(prompt, def_ival(I_PASSWD_TIMEOUT) * 60,
+	pass = tgetpass(prompt, def_passwd_timeout * 60,
 	    tgetpass_flags);
     } else {
 	warnx("%s", resp);
diff --git a/auth/pam.c b/auth/pam.c
index a55803170..114ac301c 100644
--- a/auth/pam.c
+++ b/auth/pam.c
@@ -212,7 +212,7 @@ sudo_conv(num_msg, msg, response, appdata_ptr)
 		    && (pm->msg[9] != ' ' || pm->msg[10] != '\0')))
 		    p = pm->msg;
 		/* Read the password. */
-		pass = tgetpass(p, def_ival(I_PASSWD_TIMEOUT) * 60, flags);
+		pass = tgetpass(p, def_passwd_timeout * 60, flags);
 		pr->resp = estrdup(pass ? pass : "");
 		if (*pr->resp == '\0')
 		    nil_pw = 1;		/* empty password */
diff --git a/auth/rfc1938.c b/auth/rfc1938.c
index 83f65c1a0..49f0d4e39 100644
--- a/auth/rfc1938.c
+++ b/auth/rfc1938.c
@@ -143,7 +143,7 @@ rfc1938_setup(pw, promptp, auth)
 	new_prompt = (char *) erealloc(new_prompt, np_size);
     }
 
-    if (def_flag(I_LONG_OTP_PROMPT))
+    if (def_long_otp_prompt)
 	(void) snprintf(new_prompt, np_size, "%s\n%s", challenge, orig_prompt);
     else
 	(void) snprintf(new_prompt, np_size, "%.*s [ %s ]:", op_len,
diff --git a/auth/securid5.c b/auth/securid5.c
index 1d96d6190..ff63c622c 100644
--- a/auth/securid5.c
+++ b/auth/securid5.c
@@ -184,7 +184,7 @@ securid_verify(pw, pass, auth)
     int rval;
 
     pass = (char *) tgetpass("Enter your PASSCODE: ",
-	def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+	def_passwd_timeout * 60, tgetpass_flags);
 
     /* Have ACE verify password */
     switch (SD_Check(*sd, pass, pw->pw_name)) {
@@ -214,7 +214,7 @@ securid_verify(pw, pass, auth)
 !!! ATTENTION !!!\n\
 Wait for the token code to change, \n\
 then enter the new token code.\n", \
-		def_ival(I_PASSWD_TIMEOUT) * 60, tgetpass_flags);
+		def_passwd_timeout * 60, tgetpass_flags);
 
 		if (SD_Next(*sd, pass) == ACM_OK) {
 			rval = AUTH_SUCCESS;
diff --git a/auth/sia.c b/auth/sia.c
index 67cf640d1..d5847fd19 100644
--- a/auth/sia.c
+++ b/auth/sia.c
@@ -90,8 +90,8 @@ sudo_collect(timeout, rendition, title, nprompts, prompts)
     switch (rendition) {
 	case SIAFORM:
 	case SIAONELINER:
-	    if (timeout <= 0 || timeout > def_ival(I_PASSWD_TIMEOUT) * 60)
-		timeout = def_ival(I_PASSWD_TIMEOUT) * 60;
+	    if (timeout <= 0 || timeout > def_passwd_timeout * 60)
+		timeout = def_passwd_timeout * 60;
 	    /*
 	     * Substitute custom prompt if a) the sudo prompt is not "Password:"
 	     * and b) the SIA prompt is "Password:" (so we know it is safe).
diff --git a/auth/sudo_auth.c b/auth/sudo_auth.c
index 8630fb924..6f70c0b46 100644
--- a/auth/sudo_auth.c
+++ b/auth/sudo_auth.c
@@ -113,7 +113,7 @@ verify_user(pw, prompt)
     struct passwd *pw;
     char *prompt;
 {
-    int counter = def_ival(I_PASSWD_TRIES) + 1;
+    int counter = def_passwd_tries + 1;
     int success = AUTH_FAILURE;
     int status;
     int flags;
@@ -178,7 +178,7 @@ verify_user(pw, prompt)
 #ifdef AUTH_STANDALONE
 	p = prompt;
 #else
-	p = (char *) tgetpass(prompt, def_ival(I_PASSWD_TIMEOUT) * 60,
+	p = (char *) tgetpass(prompt, def_passwd_timeout * 60,
 	    tgetpass_flags);
 	if (!p || *p == '\0')
 	    nil_pw = 1;
@@ -207,7 +207,7 @@ verify_user(pw, prompt)
 
 	/* Exit loop on nil password, but give it a chance to match first. */
 	if (nil_pw) {
-	    if (counter == def_ival(I_PASSWD_TRIES))
+	    if (counter == def_passwd_tries)
 		exit(1);
 	    else
 		break;
@@ -237,13 +237,13 @@ cleanup:
 	    (void) sigaction(SIGTSTP, &osa, NULL);
 	    return;
 	case AUTH_FAILURE:
-	    if (def_flag(I_MAIL_BADPASS) || def_flag(I_MAIL_ALWAYS))
+	    if (def_mail_badpass || def_mail_always)
 		flags = 0;
 	    else
 		flags = NO_MAIL;
 	    log_error(flags, "%d incorrect password attempt%s",
-		def_ival(I_PASSWD_TRIES) - counter,
-		(def_ival(I_PASSWD_TRIES) - counter == 1) ? "" : "s");
+		def_passwd_tries - counter,
+		(def_passwd_tries - counter == 1) ? "" : "s");
 	case AUTH_FATAL:
 	    exit(1);
     }
@@ -256,11 +256,11 @@ pass_warn(fp)
 {
 
 #ifdef INSULT
-    if (def_flag(I_INSULTS))
+    if (def_insults)
 	(void) fprintf(fp, "%s\n", INSULT);
     else
 #endif
-	(void) fprintf(fp, "%s\n", def_str(I_BADPASS_MESSAGE));
+	(void) fprintf(fp, "%s\n", def_badpass_message);
 }
 
 void
diff --git a/check.c b/check.c
index 11845fce6..2a8cfe8d5 100644
--- a/check.c
+++ b/check.c
@@ -114,7 +114,7 @@ check_user()
 	    lecture();		/* first time through they get a lecture */
 
 	/* Expand any escapes in the prompt. */
-	prompt = expand_prompt(user_prompt ? user_prompt : def_str(I_PASSPROMPT),
+	prompt = expand_prompt(user_prompt ? user_prompt : def_passprompt,
 	    user_name, user_shost);
 
 	verify_user(auth_pw, prompt);
@@ -134,7 +134,7 @@ static void
 lecture()
 {
 
-    if (def_flag(I_LECTURE)) {
+    if (def_lecture) {
 	(void) fputs("\n\
 We trust you have received the usual lecture from the local System\n\
 Administrator. It usually boils down to these two things:\n\
@@ -290,10 +290,10 @@ user_is_exempt()
     struct group *grp;
     char **gr_mem;
 
-    if (!def_str(I_EXEMPT_GROUP))
+    if (!def_exempt_group)
 	return(FALSE);
 
-    if (!(grp = getgrnam(def_str(I_EXEMPT_GROUP))))
+    if (!(grp = getgrnam(def_exempt_group)))
 	return(FALSE);
 
     if (user_gid == grp->gr_gid)
@@ -318,7 +318,7 @@ build_timestamp(timestampdir, timestampfile)
     char *dirparent;
     int len;
 
-    dirparent = def_str(I_TIMESTAMPDIR);
+    dirparent = def_timestampdir;
     len = easprintf(timestampdir, "%s/%s", dirparent, user_name);
     if (len >= MAXPATHLEN)
 	log_error(0, "timestamp path too long: %s", timestampdir);
@@ -327,21 +327,21 @@ build_timestamp(timestampdir, timestampfile)
      * Timestamp file may be a file in the directory or NUL to use
      * the directory as the timestamp.
      */
-    if (def_flag(I_TTY_TICKETS)) {
+    if (def_tty_tickets) {
 	char *p;
 
 	if ((p = strrchr(user_tty, '/')))
 	    p++;
 	else
 	    p = user_tty;
-	if (def_flag(I_TARGETPW))
+	if (def_targetpw)
 	    len = easprintf(timestampfile, "%s/%s/%s:%s", dirparent, user_name,
 		p, *user_runas);
 	else
 	    len = easprintf(timestampfile, "%s/%s/%s", dirparent, user_name, p);
 	if (len >= MAXPATHLEN)
 	    log_error(0, "timestamp path too long: %s", timestampfile);
-    } else if (def_flag(I_TARGETPW)) {
+    } else if (def_targetpw) {
 	len = easprintf(timestampfile, "%s/%s/%s", dirparent, user_name,
 	    *user_runas);
 	if (len >= MAXPATHLEN)
@@ -362,7 +362,7 @@ timestamp_status(timestampdir, timestampfile, user, make_dirs)
 {
     struct stat sb;
     time_t now;
-    char *dirparent = def_str(I_TIMESTAMPDIR);
+    char *dirparent = def_timestampdir;
     int status = TS_ERROR;		/* assume the worst */
 
     if (timestamp_uid != 0)
@@ -498,17 +498,17 @@ timestamp_status(timestampdir, timestampfile, user, make_dirs)
      */
     if (status == TS_OLD) {
 	/* Negative timeouts only expire manually (sudo -k). */
-	if (def_ival(I_TIMESTAMP_TIMEOUT) < 0 && sb.st_mtime != 0)
+	if (def_timestamp_timeout < 0 && sb.st_mtime != 0)
 	    status = TS_CURRENT;
 	else {
 	    now = time(NULL);
-	    if (def_ival(I_TIMESTAMP_TIMEOUT) && 
-		now - sb.st_mtime < 60 * def_ival(I_TIMESTAMP_TIMEOUT)) {
+	    if (def_timestamp_timeout && 
+		now - sb.st_mtime < 60 * def_timestamp_timeout) {
 		/*
 		 * Check for bogus time on the stampfile.  The clock may
 		 * have been set back or someone could be trying to spoof us.
 		 */
-		if (sb.st_mtime > now + 60 * def_ival(I_TIMESTAMP_TIMEOUT) * 2) {
+		if (sb.st_mtime > now + 60 * def_timestamp_timeout * 2) {
 		    log_error(NO_EXIT,
 			"timestamp too far in the future: %20.20s",
 			4 + ctime(&sb.st_mtime));
diff --git a/def_data.h b/def_data.h
index 9e9c5e44b..7ea14cbda 100644
--- a/def_data.h
+++ b/def_data.h
@@ -1,59 +1,118 @@
+#define def_syslog_ifac         (sudo_defs_table[0].sd_un.ival)
 #define I_SYSLOG_IFAC           0
+#define def_syslog_igoodpri     (sudo_defs_table[1].sd_un.ival)
 #define I_SYSLOG_IGOODPRI       1
+#define def_syslog_ibadpri      (sudo_defs_table[2].sd_un.ival)
 #define I_SYSLOG_IBADPRI        2
+#define def_syslog              (sudo_defs_table[3].sd_un.str)
 #define I_SYSLOG                3
+#define def_syslog_goodpri      (sudo_defs_table[4].sd_un.str)
 #define I_SYSLOG_GOODPRI        4
+#define def_syslog_badpri       (sudo_defs_table[5].sd_un.str)
 #define I_SYSLOG_BADPRI         5
+#define def_long_otp_prompt     (sudo_defs_table[6].sd_un.flag)
 #define I_LONG_OTP_PROMPT       6
+#define def_ignore_dot          (sudo_defs_table[7].sd_un.flag)
 #define I_IGNORE_DOT            7
+#define def_mail_always         (sudo_defs_table[8].sd_un.flag)
 #define I_MAIL_ALWAYS           8
+#define def_mail_badpass        (sudo_defs_table[9].sd_un.flag)
 #define I_MAIL_BADPASS          9
+#define def_mail_no_user        (sudo_defs_table[10].sd_un.flag)
 #define I_MAIL_NO_USER          10
+#define def_mail_no_host        (sudo_defs_table[11].sd_un.flag)
 #define I_MAIL_NO_HOST          11
+#define def_mail_no_perms       (sudo_defs_table[12].sd_un.flag)
 #define I_MAIL_NO_PERMS         12
+#define def_tty_tickets         (sudo_defs_table[13].sd_un.flag)
 #define I_TTY_TICKETS           13
+#define def_lecture             (sudo_defs_table[14].sd_un.flag)
 #define I_LECTURE               14
+#define def_authenticate        (sudo_defs_table[15].sd_un.flag)
 #define I_AUTHENTICATE          15
+#define def_root_sudo           (sudo_defs_table[16].sd_un.flag)
 #define I_ROOT_SUDO             16
+#define def_log_host            (sudo_defs_table[17].sd_un.flag)
 #define I_LOG_HOST              17
+#define def_log_year            (sudo_defs_table[18].sd_un.flag)
 #define I_LOG_YEAR              18
+#define def_shell_noargs        (sudo_defs_table[19].sd_un.flag)
 #define I_SHELL_NOARGS          19
+#define def_set_home            (sudo_defs_table[20].sd_un.flag)
 #define I_SET_HOME              20
+#define def_always_set_home     (sudo_defs_table[21].sd_un.flag)
 #define I_ALWAYS_SET_HOME       21
+#define def_path_info           (sudo_defs_table[22].sd_un.flag)
 #define I_PATH_INFO             22
+#define def_fqdn                (sudo_defs_table[23].sd_un.flag)
 #define I_FQDN                  23
+#define def_insults             (sudo_defs_table[24].sd_un.flag)
 #define I_INSULTS               24
+#define def_requiretty          (sudo_defs_table[25].sd_un.flag)
 #define I_REQUIRETTY            25
+#define def_env_editor          (sudo_defs_table[26].sd_un.flag)
 #define I_ENV_EDITOR            26
+#define def_rootpw              (sudo_defs_table[27].sd_un.flag)
 #define I_ROOTPW                27
+#define def_runaspw             (sudo_defs_table[28].sd_un.flag)
 #define I_RUNASPW               28
+#define def_targetpw            (sudo_defs_table[29].sd_un.flag)
 #define I_TARGETPW              29
+#define def_use_loginclass      (sudo_defs_table[30].sd_un.flag)
 #define I_USE_LOGINCLASS        30
+#define def_set_logname         (sudo_defs_table[31].sd_un.flag)
 #define I_SET_LOGNAME           31
+#define def_stay_setuid         (sudo_defs_table[32].sd_un.flag)
 #define I_STAY_SETUID           32
+#define def_env_reset           (sudo_defs_table[33].sd_un.flag)
 #define I_ENV_RESET             33
+#define def_preserve_groups     (sudo_defs_table[34].sd_un.flag)
 #define I_PRESERVE_GROUPS       34
+#define def_loglinelen          (sudo_defs_table[35].sd_un.ival)
 #define I_LOGLINELEN            35
+#define def_timestamp_timeout   (sudo_defs_table[36].sd_un.ival)
 #define I_TIMESTAMP_TIMEOUT     36
+#define def_passwd_timeout      (sudo_defs_table[37].sd_un.ival)
 #define I_PASSWD_TIMEOUT        37
+#define def_passwd_tries        (sudo_defs_table[38].sd_un.ival)
 #define I_PASSWD_TRIES          38
+#define def_umask               (sudo_defs_table[39].sd_un.mode)
 #define I_UMASK                 39
+#define def_logfile             (sudo_defs_table[40].sd_un.str)
 #define I_LOGFILE               40
+#define def_mailerpath          (sudo_defs_table[41].sd_un.str)
 #define I_MAILERPATH            41
+#define def_mailerflags         (sudo_defs_table[42].sd_un.str)
 #define I_MAILERFLAGS           42
+#define def_mailto              (sudo_defs_table[43].sd_un.str)
 #define I_MAILTO                43
+#define def_mailsub             (sudo_defs_table[44].sd_un.str)
 #define I_MAILSUB               44
+#define def_badpass_message     (sudo_defs_table[45].sd_un.str)
 #define I_BADPASS_MESSAGE       45
+#define def_timestampdir        (sudo_defs_table[46].sd_un.str)
 #define I_TIMESTAMPDIR          46
+#define def_timestampowner      (sudo_defs_table[47].sd_un.str)
 #define I_TIMESTAMPOWNER        47
+#define def_exempt_group        (sudo_defs_table[48].sd_un.str)
 #define I_EXEMPT_GROUP          48
+#define def_passprompt          (sudo_defs_table[49].sd_un.str)
 #define I_PASSPROMPT            49
+#define def_runas_default       (sudo_defs_table[50].sd_un.str)
 #define I_RUNAS_DEFAULT         50
+#define def_editor              (sudo_defs_table[51].sd_un.str)
 #define I_EDITOR                51
+#define def_env_check           (sudo_defs_table[52].sd_un.list)
 #define I_ENV_CHECK             52
+#define def_env_delete          (sudo_defs_table[53].sd_un.list)
 #define I_ENV_DELETE            53
+#define def_env_keep            (sudo_defs_table[54].sd_un.list)
 #define I_ENV_KEEP              54
+#define def_listpw_i            (sudo_defs_table[55].sd_un.ival)
 #define I_LISTPW_I              55
+#define def_verifypw_i          (sudo_defs_table[56].sd_un.ival)
 #define I_VERIFYPW_I            56
+#define def_listpw              (sudo_defs_table[57].sd_un.str)
 #define I_LISTPW                57
+#define def_verifypw            (sudo_defs_table[58].sd_un.str)
 #define I_VERIFYPW              58
diff --git a/defaults.c b/defaults.c
index 5304f62c2..f56fd3d9f 100644
--- a/defaults.c
+++ b/defaults.c
@@ -385,57 +385,57 @@ init_defaults()
 
     /* First initialize the flags. */
 #ifdef LONG_OTP_PROMPT
-    def_flag(I_LONG_OTP_PROMPT) = TRUE;
+    def_long_otp_prompt = TRUE;
 #endif
 #ifdef IGNORE_DOT_PATH
-    def_flag(I_IGNORE_DOT) = TRUE;
+    def_ignore_dot = TRUE;
 #endif
 #ifdef ALWAYS_SEND_MAIL
-    def_flag(I_MAIL_ALWAYS) = TRUE;
+    def_mail_always = TRUE;
 #endif
 #ifdef SEND_MAIL_WHEN_NO_USER
-    def_flag(I_MAIL_NO_USER) = TRUE;
+    def_mail_no_user = TRUE;
 #endif
 #ifdef SEND_MAIL_WHEN_NO_HOST
-    def_flag(I_MAIL_NO_HOST) = TRUE;
+    def_mail_no_host = TRUE;
 #endif
 #ifdef SEND_MAIL_WHEN_NOT_OK
-    def_flag(I_MAIL_NO_PERMS) = TRUE;
+    def_mail_no_perms = TRUE;
 #endif
 #ifdef USE_TTY_TICKETS
-    def_flag(I_TTY_TICKETS) = TRUE;
+    def_tty_tickets = TRUE;
 #endif
 #ifndef NO_LECTURE
-    def_flag(I_LECTURE) = TRUE;
+    def_lecture = TRUE;
 #endif
 #ifndef NO_AUTHENTICATION
-    def_flag(I_AUTHENTICATE) = TRUE;
+    def_authenticate = TRUE;
 #endif
 #ifndef NO_ROOT_SUDO
-    def_flag(I_ROOT_SUDO) = TRUE;
+    def_root_sudo = TRUE;
 #endif
 #ifdef HOST_IN_LOG
-    def_flag(I_LOG_HOST) = TRUE;
+    def_log_host = TRUE;
 #endif
 #ifdef SHELL_IF_NO_ARGS
-    def_flag(I_SHELL_NOARGS) = TRUE;
+    def_shell_noargs = TRUE;
 #endif
 #ifdef SHELL_SETS_HOME
-    def_flag(I_SET_HOME) = TRUE;
+    def_set_home = TRUE;
 #endif
 #ifndef DONT_LEAK_PATH_INFO
-    def_flag(I_PATH_INFO) = TRUE;
+    def_path_info = TRUE;
 #endif
 #ifdef FQDN
-    def_flag(I_FQDN) = TRUE;
+    def_fqdn = TRUE;
 #endif
 #ifdef USE_INSULTS
-    def_flag(I_INSULTS) = TRUE;
+    def_insults = TRUE;
 #endif
 #ifdef ENV_EDITOR
-    def_flag(I_ENV_EDITOR) = TRUE;
+    def_env_editor = TRUE;
 #endif
-    def_flag(I_SET_LOGNAME) = TRUE;
+    def_set_logname = TRUE;
 
     /* Syslog options need special care since they both strings and ints */
 #if (LOGGING & SLOG_SYSLOG)
@@ -452,33 +452,33 @@ init_defaults()
 
     /* Then initialize the int-like things. */
 #ifdef SUDO_UMASK
-    def_mode(I_UMASK) = SUDO_UMASK;
+    def_umask = SUDO_UMASK;
 #else
-    def_mode(I_UMASK) = 0777;
+    def_umask = 0777;
 #endif
-    def_ival(I_LOGLINELEN) = MAXLOGFILELEN;
-    def_ival(I_TIMESTAMP_TIMEOUT) = TIMEOUT;
-    def_ival(I_PASSWD_TIMEOUT) = PASSWORD_TIMEOUT;
-    def_ival(I_PASSWD_TRIES) = TRIES_FOR_PASSWORD;
+    def_loglinelen = MAXLOGFILELEN;
+    def_timestamp_timeout = TIMEOUT;
+    def_passwd_timeout = PASSWORD_TIMEOUT;
+    def_passwd_tries = TRIES_FOR_PASSWORD;
 
     /* Now do the strings */
-    def_str(I_MAILTO) = estrdup(MAILTO);
-    def_str(I_MAILSUB) = estrdup(MAILSUBJECT);
-    def_str(I_BADPASS_MESSAGE) = estrdup(INCORRECT_PASSWORD);
-    def_str(I_TIMESTAMPDIR) = estrdup(_PATH_SUDO_TIMEDIR);
-    def_str(I_PASSPROMPT) = estrdup(PASSPROMPT);
-    def_str(I_RUNAS_DEFAULT) = estrdup(RUNAS_DEFAULT);
+    def_mailto = estrdup(MAILTO);
+    def_mailsub = estrdup(MAILSUBJECT);
+    def_badpass_message = estrdup(INCORRECT_PASSWORD);
+    def_timestampdir = estrdup(_PATH_SUDO_TIMEDIR);
+    def_passprompt = estrdup(PASSPROMPT);
+    def_runas_default = estrdup(RUNAS_DEFAULT);
 #ifdef _PATH_SUDO_SENDMAIL
-    def_str(I_MAILERPATH) = estrdup(_PATH_SUDO_SENDMAIL);
-    def_str(I_MAILERFLAGS) = estrdup("-t");
+    def_mailerpath = estrdup(_PATH_SUDO_SENDMAIL);
+    def_mailerflags = estrdup("-t");
 #endif
 #if (LOGGING & SLOG_FILE)
-    def_str(I_LOGFILE) = estrdup(_PATH_SUDO_LOGFILE);
+    def_logfile = estrdup(_PATH_SUDO_LOGFILE);
 #endif
 #ifdef EXEMPTGROUP
-    def_str(I_EXEMPT_GROUP) = estrdup(EXEMPTGROUP);
+    def_exempt_group = estrdup(EXEMPTGROUP);
 #endif
-    def_str(I_EDITOR) = estrdup(EDITOR);
+    def_editor = estrdup(EDITOR);
 
     /* Finally do the lists (currently just environment tables). */
     init_envtables();
@@ -489,7 +489,7 @@ init_defaults()
      * value changes we get the change.
      */
     if (user_runas == NULL)
-	user_runas = &def_str(I_RUNAS_DEFAULT);
+	user_runas = &def_runas_default;
 
     firsttime = 0;
 }
diff --git a/defaults.h b/defaults.h
index 58ea8a484..216323eb1 100644
--- a/defaults.h
+++ b/defaults.h
@@ -106,15 +106,6 @@ struct sudo_defs_types {
 #define I_GOODPRI	I_SYSLOG_IGOODPRI
 #define I_BADPRI	I_SYSLOG_IBADPRI 
 
-/*
- * Macros for accessing sudo_defs_table.
- */
-#define def_flag(_i)	(sudo_defs_table[(_i)].sd_un.flag)
-#define def_ival(_i)	(sudo_defs_table[(_i)].sd_un.ival)
-#define def_str(_i)	(sudo_defs_table[(_i)].sd_un.str)
-#define def_list(_i)	(sudo_defs_table[(_i)].sd_un.list)
-#define def_mode(_i)	(sudo_defs_table[(_i)].sd_un.mode)
-
 /*
  * Prototypes
  */
diff --git a/env.c b/env.c
index 88f2ffa19..156aecb05 100644
--- a/env.c
+++ b/env.c
@@ -293,13 +293,13 @@ rebuild_env(sudo_mode, envp)
      */
     ps1 = NULL;
     didvar = 0;
-    if (def_flag(I_ENV_RESET)) {
+    if (def_env_reset) {
 	int keepit;
 
 	/* Pull in vars we want to keep from the old environment. */
 	for (ep = envp; *ep; ep++) {
 	    keepit = 0;
-	    for (cur = def_list(I_ENV_KEEP); cur; cur = cur->next) {
+	    for (cur = def_env_keep; cur; cur = cur->next) {
 		len = strlen(cur->value);
 		/* Deal with '*' wildcard */
 		if (cur->value[len - 1] == '*') {
@@ -374,7 +374,7 @@ rebuild_env(sudo_mode, envp)
 	    okvar = 1;
 
 	    /* Skip anything listed in env_delete. */
-	    for (cur = def_list(I_ENV_DELETE); cur && okvar; cur = cur->next) {
+	    for (cur = def_env_delete; cur && okvar; cur = cur->next) {
 		len = strlen(cur->value);
 		/* Deal with '*' wildcard */
 		if (cur->value[len - 1] == '*') {
@@ -389,7 +389,7 @@ rebuild_env(sudo_mode, envp)
 	    }
 
 	    /* Check certain variables for '%' and '/' characters. */
-	    for (cur = def_list(I_ENV_CHECK); cur && okvar; cur = cur->next) {
+	    for (cur = def_env_check; cur && okvar; cur = cur->next) {
 		len = strlen(cur->value);
 		/* Deal with '*' wildcard */
 		if (cur->value[len - 1] == '*') {
@@ -427,7 +427,7 @@ rebuild_env(sudo_mode, envp)
 #endif
 
     /* Set $USER and $LOGNAME to target if "set_logname" is true. */
-    if (def_flag(I_SET_LOGNAME) && runas_pw->pw_name) {
+    if (def_set_logname && runas_pw->pw_name) {
 	insert_env(format_env("LOGNAME", runas_pw->pw_name), 1);
 	insert_env(format_env("USER", runas_pw->pw_name), 1);
     }
@@ -467,15 +467,15 @@ init_envtables()
     for (p = initial_badenv_table; *p; p++) {
 	cur = emalloc(sizeof(struct list_member));
 	cur->value = estrdup(*p);
-	cur->next = def_list(I_ENV_DELETE);
-	def_list(I_ENV_DELETE) = cur;
+	cur->next = def_env_delete;
+	def_env_delete = cur;
     }
 
     /* Fill in "env_check" variable. */
     for (p = initial_checkenv_table; *p; p++) {
 	cur = emalloc(sizeof(struct list_member));
 	cur->value = estrdup(*p);
-	cur->next = def_list(I_ENV_CHECK);
-	def_list(I_ENV_CHECK) = cur;
+	cur->next = def_env_check;
+	def_env_check = cur;
     }
 }
diff --git a/find_path.c b/find_path.c
index 087ceb8b3..e3e85c8e9 100644
--- a/find_path.c
+++ b/find_path.c
@@ -151,7 +151,7 @@ find_path(infile, outfile, path)
      */
     if (!result && checkdot) {
 	result = sudo_goodpath(infile);
-	if (result && def_flag(I_IGNORE_DOT))
+	if (result && def_ignore_dot)
 	    return(NOT_FOUND_DOT);
     }
 
diff --git a/logging.c b/logging.c
index 8b48caad8..1e2995e40 100644
--- a/logging.c
+++ b/logging.c
@@ -116,7 +116,7 @@ mysyslog(pri, fmt, va_alist)
     va_start(ap);
 #endif
 #ifdef LOG_NFACILITIES
-    openlog("sudo", 0, def_ival(I_LOGFAC));
+    openlog("sudo", 0, def_syslog_ifac);
 #else
     openlog("sudo", 0);
 #endif
@@ -200,30 +200,30 @@ do_logfile(msg)
     size_t maxlen;
 
     oldmask = umask(077);
-    maxlen = def_ival(I_LOGLINELEN) > 0 ? def_ival(I_LOGLINELEN) : 0;
-    fp = fopen(def_str(I_LOGFILE), "a");
+    maxlen = def_loglinelen > 0 ? def_loglinelen : 0;
+    fp = fopen(def_logfile, "a");
     (void) umask(oldmask);
     if (fp == NULL) {
 	easprintf(&full_line, "Can't open log file: %s: %s",
-	    def_str(I_LOGFILE), strerror(errno));
+	    def_logfile, strerror(errno));
 	send_mail(full_line);
 	free(full_line);
     } else if (!lock_file(fileno(fp), SUDO_LOCK)) {
 	easprintf(&full_line, "Can't lock log file: %s: %s",
-	    def_str(I_LOGFILE), strerror(errno));
+	    def_logfile, strerror(errno));
 	send_mail(full_line);
 	free(full_line);
     } else {
-	if (def_ival(I_LOGLINELEN) == 0) {
+	if (def_loglinelen == 0) {
 	    /* Don't pretty-print long log file lines (hard to grep) */
-	    if (def_flag(I_LOG_HOST))
+	    if (def_log_host)
 		(void) fprintf(fp, "%s : %s : HOST=%s : %s\n", get_timestr(),
 		    user_name, user_shost, msg);
 	    else
 		(void) fprintf(fp, "%s : %s : %s\n", get_timestr(),
 		    user_name, msg);
 	} else {
-	    if (def_flag(I_LOG_HOST))
+	    if (def_log_host)
 		easprintf(&full_line, "%s : %s : HOST=%s : %s", get_timestr(),
 		    user_name, user_shost, msg);
 	    else
@@ -299,9 +299,9 @@ log_auth(status, inform_user)
     int pri;
 
     if (status & VALIDATE_OK)
-	pri = def_ival(I_GOODPRI);
+	pri = def_syslog_igoodpri;
     else
-	pri = def_ival(I_BADPRI);
+	pri = def_syslog_ibadpri;
 
     /* Set error message, if any. */
     if (status & VALIDATE_OK)
@@ -342,9 +342,9 @@ log_auth(status, inform_user)
     /*
      * Log via syslog and/or a file.
      */
-    if (def_str(I_SYSLOG))
+    if (def_syslog)
 	do_syslog(pri, logline);
-    if (def_str(I_LOGFILE))
+    if (def_logfile)
 	do_logfile(logline);
 
     free(logline);
@@ -423,9 +423,9 @@ log_error(va_alist)
     /*
      * Log to syslog and/or a file.
      */
-    if (def_str(I_SYSLOG))
-	do_syslog(def_ival(I_BADPRI), logline);
-    if (def_str(I_LOGFILE))
+    if (def_syslog)
+	do_syslog(def_syslog_ibadpri, logline);
+    if (def_logfile)
 	do_logfile(logline);
 
     free(message);
@@ -461,7 +461,7 @@ send_mail(line)
 #endif
 
     /* Just return if mailer is disabled. */
-    if (!def_str(I_MAILERPATH) || !def_str(I_MAILTO))
+    if (!def_mailerpath || !def_mailto)
 	return;
 
     (void) sigemptyset(&set);
@@ -490,8 +490,8 @@ send_mail(line)
 		(void) close(pfd[1]);
 
 		/* Build up an argv based the mailer path and flags */
-		mflags = estrdup(def_str(I_MAILERFLAGS));
-		mpath = estrdup(def_str(I_MAILERPATH));
+		mflags = estrdup(def_mailerflags);
+		mpath = estrdup(def_mailerpath);
 		if ((argv[0] = strrchr(mpath, ' ')))
 		    argv[0]++;
 		else
@@ -529,8 +529,8 @@ send_mail(line)
 
     /* Pipes are all setup, send message via sendmail. */
     (void) fprintf(mail, "To: %s\nFrom: %s\nSubject: ",
-	def_str(I_MAILTO), user_name);
-    for (p = def_str(I_MAILSUB); *p; p++) {
+	def_mailto, user_name);
+    for (p = def_mailsub; *p; p++) {
 	/* Expand escapes in the subject */
 	if (*p == '%' && *(p+1) != '%') {
 	    switch (*(++p)) {
@@ -567,16 +567,16 @@ mail_auth(status, line)
     int mail_mask;
 
     /* If any of these bits are set in status, we send mail. */
-    if (def_flag(I_MAIL_ALWAYS))
+    if (def_mail_always)
 	mail_mask =
 	    VALIDATE_ERROR|VALIDATE_OK|FLAG_NO_USER|FLAG_NO_HOST|VALIDATE_NOT_OK;
     else {
 	mail_mask = VALIDATE_ERROR;
-	if (def_flag(I_MAIL_NO_USER))
+	if (def_mail_no_user)
 	    mail_mask |= FLAG_NO_USER;
-	if (def_flag(I_MAIL_NO_HOST))
+	if (def_mail_no_host)
 	    mail_mask |= FLAG_NO_HOST;
-	if (def_flag(I_MAIL_NO_PERMS))
+	if (def_mail_no_perms)
 	    mail_mask |= VALIDATE_NOT_OK;
     }
 
@@ -618,7 +618,7 @@ get_timestr()
     struct tm *timeptr;
 
     timeptr = localtime(&now);
-    if (def_flag(I_LOG_YEAR))
+    if (def_log_year)
 	s = "%h %e %T %Y";
     else
 	s = "%h %e %T";
@@ -631,7 +631,7 @@ get_timestr()
 #endif /* HAVE_STRFTIME */
 
     s = ctime(&now) + 4;		/* skip day of the week */
-    if (def_flag(I_LOG_YEAR))
+    if (def_log_year)
 	s[20] = '\0';			/* avoid the newline */
     else
 	s[15] = '\0';			/* don't care about year */
diff --git a/mkdefaults b/mkdefaults
index 82ef6bdfd..819cdc04d 100755
--- a/mkdefaults
+++ b/mkdefaults
@@ -71,6 +71,19 @@ close(HEADER);
 close(CFILE);
 
 sub print_record {
+    my ($v, $defname);
+    # each variable gets a macro to access its value
+    for ($type) {
+	if    (/^T_U?INT/)  { $v = "ival"; }
+	elsif (/^(T_STR|T_PWFLAG|T_LOG)/)    { $v = "str"; }
+	elsif (/^T_FLAG/)   { $v = "flag"; }
+	elsif (/^T_MODE/)   { $v = "mode"; }
+	elsif (/^T_LIST/)   { $v = "list"; }
+	else { die "$0: unknown defaults type: $type\n"; }
+    }
+    printf HEADER "#define %-24s(sudo_defs_table[$count].sd_un.${v})\n",
+	"def_${var}";
+
     $defname = "I_" . uc($var);
     printf HEADER "#define %-24s%d", $defname, $count;
     #print HEADER "\t/* $desc */" if defined($desc);
diff --git a/parse.c b/parse.c
index 20ae461dd..25087687e 100644
--- a/parse.c
+++ b/parse.c
@@ -159,7 +159,7 @@ sudoers_lookup(pwflag)
      * wait until now to set this.
      */
     if (pwflag)
-	pwcheck = (pwflag == -1) ? PWCHECK_NEVER : def_ival(pwflag);
+	pwcheck = (pwflag == -1) ? PWCHECK_NEVER : sudo_defs_table[pwflag].sd_un.ival;
     else
 	pwcheck = 0;
 
@@ -167,7 +167,7 @@ sudoers_lookup(pwflag)
      * Assume the worst.  If the stack is empty the user was
      * not mentioned at all.
      */
-    if (def_flag(I_AUTHENTICATE))
+    if (def_authenticate)
 	error = VALIDATE_NOT_OK;
     else
 	error = VALIDATE_NOT_OK | FLAG_NOPASS;
@@ -188,7 +188,7 @@ sudoers_lookup(pwflag)
     if (pwcheck) {
 	int found;
 
-	if (pwcheck == PWCHECK_NEVER || !def_flag(I_AUTHENTICATE))
+	if (pwcheck == PWCHECK_NEVER || !def_authenticate)
 	    nopass = FLAG_NOPASS;
 	found = 0;
 	while (top) {
diff --git a/parse.yacc b/parse.yacc
index 31e8c1c04..bcbe21fc5 100644
--- a/parse.yacc
+++ b/parse.yacc
@@ -127,7 +127,7 @@ int top = 0, stacksize = 0;
 	match[top].cmnd   = -1; \
 	match[top].host   = -1; \
 	match[top].runas  = -1; \
-	match[top].nopass = def_flag(I_AUTHENTICATE) ? -1 : TRUE; \
+	match[top].nopass = def_authenticate ? -1 : TRUE; \
 	top++; \
     } while (0)
 
@@ -366,7 +366,7 @@ privilege	:	hostlist '=' cmndspeclist {
 			     */
 			    host_matches = -1;
 			    runas_matches = -1;
-			    if (def_flag(I_AUTHENTICATE))
+			    if (def_authenticate)
 				no_passwd = -1;
 			    else
 				no_passwd = TRUE;
@@ -501,7 +501,7 @@ runasspec	:	/* empty */ {
 			     */
 			    if (runas_matches == -1)
 				runas_matches = (strcmp(*user_runas,
-				    def_str(I_RUNAS_DEFAULT)) == 0);
+				    def_runas_default) == 0);
 			}
 		|	RUNAS runaslist {
 			    runas_matches = ($2 == TRUE ? TRUE : FALSE);
@@ -1052,13 +1052,13 @@ list_matches()
 	    } while ((p = strtok(NULL, ", ")));
 	    (void) fputs(") ", stdout);
 	} else {
-	    (void) printf("(%s) ", def_str(I_RUNAS_DEFAULT));
+	    (void) printf("(%s) ", def_runas_default);
 	}
 
 	/* Is a password required? */
-	if (cm_list[count].nopasswd == TRUE && def_flag(I_AUTHENTICATE))
+	if (cm_list[count].nopasswd == TRUE && def_authenticate)
 	    (void) fputs("NOPASSWD: ", stdout);
-	else if (cm_list[count].nopasswd == FALSE && !def_flag(I_AUTHENTICATE))
+	else if (cm_list[count].nopasswd == FALSE && !def_authenticate)
 	    (void) fputs("PASSWD: ", stdout);
 
 	/* Print the actual command or expanded Cmnd_Alias. */
diff --git a/set_perms.c b/set_perms.c
index 5f7a0b00c..0b4e9455c 100644
--- a/set_perms.c
+++ b/set_perms.c
@@ -121,7 +121,7 @@ set_perms_posix(perm)
 	case PERM_RUNAS:
 				/* headed for exec(), assume euid == 0 */
 				runas_setup();
-				if (def_flag(I_STAY_SETUID))
+				if (def_stay_setuid)
 				    error = seteuid(runas_pw->pw_uid);
 				else
 				    error = setuid(runas_pw->pw_uid);
@@ -194,7 +194,7 @@ set_perms_suid(perm)
 	case PERM_RUNAS:
 				/* headed for exec(), assume euid == 0 */
 				runas_setup();
-				error = setresuid(def_flag(I_STAY_SETUID) ?
+				error = setresuid(def_stay_setuid ?
 				    user_uid : runas_pw->pw_uid,
 				    runas_pw->pw_uid, runas_pw->pw_uid);
 				if (error)
@@ -266,7 +266,7 @@ set_perms_suid(perm)
 	case PERM_RUNAS:
 				/* headed for exec(), assume euid == 0 */
 				runas_setup();
-				error = setreuid(def_flag(I_STAY_SETUID) ?
+				error = setreuid(def_stay_setuid ?
 				    user_uid : runas_pw->pw_uid,
 				    runas_pw->pw_uid);
 				if (error)
@@ -382,7 +382,7 @@ runas_setup()
 #endif /* HAVE_PAM */
 
 #ifdef HAVE_LOGIN_CAP_H
-	if (def_flag(I_USE_LOGINCLASS)) {
+	if (def_use_loginclass) {
 	    /*
              * We don't have setusercontext() set the user since we
              * may only want to set the effective uid.  Depending on
@@ -390,7 +390,7 @@ runas_setup()
              * setusercontext() to call initgroups().
 	     */
 	    flags = LOGIN_SETRESOURCES|LOGIN_SETPRIORITY;
-	    if (!def_flag(I_PRESERVE_GROUPS))
+	    if (!def_preserve_groups)
 		flags |= LOGIN_SETGROUP;
 	    else if (setgid(runas_pw->pw_gid))
 		perror("cannot set gid to runas gid");
@@ -411,7 +411,7 @@ runas_setup()
 	    /*
 	     * Initialize group vector unless asked not to.
 	     */
-	    if (!def_flag(I_PRESERVE_GROUPS) &&
+	    if (!def_preserve_groups &&
 		initgroups(*user_runas, runas_pw->pw_gid) < 0)
 		perror("cannot set group vector");
 #endif /* HAVE_INITGROUPS */
diff --git a/sudo.c b/sudo.c
index 2b4f35fb7..45d9a9374 100644
--- a/sudo.c
+++ b/sudo.c
@@ -271,7 +271,7 @@ main(argc, argv, envp)
      */
 #if !defined(HAVE_SETRESUID) && !defined(HAVE_SETREUID) && \
     !defined(NO_SAVED_IDS) && defined(_SC_SAVED_IDS) && defined(_SC_VERSION)
-    if (!def_flag(I_STAY_SETUID) && set_perms == set_perms_posix) {
+    if (!def_stay_setuid && set_perms == set_perms_posix) {
 	if (setuid(0)) {
 	    perror("setuid(0)");
 	    exit(1);
@@ -300,16 +300,16 @@ main(argc, argv, envp)
     /*
      * Look up the timestamp dir owner if one is specified.
      */
-    if (def_str(I_TIMESTAMPOWNER)) {
+    if (def_timestampowner) {
 	struct passwd *pw;
 
-	if (*def_str(I_TIMESTAMPOWNER) == '#')
-	    pw = getpwuid(atoi(def_str(I_TIMESTAMPOWNER) + 1));
+	if (*def_timestampowner == '#')
+	    pw = getpwuid(atoi(def_timestampowner + 1));
 	else
-	    pw = getpwnam(def_str(I_TIMESTAMPOWNER));
+	    pw = getpwnam(def_timestampowner);
 	if (!pw)
 	    log_error(0, "timestamp owner (%s): No such user",
-		def_str(I_TIMESTAMPOWNER));
+		def_timestampowner);
 	timestamp_uid = pw->pw_uid;
     }
 
@@ -324,7 +324,7 @@ main(argc, argv, envp)
 	    errorlineno);
 
     /* Is root even allowed to run sudo? */
-    if (user_uid == 0 && !def_flag(I_ROOT_SUDO)) {
+    if (user_uid == 0 && !def_root_sudo) {
 	(void) fprintf(stderr,
 	    "Sorry, %s has been configured to not allow root to run it.\n",
 	    getprogname());
@@ -333,19 +333,19 @@ main(argc, argv, envp)
 
     /* If given the -P option, set the "preserve_groups" flag. */
     if (sudo_mode & MODE_PRESERVE_GROUPS)
-	def_flag(I_PRESERVE_GROUPS) = TRUE;
+	def_preserve_groups = TRUE;
 
     /* If no command line args and "set_home" is not set, error out. */
-    if ((sudo_mode & MODE_IMPLIED_SHELL) && !def_flag(I_SHELL_NOARGS))
+    if ((sudo_mode & MODE_IMPLIED_SHELL) && !def_shell_noargs)
 	usage(1);
 
     /* May need to set $HOME to target user if we are running a command. */
-    if ((sudo_mode & MODE_RUN) && (def_flag(I_ALWAYS_SET_HOME) ||
-	((sudo_mode & MODE_SHELL) && def_flag(I_SET_HOME))))
+    if ((sudo_mode & MODE_RUN) && (def_always_set_home ||
+	((sudo_mode & MODE_SHELL) && def_set_home)))
 	sudo_mode |= MODE_RESET_HOME;
 
     /* Bail if a tty is required and we don't have one.  */
-    if (def_flag(I_REQUIRETTY)) {
+    if (def_requiretty) {
 	if ((fd = open(_PATH_TTY, O_RDWR|O_NOCTTY)) == -1)
 	    log_error(NO_MAIL, "sorry, you must have a tty to run sudo");
 	else
@@ -389,8 +389,8 @@ main(argc, argv, envp)
 	}
 
 	/* Override user's umask if configured to do so. */
-	if (def_ival(I_UMASK) != 0777)
-	    (void) umask(def_mode(I_UMASK));
+	if (def_umask != 0777)
+	    (void) umask(def_umask);
 
 	/* Restore coredumpsize resource limit. */
 #if defined(RLIMIT_CORE) && !defined(SUDO_DEVEL)
@@ -430,7 +430,7 @@ main(argc, argv, envp)
 	log_auth(validated, 1);
 	exit(1);
     } else if (validated & VALIDATE_NOT_OK) {
-	if (def_flag(I_PATH_INFO)) {
+	if (def_path_info) {
 	    /*
 	     * We'd like to not leak path info at all here, but that can
 	     * *really* confuse the users.  To really close the leak we'd
@@ -492,7 +492,7 @@ init_vars(sudo_mode)
 	user_host = user_shost = "localhost";
     else {
 	user_host = estrdup(thost);
-	if (def_flag(I_FQDN)) {
+	if (def_fqdn) {
 	    /* Defer call to set_fqdn() until log_error() is safe. */
 	    user_shost = user_host;
 	} else {
@@ -546,7 +546,7 @@ init_vars(sudo_mode)
     /*
      * Must defer set_fqdn() until it is safe to call log_error()
      */
-    if (def_flag(I_FQDN))
+    if (def_fqdn)
 	set_fqdn();
 
     if (nohostname)
@@ -691,7 +691,7 @@ parse_args(argc, argv)
 		    usage(1);
 
 		login_class = NewArgv[1];
-		def_flag(I_USE_LOGINCLASS) = TRUE;
+		def_use_loginclass = TRUE;
 
 		NewArgc--;
 		NewArgv++;
@@ -992,14 +992,14 @@ get_authpw()
 {
     struct passwd *pw;
 
-    if (def_ival(I_ROOTPW)) {
+    if (def_rootpw) {
 	if ((pw = sudo_getpwuid(0)) == NULL)
 	    log_error(0, "uid 0 does not exist in the passwd file!");
-    } else if (def_ival(I_RUNASPW)) {
-	if ((pw = sudo_getpwnam(def_str(I_RUNAS_DEFAULT))) == NULL)
+    } else if (def_runaspw) {
+	if ((pw = sudo_getpwnam(def_runas_default)) == NULL)
 	    log_error(0, "user %s does not exist in the passwd file!",
-		def_str(I_RUNAS_DEFAULT));
-    } else if (def_ival(I_TARGETPW)) {
+		def_runas_default);
+    } else if (def_targetpw) {
 	if (**user_runas == '#') {
 	    if ((pw = sudo_getpwuid(atoi(*user_runas + 1))) == NULL)
 		log_error(0, "uid %s does not exist in the passwd file!",
diff --git a/sudo.tab.c b/sudo.tab.c
index 87f881d1c..b908aa5dd 100644
--- a/sudo.tab.c
+++ b/sudo.tab.c
@@ -1,10 +1,10 @@
 #ifndef lint
 /*static char yysccsid[] = "from: @(#)yaccpar	1.9 (Berkeley) 02/21/93";*/
 static char yyrcsid[]
-#if __GNUC__ == 2
+#if __GNUC__ >= 2
   __attribute__ ((unused))
-#endif /* __GNUC__ == 2 */
-  = "$OpenBSD: skeleton.c,v 1.19 2002/12/03 21:34:21 mickey Exp $";
+#endif /* __GNUC__ >= 2 */
+  = "$OpenBSD: skeleton.c,v 1.22 2003/11/25 20:00:15 espie Exp $";
 #endif
 #include <stdlib.h>
 #define YYBYACC 1
@@ -18,7 +18,7 @@ static char yyrcsid[]
 #define YYPREFIX "yy"
 #line 2 "parse.yacc"
 /*
- * Copyright (c) 1996, 1998-2001 Todd C. Miller <Todd.Miller@courtesan.com>
+ * Copyright (c) 1996, 1998-2003 Todd C. Miller <Todd.Miller@courtesan.com>
  * All rights reserved.
  *
  * This code is derived from software contributed by Chris Jepeway.
@@ -51,6 +51,10 @@ static char yyrcsid[]
  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
  */
 
 /*
@@ -141,7 +145,7 @@ int top = 0, stacksize = 0;
 	match[top].cmnd   = -1; \
 	match[top].host   = -1; \
 	match[top].runas  = -1; \
-	match[top].nopass = def_flag(I_AUTHENTICATE) ? -1 : TRUE; \
+	match[top].nopass = def_authenticate ? -1 : TRUE; \
 	top++; \
     } while (0)
 
@@ -227,14 +231,14 @@ yyerror(s)
     }
     parse_error = TRUE;
 }
-#line 214 "parse.yacc"
+#line 218 "parse.yacc"
 typedef union {
     char *string;
     int BOOLEAN;
     struct sudo_command command;
     int tok;
 } YYSTYPE;
-#line 238 "sudo.tab.c"
+#line 242 "sudo.tab.c"
 #define COMMAND 257
 #define ALIAS 258
 #define DEFVAR 259
@@ -642,7 +646,7 @@ short *yyss;
 short *yysslim;
 YYSTYPE *yyvs;
 int yystacksize;
-#line 865 "parse.yacc"
+#line 869 "parse.yacc"
 
 #define MOREALIASES (32)
 aliasinfo *aliases = NULL;
@@ -829,13 +833,13 @@ list_matches()
 	    } while ((p = strtok(NULL, ", ")));
 	    (void) fputs(") ", stdout);
 	} else {
-	    (void) printf("(%s) ", def_str(I_RUNAS_DEFAULT));
+	    (void) printf("(%s) ", def_runas_default);
 	}
 
 	/* Is a password required? */
-	if (cm_list[count].nopasswd == TRUE && def_flag(I_AUTHENTICATE))
+	if (cm_list[count].nopasswd == TRUE && def_authenticate)
 	    (void) fputs("NOPASSWD: ", stdout);
-	else if (cm_list[count].nopasswd == FALSE && !def_flag(I_AUTHENTICATE))
+	else if (cm_list[count].nopasswd == FALSE && !def_authenticate)
 	    (void) fputs("PASSWD: ", stdout);
 
 	/* Print the actual command or expanded Cmnd_Alias. */
@@ -992,7 +996,7 @@ init_parser()
     if (printmatches == TRUE)
 	expand_match_list();
 }
-#line 944 "sudo.tab.c"
+#line 948 "sudo.tab.c"
 /* allocate initial stack or double stack size, up to YYMAXDEPTH */
 #if defined(__cplusplus) || defined(__STDC__)
 static int yygrowstack(void)
@@ -1186,85 +1190,85 @@ yyreduce:
     switch (yyn)
     {
 case 3:
-#line 265 "parse.yacc"
+#line 269 "parse.yacc"
 { ; }
 break;
 case 4:
-#line 267 "parse.yacc"
+#line 271 "parse.yacc"
 { yyerrok; }
 break;
 case 5:
-#line 268 "parse.yacc"
+#line 272 "parse.yacc"
 { push; }
 break;
 case 6:
-#line 268 "parse.yacc"
+#line 272 "parse.yacc"
 {
 			    while (top && user_matches != TRUE)
 				pop;
 			}
 break;
 case 7:
-#line 273 "parse.yacc"
+#line 277 "parse.yacc"
 { ; }
 break;
 case 8:
-#line 275 "parse.yacc"
+#line 279 "parse.yacc"
 { ; }
 break;
 case 9:
-#line 277 "parse.yacc"
+#line 281 "parse.yacc"
 { ; }
 break;
 case 10:
-#line 279 "parse.yacc"
+#line 283 "parse.yacc"
 { ; }
 break;
 case 11:
-#line 281 "parse.yacc"
+#line 285 "parse.yacc"
 { ; }
 break;
 case 13:
-#line 287 "parse.yacc"
+#line 291 "parse.yacc"
 {
 			    defaults_matches = TRUE;
 			}
 break;
 case 14:
-#line 290 "parse.yacc"
+#line 294 "parse.yacc"
 { push; }
 break;
 case 15:
-#line 290 "parse.yacc"
+#line 294 "parse.yacc"
 {
 			    defaults_matches = user_matches;
 			    pop;
 			}
 break;
 case 16:
-#line 294 "parse.yacc"
+#line 298 "parse.yacc"
 { push; }
 break;
 case 17:
-#line 294 "parse.yacc"
+#line 298 "parse.yacc"
 {
 			    defaults_matches = yyvsp[0].BOOLEAN == TRUE;
 			    pop;
 			}
 break;
 case 18:
-#line 298 "parse.yacc"
+#line 302 "parse.yacc"
 { push; }
 break;
 case 19:
-#line 298 "parse.yacc"
+#line 302 "parse.yacc"
 {
 			    defaults_matches = host_matches;
 			    pop;
 			}
 break;
 case 22:
-#line 308 "parse.yacc"
+#line 312 "parse.yacc"
 {
 			    if (defaults_matches == TRUE &&
 				!set_default(yyvsp[0].string, NULL, TRUE)) {
@@ -1275,7 +1279,7 @@ case 22:
 			}
 break;
 case 23:
-#line 316 "parse.yacc"
+#line 320 "parse.yacc"
 {
 			    if (defaults_matches == TRUE &&
 				!set_default(yyvsp[0].string, NULL, FALSE)) {
@@ -1286,7 +1290,7 @@ case 23:
 			}
 break;
 case 24:
-#line 324 "parse.yacc"
+#line 328 "parse.yacc"
 {
 			    if (defaults_matches == TRUE &&
 				!set_default(yyvsp[-2].string, yyvsp[0].string, TRUE)) {
@@ -1298,7 +1302,7 @@ case 24:
 			}
 break;
 case 25:
-#line 333 "parse.yacc"
+#line 337 "parse.yacc"
 {
 			    if (defaults_matches == TRUE &&
 				!set_default(yyvsp[-2].string, yyvsp[0].string, '+')) {
@@ -1310,7 +1314,7 @@ case 25:
 			}
 break;
 case 26:
-#line 342 "parse.yacc"
+#line 346 "parse.yacc"
 {
 			    if (defaults_matches == TRUE &&
 				!set_default(yyvsp[-2].string, yyvsp[0].string, '-')) {
@@ -1322,7 +1326,7 @@ case 26:
 			}
 break;
 case 29:
-#line 357 "parse.yacc"
+#line 361 "parse.yacc"
 {
 			    /*
 			     * We already did a push if necessary in
@@ -1331,34 +1335,34 @@ case 29:
 			     */
 			    host_matches = -1;
 			    runas_matches = -1;
-			    if (def_flag(I_AUTHENTICATE))
+			    if (def_authenticate)
 				no_passwd = -1;
 			    else
 				no_passwd = TRUE;
 			}
 break;
 case 30:
-#line 372 "parse.yacc"
+#line 376 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				host_matches = yyvsp[0].BOOLEAN;
 			}
 break;
 case 31:
-#line 376 "parse.yacc"
+#line 380 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				host_matches = ! yyvsp[0].BOOLEAN;
 			}
 break;
 case 32:
-#line 382 "parse.yacc"
+#line 386 "parse.yacc"
 {
 			    yyval.BOOLEAN = TRUE;
 			}
 break;
 case 33:
-#line 385 "parse.yacc"
+#line 389 "parse.yacc"
 {
 			    if (addr_matches(yyvsp[0].string))
 				yyval.BOOLEAN = TRUE;
@@ -1368,7 +1372,7 @@ case 33:
 			}
 break;
 case 34:
-#line 392 "parse.yacc"
+#line 396 "parse.yacc"
 {
 			    if (netgr_matches(yyvsp[0].string, user_host, user_shost, NULL))
 				yyval.BOOLEAN = TRUE;
@@ -1378,7 +1382,7 @@ case 34:
 			}
 break;
 case 35:
-#line 399 "parse.yacc"
+#line 403 "parse.yacc"
 {
 			    if (hostname_matches(user_shost, user_host, yyvsp[0].string) == 0)
 				yyval.BOOLEAN = TRUE;
@@ -1388,7 +1392,7 @@ case 35:
 			}
 break;
 case 36:
-#line 406 "parse.yacc"
+#line 410 "parse.yacc"
 {
 			    aliasinfo *aip = find_alias(yyvsp[0].string, HOST_ALIAS);
 
@@ -1413,7 +1417,7 @@ case 36:
 			}
 break;
 case 39:
-#line 434 "parse.yacc"
+#line 438 "parse.yacc"
 {
 			    /*
 			     * Push the entry onto the stack if it is worth
@@ -1441,14 +1445,14 @@ case 39:
 			}
 break;
 case 40:
-#line 461 "parse.yacc"
+#line 465 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				cmnd_matches = yyvsp[0].BOOLEAN;
 			}
 break;
 case 41:
-#line 465 "parse.yacc"
+#line 469 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1460,14 +1464,14 @@ case 41:
 			}
 break;
 case 42:
-#line 473 "parse.yacc"
+#line 477 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				cmnd_matches = ! yyvsp[0].BOOLEAN;
 			}
 break;
 case 43:
-#line 479 "parse.yacc"
+#line 483 "parse.yacc"
 {
 			    if (printmatches == TRUE && host_matches == TRUE &&
 				user_matches == TRUE) {
@@ -1489,21 +1493,21 @@ case 43:
 			     */
 			    if (runas_matches == -1)
 				runas_matches = (strcmp(*user_runas,
-				    def_str(I_RUNAS_DEFAULT)) == 0);
+				    def_runas_default) == 0);
 			}
 break;
 case 44:
-#line 502 "parse.yacc"
+#line 506 "parse.yacc"
 {
 			    runas_matches = (yyvsp[0].BOOLEAN == TRUE ? TRUE : FALSE);
 			}
 break;
 case 45:
-#line 507 "parse.yacc"
+#line 511 "parse.yacc"
 { ; }
 break;
 case 46:
-#line 508 "parse.yacc"
+#line 512 "parse.yacc"
 {
 			    /* Later entries override earlier ones. */
 			    if (yyvsp[0].BOOLEAN != -1)
@@ -1513,11 +1517,11 @@ case 46:
 			}
 break;
 case 47:
-#line 517 "parse.yacc"
+#line 521 "parse.yacc"
 { ; }
 break;
 case 48:
-#line 518 "parse.yacc"
+#line 522 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1529,14 +1533,14 @@ case 48:
 			}
 break;
 case 49:
-#line 526 "parse.yacc"
+#line 530 "parse.yacc"
 {
 			    /* Set $$ to the negation of runasuser */
 			    yyval.BOOLEAN = (yyvsp[0].BOOLEAN == -1 ? -1 : ! yyvsp[0].BOOLEAN);
 			}
 break;
 case 50:
-#line 532 "parse.yacc"
+#line 536 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1553,7 +1557,7 @@ case 50:
 			}
 break;
 case 51:
-#line 546 "parse.yacc"
+#line 550 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1570,7 +1574,7 @@ case 51:
 			}
 break;
 case 52:
-#line 560 "parse.yacc"
+#line 564 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1587,7 +1591,7 @@ case 52:
 			}
 break;
 case 53:
-#line 574 "parse.yacc"
+#line 578 "parse.yacc"
 {
 			    aliasinfo *aip = find_alias(yyvsp[0].string, RUNAS_ALIAS);
 
@@ -1619,7 +1623,7 @@ case 53:
 			}
 break;
 case 54:
-#line 603 "parse.yacc"
+#line 607 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1632,7 +1636,7 @@ case 54:
 			}
 break;
 case 55:
-#line 615 "parse.yacc"
+#line 619 "parse.yacc"
 {
 			    /* Inherit NOPASSWD/PASSWD status. */
 			    if (printmatches == TRUE && host_matches == TRUE &&
@@ -1645,7 +1649,7 @@ case 55:
 			}
 break;
 case 56:
-#line 625 "parse.yacc"
+#line 629 "parse.yacc"
 {
 			    no_passwd = TRUE;
 			    if (printmatches == TRUE && host_matches == TRUE &&
@@ -1654,7 +1658,7 @@ case 56:
 			}
 break;
 case 57:
-#line 631 "parse.yacc"
+#line 635 "parse.yacc"
 {
 			    no_passwd = FALSE;
 			    if (printmatches == TRUE && host_matches == TRUE &&
@@ -1663,7 +1667,7 @@ case 57:
 			}
 break;
 case 58:
-#line 639 "parse.yacc"
+#line 643 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE)
@@ -1683,7 +1687,7 @@ case 58:
 			}
 break;
 case 59:
-#line 656 "parse.yacc"
+#line 660 "parse.yacc"
 {
 			    aliasinfo *aip;
 
@@ -1715,7 +1719,7 @@ case 59:
 			}
 break;
 case 60:
-#line 685 "parse.yacc"
+#line 689 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				if (in_alias == TRUE) {
@@ -1744,11 +1748,11 @@ case 60:
 			}
 break;
 case 63:
-#line 717 "parse.yacc"
+#line 721 "parse.yacc"
 { push; }
 break;
 case 64:
-#line 717 "parse.yacc"
+#line 721 "parse.yacc"
 {
 			    if ((host_matches != -1 || pedantic) &&
 				!add_alias(yyvsp[-3].string, HOST_ALIAS, host_matches)) {
@@ -1759,7 +1763,7 @@ case 64:
 			}
 break;
 case 69:
-#line 735 "parse.yacc"
+#line 739 "parse.yacc"
 {
 			    push;
 			    if (printmatches == TRUE) {
@@ -1772,7 +1776,7 @@ case 69:
 			}
 break;
 case 70:
-#line 744 "parse.yacc"
+#line 748 "parse.yacc"
 {
 			    if ((cmnd_matches != -1 || pedantic) &&
 				!add_alias(yyvsp[-3].string, CMND_ALIAS, cmnd_matches)) {
@@ -1787,11 +1791,11 @@ case 70:
 			}
 break;
 case 71:
-#line 758 "parse.yacc"
+#line 762 "parse.yacc"
 { ; }
 break;
 case 75:
-#line 766 "parse.yacc"
+#line 770 "parse.yacc"
 {
 			    if (printmatches == TRUE) {
 				in_alias = TRUE;
@@ -1803,7 +1807,7 @@ case 75:
 			}
 break;
 case 76:
-#line 774 "parse.yacc"
+#line 778 "parse.yacc"
 {
 			    if ((yyvsp[0].BOOLEAN != -1 || pedantic) &&
 				!add_alias(yyvsp[-3].string, RUNAS_ALIAS, yyvsp[0].BOOLEAN)) {
@@ -1817,11 +1821,11 @@ case 76:
 			}
 break;
 case 79:
-#line 791 "parse.yacc"
+#line 795 "parse.yacc"
 { push; }
 break;
 case 80:
-#line 791 "parse.yacc"
+#line 795 "parse.yacc"
 {
 			    if ((user_matches != -1 || pedantic) &&
 				!add_alias(yyvsp[-3].string, USER_ALIAS, user_matches)) {
@@ -1833,21 +1837,21 @@ case 80:
 			}
 break;
 case 83:
-#line 806 "parse.yacc"
+#line 810 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				user_matches = yyvsp[0].BOOLEAN;
 			}
 break;
 case 84:
-#line 810 "parse.yacc"
+#line 814 "parse.yacc"
 {
 			    if (yyvsp[0].BOOLEAN != -1)
 				user_matches = ! yyvsp[0].BOOLEAN;
 			}
 break;
 case 85:
-#line 816 "parse.yacc"
+#line 820 "parse.yacc"
 {
 			    if (strcmp(yyvsp[0].string, user_name) == 0)
 				yyval.BOOLEAN = TRUE;
@@ -1857,7 +1861,7 @@ case 85:
 			}
 break;
 case 86:
-#line 823 "parse.yacc"
+#line 827 "parse.yacc"
 {
 			    if (usergr_matches(yyvsp[0].string, user_name))
 				yyval.BOOLEAN = TRUE;
@@ -1867,7 +1871,7 @@ case 86:
 			}
 break;
 case 87:
-#line 830 "parse.yacc"
+#line 834 "parse.yacc"
 {
 			    if (netgr_matches(yyvsp[0].string, NULL, NULL, user_name))
 				yyval.BOOLEAN = TRUE;
@@ -1877,7 +1881,7 @@ case 87:
 			}
 break;
 case 88:
-#line 837 "parse.yacc"
+#line 841 "parse.yacc"
 {
 			    aliasinfo *aip = find_alias(yyvsp[0].string, USER_ALIAS);
 
@@ -1902,12 +1906,12 @@ case 88:
 			}
 break;
 case 89:
-#line 859 "parse.yacc"
+#line 863 "parse.yacc"
 {
 			    yyval.BOOLEAN = TRUE;
 			}
 break;
-#line 1859 "sudo.tab.c"
+#line 1863 "sudo.tab.c"
     }
     yyssp -= yym;
     yystate = *yyssp;
diff --git a/visudo.c b/visudo.c
index e1fad388e..6695203b4 100644
--- a/visudo.c
+++ b/visudo.c
@@ -259,7 +259,7 @@ main(argc, argv)
 	if (find_path(UserEditor, &Editor, getenv("PATH")) == FOUND) {
 	    UserEditor = Editor;
 	} else {
-	    if (def_flag(I_ENV_EDITOR)) {
+	    if (def_env_editor) {
 		/* If we are honoring $EDITOR this is a fatal error. */
 		warnx("specified editor (%s) doesn't exist!", UserEditor);
 		Exit(-1);
@@ -275,7 +275,7 @@ main(argc, argv)
      * we allow any $EDITOR or because $EDITOR is in the allowable list.
      */
     Editor = EditorPath = NULL;
-    if (def_flag(I_ENV_EDITOR) && UserEditor)
+    if (def_env_editor && UserEditor)
 	Editor = UserEditor;
     else if (UserEditor) {
 	struct stat editor_sb;
@@ -287,7 +287,7 @@ main(argc, argv)
 	    warn("unable to stat editor (%s)", UserEditor);
 	    Exit(-1);
 	}
-	EditorPath = estrdup(def_str(I_EDITOR));
+	EditorPath = estrdup(def_editor);
 	Editor = strtok(EditorPath, ":");
 	do {
 	    /*
@@ -317,13 +317,13 @@ main(argc, argv)
     }
 
     /*
-     * Can't use $EDITOR, try each element of I_EDITOR until we
+     * Can't use $EDITOR, try each element of def_editor until we
      * find one that exists, is regular, and is executable.
      */
     if (Editor == NULL || *Editor == '\0') {
 	if (EditorPath != NULL)
 	    free(EditorPath);
-	EditorPath = estrdup(def_str(I_EDITOR));
+	EditorPath = estrdup(def_editor);
 	Editor = strtok(EditorPath, ":");
 	do {
 	    if (sudo_goodpath(Editor))
@@ -332,7 +332,7 @@ main(argc, argv)
 
 	/* Bleah, none of the editors existed! */
 	if (Editor == NULL || *Editor == '\0') {
-	    warnx("no editor found (editor path = %s)", def_str(I_EDITOR));
+	    warnx("no editor found (editor path = %s)", def_editor);
 	    Exit(-1);
 	}
     }