projects
/
project
/
uci.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cli: check against multiple -f invocations to avoid leaks (patch by Stanislav Fomichev)
[project/uci.git]
/
list.c
diff --git
a/list.c
b/list.c
index
1a080fa
..
cf6d970
100644
(file)
--- a/
list.c
+++ b/
list.c
@@
-9,7
+9,7
@@
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * GNU
Lesser
General Public License for more details.
*/
static void uci_list_set_pos(struct uci_list *head, struct uci_list *ptr, int pos)
*/
static void uci_list_set_pos(struct uci_list *head, struct uci_list *ptr, int pos)
@@
-19,11
+19,12
@@
static void uci_list_set_pos(struct uci_list *head, struct uci_list *ptr, int po
uci_list_del(ptr);
uci_foreach_element(head, p) {
uci_list_del(ptr);
uci_foreach_element(head, p) {
- new_head = &p->list;
if (pos-- <= 0)
break;
if (pos-- <= 0)
break;
+ new_head = &p->list;
}
}
- uci_list_add(new_head, ptr);
+
+ uci_list_add(new_head->next, ptr);
}
static inline void uci_list_fixup(struct uci_list *ptr)
}
static inline void uci_list_fixup(struct uci_list *ptr)
@@
-36,7
+37,7
@@
static inline void uci_list_fixup(struct uci_list *ptr)
* uci_alloc_generic allocates a new uci_element with payload
* payload is appended to the struct to save memory and reduce fragmentation
*/
* uci_alloc_generic allocates a new uci_element with payload
* payload is appended to the struct to save memory and reduce fragmentation
*/
-
static
struct uci_element *
+
__private
struct uci_element *
uci_alloc_generic(struct uci_context *ctx, int type, const char *name, int size)
{
struct uci_element *e;
uci_alloc_generic(struct uci_context *ctx, int type, const char *name, int size)
{
struct uci_element *e;
@@
-62,7
+63,7
@@
done:
return e;
}
return e;
}
-
static
void
+
__private
void
uci_free_element(struct uci_element *e)
{
if (e->name)
uci_free_element(struct uci_element *e)
{
if (e->name)
@@
-224,8
+225,8
@@
uci_alloc_package(struct uci_context *ctx, const char *name)
p = uci_alloc_element(ctx, package, name, 0);
p->ctx = ctx;
uci_list_init(&p->sections);
p = uci_alloc_element(ctx, package, name, 0);
p->ctx = ctx;
uci_list_init(&p->sections);
- uci_list_init(&p->
history
);
- uci_list_init(&p->saved_
history
);
+ uci_list_init(&p->
delta
);
+ uci_list_init(&p->saved_
delta
);
return p;
}
return p;
}
@@
-243,11
+244,11
@@
uci_free_package(struct uci_package **package)
uci_foreach_element_safe(&p->sections, tmp, e) {
uci_free_section(uci_to_section(e));
}
uci_foreach_element_safe(&p->sections, tmp, e) {
uci_free_section(uci_to_section(e));
}
- uci_foreach_element_safe(&p->
history
, tmp, e) {
- uci_free_
history(uci_to_history
(e));
+ uci_foreach_element_safe(&p->
delta
, tmp, e) {
+ uci_free_
delta(uci_to_delta
(e));
}
}
- uci_foreach_element_safe(&p->saved_
history
, tmp, e) {
- uci_free_
history(uci_to_history
(e));
+ uci_foreach_element_safe(&p->saved_
delta
, tmp, e) {
+ uci_free_
delta(uci_to_delta
(e));
}
uci_free_element(&p->e);
*package = NULL;
}
uci_free_element(&p->e);
*package = NULL;
@@
-358,6
+359,18
@@
done:
}
int
}
int
+uci_lookup_next(struct uci_context *ctx, struct uci_element **e, struct uci_list *list, const char *name)
+{
+ UCI_HANDLE_ERR(ctx);
+
+ *e = uci_lookup_list(list, name);
+ if (!*e)
+ UCI_THROW(ctx, UCI_ERR_NOTFOUND);
+
+ return 0;
+}
+
+int
uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool extended)
{
struct uci_element *e;
uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool extended)
{
struct uci_element *e;
@@
-371,7
+384,11
@@
uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool ext
ptr->flags |= UCI_LOOKUP_DONE;
/* look up the package first */
ptr->flags |= UCI_LOOKUP_DONE;
/* look up the package first */
- e = uci_lookup_list(&ctx->root, ptr->package);
+ if (ptr->p)
+ e = &ptr->p->e;
+ else
+ e = uci_lookup_list(&ctx->root, ptr->package);
+
if (!e) {
UCI_INTERNAL(uci_load, ctx, ptr->package, &ptr->p);
if (!ptr->p)
if (!e) {
UCI_INTERNAL(uci_load, ctx, ptr->package, &ptr->p);
if (!ptr->p)
@@
-382,15
+399,21
@@
uci_lookup_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str, bool ext
ptr->last = e;
}
ptr->last = e;
}
- if (!ptr->section)
+ if (!ptr->section
&& !ptr->s
)
goto complete;
/* if the section name validates as a regular name, pass through
* to the regular uci_lookup function call */
goto complete;
/* if the section name validates as a regular name, pass through
* to the regular uci_lookup function call */
- if (ptr->flags & UCI_LOOKUP_EXTENDED)
- e = uci_lookup_ext_section(ctx, ptr);
- else
+ if (ptr->s) {
+ e = &ptr->s->e;
+ } else if (ptr->flags & UCI_LOOKUP_EXTENDED) {
+ if (extended)
+ e = uci_lookup_ext_section(ctx, ptr);
+ else
+ UCI_THROW(ctx, UCI_ERR_INVAL);
+ } else {
e = uci_lookup_list(&ptr->p->sections, ptr->section);
e = uci_lookup_list(&ptr->p->sections, ptr->section);
+ }
if (!e)
goto abort;
if (!e)
goto abort;
@@
-417,8
+440,8
@@
notfound:
return 0;
}
return 0;
}
-
static
struct uci_element *
-expand_ptr(struct uci_context *ctx, struct uci_ptr *ptr, bool complete)
+
__private
struct uci_element *
+
uci_
expand_ptr(struct uci_context *ctx, struct uci_ptr *ptr, bool complete)
{
UCI_ASSERT(ctx, ptr != NULL);
{
UCI_ASSERT(ctx, ptr != NULL);
@@
-452,8
+475,8
@@
static void uci_add_element_list(struct uci_context *ctx, struct uci_ptr *ptr, b
struct uci_package *p;
p = ptr->p;
struct uci_package *p;
p = ptr->p;
- if (!internal && p->has_
history
)
- uci_add_
history(ctx, &p->history
, UCI_CMD_LIST_ADD, ptr->section, ptr->option, ptr->value);
+ if (!internal && p->has_
delta
)
+ uci_add_
delta(ctx, &p->delta
, UCI_CMD_LIST_ADD, ptr->section, ptr->option, ptr->value);
e = uci_alloc_generic(ctx, UCI_TYPE_ITEM, ptr->value, sizeof(struct uci_option));
uci_list_add(&ptr->o->v.list, &e->list);
e = uci_alloc_generic(ctx, UCI_TYPE_ITEM, ptr->value, sizeof(struct uci_option));
uci_list_add(&ptr->o->v.list, &e->list);
@@
-461,22
+484,22
@@
static void uci_add_element_list(struct uci_context *ctx, struct uci_ptr *ptr, b
int uci_rename(struct uci_context *ctx, struct uci_ptr *ptr)
{
int uci_rename(struct uci_context *ctx, struct uci_ptr *ptr)
{
- /* NB: UCI_INTERNAL use means without
history
tracking */
- bool internal = ctx->internal;
+ /* NB: UCI_INTERNAL use means without
delta
tracking */
+ bool internal = ctx
&& ctx
->internal;
struct uci_element *e;
struct uci_package *p;
char *n;
UCI_HANDLE_ERR(ctx);
struct uci_element *e;
struct uci_package *p;
char *n;
UCI_HANDLE_ERR(ctx);
- e = expand_ptr(ctx, ptr, true);
+ e =
uci_
expand_ptr(ctx, ptr, true);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
UCI_ASSERT(ctx, ptr->value);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
UCI_ASSERT(ctx, ptr->value);
- if (!internal && p->has_
history
)
- uci_add_
history(ctx, &p->history
, UCI_CMD_RENAME, ptr->section, ptr->option, ptr->value);
+ if (!internal && p->has_
delta
)
+ uci_add_
delta(ctx, &p->delta
, UCI_CMD_RENAME, ptr->section, ptr->option, ptr->value);
n = uci_strdup(ctx, ptr->value);
if (e->name)
n = uci_strdup(ctx, ptr->value);
if (e->name)
@@
-497,9
+520,9
@@
int uci_reorder_section(struct uci_context *ctx, struct uci_section *s, int pos)
UCI_HANDLE_ERR(ctx);
uci_list_set_pos(&s->package->sections, &s->e.list, pos);
UCI_HANDLE_ERR(ctx);
uci_list_set_pos(&s->package->sections, &s->e.list, pos);
- if (!ctx->internal && p->has_
history
) {
+ if (!ctx->internal && p->has_
delta
) {
sprintf(order, "%d", pos);
sprintf(order, "%d", pos);
- uci_add_
history(ctx, &p->history
, UCI_CMD_REORDER, s->e.name, NULL, order);
+ uci_add_
delta(ctx, &p->delta
, UCI_CMD_REORDER, s->e.name, NULL, order);
}
return 0;
}
return 0;
@@
-507,7
+530,7
@@
int uci_reorder_section(struct uci_context *ctx, struct uci_section *s, int pos)
int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *type, struct uci_section **res)
{
int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *type, struct uci_section **res)
{
- bool internal = ctx->internal;
+ bool internal = ctx
&& ctx
->internal;
struct uci_section *s;
UCI_HANDLE_ERR(ctx);
struct uci_section *s;
UCI_HANDLE_ERR(ctx);
@@
-515,8
+538,8
@@
int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *
s = uci_alloc_section(p, type, NULL);
uci_fixup_section(ctx, s);
*res = s;
s = uci_alloc_section(p, type, NULL);
uci_fixup_section(ctx, s);
*res = s;
- if (!internal && p->has_
history
)
- uci_add_
history(ctx, &p->history
, UCI_CMD_ADD, s->e.name, NULL, type);
+ if (!internal && p->has_
delta
)
+ uci_add_
delta(ctx, &p->delta
, UCI_CMD_ADD, s->e.name, NULL, type);
return 0;
}
return 0;
}
@@
-524,19
+547,19
@@
int uci_add_section(struct uci_context *ctx, struct uci_package *p, const char *
int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
{
/* NB: pass on internal flag to uci_del_element */
int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
{
/* NB: pass on internal flag to uci_del_element */
- bool internal = ctx->internal;
+ bool internal = ctx
&& ctx
->internal;
struct uci_package *p;
struct uci_element *e;
UCI_HANDLE_ERR(ctx);
struct uci_package *p;
struct uci_element *e;
UCI_HANDLE_ERR(ctx);
- e = expand_ptr(ctx, ptr, true);
+ e =
uci_
expand_ptr(ctx, ptr, true);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
p = ptr->p;
UCI_ASSERT(ctx, ptr->s);
- if (!internal && p->has_
history
)
- uci_add_
history(ctx, &p->history
, UCI_CMD_REMOVE, ptr->section, ptr->option, NULL);
+ if (!internal && p->has_
delta
)
+ uci_add_
delta(ctx, &p->delta
, UCI_CMD_REMOVE, ptr->section, ptr->option, NULL);
uci_free_any(&e);
uci_free_any(&e);
@@
-550,14
+573,14
@@
int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
{
int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
{
- /* NB: UCI_INTERNAL use means without
history
tracking */
- bool internal = ctx->internal;
+ /* NB: UCI_INTERNAL use means without
delta
tracking */
+ bool internal = ctx
&& ctx
->internal;
struct uci_option *prev = NULL;
const char *value2 = NULL;
UCI_HANDLE_ERR(ctx);
struct uci_option *prev = NULL;
const char *value2 = NULL;
UCI_HANDLE_ERR(ctx);
- expand_ptr(ctx, ptr, false);
+
uci_
expand_ptr(ctx, ptr, false);
UCI_ASSERT(ctx, ptr->s);
UCI_ASSERT(ctx, ptr->value);
UCI_ASSERT(ctx, ptr->s);
UCI_ASSERT(ctx, ptr->value);
@@
-591,11
+614,11
@@
int uci_add_list(struct uci_context *ctx, struct uci_ptr *ptr)
int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
{
int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
{
- /* NB: UCI_INTERNAL use means without
history
tracking */
- bool internal = ctx->internal;
+ /* NB: UCI_INTERNAL use means without
delta
tracking */
+ bool internal = ctx
&& ctx
->internal;
UCI_HANDLE_ERR(ctx);
UCI_HANDLE_ERR(ctx);
- expand_ptr(ctx, ptr, false);
+
uci_
expand_ptr(ctx, ptr, false);
UCI_ASSERT(ctx, ptr->value);
UCI_ASSERT(ctx, ptr->s || (!ptr->option && ptr->section));
if (!ptr->option && ptr->value[0]) {
UCI_ASSERT(ctx, ptr->value);
UCI_ASSERT(ctx, ptr->s || (!ptr->option && ptr->section));
if (!ptr->option && ptr->value[0]) {
@@
-644,8
+667,8
@@
int uci_set(struct uci_context *ctx, struct uci_ptr *ptr)
UCI_THROW(ctx, UCI_ERR_INVAL);
}
UCI_THROW(ctx, UCI_ERR_INVAL);
}
- if (!internal && ptr->p->has_
history
)
- uci_add_
history(ctx, &ptr->p->history
, UCI_CMD_CHANGE, ptr->section, ptr->option, ptr->value);
+ if (!internal && ptr->p->has_
delta
)
+ uci_add_
delta(ctx, &ptr->p->delta
, UCI_CMD_CHANGE, ptr->section, ptr->option, ptr->value);
return 0;
}
return 0;
}