diff options
author | venaas <venaas> | 2008-04-15 13:05:18 +0000 |
---|---|---|
committer | venaas <venaas@e88ac4ed-0b26-0410-9574-a7f39faa03bf> | 2008-04-15 13:05:18 +0000 |
commit | 3c58a54570cfcebaff16d713fcfa02426152c824 (patch) | |
tree | a539f83357d9a6888af32cf7f857d6b022b1c6b3 | |
parent | 7ca3197e8da2add69e17437f1b8f3f2ac669990b (diff) |
include argument now relative to current config file, also never try to open master config basename
git-svn-id: https://svn.testnett.uninett.no/radsecproxy/trunk@230 e88ac4ed-0b26-0410-9574-a7f39faa03bf
-rw-r--r-- | gconfig.c | 57 | ||||
-rw-r--r-- | radsecproxy.c | 25 |
2 files changed, 44 insertions, 38 deletions
@@ -1,5 +1,5 @@ /* - * Copyright (C) 2007 Stig Venaas <venaas@uninett.no> + * Copyright (C) 2007, 2008 Stig Venaas <venaas@uninett.no> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -12,6 +12,7 @@ #include <stdlib.h> #include <glob.h> #include <sys/types.h> +#include <libgen.h> #include "debug.h" #include "util.h" #include "gconfig.h" @@ -77,22 +78,44 @@ FILE *pushgconffile(struct gconffile **cf, const char *path) { return f; } -FILE *pushgconffiles(struct gconffile **cf, const char *path) { +FILE *pushgconffiles(struct gconffile **cf, const char *cfgpath) { int i; FILE *f; glob_t globbuf; + char *path, *curfile = NULL, *dir; + /* if cfgpath is relative, make it relative to current config */ + if (*cfgpath == '/') + path = (char *)cfgpath; + else { + /* dirname may modify its argument */ + curfile = stringcopy((*cf)->path, 0); + if (!curfile) + debugx(1, DBG_ERR, "malloc failed"); + dir = dirname(curfile); + path = malloc(strlen(dir) + strlen(cfgpath) + 2); + if (!path) + debugx(1, DBG_ERR, "malloc failed"); + strcpy(path, dir); + path[strlen(dir)] = '/'; + strcpy(path + strlen(dir) + 1, cfgpath); + } memset(&globbuf, 0, sizeof(glob_t)); if (glob(path, 0, NULL, &globbuf)) { debug(DBG_INFO, "could not glob %s", path); - return NULL; + f = NULL; + } else { + for (i = globbuf.gl_pathc - 1; i >= 0; i--) { + f = pushgconffile(cf, globbuf.gl_pathv[i]); + if (!f) + break; + } + globfree(&globbuf); + } + if (curfile) { + free(curfile); + free(path); } - for (i = globbuf.gl_pathc - 1; i >= 0; i--) { - f = pushgconffile(cf, globbuf.gl_pathv[i]); - if (!f) - break; - } - globfree(&globbuf); return f; } @@ -200,18 +223,18 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { case CONF_STR: str = va_arg(ap, char **); if (!str) - debugx(1, DBG_ERR, "getgeneralconfig: internal parameter error"); + debugx(1, DBG_ERR, "getgenericconfig: internal parameter error"); break; case CONF_MSTR: mstr = va_arg(ap, char ***); if (!mstr) - debugx(1, DBG_ERR, "getgeneralconfig: internal parameter error"); + debugx(1, DBG_ERR, "getgenericconfig: internal parameter error"); break; case CONF_CBK: cbk = va_arg(ap, void (*)(struct gconffile **, char *, char *, char *)); break; default: - debugx(1, DBG_ERR, "getgeneralconfig: internal parameter error"); + debugx(1, DBG_ERR, "getgenericconfig: internal parameter error"); } if (!strcasecmp(opt, word)) break; @@ -234,9 +257,9 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { switch (type) { case CONF_STR: if (block) - debug(DBG_DBG, "getgeneralconfig: block %s: %s = %s", block, opt, val); + debug(DBG_DBG, "getgenericconfig: block %s: %s = %s", block, opt, val); else - debug(DBG_DBG, "getgeneralconfig: %s = %s", opt, val); + debug(DBG_DBG, "getgenericconfig: %s = %s", opt, val); if (*str) debugx(1, DBG_ERR, "configuration error, option %s already set to %s", opt, *str); *str = stringcopy(val, 0); @@ -245,9 +268,9 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { break; case CONF_MSTR: if (block) - debug(DBG_DBG, "getgeneralconfig: block %s: %s = %s", block, opt, val); + debug(DBG_DBG, "getgenericconfig: block %s: %s = %s", block, opt, val); else - debug(DBG_DBG, "getgeneralconfig: %s = %s", opt, val); + debug(DBG_DBG, "getgenericconfig: %s = %s", opt, val); if (*mstr) for (n = 0; (*mstr)[n]; n++); else @@ -267,7 +290,7 @@ void getgenericconfig(struct gconffile **cf, char *block, ...) { free(optval); break; default: - debugx(1, DBG_ERR, "getgeneralconfig: internal parameter error"); + debugx(1, DBG_ERR, "getgenericconfig: internal parameter error"); } } } diff --git a/radsecproxy.c b/radsecproxy.c index 030ffba..c5c5375 100644 --- a/radsecproxy.c +++ b/radsecproxy.c @@ -2581,28 +2581,12 @@ void addrealm(char *value, char **servers, char *message) { debug(DBG_DBG, "addrealm: added realm %s", value); } -struct gconffile *openconfigfile(const char *filename) { - FILE *f; - char pathname[100], *base = NULL; +struct gconffile *openconfigfile(const char *file) { struct gconffile *cf = NULL; - - f = pushgconffile(&cf, filename); - if (f) { - debug(DBG_DBG, "reading config file %s", filename); - return cf; - } - if (strlen(filename) + 1 <= sizeof(pathname)) { - /* basename() might modify the string */ - strcpy(pathname, filename); - base = basename(pathname); - f = pushgconffile(&cf, base); - } - - if (!f) - debugx(1, DBG_ERR, "could not read config file %s nor %s\n%s", filename, base, strerror(errno)); - - debug(DBG_DBG, "reading config file %s", base); + if (!pushgconffile(&cf, file)) + debugx(1, DBG_ERR, "could not read config file %s\n%s", file, strerror(errno)); + debug(DBG_DBG, "reading config file %s", file); return cf; } @@ -3020,7 +3004,6 @@ void getmainconfig(const char *configfile) { "Rewrite", CONF_CBK, confrewrite_cb, NULL ); - popgconffile(&cfs); tlsfree(); rewritefree(); |