140266059SGregory Neil Shapiro /* 240266059SGregory Neil Shapiro * Copyright (c) 2001 Sendmail, Inc. and its suppliers. 340266059SGregory Neil Shapiro * All rights reserved. 440266059SGregory Neil Shapiro * 540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set 640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of 740266059SGregory Neil Shapiro * the sendmail distribution. 840266059SGregory Neil Shapiro * 940266059SGregory Neil Shapiro */ 1040266059SGregory Neil Shapiro 1140266059SGregory Neil Shapiro #include <sm/gen.h> 1240266059SGregory Neil Shapiro SM_RCSID("@(#)$Id: cf.c,v 1.6 2001/09/11 04:04:47 gshapiro Exp $") 1340266059SGregory Neil Shapiro 1440266059SGregory Neil Shapiro #include <ctype.h> 1540266059SGregory Neil Shapiro #include <errno.h> 1640266059SGregory Neil Shapiro 1740266059SGregory Neil Shapiro #include <sm/cf.h> 1840266059SGregory Neil Shapiro #include <sm/io.h> 1940266059SGregory Neil Shapiro #include <sm/string.h> 2040266059SGregory Neil Shapiro #include <sm/heap.h> 2140266059SGregory Neil Shapiro 2240266059SGregory Neil Shapiro /* 2340266059SGregory Neil Shapiro ** SM_CF_GETOPT -- look up option values in the sendmail.cf file 2440266059SGregory Neil Shapiro ** 2540266059SGregory Neil Shapiro ** Open the sendmail.cf file and parse all of the 'O' directives. 2640266059SGregory Neil Shapiro ** Each time one of the options named in the option vector optv 2740266059SGregory Neil Shapiro ** is found, store a malloced copy of the option value in optv. 2840266059SGregory Neil Shapiro ** 2940266059SGregory Neil Shapiro ** Parameters: 3040266059SGregory Neil Shapiro ** path -- pathname of sendmail.cf file 3140266059SGregory Neil Shapiro ** optc -- size of option vector 3240266059SGregory Neil Shapiro ** optv -- pointer to option vector 3340266059SGregory Neil Shapiro ** 3440266059SGregory Neil Shapiro ** Results: 3540266059SGregory Neil Shapiro ** 0 on success, or an errno value on failure. 3640266059SGregory Neil Shapiro ** An exception is raised on malloc failure. 3740266059SGregory Neil Shapiro */ 3840266059SGregory Neil Shapiro 3940266059SGregory Neil Shapiro int 4040266059SGregory Neil Shapiro sm_cf_getopt(path, optc, optv) 4140266059SGregory Neil Shapiro char *path; 4240266059SGregory Neil Shapiro int optc; 4340266059SGregory Neil Shapiro SM_CF_OPT_T *optv; 4440266059SGregory Neil Shapiro { 4540266059SGregory Neil Shapiro SM_FILE_T *cfp; 4640266059SGregory Neil Shapiro char buf[2048]; 4740266059SGregory Neil Shapiro char *p; 4840266059SGregory Neil Shapiro char *id; 4940266059SGregory Neil Shapiro char *idend; 5040266059SGregory Neil Shapiro char *val; 5140266059SGregory Neil Shapiro int i; 5240266059SGregory Neil Shapiro 5340266059SGregory Neil Shapiro cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL); 5440266059SGregory Neil Shapiro if (cfp == NULL) 5540266059SGregory Neil Shapiro return errno; 5640266059SGregory Neil Shapiro 5740266059SGregory Neil Shapiro while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL) 5840266059SGregory Neil Shapiro { 5940266059SGregory Neil Shapiro p = strchr(buf, '\n'); 6040266059SGregory Neil Shapiro if (p != NULL) 6140266059SGregory Neil Shapiro *p = '\0'; 6240266059SGregory Neil Shapiro 6340266059SGregory Neil Shapiro if (buf[0] != 'O' || buf[1] != ' ') 6440266059SGregory Neil Shapiro continue; 6540266059SGregory Neil Shapiro 6640266059SGregory Neil Shapiro id = &buf[2]; 6740266059SGregory Neil Shapiro val = strchr(id, '='); 6840266059SGregory Neil Shapiro if (val == NULL) 6940266059SGregory Neil Shapiro val = idend = id + strlen(id); 7040266059SGregory Neil Shapiro else 7140266059SGregory Neil Shapiro { 7240266059SGregory Neil Shapiro idend = val; 7340266059SGregory Neil Shapiro ++val; 7440266059SGregory Neil Shapiro while (*val == ' ') 7540266059SGregory Neil Shapiro ++val; 7640266059SGregory Neil Shapiro while (idend > id && idend[-1] == ' ') 7740266059SGregory Neil Shapiro --idend; 7840266059SGregory Neil Shapiro *idend = '\0'; 7940266059SGregory Neil Shapiro } 8040266059SGregory Neil Shapiro 8140266059SGregory Neil Shapiro for (i = 0; i < optc; ++i) 8240266059SGregory Neil Shapiro { 8340266059SGregory Neil Shapiro if (sm_strcasecmp(optv[i].opt_name, id) == 0) 8440266059SGregory Neil Shapiro { 8540266059SGregory Neil Shapiro optv[i].opt_val = sm_strdup_x(val); 8640266059SGregory Neil Shapiro break; 8740266059SGregory Neil Shapiro } 8840266059SGregory Neil Shapiro } 8940266059SGregory Neil Shapiro } 9040266059SGregory Neil Shapiro if (sm_io_error(cfp)) 9140266059SGregory Neil Shapiro { 9240266059SGregory Neil Shapiro int save_errno = errno; 9340266059SGregory Neil Shapiro 9440266059SGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 9540266059SGregory Neil Shapiro errno = save_errno; 9640266059SGregory Neil Shapiro return errno; 9740266059SGregory Neil Shapiro } 9840266059SGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 9940266059SGregory Neil Shapiro return 0; 10040266059SGregory Neil Shapiro } 101