summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ast.c10
-rw-r--r--ast.h5
-rw-r--r--lib/fs.c20
-rw-r--r--lib/ubus.c10
-rw-r--r--lib/uci.c10
-rw-r--r--module.h4
6 files changed, 31 insertions, 28 deletions
diff --git a/ast.c b/ast.c
index 498f40e..084bbcb 100644
--- a/ast.c
+++ b/ast.c
@@ -291,6 +291,9 @@ ut_free(struct ut_state *s)
ut_reset(s);
}
+ while (ut_ext_types_count > 0)
+ json_object_put(ut_ext_types[--ut_ext_types_count].proto);
+
free(ut_ext_types);
free(s);
}
@@ -343,7 +346,7 @@ out:
}
bool
-ut_register_extended_type(const char *name, void (*freefn)(void *))
+ut_register_extended_type(const char *name, struct json_object *proto, void (*freefn)(void *))
{
struct ut_extended_type *tmp;
@@ -355,6 +358,7 @@ ut_register_extended_type(const char *name, void (*freefn)(void *))
ut_ext_types = tmp;
ut_ext_types[ut_ext_types_count].name = name;
ut_ext_types[ut_ext_types_count].free = freefn;
+ ut_ext_types[ut_ext_types_count].proto = proto;
ut_ext_types_count++;
return true;
@@ -393,7 +397,7 @@ ut_extended_type_free(struct json_object *v, void *ud)
}
struct json_object *
-ut_set_extended_type(struct json_object *v, struct json_object *proto, const char *name, void *data)
+ut_set_extended_type(struct json_object *v, const char *name, void *data)
{
struct ut_extended_type *et = NULL;
struct ut_op *op;
@@ -416,7 +420,7 @@ ut_set_extended_type(struct json_object *v, struct json_object *proto, const cha
op->val = v;
op->type = T_RESSOURCE;
- op->tag.proto = json_object_get(proto);
+ op->tag.proto = json_object_get(et->proto);
op->tag.type = n + 1;
op->tag.data = data;
diff --git a/ast.h b/ast.h
index ecbd763..41cbc61 100644
--- a/ast.h
+++ b/ast.h
@@ -101,6 +101,7 @@ struct ut_state {
struct ut_extended_type {
const char *name;
+ struct json_object *proto;
void (*free)(void *);
};
@@ -128,8 +129,8 @@ struct json_object *ut_new_object(struct json_object *proto);
struct json_object *ut_new_double(double v);
struct json_object *ut_new_null(void);
-bool ut_register_extended_type(const char *name, void (*freefn)(void *));
-struct json_object *ut_set_extended_type(struct json_object *v, struct json_object *proto, const char *name, void *data);
+bool ut_register_extended_type(const char *name, struct json_object *proto, void (*freefn)(void *));
+struct json_object *ut_set_extended_type(struct json_object *v, const char *name, void *data);
void **ut_get_extended_type(struct json_object *val, const char *name);
void *ParseAlloc(void *(*mfunc)(size_t));
diff --git a/lib/fs.c b/lib/fs.c
index dfa9955..448ad62 100644
--- a/lib/fs.c
+++ b/lib/fs.c
@@ -29,10 +29,6 @@
static const struct ut_ops *ops;
-static struct json_object *proc_proto;
-static struct json_object *file_proto;
-static struct json_object *dir_proto;
-
static int last_error = 0;
static struct json_object *
@@ -221,7 +217,7 @@ ut_fs_popen(struct ut_state *s, uint32_t off, struct json_object *args)
err_return(ENOMEM);
}
- return ops->set_type(fo, proc_proto, "fs.proc", fp);
+ return ops->set_type(fo, "fs.proc", fp);
}
@@ -328,7 +324,7 @@ ut_fs_open(struct ut_state *s, uint32_t off, struct json_object *args)
err_return(ENOMEM);
}
- return ops->set_type(fo, file_proto, "fs.file", fp);
+ return ops->set_type(fo, "fs.file", fp);
}
@@ -423,7 +419,7 @@ ut_fs_opendir(struct ut_state *s, uint32_t off, struct json_object *args)
err_return(ENOMEM);
}
- return ops->set_type(diro, dir_proto, "fs.dir", dp);
+ return ops->set_type(diro, "fs.dir", dp);
}
static struct json_object *
@@ -723,11 +719,9 @@ static void close_dir(void *ud) {
void ut_module_init(const struct ut_ops *ut, struct ut_state *s, struct json_object *scope)
{
- ops = ut;
- ops->register_type("fs.proc", close_proc);
- ops->register_type("fs.file", close_file);
- ops->register_type("fs.dir", close_dir);
+ struct json_object *proc_proto, *file_proto, *dir_proto;
+ ops = ut;
proc_proto = ops->new_object(NULL);
file_proto = ops->new_object(NULL);
dir_proto = ops->new_object(NULL);
@@ -736,4 +730,8 @@ void ut_module_init(const struct ut_ops *ut, struct ut_state *s, struct json_obj
register_functions(ops, proc_fns, proc_proto);
register_functions(ops, file_fns, file_proto);
register_functions(ops, dir_fns, dir_proto);
+
+ ops->register_type("fs.proc", proc_proto, close_proc);
+ ops->register_type("fs.file", file_proto, close_file);
+ ops->register_type("fs.dir", dir_proto, close_dir);
}
diff --git a/lib/ubus.c b/lib/ubus.c
index 55793a2..21f7a7b 100644
--- a/lib/ubus.c
+++ b/lib/ubus.c
@@ -25,8 +25,6 @@
static const struct ut_ops *ops;
-static struct json_object *conn_proto;
-
static enum ubus_msg_status last_error = 0;
struct ubus_connection {
@@ -171,7 +169,7 @@ ut_ubus_connect(struct ut_state *s, uint32_t off, struct json_object *args)
ubus_add_uloop(c->ctx);
- return ops->set_type(co, conn_proto, "ubus.connection", c);
+ return ops->set_type(co, "ubus.connection", c);
}
static void
@@ -317,11 +315,13 @@ static void close_connection(void *ud) {
void ut_module_init(const struct ut_ops *ut, struct ut_state *s, struct json_object *scope)
{
- ops = ut;
- ops->register_type("ubus.connection", close_connection);
+ struct json_object *conn_proto;
+ ops = ut;
conn_proto = ops->new_object(NULL);
register_functions(ops, global_fns, scope);
register_functions(ops, conn_fns, conn_proto);
+
+ ops->register_type("ubus.connection", conn_proto, close_connection);
}
diff --git a/lib/uci.c b/lib/uci.c
index 8f7ffce..3cefd2f 100644
--- a/lib/uci.c
+++ b/lib/uci.c
@@ -23,8 +23,6 @@
static const struct ut_ops *ops;
-static struct json_object *uci_proto;
-
static int last_error = 0;
enum pkg_cmd {
@@ -105,7 +103,7 @@ ut_uci_cursor(struct ut_state *s, uint32_t off, struct json_object *args)
err_return(UCI_ERR_MEM);
}
- return ops->set_type(co, uci_proto, "uci.cursor", c);
+ return ops->set_type(co, "uci.cursor", c);
}
@@ -1015,11 +1013,13 @@ static void close_uci(void *ud) {
void ut_module_init(const struct ut_ops *ut, struct ut_state *s, struct json_object *scope)
{
- ops = ut;
- ops->register_type("uci.cursor", close_uci);
+ struct json_object *uci_proto;
+ ops = ut;
uci_proto = ops->new_object(NULL);
register_functions(ops, global_fns, scope);
register_functions(ops, cursor_fns, uci_proto);
+
+ ops->register_type("uci.cursor", uci_proto, close_uci);
}
diff --git a/module.h b/module.h
index 8760926..77c4f99 100644
--- a/module.h
+++ b/module.h
@@ -22,8 +22,8 @@
struct ut_ops {
bool (*register_function)(struct json_object *, const char *, ut_c_fn *);
- bool (*register_type)(const char *, void (*)(void *));
- struct json_object *(*set_type)(struct json_object *, struct json_object *, const char *, void *);
+ bool (*register_type)(const char *, struct json_object *, void (*)(void *));
+ struct json_object *(*set_type)(struct json_object *, const char *, void *);
void **(*get_type)(struct json_object *, const char *);
struct json_object *(*new_object)(struct json_object *);
struct json_object *(*new_double)(double);