2 * ucimap-example - sample code for the ucimap library
3 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
23 struct list_head list
;
24 struct list_head alias
;
32 struct ucimap_list
*aliases
;
36 struct list_head list
;
39 struct uci_network
*interface
;
43 network_init_interface(struct uci_map
*map
, void *section
, struct uci_section
*s
)
45 struct uci_network
*net
= section
;
47 INIT_LIST_HEAD(&net
->list
);
48 INIT_LIST_HEAD(&net
->alias
);
49 net
->name
= s
->e
.name
;
55 network_init_alias(struct uci_map
*map
, void *section
, struct uci_section
*s
)
57 struct uci_alias
*alias
= section
;
59 INIT_LIST_HEAD(&alias
->list
);
60 alias
->name
= s
->e
.name
;
65 network_add_interface(struct uci_map
*map
, void *section
)
67 struct uci_network
*net
= section
;
69 list_add(&net
->list
, &ifs
);
75 network_add_alias(struct uci_map
*map
, void *section
)
77 struct uci_alias
*a
= section
;
80 list_add(&a
->list
, &a
->interface
->alias
);
85 static struct uci_sectmap network_interface
;
86 static struct uci_sectmap network_alias
;
88 static struct uci_optmap network_interface_options
[] = {
89 OPTMAP_OPTION(UCIMAP_STRING
, struct uci_network
, proto
, .data
.s
.maxlen
= 32),
90 OPTMAP_OPTION(UCIMAP_STRING
, struct uci_network
, ifname
),
91 OPTMAP_OPTION(UCIMAP_STRING
, struct uci_network
, ipaddr
),
92 OPTMAP_OPTION(UCIMAP_BOOL
, struct uci_network
, enabled
),
93 OPTMAP_OPTION(UCIMAP_INT
, struct uci_network
, test
),
94 OPTMAP_OPTION(UCIMAP_LIST
| UCIMAP_SECTION
, struct uci_network
, aliases
, .data
.sm
= &network_alias
),
97 static struct uci_sectmap network_interface
= {
99 .options
= network_interface_options
,
100 .alloc_len
= sizeof(struct uci_network
),
101 .init_section
= network_init_interface
,
102 .add_section
= network_add_interface
,
103 .n_options
= ARRAY_SIZE(network_interface_options
),
106 static struct uci_optmap network_alias_options
[] = {
107 OPTMAP_OPTION(UCIMAP_SECTION
, struct uci_alias
, interface
, .data
.sm
= &network_interface
),
110 static struct uci_sectmap network_alias
= {
112 .options
= network_alias_options
,
113 .alloc_len
= sizeof(struct uci_network
),
114 .init_section
= network_init_alias
,
115 .add_section
= network_add_alias
,
116 .n_options
= ARRAY_SIZE(network_alias_options
),
119 static struct uci_sectmap
*network_smap
[] = {
124 static struct uci_map network_map
= {
125 .sections
= network_smap
,
126 .n_sections
= ARRAY_SIZE(network_smap
),
130 int main(int argc
, char **argv
)
132 struct uci_context
*ctx
;
133 struct uci_package
*pkg
;
134 struct list_head
*p
, *p2
;
135 struct uci_network
*net
;
136 struct uci_alias
*alias
;
139 INIT_LIST_HEAD(&ifs
);
140 ctx
= uci_alloc_context();
141 ucimap_init(&network_map
);
143 uci_load(ctx
, "network", &pkg
);
145 ucimap_parse(&network_map
, pkg
);
147 list_for_each(p
, &ifs
) {
148 net
= list_entry(p
, struct uci_network
, list
);
149 printf("New network section '%s'\n"
160 (net
->enabled
? "on" : "off"));
162 for (i
= 0; i
< net
->aliases
->n_items
; i
++) {
163 alias
= net
->aliases
->item
[i
].section
;
164 printf("New alias: %s\n", alias
->name
);
167 net
->ipaddr
= "2.3.4.5";
168 ucimap_set_changed(net
, &net
->ipaddr
);
169 ucimap_store_section(&network_map
, pkg
, net
);
176 ucimap_cleanup(&network_map
);
177 uci_free_context(ctx
);