summaryrefslogtreecommitdiff
path: root/usr/src/lib/libslp/clib/slp_config.c
diff options
context:
space:
mode:
authorstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
committerstevel@tonic-gate <none@none>2005-06-14 00:00:00 -0700
commit7c478bd95313f5f23a4c958a745db2134aa03244 (patch)
treec871e58545497667cbb4b0a4f2daf204743e1fe7 /usr/src/lib/libslp/clib/slp_config.c
downloadillumos-gate-7c478bd95313f5f23a4c958a745db2134aa03244.tar.gz
OpenSolaris Launch
Diffstat (limited to 'usr/src/lib/libslp/clib/slp_config.c')
-rw-r--r--usr/src/lib/libslp/clib/slp_config.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/usr/src/lib/libslp/clib/slp_config.c b/usr/src/lib/libslp/clib/slp_config.c
new file mode 100644
index 0000000000..b84fda0114
--- /dev/null
+++ b/usr/src/lib/libslp/clib/slp_config.c
@@ -0,0 +1,203 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1999 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Provides accessors to configuration properties.
+ *
+ * slp_readConfig: attempts to locate slp.conf, and reads in all
+ * properties specified therein.
+ * slp_get_mtu: returns the MTU
+ * slp_get_next_onlist: parses a comma separated list of integers (in
+ * string form), returning one at a time.
+ * slp_parse_static_das: parses the list of DAs given in the DAAddresses
+ * property.
+ *
+ * Also see the config wrapper macros in slp-internal.h.
+ */
+
+#include <stdio.h>
+#include <syslog.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <slp-internal.h>
+
+/*
+ * Reads from fp and dynamically reallocates the buffer if necessary.
+ * Returns 1 on success, 0 on read completion, and -1 on failure.
+ */
+static int super_fgets(char **buf, size_t *bufsize, FILE *fp) {
+ char *r, *p;
+ size_t real_bufsize, readlen = 0;
+
+ p = *buf;
+ real_bufsize = *bufsize;
+ for (;;) {
+ r = fgets(p, (int)real_bufsize, fp);
+ if (feof(fp) && !r)
+ return (0);
+ if (!r)
+ return (-1);
+ readlen += strlen(r);
+ if ((*buf)[readlen - 1] == '\n')
+ return (1);
+
+ /* else buf is too small */
+ *bufsize *= 2;
+ if (!(*buf = realloc(*buf, *bufsize))) {
+ slp_err(LOG_CRIT, 0, "super_fgets", "out of memory");
+ return (-1);
+ }
+ p = *buf + readlen;
+ real_bufsize = *bufsize - readlen;
+ }
+}
+
+static void skip_space(char **p) {
+ while (*p && **p != '\n' && isspace(**p))
+ (*p)++;
+}
+
+static void null_space(char *p) {
+ for (; *p; p++)
+ if (isspace(*p))
+ *p = 0;
+}
+
+/*
+ * Reads into the local property store all properties defined in
+ * the config file.
+ */
+void slp_readConfig() {
+ char *cfile, *buf;
+ FILE *fp;
+ size_t buflen = 512;
+
+ /* check env for alternate config file */
+ fp = NULL;
+ if (cfile = getenv("SLP_CONF_FILE"))
+ fp = fopen(cfile, "r");
+ if (!fp)
+ if (!(fp = fopen(SLP_DEFAULT_CONFIG_FILE, "r"))) {
+ slp_err(LOG_INFO, 0, "readConfig",
+ "cannot open config file");
+ return;
+ }
+
+ if (!(buf = malloc(buflen))) {
+ slp_err(LOG_CRIT, 0, "readConfig", "out of memory");
+ (void) fclose(fp);
+ return;
+ }
+
+ while (!feof(fp)) {
+ char *val, *p;
+ int err;
+
+ /* read a line */
+ err = super_fgets(&buf, &buflen, fp);
+ if (err == 0) continue;
+ if (err == -1) {
+ slp_err(LOG_INFO, 0, "readConfig",
+ "error reading file: %d",
+ ferror(fp));
+ (void) fclose(fp);
+ free(buf);
+ return;
+ }
+
+ /* skip comments and newlines */
+ p = buf;
+ skip_space(&p);
+ if (*p == '#' || *p == ';' || *p == '\n')
+ continue;
+
+ /* get property and value */
+ if (val = strchr(p, '=')) {
+ *val++ = 0;
+ skip_space(&val);
+ /* remove the trailing newline */
+ val[strlen(val) - 1] = 0;
+ }
+ null_space(p);
+
+ SLPSetProperty(p, val ? val : "");
+ }
+
+ (void) fclose(fp);
+ free(buf);
+}
+
+/*
+ * Config convenience wrappers
+ */
+size_t slp_get_mtu() {
+ size_t size;
+ size = atoi(SLPGetProperty(SLP_CONFIG_MTU));
+ size = size ? size : SLP_DEFAULT_SENDMTU;
+
+ return (size);
+}
+
+/*
+ * On the first invocation, *state should == the value of the property
+ * to parse.
+ * If there are no more timeouts, returns -1, otherwise the timeout.
+ * If the value in the property is invalid, returns the default 2000.
+ */
+int slp_get_next_onlist(char **state) {
+ char *p, buf[33];
+ size_t l;
+ int answer;
+
+ if (!*state)
+ return (-1);
+
+ if (**state == ',') {
+ (*state)++; /* skip the ',' */
+ }
+ p = *state;
+ *state = slp_utf_strchr(*state, ',');
+ if (!*state)
+ l = strlen(p);
+ else {
+ l = *state - p;
+ l = (l > 32 ? 32 : l);
+ }
+ (void) strncpy(buf, p, l);
+ buf[l] = 0;
+ answer = atoi(buf);
+
+ return (answer != 0 ? answer : 2000);
+}
+
+int slp_get_maxResults() {
+ int num = atoi(SLPGetProperty(SLP_CONFIG_MAXRESULTS));
+
+ return (num <= 0 ? -1 : num);
+}