blob: e544e84ba1a975a87a5af718ad7a6e4951f76dd7 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001
2#include "piped.h"
3#include "piped_uci.h"
4#include "piped_util.h"
5
6static inline void pd_uci_set_ptr(const char *p, const char *s, const char *o,
7 const char *v, struct uci_ptr *ptr)
8{
9 memset(ptr, 0, sizeof(*ptr));
10 ptr->package = p;
11 ptr->section = s;
12 ptr->option = o;
13 ptr->value = v;
14}
15
16void pd_uci_done(struct uci_context *c, bool commit)
17{
18 struct uci_package *p;
19
20 if (commit) {
21 if ((p = uci_lookup_package(c, UCI_PKG_NW)))
22 uci_commit(c, &p, false);
23 if ((p = uci_lookup_package(c, UCI_PKG_DHCP)))
24 uci_commit(c, &p, false);
25 }
26 uci_free_context(c);
27}
28
29int pd_uci_get_ptr(struct uci_context *c, const char *p, const char *s,
30 const char *o, const char *v, struct uci_ptr *ptr)
31{
32 int rc;
33 pd_uci_set_ptr(p, s, o, v, ptr);
34 rc = uci_lookup_ptr(c, ptr, NULL, false);
35 if (rc || !(ptr->flags & UCI_LOOKUP_COMPLETE))
36 return 1;
37 if (ptr->last->type != UCI_TYPE_OPTION)
38 return 1;
39 return 0;
40}
41
42char *pd_uci_get_opt(struct uci_context *c, const char *p, const char *s,
43 const char *o)
44{
45 struct uci_ptr ptr;
46
47 if (pd_uci_get_ptr(c, p, s, o, NULL, &ptr))
48 return NULL;
49 if (ptr.o->type != UCI_TYPE_STRING)
50 return NULL;
51 return ptr.o->v.string;
52}
53
54char *pd_uci_get_list_first(struct uci_context *c, const char *p, const char *s,
55 const char *o)
56{
57 struct uci_ptr ptr;
58 struct uci_element *e;
59 if (pd_uci_get_ptr(c, p, s, o, NULL, &ptr))
60 return NULL;
61 if (ptr.o->type != UCI_TYPE_LIST)
62 return NULL;
63 e = list_to_element((&ptr.o->v.list)->next);
64 if (!e)
65 return NULL;
66 return e->name;
67}
68
69struct uci_list *pd_uci_get_list(struct uci_context *c, const char *p,
70 const char *s, const char *o)
71{
72 struct uci_ptr ptr;
73 if (pd_uci_get_ptr(c, p, s, o, NULL, &ptr))
74 return NULL;
75 if (ptr.o->type != UCI_TYPE_LIST)
76 return NULL;
77 return &ptr.o->v.list;
78}
79
80int pd_uci_set_opt(struct uci_context *c, const char *p, const char *s,
81 const char *o, const char *v)
82{
83
84 struct uci_ptr ptr;
85 pd_uci_set_ptr(p, s, o, v, &ptr);
86 return uci_set(c, &ptr);
87}
88
89int pd_uci_add_list(struct uci_context *c, const char *p, const char *s,
90 const char *o, const char *v)
91{
92 struct uci_ptr ptr;
93 pd_uci_set_ptr(p, s, o, v, &ptr);
94 return uci_add_list(c, &ptr);
95}
96
97int pd_uci_del_from_list(struct uci_context *c, const char *p, const char *s,
98 const char *o, const char *v)
99{
100 struct uci_ptr ptr;
101 pd_uci_set_ptr(p, s, o, v, &ptr);
102 return uci_del_list(c, &ptr);
103}
104
105int pd_uci_del_opt(struct uci_context *c, const char *p, const char *s,
106 const char *o, const char *v)
107{
108 struct uci_ptr ptr;
109 pd_uci_set_ptr(p, s, o, v, &ptr);
110 return uci_delete(c, &ptr);
111}
112
113int pd_uci_del(struct uci_context *c, const char *p, const char *s,
114 const char *o, const char *v)
115{
116 struct uci_ptr ptr;
117 if (pd_uci_get_ptr(c, p, s, o, NULL, &ptr))
118 return 1;
119
120 ptr.value = v;
121 return uci_delete(c, &ptr);
122}
123
124int pd_uci_list_len(struct uci_list *l)
125{
126 struct uci_element *e;
127 int n = 0;
128
129 uci_foreach_element(l, e)
130 n++;
131 return n;
132}
133
134int pd_uci_parse_bool(char *b)
135{
136 if (!strcmp(b, "true") || !strcmp(b, "1"))
137 return 1;
138 else if (!strcmp(b, "false") || !strcmp(b, "0"))
139 return 0;
140 return -1;
141}