1/*
2 * Copyright (c) 2001 Sendmail, Inc. and its suppliers.
3 *      All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 *
9 */
10
11#pragma ident	"%Z%%M%	%I%	%E% SMI"
12
13#include <sm/gen.h>
14SM_RCSID("@(#)$Id: cf.c,v 1.4 2001/02/01 02:40:21 dmoen Exp $")
15
16#include <ctype.h>
17#include <errno.h>
18
19#include <sm/cf.h>
20#include <sm/io.h>
21#include <sm/string.h>
22#include <sm/heap.h>
23
24/*
25**  SM_CF_GETOPT -- look up option values in the sendmail.cf file
26**
27**	Open the sendmail.cf file and parse all of the 'O' directives.
28**	Each time one of the options named in the option vector optv
29**	is found, store a malloced copy of the option value in optv.
30**
31**	Parameters:
32**		path -- pathname of sendmail.cf file
33**		optc -- size of option vector
34**		optv -- pointer to option vector
35**
36**	Results:
37**		0 on success, or an errno value on failure.
38**		An exception is raised on malloc failure.
39*/
40
41int
42sm_cf_getopt(path, optc, optv)
43	char *path;
44	int optc;
45	SM_CF_OPT_T *optv;
46{
47	SM_FILE_T *cfp;
48	char buf[2048];
49	char *p;
50	char *id;
51	char *idend;
52	char *val;
53	int i;
54
55	cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL);
56	if (cfp == NULL)
57		return errno;
58
59	while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
60	{
61		p = strchr(buf, '\n');
62		if (p != NULL)
63			*p = '\0';
64
65		if (buf[0] != 'O' || buf[1] != ' ')
66			continue;
67
68		id = &buf[2];
69		val = strchr(id, '=');
70		if (val == NULL)
71			val = idend = id + strlen(id);
72		else
73		{
74			idend = val;
75			++val;
76			while (*val == ' ')
77				++val;
78			while (idend > id && idend[-1] == ' ')
79				--idend;
80			*idend = '\0';
81		}
82
83		for (i = 0; i < optc; ++i)
84		{
85			if (sm_strcasecmp(optv[i].opt_name, id) == 0)
86			{
87				optv[i].opt_val = sm_strdup_x(val);
88				break;
89			}
90		}
91	}
92	if (sm_io_error(cfp))
93	{
94		int save_errno = errno;
95
96		(void) sm_io_close(cfp, SM_TIME_DEFAULT);
97		errno = save_errno;
98		return errno;
99	}
100	(void) sm_io_close(cfp, SM_TIME_DEFAULT);
101	return 0;
102}
103