From e8304eb7a12cc558e8f61d9f8afb88d87b2abaed Mon Sep 17 00:00:00 2001 From: Omar Kallel Date: Mon, 16 Apr 2018 16:52:51 +0100 Subject: [PATCH] Fixing bugs --- dm/dmcommon.c | 6 ++-- dm/dmcommon.h | 2 +- dm/dmtree/common/voice_services.c | 42 +++++++++++++++---------- dm/dmtree/common/x_inteno_se_buttons.c | 4 +-- dm/dmtree/common/x_inteno_se_ipacccfg.c | 20 ++++++------ dm/dmtree/common/x_inteno_se_owsd.c | 10 +++--- dm/dmuci.h | 6 ++++ 7 files changed, 53 insertions(+), 37 deletions(-) diff --git a/dm/dmcommon.c b/dm/dmcommon.c index 615e890..23c8396 100644 --- a/dm/dmcommon.c +++ b/dm/dmcommon.c @@ -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; } diff --git a/dm/dmcommon.h b/dm/dmcommon.h index a056a80..def5b96 100644 --- a/dm/dmcommon.h +++ b/dm/dmcommon.h @@ -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 diff --git a/dm/dmtree/common/voice_services.c b/dm/dmtree/common/voice_services.c index 8de68f4..12fb45d 100644 --- a/dm/dmtree/common/voice_services.c +++ b/dm/dmtree/common/voice_services.c @@ -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; diff --git a/dm/dmtree/common/x_inteno_se_buttons.c b/dm/dmtree/common/x_inteno_se_buttons.c index 4fa95b1..faa5b3c 100644 --- a/dm/dmtree/common/x_inteno_se_buttons.c +++ b/dm/dmtree/common/x_inteno_se_buttons.c @@ -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; diff --git a/dm/dmtree/common/x_inteno_se_ipacccfg.c b/dm/dmtree/common/x_inteno_se_ipacccfg.c index a68bc20..736449e 100644 --- a/dm/dmtree/common/x_inteno_se_ipacccfg.c +++ b/dm/dmtree/common/x_inteno_se_ipacccfg.c @@ -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; diff --git a/dm/dmtree/common/x_inteno_se_owsd.c b/dm/dmtree/common/x_inteno_se_owsd.c index a0dc189..43a3360 100644 --- a/dm/dmtree/common/x_inteno_se_owsd.c +++ b/dm/dmtree/common/x_inteno_se_owsd.c @@ -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); diff --git a/dm/dmuci.h b/dm/dmuci.h index d390fac..602476f 100644 --- a/dm/dmuci.h +++ b/dm/dmuci.h @@ -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; \