commit 39afa6c25b9a51f07f06384c5155d791e9bbb6ff
parent fa1a3099c19fb94216d636792112bbd92331d2b2
Author: Joris Vink <joris@coders.se>
Date: Wed, 1 May 2013 17:17:16 +0200
add missing config.c
Diffstat:
src/config.c | | | 156 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 156 insertions(+), 0 deletions(-)
diff --git a/src/config.c b/src/config.c
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2013 Joris Vink <joris@coders.se>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/queue.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <openssl/err.h>
+#include <openssl/ssl.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+
+#include "spdy.h"
+#include "kore.h"
+
+static int configure_bind(char **);
+static int configure_load(char **);
+static int configure_handler(char **);
+
+static struct {
+ const char *name;
+ int (*configure)(char **);
+} config_names[] = {
+ { "bind", configure_bind },
+ { "load", configure_load },
+ { "static", configure_handler },
+ { "dynamic", configure_handler },
+ { NULL, NULL },
+};
+
+void
+kore_parse_config(const char *config_path)
+{
+ FILE *fp;
+ int i, lineno;
+ char buf[BUFSIZ], *p, *t, **ap, *argv[5];
+
+ if ((fp = fopen(config_path, "r")) == NULL)
+ fatal("configuration given cannot be opened: %s", config_path);
+
+ lineno = 1;
+ while (fgets(buf, sizeof(buf), fp) != NULL) {
+ p = buf;
+ buf[strcspn(buf, "\n")] = '\0';
+
+ while (isspace(*p))
+ p++;
+ if (p[0] == '#' || p[0] == '\0') {
+ lineno++;
+ continue;
+ }
+
+ for (t = p; *t != '\0'; t++) {
+ if (*t == '\t')
+ *t = ' ';
+ }
+
+ for (ap = argv; ap < &argv[4] &&
+ (*ap = strsep(&p, " ")) != NULL;) {
+ if (**ap != '\0')
+ ap++;
+ }
+ *ap = NULL;
+
+ for (i = 0; config_names[i].name != NULL; i++) {
+ if (!strcmp(config_names[i].name, argv[0])) {
+ if (!config_names[i].configure(argv)) {
+ fatal("configuration error on line %d",
+ lineno);
+ }
+ break;
+ }
+ }
+
+ lineno++;
+ }
+}
+
+static int
+configure_bind(char **argv)
+{
+ int err;
+
+ if (argv[1] == NULL || argv[2] == NULL)
+ return (KORE_RESULT_ERROR);
+ if (server_ip != NULL || server_port != 0) {
+ kore_log("duplicate bind directive seen");
+ return (KORE_RESULT_ERROR);
+ }
+
+ server_ip = kore_strdup(argv[1]);
+ server_port = kore_strtonum(argv[2], 1, 65535, &err);
+ if (err != KORE_RESULT_OK) {
+ kore_log("%s is an invalid port number", argv[2]);
+ return (KORE_RESULT_ERROR);
+ }
+
+ return (KORE_RESULT_OK);
+}
+
+static int
+configure_load(char **argv)
+{
+ if (argv[1] == NULL)
+ return (KORE_RESULT_ERROR);
+
+ kore_module_load(argv[1]);
+ return (KORE_RESULT_OK);
+}
+
+static int
+configure_handler(char **argv)
+{
+ int type;
+
+ if (argv[1] == NULL || argv[2] == NULL)
+ return (KORE_RESULT_ERROR);
+
+ if (!strcmp(argv[0], "static"))
+ type = HANDLER_TYPE_STATIC;
+ else if (!strcmp(argv[0], "dynamic"))
+ type = HANDLER_TYPE_DYNAMIC;
+ else
+ return (KORE_RESULT_ERROR);
+
+ if (!kore_module_handler_new(argv[1], argv[2], type)) {
+ kore_log("cannot create handler for %s", argv[1]);
+ return (KORE_RESULT_ERROR);
+ }
+
+ return (KORE_RESULT_OK);
+}