mirror of
https://dev.iopsys.eu/bbf/icwmp.git
synced 2026-02-04 22:40:25 +01:00
Fixing bugs
This commit is contained in:
parent
10ae23726a
commit
e8304eb7a1
7 changed files with 53 additions and 37 deletions
|
|
@ -1052,10 +1052,10 @@ void synchronize_specific_config_sections_with_dmmap_eq(char *package, char *sec
|
|||
}
|
||||
}
|
||||
|
||||
void get_dmmap_section_of_config_section(struct uci_section *config_section, char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section){
|
||||
void get_dmmap_section_of_config_section(char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section){
|
||||
struct uci_section* s;
|
||||
char *section_name_conf =section_name(config_section);
|
||||
uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "section_name", section_name_conf, s){
|
||||
|
||||
uci_path_foreach_option_eq(icwmpd, dmmap_package, section_type, "section_name", section_name, s){
|
||||
*dmmap_section= s;
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -154,6 +154,6 @@ void ip_to_hex(char *address, char *ret);
|
|||
void free_dmmap_config_dup_list(struct list_head *dup_list);
|
||||
void synchronize_specific_config_sections_with_dmmap(char *package, char *section_type, char *dmmap_package, struct list_head *dup_list);
|
||||
void synchronize_specific_config_sections_with_dmmap_eq(char *package, char *section_type, char *dmmap_package,char* option_name, char* option_value, struct list_head *dup_list);
|
||||
void get_dmmap_section_of_config_section(struct uci_section *config_section, char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section);
|
||||
void get_dmmap_section_of_config_section(char* dmmap_package, char* section_type, char *section_name, struct uci_section **dmmap_section);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -483,15 +483,19 @@ int add_profile_object(char *refparam, struct dmctx *ctx, void *data, char **ins
|
|||
return 0;
|
||||
}
|
||||
|
||||
int delete_associated_line_instances(char *sip_id)
|
||||
int delete_associated_line_instances(char *sip_id, char* profile_key)
|
||||
{
|
||||
struct uci_section *s;
|
||||
char *stmp;
|
||||
|
||||
uci_foreach_option_eq("voice_client", "brcm_line", "sip_account", sip_id, s) {
|
||||
dmuci_set_value_by_section(s, "sip_account", "-");
|
||||
dmuci_set_value_by_section(s, "lineinstance", "");
|
||||
dmuci_set_value_by_section(s, "linealias", "");
|
||||
}
|
||||
uci_path_foreach_option_eq_safe(icwmpd, "dmmap_voice_client", "brcm_line", "voice_profile_key", profile_key, stmp, s) {
|
||||
dmuci_delete_by_section(s, NULL, NULL);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -501,31 +505,31 @@ int delete_profile_object(char *refparam, struct dmctx *ctx, void *data, char *i
|
|||
struct uci_section *s, *ss = NULL;
|
||||
struct sip_args *sipargs = (struct sip_args *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
char *v= NULL;
|
||||
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &v);
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
get_dmmap_section_of_config_section(sipargs->sip_section, "dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
delete_associated_line_instances(section_name(sipargs->sip_section));
|
||||
delete_associated_line_instances(section_name(sipargs->sip_section), v);
|
||||
dmuci_delete_by_section(sipargs->sip_section, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_sections("voice_client", "sip_service_provider", s) {
|
||||
if (found != 0) {
|
||||
get_dmmap_section_of_config_section(s, "dmmap_voice_client", "sip_service_provider", section_name(s), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
delete_associated_line_instances(section_name(ss));
|
||||
delete_associated_line_instances(section_name(ss), v);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
}
|
||||
ss = s;
|
||||
found++;
|
||||
}
|
||||
if (ss != NULL) {
|
||||
get_dmmap_section_of_config_section(ss, "dmmap_voice_client", "sip_service_provider", section_name(ss), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
delete_associated_line_instances(section_name(ss));
|
||||
delete_associated_line_instances(section_name(ss), v);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
}
|
||||
break;
|
||||
|
|
@ -573,13 +577,13 @@ char *update_vp_line_instance(struct uci_section *brcm_s, char *sipx)
|
|||
struct uci_section *s = NULL, *dmmap_section= NULL, *dmmap_dup= NULL;
|
||||
int last_instance = 0, i_instance;
|
||||
char *instance, buf[8];
|
||||
get_dmmap_section_of_config_section(brcm_s, "dmmap_voice_client", "brcm_line", section_name(brcm_s), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(brcm_s), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "lineinstance", &instance);
|
||||
if(instance[0] != '\0'){
|
||||
return instance;
|
||||
}
|
||||
uci_foreach_option_eq("voice_client", "brcm_line", "sip_account", sipx, s) {
|
||||
get_dmmap_section_of_config_section(s, "dmmap_voice_client", "brcm_line", section_name(brcm_s), &dmmap_dup);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(s), &dmmap_dup);
|
||||
dmuci_get_value_by_section_string(dmmap_dup, "lineinstance", &instance);
|
||||
if (instance[0] != '\0') {
|
||||
i_instance = atoi(instance);
|
||||
|
|
@ -650,7 +654,7 @@ int add_line_object(char *refparam, struct dmctx *ctx, void *data, char **instan
|
|||
add_line(s, section_name(sipargs->sip_section));
|
||||
dmuci_add_section_icwmpd("dmmap_voice_client", "brcm_line", &dmmap_voice_line_section, &v);
|
||||
dmuci_set_value_by_section(dmmap_voice_line_section, "section_name", section_name(s));
|
||||
get_dmmap_section_of_config_section(sipargs->sip_section, "dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "profileinstance", &voice_profile_key);
|
||||
dmuci_set_value_by_section(dmmap_voice_line_section, "voice_profile_key", voice_profile_key);
|
||||
*instancepara = update_vp_line_instance(s, section_name(sipargs->sip_section)); //TODO: To Check
|
||||
|
|
@ -709,7 +713,7 @@ int delete_line_object(char *refparam, struct dmctx *ctx, void *data, char *inst
|
|||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
bargs = (struct brcm_args *)data;
|
||||
get_dmmap_section_of_config_section(bargs->brcm_section, "dmmap_voice_client", "brcm_line", section_name(bargs->brcm_section), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(bargs->brcm_section), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
delete_line(bargs->brcm_section, bargs->sip_section);
|
||||
break;
|
||||
|
|
@ -717,7 +721,7 @@ int delete_line_object(char *refparam, struct dmctx *ctx, void *data, char *inst
|
|||
sipargs = (struct sip_args *)data;
|
||||
s_name = section_name(sipargs->sip_section);
|
||||
uci_foreach_option_eq("voice_client", "brcm_line", "sip_account", s_name, s) {
|
||||
get_dmmap_section_of_config_section(s, "dmmap_voice_client", "brcm_line", section_name(s), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(s), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
delete_line(s, sipargs->sip_section);
|
||||
|
|
@ -2234,7 +2238,7 @@ int get_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char
|
|||
struct sip_args *sipargs = (struct sip_args *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(sipargs->sip_section, "dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "profilealias", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2244,7 +2248,7 @@ int set_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char
|
|||
struct sip_args *sipargs = (struct sip_args *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(sipargs->sip_section, "dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "sip_service_provider", section_name(sipargs->sip_section), &dmmap_section);
|
||||
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
|
|
@ -2259,18 +2263,24 @@ int set_voice_profile_alias(char *refparam, struct dmctx *ctx, void *data, char
|
|||
int get_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value)
|
||||
{
|
||||
struct brcm_args *brcmarg = (struct brcm_args *)data;
|
||||
dmuci_get_value_by_section_string(brcmarg->brcm_section, "linealias", value);
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(brcmarg->brcm_section), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "linealias", value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int set_line_alias(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action)
|
||||
{
|
||||
struct brcm_args *brcmarg = (struct brcm_args *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section("dmmap_voice_client", "brcm_line", section_name(brcmarg->brcm_section), &dmmap_section);
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
return 0;
|
||||
case VALUESET:
|
||||
dmuci_set_value_by_section(brcmarg->brcm_section, "linealias", value);
|
||||
dmuci_set_value_by_section(dmmap_section, "linealias", value);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ int get_x_inteno_button_alias(char *refparam, struct dmctx *ctx, void *data, cha
|
|||
{
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section((struct uci_section *)data, "dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "buttonalias", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -160,7 +160,7 @@ int set_x_inteno_button_alias(char *refparam, struct dmctx *ctx, void *data, cha
|
|||
{
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section((struct uci_section *)data, "dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_buttons", "button", section_name((struct uci_section *)data), &dmmap_section);
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -656,14 +656,14 @@ int delete_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char *in
|
|||
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
get_dmmap_section_of_config_section(ipaccsection, "dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ipaccsection, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_sections("firewall", "rule", s) {
|
||||
if (found != 0){
|
||||
get_dmmap_section_of_config_section(s, "dmmap_firewall", "rule", section_name(s), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(s), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
@ -672,7 +672,7 @@ int delete_ipacccfg_rule(char *refparam, struct dmctx *ctx, void *data, char *in
|
|||
found++;
|
||||
}
|
||||
if (ss != NULL){
|
||||
get_dmmap_section_of_config_section(ss, "dmmap_firewall", "rule", section_name(ss), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ss), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
@ -713,14 +713,14 @@ int delete_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *dat
|
|||
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
get_dmmap_section_of_config_section(forwardsection, "dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(forwardsection, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_option_eq("firewall", "redirect", "target", "DNAT", s) {
|
||||
if (found != 0){
|
||||
get_dmmap_section_of_config_section(s, "dmmap_firewall", "redirect", section_name(s), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(s), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
@ -729,7 +729,7 @@ int delete_ipacccfg_port_forwarding(char *refparam, struct dmctx *ctx, void *dat
|
|||
found++;
|
||||
}
|
||||
if (ss != NULL){
|
||||
get_dmmap_section_of_config_section(ss, "dmmap_firewall", "redirect", section_name(ss), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(ss), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
@ -745,7 +745,7 @@ int get_x_inteno_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *d
|
|||
struct uci_section *ipaccsection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(ipaccsection, "dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "frulealias", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -755,7 +755,7 @@ int set_x_inteno_cfgobj_address_alias(char *refparam, struct dmctx *ctx, void *d
|
|||
struct uci_section *ipaccsection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(ipaccsection, "dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "rule", section_name(ipaccsection), &dmmap_section);
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
return 0;
|
||||
|
|
@ -771,7 +771,7 @@ int get_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, cha
|
|||
struct uci_section *forwardsection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(forwardsection, "dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "forwardalias", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -781,7 +781,7 @@ int set_port_forwarding_alias(char *refparam, struct dmctx *ctx, void *data, cha
|
|||
struct uci_section *forwardsection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(forwardsection, "dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_firewall", "redirect", section_name(forwardsection), &dmmap_section);
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -325,7 +325,7 @@ int get_x_inteno_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *d
|
|||
struct uci_section *owsd_listensection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(owsd_listensection, "dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
dmuci_get_value_by_section_string(dmmap_section, "olistenalias", value);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -335,7 +335,7 @@ int set_x_inteno_owsd_listenobj_alias(char *refparam, struct dmctx *ctx, void *d
|
|||
struct uci_section *owsd_listensection = (struct uci_section *)data;
|
||||
struct uci_section *dmmap_section;
|
||||
|
||||
get_dmmap_section_of_config_section(owsd_listensection, "dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
switch (action) {
|
||||
case VALUECHECK:
|
||||
return 0;
|
||||
|
|
@ -377,14 +377,14 @@ int delete_owsd_listen_instance(char *refparam, struct dmctx *ctx, void *data, c
|
|||
int found = 0;
|
||||
switch (del_action) {
|
||||
case DEL_INST:
|
||||
get_dmmap_section_of_config_section(owsd_listensection, "dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_owsd", "owsd-listen", section_name(owsd_listensection), &dmmap_section);
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(owsd_listensection, NULL, NULL);
|
||||
break;
|
||||
case DEL_ALL:
|
||||
uci_foreach_sections("owsd", "owsd-listen", s) {
|
||||
if (found != 0){
|
||||
get_dmmap_section_of_config_section(s, "dmmap_owsd", "listen", section_name(s), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_owsd", "listen", section_name(s), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
@ -393,7 +393,7 @@ int delete_owsd_listen_instance(char *refparam, struct dmctx *ctx, void *data, c
|
|||
found++;
|
||||
}
|
||||
if (ss != NULL){
|
||||
get_dmmap_section_of_config_section(ss, "dmmap_owsd", "listen", section_name(ss), &dmmap_section);
|
||||
get_dmmap_section_of_config_section("dmmap_owsd", "listen", section_name(ss), &dmmap_section);
|
||||
if(dmmap_section != NULL)
|
||||
dmuci_delete_by_section(dmmap_section, NULL, NULL);
|
||||
dmuci_delete_by_section(ss, NULL, NULL);
|
||||
|
|
|
|||
|
|
@ -65,6 +65,12 @@ struct package_change {
|
|||
section != NULL; \
|
||||
section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION))
|
||||
|
||||
#define uci_path_foreach_option_eq_safe(path, package, stype, option, val, _tmp, section) \
|
||||
for (section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, NULL, GET_FIRST_SECTION), \
|
||||
_tmp = (section) ? dmuci_walk_section_##path(package, stype, NULL, NULL, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION) : NULL; \
|
||||
section != NULL; \
|
||||
section = _tmp, _tmp = (section) ? dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_EQUAL, NULL, section, GET_NEXT_SECTION) : NULL)
|
||||
|
||||
#define uci_path_foreach_option_cont(path, package, stype, option, val, section) \
|
||||
for (section = dmuci_walk_section_##path(package, stype, option, val, CMP_OPTION_CONTAINING, NULL, NULL, GET_FIRST_SECTION); \
|
||||
section != NULL; \
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue