From: Felix Fietkau Date: Tue, 12 Feb 2008 11:09:35 +0000 (+0100) Subject: cleanup X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=c90d9cb8ba073d1c98e61591303aa96300750940;p=uci.git cleanup --- diff --git a/file.c b/file.c index d2fdf58..883e360 100644 --- a/file.c +++ b/file.c @@ -527,9 +527,8 @@ done: return package; } -static struct uci_backend uci_file_backend = { - .name = "file", +static UCI_BACKEND(uci_file_backend, "file", .load = uci_file_load, .commit = uci_file_commit, .list_configs = uci_list_config_files, -}; +); diff --git a/libuci.c b/libuci.c index a220199..da2d15e 100644 --- a/libuci.c +++ b/libuci.c @@ -56,10 +56,13 @@ struct uci_context *uci_alloc_context(void) memset(ctx, 0, sizeof(struct uci_context)); uci_list_init(&ctx->root); uci_list_init(&ctx->history_path); + uci_list_init(&ctx->backends); ctx->flags = UCI_FLAG_STRICT; ctx->confdir = (char *) uci_confdir; ctx->savedir = (char *) uci_savedir; + + uci_list_add(&ctx->backends, &uci_file_backend.e.list); ctx->backend = &uci_file_backend; return ctx; diff --git a/uci.h b/uci.h index ac85105..4855170 100644 --- a/uci.h +++ b/uci.h @@ -281,7 +281,8 @@ enum uci_type { UCI_TYPE_PACKAGE = 1, UCI_TYPE_SECTION = 2, UCI_TYPE_OPTION = 3, - UCI_TYPE_PATH = 4 + UCI_TYPE_PATH = 4, + UCI_TYPE_BACKEND = 5, }; enum uci_flags { @@ -300,13 +301,12 @@ struct uci_element struct uci_backend { - const char *name; + struct uci_element e; char **(*list_configs)(struct uci_context *ctx); struct uci_package *(*load)(struct uci_context *ctx, const char *name); void (*commit)(struct uci_context *ctx, struct uci_package **p, bool overwrite); }; - struct uci_context { /* list of config packages */ @@ -317,6 +317,7 @@ struct uci_context /* backend for import and export */ struct uci_backend *backend; + struct uci_list backends; /* uci runtime flags */ enum uci_flags flags; @@ -346,6 +347,7 @@ struct uci_package /* private: */ struct uci_backend *backend; + void *priv; int n_section; struct uci_list history; struct uci_list saved_history; @@ -382,6 +384,18 @@ struct uci_history char *value; }; +#define UCI_BACKEND(_var, _name, ...) \ +struct uci_backend _var = { \ + .e.list = { \ + .next = &_var.e.list, \ + .prev = &_var.e.list, \ + }, \ + .e.name = _name, \ + .e.type = UCI_TYPE_BACKEND, \ + __VA_ARGS__ \ +} + + /* linked list handling */ #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) @@ -444,6 +458,7 @@ struct uci_history #define uci_list_empty(list) ((list)->next == (list)) /* wrappers for dynamic type handling */ +#define uci_type_backend UCI_TYPE_BACKEND #define uci_type_history UCI_TYPE_HISTORY #define uci_type_package UCI_TYPE_PACKAGE #define uci_type_section UCI_TYPE_SECTION @@ -452,6 +467,7 @@ struct uci_history /* element typecasting */ #ifdef UCI_DEBUG_TYPECAST static const char *uci_typestr[] = { + [uci_type_backend] = "backend", [uci_type_history] = "history", [uci_type_package] = "package", [uci_type_section] = "section", @@ -472,12 +488,14 @@ static void uci_typecast_error(int from, int to) return (struct uci_ ## _type *) e; \ } +BUILD_CAST(backend) BUILD_CAST(history) BUILD_CAST(package) BUILD_CAST(section) BUILD_CAST(option) #else +#define uci_to_backend(ptr) container_of(ptr, struct uci_backend, e) #define uci_to_history(ptr) container_of(ptr, struct uci_history, e) #define uci_to_package(ptr) container_of(ptr, struct uci_package, e) #define uci_to_section(ptr) container_of(ptr, struct uci_section, e)