summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2008-01-20 15:10:32 +0000
committerFelix Fietkau2008-01-20 15:10:32 +0000
commitf57d582f15c0ead3b600cb999ca298390957f597 (patch)
tree8f7728a724929e5b6cccba5798b5905a259ad21f
parent5e35ebaeb9da2e5fc7f455b6da9904b5187b0d06 (diff)
downloaduci-f57d582f15c0ead3b600cb999ca298390957f597.tar.gz
better config file handling
-rw-r--r--Makefile4
-rw-r--r--libuci.c3
-rw-r--r--parse.c26
-rw-r--r--test.c4
-rw-r--r--uci.h (renamed from libuci.h)7
5 files changed, 33 insertions, 11 deletions
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 <string.h>
#include <stdlib.h>
#include <stdio.h>
-#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 <sys/stat.h>
#include <ctype.h>
#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
index de96f45..4706255 100644
--- a/libuci.h
+++ b/uci.h
@@ -18,12 +18,15 @@
#include <setjmp.h>
#include <stdio.h>
+#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