summaryrefslogtreecommitdiff
path: root/gnu/usr.sbin/sendmail/libsm/cf.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.sbin/sendmail/libsm/cf.c')
-rw-r--r--gnu/usr.sbin/sendmail/libsm/cf.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/gnu/usr.sbin/sendmail/libsm/cf.c b/gnu/usr.sbin/sendmail/libsm/cf.c
new file mode 100644
index 00000000000..9ee2bbfa218
--- /dev/null
+++ b/gnu/usr.sbin/sendmail/libsm/cf.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2001 Sendmail, Inc. and its suppliers.
+ * All rights reserved.
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENSE file which can be found at the top level of
+ * the sendmail distribution.
+ *
+ */
+
+#include <sm/gen.h>
+SM_RCSID("@(#)$Sendmail: cf.c,v 1.4 2001/02/01 02:40:21 dmoen Exp $")
+
+#include <ctype.h>
+#include <errno.h>
+
+#include <sm/cf.h>
+#include <sm/io.h>
+#include <sm/string.h>
+#include <sm/heap.h>
+
+/*
+** SM_CF_GETOPT -- look up option values in the sendmail.cf file
+**
+** Open the sendmail.cf file and parse all of the 'O' directives.
+** Each time one of the options named in the option vector optv
+** is found, store a malloced copy of the option value in optv.
+**
+** Parameters:
+** path -- pathname of sendmail.cf file
+** optc -- size of option vector
+** optv -- pointer to option vector
+**
+** Results:
+** 0 on success, or an errno value on failure.
+** An exception is raised on malloc failure.
+*/
+
+int
+sm_cf_getopt(path, optc, optv)
+ char *path;
+ int optc;
+ SM_CF_OPT_T *optv;
+{
+ SM_FILE_T *cfp;
+ char buf[2048];
+ char *p;
+ char *id;
+ char *idend;
+ char *val;
+ int i;
+
+ cfp = sm_io_open(SmFtStdio, SM_TIME_DEFAULT, path, SM_IO_RDONLY, NULL);
+ if (cfp == NULL)
+ return errno;
+
+ while (sm_io_fgets(cfp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
+ {
+ p = strchr(buf, '\n');
+ if (p != NULL)
+ *p = '\0';
+
+ if (buf[0] != 'O' || buf[1] != ' ')
+ continue;
+
+ id = &buf[2];
+ val = strchr(id, '=');
+ if (val == NULL)
+ val = idend = id + strlen(id);
+ else
+ {
+ idend = val;
+ ++val;
+ while (*val == ' ')
+ ++val;
+ while (idend > id && idend[-1] == ' ')
+ --idend;
+ *idend = '\0';
+ }
+
+ for (i = 0; i < optc; ++i)
+ {
+ if (sm_strcasecmp(optv[i].opt_name, id) == 0)
+ {
+ optv[i].opt_val = sm_strdup_x(val);
+ break;
+ }
+ }
+ }
+ if (sm_io_error(cfp))
+ {
+ int save_errno = errno;
+
+ (void) sm_io_close(cfp, SM_TIME_DEFAULT);
+ errno = save_errno;
+ return errno;
+ }
+ (void) sm_io_close(cfp, SM_TIME_DEFAULT);
+ return 0;
+}