xref: /freebsd/contrib/sendmail/libsm/cf.c (revision 2fb4f839f3fc72ce2bab12f9ba4760f97f73e97f)
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