Merge from vendor branch CVS:
[dragonfly.git] / contrib / sendmail-8.13.8 / libsm / cf.c
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 #include <sm/gen.h>
12 SM_RCSID("@(#)$Id: cf.c,v 1.6 2001/09/11 04:04:47 gshapiro Exp $")
13
14 #include <ctype.h>
15 #include <errno.h>
16
17 #include <sm/cf.h>
18 #include <sm/io.h>
19 #include <sm/string.h>
20 #include <sm/heap.h>
21
22 /*
23 **  SM_CF_GETOPT -- look up option values in the sendmail.cf file
24 **
25 **      Open the sendmail.cf file and parse all of the 'O' directives.
26 **      Each time one of the options named in the option vector optv
27 **      is found, store a malloced copy of the option value in optv.
28 **
29 **      Parameters:
30 **              path -- pathname of sendmail.cf file
31 **              optc -- size of option vector
32 **              optv -- pointer to option vector
33 **
34 **      Results:
35 **              0 on success, or an errno value on failure.
36 **              An exception is raised on malloc failure.
37 */
38
39 int
40 sm_cf_getopt(path, optc, optv)
41         char *path;
42         int optc;
43         SM_CF_OPT_T *optv;
44 {
45         SM_FILE_T *cfp;
46         char buf[2048];
47         char *p;
48         char *id;
49         char *idend;
50         char *val;
51         int i;
52
53         cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL);
54         if (cfp == NULL)
55                 return errno;
56
57         while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
58         {
59                 p = strchr(buf, '\n');
60                 if (p != NULL)
61                         *p = '\0';
62
63                 if (buf[0] != 'O' || buf[1] != ' ')
64                         continue;
65
66                 id = &buf[2];
67                 val = strchr(id, '=');
68                 if (val == NULL)
69                         val = idend = id + strlen(id);
70                 else
71                 {
72                         idend = val;
73                         ++val;
74                         while (*val == ' ')
75                                 ++val;
76                         while (idend > id && idend[-1] == ' ')
77                                 --idend;
78                         *idend = '\0';
79                 }
80
81                 for (i = 0; i < optc; ++i)
82                 {
83                         if (sm_strcasecmp(optv[i].opt_name, id) == 0)
84                         {
85                                 optv[i].opt_val = sm_strdup_x(val);
86                                 break;
87                         }
88                 }
89         }
90         if (sm_io_error(cfp))
91         {
92                 int save_errno = errno;
93
94                 (void) sm_io_close(cfp, SM_TIME_DEFAULT);
95                 errno = save_errno;
96                 return errno;
97         }
98         (void) sm_io_close(cfp, SM_TIME_DEFAULT);
99         return 0;
100 }