From f57d582f15c0ead3b600cb999ca298390957f597 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sun, 20 Jan 2008 16:10:32 +0100 Subject: [PATCH] better config file handling --- Makefile | 4 ++-- libuci.c | 3 ++- parse.c | 26 ++++++++++++++++++++++---- test.c | 4 ++-- libuci.h => uci.h | 7 +++++-- 5 files changed, 33 insertions(+), 11 deletions(-) rename libuci.h => uci.h (93%) diff --git a/Makefile b/Makefile index bf194d1..b33f6fa 100644 --- a/Makefile +++ b/Makefile @@ -5,8 +5,8 @@ all: parsetest parsetest: libuci.o test.o $(CC) $(CFLAGS) -o $@ $^ -libuci.o: libuci.c parse.c libuci.h list.c err.h -test.o: test.c libuci.h +libuci.o: libuci.c parse.c uci.h list.c err.h +test.o: test.c uci.h clean: rm -f parsetest *.o diff --git a/libuci.c b/libuci.c index 4dfffff..262ca69 100644 --- a/libuci.c +++ b/libuci.c @@ -21,7 +21,7 @@ #include #include #include -#include "libuci.h" +#include "uci.h" #define DEBUG #include "err.h" @@ -31,6 +31,7 @@ static const char *uci_errstr[] = { [UCI_ERR_MEM] = "Out of memory", [UCI_ERR_INVAL] = "Invalid argument", [UCI_ERR_NOTFOUND] = "Entry not found", + [UCI_ERR_IO] = "I/O error", [UCI_ERR_PARSE] = "Parse error", [UCI_ERR_UNKNOWN] = "Unknown error", }; diff --git a/parse.c b/parse.c index 9dd7126..5fc4661 100644 --- a/parse.c +++ b/parse.c @@ -16,6 +16,7 @@ * This file contains the code for parsing uci config files */ +#include #include #define LINEBUF 128 @@ -267,9 +268,11 @@ static void uci_parse_line(struct uci_context *ctx) } } -int uci_parse(struct uci_context *ctx, const char *name) +int uci_load(struct uci_context *ctx, const char *name) { struct uci_parse_context *pctx; + struct stat statbuf; + char *filename; UCI_HANDLE_ERR(ctx); UCI_ASSERT(ctx, name != NULL); @@ -280,11 +283,26 @@ int uci_parse(struct uci_context *ctx, const char *name) pctx = (struct uci_parse_context *) uci_malloc(ctx, sizeof(struct uci_parse_context)); ctx->pctx = pctx; - /* TODO: use /etc/config/ */ - pctx->file = fopen(name, "r"); - if (!pctx->file) + switch (name[0]) { + case '.': + case '/': + /* absolute/relative path outside of /etc/config */ + filename = (char *) name; + break; + default: + filename = uci_malloc(ctx, strlen(name) + sizeof(UCI_CONFDIR) + 2); + sprintf(filename, UCI_CONFDIR "/%s", name); + break; + } + + if ((stat(filename, &statbuf) < 0) || + ((statbuf.st_mode & S_IFMT) != S_IFREG)) UCI_THROW(ctx, UCI_ERR_NOTFOUND); + pctx->file = fopen(filename, "r"); + if (!pctx->file) + UCI_THROW(ctx, UCI_ERR_IO); + pctx->cfg = uci_alloc_file(ctx, name); while (!feof(pctx->file)) { diff --git a/test.c b/test.c index 53b2a6a..caf773b 100644 --- a/test.c +++ b/test.c @@ -10,7 +10,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ -#include "libuci.h" +#include "uci.h" int main(int argc, char **argv) { @@ -21,7 +21,7 @@ int main(int argc, char **argv) return 1; } - if (uci_parse(ctx, argv[1])) { + if (uci_load(ctx, argv[1])) { uci_perror(ctx, "uci_parse"); return 1; } diff --git a/libuci.h b/uci.h similarity index 93% rename from libuci.h rename to uci.h index de96f45..4706255 100644 --- a/libuci.h +++ b/uci.h @@ -18,12 +18,15 @@ #include #include +#define UCI_CONFDIR "/etc/config" + enum { UCI_OK = 0, UCI_ERR_MEM, UCI_ERR_INVAL, UCI_ERR_NOTFOUND, + UCI_ERR_IO, UCI_ERR_PARSE, UCI_ERR_UNKNOWN, UCI_ERR_LAST @@ -54,12 +57,12 @@ extern struct uci_context *uci_alloc(void); extern void uci_perror(struct uci_context *ctx, const char *str); /** - * uci_parse: Parse an uci config file and store it in the uci context + * uci_load: Parse an uci config file and store it in the uci context * * @ctx: uci context * @name: name of the config file (relative to the config directory) */ -int uci_parse(struct uci_context *ctx, const char *name); +int uci_load(struct uci_context *ctx, const char *name); /** * uci_cleanup: Clean up after an error -- 2.41.1