]> git.ipfire.org Git - thirdparty/ulogd2.git/commitdiff
config stuff added
authorlaforge <laforge>
Sat, 9 Sep 2000 08:36:05 +0000 (08:36 +0000)
committerlaforge <laforge>
Sat, 9 Sep 2000 08:36:05 +0000 (08:36 +0000)
conffile.c [new file with mode: 0644]
conffile.h [new file with mode: 0644]

diff --git a/conffile.c b/conffile.c
new file mode 100644 (file)
index 0000000..383384d
--- /dev/null
@@ -0,0 +1,115 @@
+/* config file parser functions
+ * (C) 2000 by Harald Welte <laforge@gnumonks.org>
+ *
+ * $Id$
+ * 
+ * This code is distributed under the terms of GNU GPL */
+
+#include <stdio.h>
+#include <string.h>
+#include "conffile.h"
+
+#ifdef DEBUG_CONF
+#define DEBUGC(format, args...) fprintf(stderr, format ## args)
+#else
+#define DEBUGC 
+#endif
+
+static config_entry_t *config = NULL;
+
+static char *get_word(const char *string)
+{
+       int len;
+       char *word, *space;
+       space = strchr(string, ' ');
+       if (!space)
+               return NULL;
+       len = space - string;
+       word = (char *) malloc(len+1);
+       if (!word)
+               return NULL;
+       strncpy(word, string, len);
+
+       return word;
+}
+
+int config_register_key(config_entry_t *ce)
+{
+       ce->next = config;
+       ce->hit = 0;
+       config = ce;
+       return 0;
+}
+
+int config_parse_file(const char *fname)
+{
+       FILE *cfile;
+       char *line, *word, *args;
+       config_entry_t *ce;
+
+       line = (char *) malloc(LINE_LEN+1);     
+       if (!line) 
+               return -ERROOM;
+       
+       cfile = fopen(fname, "r");
+       if (!cfile) {
+               free(line);
+               return -ERROPEN;
+       }
+       
+       while (line = fgets(line, LINE_LEN, cfile))
+       {
+               if (*line == '#')
+                       continue;
+
+               word = get_word(line);
+               if (!word)
+                       continue;
+
+               args = line + strlen(word) + 1;
+
+               for (ce = config; ce; ce = ce->next) {
+                       if (strcmp(ce->key, word)) {
+                               continue;
+                       }
+                       if (ce->hit && !(ce->options & CONFIG_OPT_MULTI))
+                       {
+                               DEBUGC("->ce-hit and option not multi!\n");
+                               free(line);
+                               fclose(cfile);
+                               return -ERRMULT;
+                       }
+                       ce->hit++;
+                       switch (ce->type) {
+                               case CONFIG_TYPE_STRING:
+                                       if (strlen(args) <= ce->u.str.maxlen) {
+                                               strcpy(ce->u.str.string, args);
+                                       }
+                                       break;
+                               case CONFIG_TYPE_INT:
+                                       ce->u.value = atoi(args);
+                                       break;
+                               case CONFIG_TYPE_CALLBACK:
+                                       (ce->u.parser)(args);
+                                       break;
+                       }
+                       break;
+               }
+       }
+
+
+       for (ce = config; ce; ce = ce->next) {
+               if ((ce->options & CONFIG_OPT_MANDATORY) && (ce->hit == 0)) {
+                       DEBUGC("mandatory config directive %s not found\n",
+                               ce->key);
+                       free(line);
+                       fclose(cfile);
+                       return -ERRMAND;
+               }
+
+       }
+
+       fclose(cfile);
+       return 0;
+}
+
diff --git a/conffile.h b/conffile.h
new file mode 100644 (file)
index 0000000..90fc501
--- /dev/null
@@ -0,0 +1,49 @@
+/* config file parser functions
+ * (C) 2000 by Harald Welte <laforge@gnumonks.org>
+ *
+ * $Id$
+ * 
+ * This code is distributed under the terms of GNU GPL */
+
+#include <sys/types.h>
+
+/* errors returned by config functions */
+enum {
+       ERRNONE = 0,
+       ERROPEN,        /* unable to open config file */
+       ERROOM,         /* out of memory */
+       ERRMULT,        /* non-multiple option occured more  than once */
+       ERRMAND,        /* mandatory option not found */
+};
+
+/* maximum line lenght of config file entries */
+#define LINE_LEN 255
+
+/* maximum lenght of config key name */
+#define CONFIG_KEY_LEN 30
+
+#define CONFIG_TYPE_INT                0x0001
+#define CONFIG_TYPE_STRING     0x0002
+#define CONFIG_TYPE_CALLBACK   0x0003
+
+#define CONFIG_OPT_MANDATORY   0x0001
+#define CONFIG_OPT_MULTI       0x0002
+
+typedef struct config_entry {
+       struct config_entry *next;
+       char key[CONFIG_KEY_LEN];
+       u_int8_t type;
+       u_int8_t options;
+       u_int8_t hit;
+       union {
+               struct {
+                       char *string;
+                       int maxlen;
+               } str;
+               int value;
+               int (*parser)(char *argstr);
+       } u;
+} config_entry_t;
+       
+int config_parse_file(const char *fname);
+int config_register_key(config_entry_t *ce);