140266059SGregory Neil Shapiro /* 25dd76dd0SGregory Neil Shapiro * Copyright (c) 2001 Proofpoint, 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> 124313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: cf.c,v 1.8 2013-11-22 20:51:42 ca 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> 21*2fb4f839SGregory Neil Shapiro #include <sm/sendmail.h> 2240266059SGregory Neil Shapiro 2340266059SGregory Neil Shapiro /* 2440266059SGregory Neil Shapiro ** SM_CF_GETOPT -- look up option values in the sendmail.cf file 2540266059SGregory Neil Shapiro ** 2640266059SGregory Neil Shapiro ** Open the sendmail.cf file and parse all of the 'O' directives. 2740266059SGregory Neil Shapiro ** Each time one of the options named in the option vector optv 2840266059SGregory Neil Shapiro ** is found, store a malloced copy of the option value in optv. 2940266059SGregory Neil Shapiro ** 3040266059SGregory Neil Shapiro ** Parameters: 3140266059SGregory Neil Shapiro ** path -- pathname of sendmail.cf file 3240266059SGregory Neil Shapiro ** optc -- size of option vector 3340266059SGregory Neil Shapiro ** optv -- pointer to option vector 3440266059SGregory Neil Shapiro ** 3540266059SGregory Neil Shapiro ** Results: 3640266059SGregory Neil Shapiro ** 0 on success, or an errno value on failure. 3740266059SGregory Neil Shapiro ** An exception is raised on malloc failure. 3840266059SGregory Neil Shapiro */ 3940266059SGregory Neil Shapiro 4040266059SGregory Neil Shapiro int 4140266059SGregory Neil Shapiro sm_cf_getopt(path, optc, optv) 4240266059SGregory Neil Shapiro char *path; 4340266059SGregory Neil Shapiro int optc; 4440266059SGregory Neil Shapiro SM_CF_OPT_T *optv; 4540266059SGregory Neil Shapiro { 4640266059SGregory Neil Shapiro SM_FILE_T *cfp; 4740266059SGregory Neil Shapiro char buf[2048]; 4840266059SGregory Neil Shapiro char *p; 4940266059SGregory Neil Shapiro char *id; 5040266059SGregory Neil Shapiro char *idend; 5140266059SGregory Neil Shapiro char *val; 5240266059SGregory Neil Shapiro int i; 5340266059SGregory Neil Shapiro 5440266059SGregory Neil Shapiro cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL); 5540266059SGregory Neil Shapiro if (cfp == NULL) 5640266059SGregory Neil Shapiro return errno; 5740266059SGregory Neil Shapiro 58552d4955SGregory Neil Shapiro while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) >= 0) 5940266059SGregory Neil Shapiro { 6040266059SGregory Neil Shapiro p = strchr(buf, '\n'); 6140266059SGregory Neil Shapiro if (p != NULL) 6240266059SGregory Neil Shapiro *p = '\0'; 6340266059SGregory Neil Shapiro 6440266059SGregory Neil Shapiro if (buf[0] != 'O' || buf[1] != ' ') 6540266059SGregory Neil Shapiro continue; 6640266059SGregory Neil Shapiro 6740266059SGregory Neil Shapiro id = &buf[2]; 6840266059SGregory Neil Shapiro val = strchr(id, '='); 6940266059SGregory Neil Shapiro if (val == NULL) 7040266059SGregory Neil Shapiro val = idend = id + strlen(id); 7140266059SGregory Neil Shapiro else 7240266059SGregory Neil Shapiro { 7340266059SGregory Neil Shapiro idend = val; 7440266059SGregory Neil Shapiro ++val; 7540266059SGregory Neil Shapiro while (*val == ' ') 7640266059SGregory Neil Shapiro ++val; 7740266059SGregory Neil Shapiro while (idend > id && idend[-1] == ' ') 7840266059SGregory Neil Shapiro --idend; 7940266059SGregory Neil Shapiro *idend = '\0'; 8040266059SGregory Neil Shapiro } 8140266059SGregory Neil Shapiro 8240266059SGregory Neil Shapiro for (i = 0; i < optc; ++i) 8340266059SGregory Neil Shapiro { 84*2fb4f839SGregory Neil Shapiro if (SM_STRCASEEQ(optv[i].opt_name, id)) 8540266059SGregory Neil Shapiro { 8640266059SGregory Neil Shapiro optv[i].opt_val = sm_strdup_x(val); 8740266059SGregory Neil Shapiro break; 8840266059SGregory Neil Shapiro } 8940266059SGregory Neil Shapiro } 9040266059SGregory Neil Shapiro } 9140266059SGregory Neil Shapiro if (sm_io_error(cfp)) 9240266059SGregory Neil Shapiro { 9340266059SGregory Neil Shapiro int save_errno = errno; 9440266059SGregory Neil Shapiro 9540266059SGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 9640266059SGregory Neil Shapiro errno = save_errno; 9740266059SGregory Neil Shapiro return errno; 9840266059SGregory Neil Shapiro } 9940266059SGregory Neil Shapiro (void) sm_io_close(cfp, SM_TIME_DEFAULT); 10040266059SGregory Neil Shapiro return 0; 10140266059SGregory Neil Shapiro } 102