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;
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 {
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 */
/* backend for import and export */
struct uci_backend *backend;
+ struct uci_list backends;
/* uci runtime flags */
enum uci_flags flags;
/* private: */
struct uci_backend *backend;
+ void *priv;
int n_section;
struct uci_list history;
struct uci_list saved_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)
#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
/* 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",
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)