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
 
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include "libuci.h"
+#include "uci.h"
 
 #define DEBUG
 #include "err.h"
        [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",
 };
 
  * This file contains the code for parsing uci config files
  */
 
+#include <sys/stat.h>
 #include <ctype.h>
 
 #define LINEBUF        128
        }
 }
 
-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);
        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)) {
 
  * 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)
 {
                return 1;
        }
 
-       if (uci_parse(ctx, argv[1])) {
+       if (uci_load(ctx, argv[1])) {
                uci_perror(ctx, "uci_parse");
                return 1;
        }
 
 #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
 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