[BACK]Return to defaults.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / sudo

Annotation of src/usr.bin/sudo/defaults.c, Revision 1.1

1.1     ! millert     1: /*
        !             2:  * Copyright (c) 1999 Todd C. Miller <Todd.Miller@courtesan.com>
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that the following conditions
        !             7:  * are met:
        !             8:  *
        !             9:  * 1. Redistributions of source code must retain the above copyright
        !            10:  *    notice, this list of conditions and the following disclaimer.
        !            11:  *
        !            12:  * 2. Redistributions in binary form must reproduce the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer in the
        !            14:  *    documentation and/or other materials provided with the distribution.
        !            15:  *
        !            16:  * 3. The name of the author may not be used to endorse or promote products
        !            17:  *    derived from this software without specific prior written permission.
        !            18:  *
        !            19:  * 4. Products derived from this software may not be called "Sudo" nor
        !            20:  *    may "Sudo" appear in their names without specific prior written
        !            21:  *    permission from the author.
        !            22:  *
        !            23:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
        !            24:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
        !            25:  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
        !            26:  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
        !            27:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
        !            28:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
        !            29:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
        !            30:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
        !            31:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
        !            32:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            33:  */
        !            34:
        !            35: #include "config.h"
        !            36:
        !            37: #include <stdio.h>
        !            38: #ifdef STDC_HEADERS
        !            39: #include <stdlib.h>
        !            40: #endif /* STDC_HEADERS */
        !            41: #ifdef HAVE_UNISTD_H
        !            42: #include <unistd.h>
        !            43: #endif /* HAVE_UNISTD_H */
        !            44: #ifdef HAVE_STRING_H
        !            45: #include <string.h>
        !            46: #endif /* HAVE_STRING_H */
        !            47: #ifdef HAVE_STRINGS_H
        !            48: #include <strings.h>
        !            49: #endif /* HAVE_STRINGS_H */
        !            50: #include <sys/types.h>
        !            51: #include <sys/param.h>
        !            52:
        !            53: #include "sudo.h"
        !            54:
        !            55: #ifndef lint
        !            56: static const char rcsid[] = "$Sudo: defaults.c,v 1.12 1999/11/05 22:11:55 millert Exp $";
        !            57: #endif /* lint */
        !            58:
        !            59: /*
        !            60:  * For converting between syslog numbers and strings.
        !            61:  */
        !            62: struct strmap {
        !            63:     char *name;
        !            64:     int num;
        !            65: };
        !            66:
        !            67: #ifdef LOG_NFACILITIES
        !            68: static struct strmap facilities[] = {
        !            69: #ifdef LOG_AUTHPRIV
        !            70:        { "authpriv",   LOG_AUTHPRIV },
        !            71: #endif
        !            72:        { "auth",       LOG_AUTH },
        !            73:        { "daemon",     LOG_DAEMON },
        !            74:        { "user",       LOG_USER },
        !            75:        { "local0",     LOG_LOCAL0 },
        !            76:        { "local1",     LOG_LOCAL1 },
        !            77:        { "local2",     LOG_LOCAL2 },
        !            78:        { "local3",     LOG_LOCAL3 },
        !            79:        { "local4",     LOG_LOCAL4 },
        !            80:        { "local5",     LOG_LOCAL5 },
        !            81:        { "local6",     LOG_LOCAL6 },
        !            82:        { "local7",     LOG_LOCAL7 },
        !            83:        { NULL,         -1 }
        !            84: };
        !            85: #endif /* LOG_NFACILITIES */
        !            86:
        !            87: static struct strmap priorities[] = {
        !            88:        { "alert",      LOG_ALERT },
        !            89:        { "crit",       LOG_CRIT },
        !            90:        { "debug",      LOG_DEBUG },
        !            91:        { "emerg",      LOG_EMERG },
        !            92:        { "err",        LOG_ERR },
        !            93:        { "info",       LOG_INFO },
        !            94:        { "notice",     LOG_NOTICE },
        !            95:        { "warning",    LOG_WARNING },
        !            96:        { NULL,         -1 }
        !            97: };
        !            98:
        !            99: extern int sudolineno;
        !           100:
        !           101: /*
        !           102:  * Local prototypes.
        !           103:  */
        !           104: static int store_int __P((char *, struct sudo_defs_types *, int));
        !           105: static int store_str __P((char *, struct sudo_defs_types *, int));
        !           106: static int store_syslogfac __P((char *, struct sudo_defs_types *, int));
        !           107: static int store_syslogpri __P((char *, struct sudo_defs_types *, int));
        !           108: static int store_mode __P((char *, struct sudo_defs_types *, int));
        !           109:
        !           110: /*
        !           111:  * Table describing compile-time and run-time options.
        !           112:  */
        !           113: struct sudo_defs_types sudo_defs_table[] = {
        !           114:     {
        !           115:        "syslog_ifac", T_INT, { 0 },
        !           116:        NULL
        !           117:     }, {
        !           118:        "syslog_igoodpri", T_INT, { 0 },
        !           119:        NULL
        !           120:     }, {
        !           121:        "syslog_ibadpri", T_INT, { 0 },
        !           122:        NULL
        !           123:     }, {
        !           124:        "syslog", T_LOGFAC|T_BOOL, { 0 },
        !           125:        "Syslog facility if syslog is being used for logging: %s"
        !           126:     }, {
        !           127:        "syslog_goodpri", T_LOGPRI, { 0 },
        !           128:        "Syslog priority to use when user authenticates successfully: %s"
        !           129:     }, {
        !           130:        "syslog_badpri", T_LOGPRI, { 0 },
        !           131:        "Syslog priority to use when user authenticates unsuccessfully: %s"
        !           132:     }, {
        !           133:        "long_otp_prompt", T_FLAG, { 0 },
        !           134:        "Put OTP prompt on its own line"
        !           135:     }, {
        !           136:        "ignore_dot", T_FLAG, { 0 },
        !           137:        "Ignore '.' in $PATH"
        !           138:     }, {
        !           139:        "mail_always", T_FLAG, { 0 },
        !           140:        "Always send mail when sudo is run"
        !           141:     }, {
        !           142:        "mail_no_user", T_FLAG, { 0 },
        !           143:        "Send mail if the user is not in sudoers"
        !           144:     }, {
        !           145:        "mail_no_host", T_FLAG, { 0 },
        !           146:        "Send mail if the user is not in sudoers for this host"
        !           147:     }, {
        !           148:        "mail_no_perms", T_FLAG, { 0 },
        !           149:        "Send mail if the user is not allowed to run a command"
        !           150:     }, {
        !           151:        "tty_tickets", T_FLAG, { 0 },
        !           152:        "Use a separate timestamp for each user/tty combo"
        !           153:     }, {
        !           154:        "lecture", T_FLAG, { 0 },
        !           155:        "Lecture user the first time they run sudo"
        !           156:     }, {
        !           157:        "authenticate", T_FLAG, { 0 },
        !           158:        "Require users to authenticate by default"
        !           159:     }, {
        !           160:        "root_sudo", T_FLAG, { 0 },
        !           161:        "Root may run sudo"
        !           162:     }, {
        !           163:        "log_host", T_FLAG, { 0 },
        !           164:        "Log the hostname in the (non-syslog) log file"
        !           165:     }, {
        !           166:        "log_year", T_FLAG, { 0 },
        !           167:        "Log the year in the (non-syslog) log file"
        !           168:     }, {
        !           169:        "shell_noargs", T_FLAG, { 0 },
        !           170:        "If sudo is invoked with no arguments, start a shell"
        !           171:     }, {
        !           172:        "set_home", T_FLAG, { 0 },
        !           173:        "Set $HOME to the target user when starting a shell with -s"
        !           174:     }, {
        !           175:        "path_info", T_FLAG, { 0 },
        !           176:        "Allow some information gathering to give useful error messages"
        !           177:     }, {
        !           178:        "fqdn", T_FLAG, { 0 },
        !           179:        "Require fully-qualified hsotnames in the sudoers file"
        !           180:     }, {
        !           181:        "insults", T_FLAG, { 0 },
        !           182:        "Insult the user when they enter an incorrect password"
        !           183:     }, {
        !           184:        "requiretty", T_FLAG, { 0 },
        !           185:        "Only allow the user to run sudo if they have a tty"
        !           186:     }, {
        !           187:        "loglinelen", T_INT|T_BOOL, { 0 },
        !           188:        "Length at which to wrap log file lines (0 for no wrap): %d"
        !           189:     }, {
        !           190:        "timestamp_timeout", T_INT|T_BOOL, { 0 },
        !           191:        "Authentication timestamp timeout: %d minutes"
        !           192:     }, {
        !           193:        "passwd_timeout", T_INT|T_BOOL, { 0 },
        !           194:        "Password prompt timeout: %d minutes"
        !           195:     }, {
        !           196:        "passwd_tries", T_INT, { 0 },
        !           197:        "Number of tries to enter a password: %d"
        !           198:     }, {
        !           199:        "umask", T_MODE|T_BOOL, { 0 },
        !           200:        "Umask to use or 0777 to use user's: 0%o"
        !           201:     }, {
        !           202:        "logfile", T_STR|T_BOOL|T_PATH, { 0 },
        !           203:        "Path to log file: %s"
        !           204:     }, {
        !           205:        "mailerpath", T_STR|T_BOOL|T_PATH, { 0 },
        !           206:        "Path to mail program: %s"
        !           207:     }, {
        !           208:        "mailerflags", T_STR|T_BOOL, { 0 },
        !           209:        "Flags for mail program: %s"
        !           210:     }, {
        !           211:        "mailto", T_STR|T_BOOL, { 0 },
        !           212:        "Address to send mail to: %s"
        !           213:     }, {
        !           214:        "mailsub", T_STR, { 0 },
        !           215:        "Subject line for mail messages: %s"
        !           216:     }, {
        !           217:        "badpass_message", T_STR, { 0 },
        !           218:        "Incorrect password message: %s"
        !           219:     }, {
        !           220:        "timestampdir", T_STR|T_PATH, { 0 },
        !           221:        "Path to authentication timestamp dir: %s"
        !           222:     }, {
        !           223:        "exempt_group", T_STR|T_BOOL, { 0 },
        !           224:        "Users in this group are exempt from password and PATH requirements: %s"
        !           225:     }, {
        !           226:        "passprompt", T_STR, { 0 },
        !           227:        "Default password prompt: %s"
        !           228:     }, {
        !           229:        "runas_default", T_STR, { 0 },
        !           230:        "Default user to run commands as: %s"
        !           231:     }, {
        !           232:        "secure_path", T_STR|T_BOOL, { 0 },
        !           233:        "Value to override user's $PATH with: %s"
        !           234:     }, {
        !           235:        NULL, 0, { 0 }, NULL
        !           236:     }
        !           237: };
        !           238:
        !           239: /*
        !           240:  * Print version and configure info.
        !           241:  */
        !           242: void
        !           243: dump_defaults()
        !           244: {
        !           245:     struct sudo_defs_types *cur;
        !           246:
        !           247:     for (cur = sudo_defs_table; cur->name; cur++) {
        !           248:        if (cur->desc) {
        !           249:            switch (cur->type & T_MASK) {
        !           250:                case T_FLAG:
        !           251:                    if (cur->sd_un.flag)
        !           252:                        puts(cur->desc);
        !           253:                    break;
        !           254:                case T_STR:
        !           255:                case T_LOGFAC:
        !           256:                case T_LOGPRI:
        !           257:                    if (cur->sd_un.str) {
        !           258:                        (void) printf(cur->desc, cur->sd_un.str);
        !           259:                        putchar('\n');
        !           260:                    }
        !           261:                    break;
        !           262:                case T_INT:
        !           263:                    (void) printf(cur->desc, cur->sd_un.ival);
        !           264:                    putchar('\n');
        !           265:                    break;
        !           266:                case T_MODE:
        !           267:                    (void) printf(cur->desc, cur->sd_un.mode);
        !           268:                    putchar('\n');
        !           269:                    break;
        !           270:            }
        !           271:        }
        !           272:     }
        !           273:
        !           274: #ifdef ENV_EDITOR
        !           275:     (void) printf("Default editor for visudo: %s\n", EDITOR);
        !           276: #else
        !           277:     (void) printf("Editor for visudo: %s\n", EDITOR);
        !           278: #endif
        !           279: }
        !           280:
        !           281: /*
        !           282:  * List each option along with its description.
        !           283:  */
        !           284: void
        !           285: list_options()
        !           286: {
        !           287:     struct sudo_defs_types *cur;
        !           288:     char *p;
        !           289:
        !           290:     (void) puts("Available options in a sudoers ``Defaults'' line:\n");
        !           291:     for (cur = sudo_defs_table; cur->name; cur++) {
        !           292:        if (cur->name && cur->desc) {
        !           293:            switch (cur->type & T_MASK) {
        !           294:                case T_FLAG:
        !           295:                    (void) printf("%s: %s\n", cur->name, cur->desc);
        !           296:                    break;
        !           297:                default:
        !           298:                    p = strrchr(cur->desc, ':');
        !           299:                    if (p)
        !           300:                        (void) printf("%s: %.*s\n", cur->name, p - cur->desc,
        !           301:                            cur->desc);
        !           302:                    else
        !           303:                        (void) printf("%s: %s\n", cur->name, cur->desc);
        !           304:                    break;
        !           305:            }
        !           306:        }
        !           307:     }
        !           308: }
        !           309:
        !           310: /*
        !           311:  * Sets/clears an entry in the defaults structure
        !           312:  * If a variable that takes a value is used in a boolean
        !           313:  * context with op == 0, disable that variable.
        !           314:  * Eg. you may want to turn off logging to a file for some hosts.
        !           315:  * This is only meaningful for variables that are *optional*.
        !           316:  */
        !           317: int
        !           318: set_default(var, val, op)
        !           319:     char *var;
        !           320:     char *val;
        !           321:     int op;     /* TRUE or FALSE */
        !           322: {
        !           323:     struct sudo_defs_types *cur;
        !           324:
        !           325:     for (cur = sudo_defs_table; cur->name; cur++) {
        !           326:        if (strcmp(var, cur->name) == 0)
        !           327:            break;
        !           328:     }
        !           329:     if (!cur->name) {
        !           330:        (void) fprintf(stderr,
        !           331:            "%s: unknown defaults entry `%s' referenced near line %d\n", Argv[0],
        !           332:            var, sudolineno);
        !           333:        return(FALSE);
        !           334:     }
        !           335:
        !           336:     switch (cur->type & T_MASK) {
        !           337:        case T_LOGFAC:
        !           338:            if (!store_syslogfac(val, cur, op)) {
        !           339:                if (val)
        !           340:                    (void) fprintf(stderr,
        !           341:                        "%s: value '%s' is invalid for option '%s'\n", Argv[0],
        !           342:                        val, var);
        !           343:                else
        !           344:                    (void) fprintf(stderr,
        !           345:                        "%s: no value specified for `%s' on line %d\n", Argv[0],
        !           346:                        var, sudolineno);
        !           347:                return(FALSE);
        !           348:            }
        !           349:            break;
        !           350:        case T_LOGPRI:
        !           351:            if (!store_syslogpri(val, cur, op)) {
        !           352:                if (val)
        !           353:                    (void) fprintf(stderr,
        !           354:                        "%s: value '%s' is invalid for option '%s'\n", Argv[0],
        !           355:                        val, var);
        !           356:                else
        !           357:                    (void) fprintf(stderr,
        !           358:                        "%s: no value specified for `%s' on line %d\n", Argv[0],
        !           359:                        var, sudolineno);
        !           360:                return(FALSE);
        !           361:            }
        !           362:            break;
        !           363:        case T_STR:
        !           364:            if (!val) {
        !           365:                /* Check for bogus boolean usage or lack of a value. */
        !           366:                if (!(cur->type & T_BOOL) || op != FALSE) {
        !           367:                    (void) fprintf(stderr,
        !           368:                        "%s: no value specified for `%s' on line %d\n", Argv[0],
        !           369:                        var, sudolineno);
        !           370:                    return(FALSE);
        !           371:                }
        !           372:            }
        !           373:            if ((cur->type & T_PATH) && *val != '/') {
        !           374:                (void) fprintf(stderr,
        !           375:                    "%s: values for `%s' must start with a '/'\n", Argv[0],
        !           376:                    var);
        !           377:                return(FALSE);
        !           378:            }
        !           379:            if (!store_str(val, cur, op)) {
        !           380:                (void) fprintf(stderr,
        !           381:                    "%s: value '%s' is invalid for option '%s'\n", Argv[0],
        !           382:                    val, var);
        !           383:                return(FALSE);
        !           384:            }
        !           385:            break;
        !           386:        case T_INT:
        !           387:            if (!val) {
        !           388:                /* Check for bogus boolean usage or lack of a value. */
        !           389:                if (!(cur->type & T_BOOL) || op != FALSE) {
        !           390:                    (void) fprintf(stderr,
        !           391:                        "%s: no value specified for `%s' on line %d\n", Argv[0],
        !           392:                        var, sudolineno);
        !           393:                    return(FALSE);
        !           394:                }
        !           395:            }
        !           396:            if (!store_int(val, cur, op)) {
        !           397:                (void) fprintf(stderr,
        !           398:                    "%s: value '%s' is invalid for option '%s'\n", Argv[0],
        !           399:                    val, var);
        !           400:                return(FALSE);
        !           401:            }
        !           402:            break;
        !           403:        case T_MODE:
        !           404:            if (!val) {
        !           405:                /* Check for bogus boolean usage or lack of a value. */
        !           406:                if (!(cur->type & T_BOOL) || op != FALSE) {
        !           407:                    (void) fprintf(stderr,
        !           408:                        "%s: no value specified for `%s' on line %d\n", Argv[0],
        !           409:                        var, sudolineno);
        !           410:                    return(FALSE);
        !           411:                }
        !           412:            }
        !           413:            if (!store_mode(val, cur, op)) {
        !           414:                (void) fprintf(stderr,
        !           415:                    "%s: value '%s' is invalid for option '%s'\n", Argv[0],
        !           416:                    val, var);
        !           417:                return(FALSE);
        !           418:            }
        !           419:            break;
        !           420:        case T_FLAG:
        !           421:            if (val) {
        !           422:                (void) fprintf(stderr,
        !           423:                    "%s: option `%s' does not take a value on line %d\n",
        !           424:                    Argv[0], var, sudolineno);
        !           425:                return(FALSE);
        !           426:            }
        !           427:            cur->sd_un.flag = op;
        !           428:            break;
        !           429:     }
        !           430:
        !           431:     return(TRUE);
        !           432: }
        !           433:
        !           434: /*
        !           435:  * Set default options to compiled-in values.
        !           436:  * Any of these may be overridden at runtime by a "Defaults" file.
        !           437:  */
        !           438: void
        !           439: init_defaults()
        !           440: {
        !           441:     static int firsttime = 1;
        !           442:     struct sudo_defs_types *def;
        !           443:
        !           444:     /* Free any strings that were set. */
        !           445:     if (!firsttime) {
        !           446:        for (def = sudo_defs_table; def->name; def++)
        !           447:            switch (def->type & T_MASK) {
        !           448:                case T_STR:
        !           449:                case T_LOGFAC:
        !           450:                case T_LOGPRI:
        !           451:                    if (def->sd_un.str) {
        !           452:                        free(def->sd_un.str);
        !           453:                        def->sd_un.str = NULL;
        !           454:                    }
        !           455:                    break;
        !           456:            }
        !           457:     }
        !           458:
        !           459:     /* First initialize the flags. */
        !           460: #ifdef LONG_OTP_PROMPT
        !           461:     def_flag(I_LONG_OTP_PROMPT) = TRUE;
        !           462: #endif
        !           463: #ifdef IGNORE_DOT_PATH
        !           464:     def_flag(I_IGNORE_DOT) = TRUE;
        !           465: #endif
        !           466: #ifdef ALWAYS_SEND_MAIL
        !           467:     def_flag(I_MAIL_ALWAYS) = TRUE;
        !           468: #endif
        !           469: #ifdef SEND_MAIL_WHEN_NO_USER
        !           470:     def_flag(I_MAIL_NOUSER) = TRUE;
        !           471: #endif
        !           472: #ifdef SEND_MAIL_WHEN_NO_HOST
        !           473:     def_flag(I_MAIL_NOHOST) = TRUE;
        !           474: #endif
        !           475: #ifdef SEND_MAIL_WHEN_NOT_OK
        !           476:     def_flag(I_MAIL_NOPERMS) = TRUE;
        !           477: #endif
        !           478: #ifdef USE_TTY_TICKETS
        !           479:     def_flag(I_TTY_TICKETS) = TRUE;
        !           480: #endif
        !           481: #ifndef NO_LECTURE
        !           482:     def_flag(I_LECTURE) = TRUE;
        !           483: #endif
        !           484: #ifndef NO_AUTHENTICATION
        !           485:     def_flag(I_AUTHENTICATE) = TRUE;
        !           486: #endif
        !           487: #ifndef NO_ROOT_SUDO
        !           488:     def_flag(I_ROOT_SUDO) = TRUE;
        !           489: #endif
        !           490: #ifdef HOST_IN_LOG
        !           491:     def_flag(I_LOG_HOST) = TRUE;
        !           492: #endif
        !           493: #ifdef SHELL_IF_NO_ARGS
        !           494:     def_flag(I_SHELL_NOARGS) = TRUE;
        !           495: #endif
        !           496: #ifdef SHELL_SETS_HOME
        !           497:     def_flag(I_SET_HOME) = TRUE;
        !           498: #endif
        !           499: #ifndef DONT_LEAK_PATH_INFO
        !           500:     def_flag(I_PATH_INFO) = TRUE;
        !           501: #endif
        !           502: #ifdef FQDN
        !           503:     def_flag(I_FQDN) = TRUE;
        !           504: #endif
        !           505: #ifdef USE_INSULTS
        !           506:     def_flag(I_INSULTS) = TRUE;
        !           507: #endif
        !           508:
        !           509:     /* Syslog options need special care since they both strings and ints */
        !           510: #if (LOGGING & SLOG_SYSLOG)
        !           511:     (void) store_syslogfac(LOGFAC, &sudo_defs_table[I_LOGFACSTR], TRUE);
        !           512:     (void) store_syslogpri(PRI_SUCCESS, &sudo_defs_table[I_GOODPRISTR], TRUE);
        !           513:     (void) store_syslogpri(PRI_FAILURE, &sudo_defs_table[I_BADPRISTR], TRUE);
        !           514: #endif
        !           515:
        !           516:     /* Then initialize the int-like things. */
        !           517: #ifdef SUDO_UMASK
        !           518:     def_mode(I_UMASK) = SUDO_UMASK;
        !           519: #else
        !           520:     def_mode(I_UMASK) = 0777;
        !           521: #endif
        !           522:     def_ival(I_LOGLEN) = MAXLOGFILELEN;
        !           523:     def_ival(I_TS_TIMEOUT) = TIMEOUT;
        !           524:     def_ival(I_PW_TIMEOUT) = PASSWORD_TIMEOUT;
        !           525:     def_ival(I_PW_TRIES) = TRIES_FOR_PASSWORD;
        !           526:
        !           527:     /* Finally do the strings */
        !           528:     def_str(I_MAILTO) = estrdup(MAILTO);
        !           529:     def_str(I_MAILSUB) = estrdup(MAILSUBJECT);
        !           530:     def_str(I_BADPASS_MSG) = estrdup(INCORRECT_PASSWORD);
        !           531:     def_str(I_TIMESTAMPDIR) = estrdup(_PATH_SUDO_TIMEDIR);
        !           532:     def_str(I_PASSPROMPT) = estrdup(PASSPROMPT);
        !           533:     def_str(I_RUNAS_DEF) = estrdup(RUNAS_DEFAULT);
        !           534: #ifdef _PATH_SENDMAIL
        !           535:     def_str(I_MAILERPATH) = estrdup(_PATH_SENDMAIL);
        !           536:     def_str(I_MAILERFLAGS) = estrdup("-t");
        !           537: #endif
        !           538: #if (LOGGING & SLOG_FILE)
        !           539:     def_str(I_LOGFILE) = estrdup(_PATH_SUDO_LOGFILE);
        !           540: #endif
        !           541: #ifdef EXEMPTGROUP
        !           542:     def_str(I_EXEMPT_GRP) = estrdup(EXEMPTGROUP);
        !           543: #endif
        !           544: #ifdef SECURE_PATH
        !           545:     def_str(I_SECURE_PATH) = estrdup(SECURE_PATH);
        !           546: #endif
        !           547:
        !           548:     /*
        !           549:      * The following depend on the above values.
        !           550:      * We use a pointer to the string so that if its
        !           551:      * value changes we get the change.
        !           552:      */
        !           553:     if (user_runas == NULL)
        !           554:        user_runas = &def_str(I_RUNAS_DEF);
        !           555:
        !           556:     firsttime = 0;
        !           557: }
        !           558:
        !           559: static int
        !           560: store_int(val, def, op)
        !           561:     char *val;
        !           562:     struct sudo_defs_types *def;
        !           563:     int op;
        !           564: {
        !           565:     char *endp;
        !           566:     long l;
        !           567:
        !           568:     if (op == FALSE) {
        !           569:        def->sd_un.ival = 0;
        !           570:     } else {
        !           571:        l = strtol(val, &endp, 10);
        !           572:        if (*endp != '\0' || l < 0)
        !           573:            return(FALSE);
        !           574:        /* XXX - should check against INT_MAX */
        !           575:        def->sd_un.ival = (unsigned int)l;
        !           576:     }
        !           577:     return(TRUE);
        !           578: }
        !           579:
        !           580: static int
        !           581: store_str(val, def, op)
        !           582:     char *val;
        !           583:     struct sudo_defs_types *def;
        !           584:     int op;
        !           585: {
        !           586:
        !           587:     if (def->sd_un.str)
        !           588:        free(def->sd_un.str);
        !           589:     if (op == FALSE)
        !           590:        def->sd_un.str = NULL;
        !           591:     else
        !           592:        def->sd_un.str = estrdup(val);
        !           593:     return(TRUE);
        !           594: }
        !           595:
        !           596: static int
        !           597: store_syslogfac(val, def, op)
        !           598:     char *val;
        !           599:     struct sudo_defs_types *def;
        !           600:     int op;
        !           601: {
        !           602:     struct strmap *fac;
        !           603:
        !           604:     if (op == FALSE) {
        !           605:        free(def->sd_un.str);
        !           606:        def->sd_un.str = NULL;
        !           607:        return(TRUE);
        !           608:     }
        !           609: #ifdef LOG_NFACILITIES
        !           610:     if (!val)
        !           611:        return(FALSE);
        !           612:     for (fac = facilities; fac->name && strcmp(val, fac->name); fac++)
        !           613:        ;
        !           614:     if (fac->name == NULL)
        !           615:        return(FALSE);                          /* not found */
        !           616:
        !           617:     /* Store both name and number. */
        !           618:     if (def->sd_un.str)
        !           619:        free(def->sd_un.str);
        !           620:     def->sd_un.str = estrdup(fac->name);
        !           621:     sudo_defs_table[I_LOGFAC].sd_un.ival = fac->num;
        !           622: #else
        !           623:     if (def->sd_un.str)
        !           624:        free(def->sd_un.str);
        !           625:     def->sd_un.str = estrdup("default");
        !           626: #endif /* LOG_NFACILITIES */
        !           627:     return(TRUE);
        !           628: }
        !           629:
        !           630: static int
        !           631: store_syslogpri(val, def, op)
        !           632:     char *val;
        !           633:     struct sudo_defs_types *def;
        !           634:     int op;
        !           635: {
        !           636:     struct strmap *pri;
        !           637:     struct sudo_defs_types *idef;
        !           638:
        !           639:     if (op == FALSE || !val)
        !           640:        return(FALSE);
        !           641:     if (def == &sudo_defs_table[I_GOODPRISTR])
        !           642:        idef = &sudo_defs_table[I_GOODPRI];
        !           643:     else if (def == &sudo_defs_table[I_BADPRISTR])
        !           644:        idef = &sudo_defs_table[I_BADPRI];
        !           645:     else
        !           646:        return(FALSE);
        !           647:
        !           648:     for (pri = priorities; pri->name && strcmp(val, pri->name); pri++)
        !           649:        ;
        !           650:     if (pri->name == NULL)
        !           651:        return(FALSE);                          /* not found */
        !           652:
        !           653:     /* Store both name and number. */
        !           654:     if (def->sd_un.str)
        !           655:        free(def->sd_un.str);
        !           656:     def->sd_un.str = estrdup(pri->name);
        !           657:     idef->sd_un.ival = pri->num;
        !           658:     return(TRUE);
        !           659: }
        !           660:
        !           661: static int
        !           662: store_mode(val, def, op)
        !           663:     char *val;
        !           664:     struct sudo_defs_types *def;
        !           665:     int op;
        !           666: {
        !           667:     char *endp;
        !           668:     long l;
        !           669:
        !           670:     if (op == FALSE) {
        !           671:        def->sd_un.mode = (mode_t)0777;
        !           672:     } else {
        !           673:        l = strtol(val, &endp, 8);
        !           674:        if (*endp != '\0' || l < 0 || l >= 0777)
        !           675:            return(FALSE);
        !           676:        def->sd_un.mode = (mode_t)l;
        !           677:     }
        !           678:     return(TRUE);
        !           679: }