diff options
Diffstat (limited to 'gnu/usr.sbin/sendmail/libsm/cf.c')
-rw-r--r-- | gnu/usr.sbin/sendmail/libsm/cf.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/gnu/usr.sbin/sendmail/libsm/cf.c b/gnu/usr.sbin/sendmail/libsm/cf.c new file mode 100644 index 00000000000..9ee2bbfa218 --- /dev/null +++ b/gnu/usr.sbin/sendmail/libsm/cf.c @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001 Sendmail, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + */ + +#include <sm/gen.h> +SM_RCSID("@(#)$Sendmail: cf.c,v 1.4 2001/02/01 02:40:21 dmoen Exp $") + +#include <ctype.h> +#include <errno.h> + +#include <sm/cf.h> +#include <sm/io.h> +#include <sm/string.h> +#include <sm/heap.h> + +/* +** SM_CF_GETOPT -- look up option values in the sendmail.cf file +** +** Open the sendmail.cf file and parse all of the 'O' directives. +** Each time one of the options named in the option vector optv +** is found, store a malloced copy of the option value in optv. +** +** Parameters: +** path -- pathname of sendmail.cf file +** optc -- size of option vector +** optv -- pointer to option vector +** +** Results: +** 0 on success, or an errno value on failure. +** An exception is raised on malloc failure. +*/ + +int +sm_cf_getopt(path, optc, optv) + char *path; + int optc; + SM_CF_OPT_T *optv; +{ + SM_FILE_T *cfp; + char buf[2048]; + char *p; + char *id; + char *idend; + char *val; + int i; + + cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL); + if (cfp == NULL) + return errno; + + while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL) + { + p = strchr(buf, '\n'); + if (p != NULL) + *p = '\0'; + + if (buf[0] != 'O' || buf[1] != ' ') + continue; + + id = &buf[2]; + val = strchr(id, '='); + if (val == NULL) + val = idend = id + strlen(id); + else + { + idend = val; + ++val; + while (*val == ' ') + ++val; + while (idend > id && idend[-1] == ' ') + --idend; + *idend = '\0'; + } + + for (i = 0; i < optc; ++i) + { + if (sm_strcasecmp(optv[i].opt_name, id) == 0) + { + optv[i].opt_val = sm_strdup_x(val); + break; + } + } + } + if (sm_io_error(cfp)) + { + int save_errno = errno; + + (void) sm_io_close(cfp, SM_TIME_DEFAULT); + errno = save_errno; + return errno; + } + (void) sm_io_close(cfp, SM_TIME_DEFAULT); + return 0; +} |