From c127605b17195e34a73b7a8c8d401769cdf60795 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Sat, 28 Jan 2006 02:52:38 +0000 Subject: Move config parser stuff into common directory for use by other binaries. --- daemon/Makefile.am | 1 + daemon/config.c | 204 +++++++++++------------------------------------------ daemon/rrdbotd.c | 50 ------------- daemon/rrdbotd.h | 3 - daemon/usuals.h | 79 --------------------- 5 files changed, 44 insertions(+), 293 deletions(-) delete mode 100644 daemon/usuals.h (limited to 'daemon') diff --git a/daemon/Makefile.am b/daemon/Makefile.am index fbc275d..dda6ceb 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -7,6 +7,7 @@ rrdbotd_SOURCES = rrdbotd.c rrdbotd.h config.c usuals.h \ ../common/sock-any.h ../common/sock-any.c \ ../common/compat.h ../common/compat.c \ ../common/hash.h ../common/hash.c \ + ../common/config-parser.h ../common/config-parser.c \ ../mib/parse.c rrdbotd_CFLAGS = -I${top_srcdir}/common/ -I${top_srcdir}/bsnmp/ -I${top_srcdir} \ -DCONF_PREFIX=\"$(sysconfdir)\" -DDATA_PREFIX=\"$(datadir)\" diff --git a/daemon/config.c b/daemon/config.c index 9b38bcb..f45d1f0 100644 --- a/daemon/config.c +++ b/daemon/config.c @@ -41,6 +41,7 @@ #include #include #include +#include #include "rrdbotd.h" @@ -53,7 +54,6 @@ typedef struct _config_ctx { const char* confname; - char* configmem; uint interval; uint timeout; rb_item* items; @@ -181,14 +181,10 @@ config_done(config_ctx* ctx) * This allows all the users of these strings not to worry * about reallocating or freeing them */ - rb_atexit(free, ctx->configmem); - ctx->configmem = NULL; /* Clear current config and get ready for next */ ctx->items = NULL; ctx->interval = 0; - - } static void @@ -374,180 +370,66 @@ config_value(const char* header, const char* name, char* value, } } -/* ----------------------------------------------------------------------------- - * CONFIG FILES - */ - -static char* -read_config_file(const char* configfile) +void +rb_config_parse() { - char* config = NULL; - FILE* f = NULL; - long len; - - ASSERT(configfile); - - f = fopen(configfile, "r"); - if(f == NULL) - err(1, "couldn't open config file: %s", configfile); - - /* Figure out size */ - if(fseek(f, 0, SEEK_END) == -1 || (len = ftell(f)) == -1 || fseek(f, 0, SEEK_SET) == -1) - err(1, "couldn't seek config file: %s", configfile); - - if((config = (char*)malloc(len + 2)) == NULL) - errx(1, "out of memory"); - - /* And read in one block */ - if(fread(config, 1, len, f) != len) - err(1, "couldn't read config file: %s", configfile); + config_ctx ctx; - fclose(f); + /* Setup the hash tables properly */ + g_state.poll_by_key = hsh_create(); + g_state.host_by_name = hsh_create(); - /* Null terminate the data */ - config[len] = '\n'; - config[len + 1] = 0; + memset(&ctx, 0, sizeof(ctx)); - /* Remove nasty dos line endings */ - strcln(config, '\r'); + if(cfg_parse_dir(g_state.confdir, &ctx) == -1) + exit(2); /* message already printed */ - rb_messagex(LOG_DEBUG, "read config file: %s", configfile); - return config; + if(!g_state.polls) + errx(1, "no config files found in config directory: %s", g_state.confdir); } -static void -parse_config_file(const char* configfile, config_ctx *ctx) -{ - char* name = NULL; - char* value = NULL; - char* config; - char* next; - char* header; - char* p; - char* t; - int pos; - - config = read_config_file(configfile); - ctx->configmem = config; - next = config; - - /* Go through lines and process them */ - while((t = strchr(next, '\n')) != NULL) - { - *t = 0; - p = next; /* Do this before cleaning below */ - next = t + 1; - - t = strbtrim(p); - - /* Continuation line (had spaces at start) */ - if(p < t && *t) - { - if(!value) - errx(2, "%s: invalid continuation in config: %s", - ctx->confname, p); - - /* Calculate the end of the current value */ - t = value + strlen(value); - ASSERT(t < p); - - /* Continuations are separated by spaces */ - *t = ' '; - t++; - - continue; - } - - // No continuation hand off value if necessary - if(name && value) - { - rb_messagex(LOG_DEBUG, "config: %s: [%s] %s = %s", - ctx->confname, header, name, value); - config_value(header, name, value, ctx); - } - - name = NULL; - value = NULL; - - /* Empty lines / comments at start / comments without continuation */ - if(!*t || *p == '#') - continue; - - /* A header */ - if(*p == '[') - { - t = p + strcspn(p, "]"); - if(!*t || t == p + 1) - errx(2, "%s: invalid config header: %s", ctx->confname, p); - - *t = 0; - header = strtrim(p + 1); - continue; - } - - /* Look for the break between name = value on the same line */ - t = p + strcspn(p, ":="); - if(!*t) - errx(2, "%s: invalid config line: %s", ctx->confname, p); - - /* Null terminate and split value part */ - *t = 0; - t++; - - name = strtrim(p); - value = strtrim(t); - } - - if(name && value) - { - rb_messagex(LOG_DEBUG, "config: %s: [%s] %s = %s", - ctx->confname, header, name, value); - config_value(header, name, value, ctx); - } - - config_done(ctx); - - /* If nobody claimed this memory then we don't need to keep it around */ - if(ctx->configmem) - free(ctx->configmem); - ctx->configmem = NULL; -} +/* ----------------------------------------------------------------------------- + * CONFIG CALLBACKS + */ -void -rb_config_parse() +int +cfg_value(const char* filename, const char* header, const char* name, + char* value, void* data) { - char configfile[MAXPATHLEN]; - struct dirent* dire; - config_ctx ctx; - DIR* dir; + config_ctx* ctx = (config_ctx*)data; - /* Setup the hash tables properly */ - g_state.poll_by_key = hsh_create(); - g_state.host_by_name = hsh_create(); + ASSERT(filename); + ASSERT(ctx); - dir = opendir(g_state.confdir); - if(!dir) - err(1, "couldn't list config directory: %s", g_state.confdir); + /* A little setup where necessary */ + if(!ctx->confname) + ctx->confname = filename; - while((dire = readdir(dir)) != NULL) + /* Called like this after each file */ + if(!header) { - if(dire->d_type != DT_REG && dire->d_type != DT_LNK) - continue; + config_done(ctx); + ctx->confname = NULL; + return 0; + } - /* Build a happy path name */ - snprintf(configfile, MAXPATHLEN, "%s/%s", g_state.confdir, dire->d_name); - configfile[MAXPATHLEN - 1] = 0; + ASSERT(ctx->confname); + ASSERT(name && value && header); - memset(&ctx, 0, sizeof(ctx)); - ctx.confname = dire->d_name; + rb_messagex(LOG_DEBUG, "config: %s: [%s] %s = %s", + ctx->confname, header, name, value); - parse_config_file(configfile, &ctx); - } + config_value(header, name, value, ctx); - if(!g_state.polls) - errx(1, "no config files found in config directory: %s", g_state.confdir); + return 0; +} - closedir(dir); +int +cfg_error(const char* filename, const char* errmsg, void* data) +{ + /* Just exit on errors */ + errx(2, "%s", errmsg); + return 0; } /* ----------------------------------------------------------------------------- diff --git a/daemon/rrdbotd.c b/daemon/rrdbotd.c index a9171e8..0b998b3 100644 --- a/daemon/rrdbotd.c +++ b/daemon/rrdbotd.c @@ -98,56 +98,6 @@ test(int argc, char* argv[]) exit(1); } -/* ----------------------------------------------------------------------------- - * CLEANUP - */ - -typedef struct _exit_stack -{ - voidfunc func; - void* data; - - /* We have a list of these beauties */ - struct _exit_stack* next; -} -exit_stack; - -/* Our exit stack */ -static exit_stack* atexits = NULL; -static int atexit_registered = 0; - -static void -atexit_do_stack(void) -{ - exit_stack* next; - for(; atexits; atexits = next) - { - next = atexits->next; - (atexits->func)(atexits->data); - free(atexits); - } -} - -void -rb_atexit(voidfunc func, void* data) -{ - exit_stack* ae; - - ASSERT(func); - - ae = (exit_stack*)calloc(1, sizeof(exit_stack)); - if(ae) - { - ae->func = func; - ae->data = data; - ae->next = atexits; - atexits = ae; - - if(!atexit_registered) - atexit(atexit_do_stack); - } -} - /* ----------------------------------------------------------------------------- * LOGGING */ diff --git a/daemon/rrdbotd.h b/daemon/rrdbotd.h index 1a9782b..b211007 100644 --- a/daemon/rrdbotd.h +++ b/daemon/rrdbotd.h @@ -152,9 +152,6 @@ void rb_messagex(int level, const char* msg, ...); void rb_message(int level, const char* msg, ...); void rb_vmessage(int level, int err, const char* msg, va_list ap); -typedef void (*voidfunc)(void*); -void rb_atexit (voidfunc func, void* data); - /* ----------------------------------------------------------------------------- * CONFIG (config.c) */ diff --git a/daemon/usuals.h b/daemon/usuals.h deleted file mode 100644 index 5fece3f..0000000 --- a/daemon/usuals.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2005, Nate Nielsen - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above - * copyright notice, this list of conditions and the - * following disclaimer. - * * Redistributions in binary form must reproduce the - * above copyright notice, this list of conditions and - * the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * * The names of contributors to this software may not be - * used to endorse or promote products derived from this - * software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * - * CONTRIBUTORS - * Nate Nielsen - * - */ - -#ifndef __USUALS_H__ -#define __USUALS_H__ - -#include - -#include "config.h" - -#include -#include -#include -#include -#include -#include - -#include "compat.h" - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#define countof(x) (sizeof(x) / sizeof(x[0])) - -#ifdef _DEBUG - #include "assert.h" - #define ASSERT(x) assert(x) -#else - #define ASSERT(x) -#endif - -#define KL(s) ((sizeof(s) - 1) / sizeof(char)) -#define RETURN(x) { ret = (x); goto finally; } - -#endif /* __USUALS_H__ */ -- cgit v1.2.3