diff --git a/src/core/agent.c b/src/core/agent.c index f1ac0c5c1e9aee6b5f17323579f8f2b8cdf30d19..8091f0713db9a456572d9485413a8ac3c325b281 100644 --- a/src/core/agent.c +++ b/src/core/agent.c @@ -2354,7 +2354,7 @@ static void wifi_wps_creds_event_handler(void *c, struct blob_attr *msg) ret = uci_check_wifi_iface("mapagent", ifname, "bk-iface"); if (!ret) { ret = uci_add_wireless_iface_sec("mapagent", ifname, - "bk-iface"); + "bk-iface", NULL); if (!ret) return; } diff --git a/src/core/config.c b/src/core/config.c index 60acf63d64c24251ee3c833cf531dc5336aa7879..85350c234693b77d770f47917390d92579f9a84f 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -52,6 +52,18 @@ int verbose; +char *replace_char(char *str, char find, char replace) +{ + char *current_pos = strchr(str, find); + + while (current_pos) { + *current_pos = replace; + current_pos = strchr(current_pos, find); + } + + return str; +} + int set_value(struct uci_context *ctx, struct uci_package *pkg, struct uci_section *section, const char *key, const char *value, enum uci_option_type type) @@ -549,11 +561,13 @@ static bool get_encryption_value(uint16_t auth_type, uint16_t encryption_type, } bool uci_add_wireless_iface_sec(char *package_name, char *interface_name, - char *section_name) + char *section_type, char *section_name) { struct uci_context *ctx; struct uci_package *pkg; struct uci_section *s; + struct uci_ptr ptr = {0}; + bool ret = false; if (!interface_name || !package_name) return false; @@ -562,33 +576,43 @@ bool uci_add_wireless_iface_sec(char *package_name, char *interface_name, if (!ctx) return false; - if (uci_load(ctx, package_name, &pkg)) { - uci_free_context(ctx); - return false; - } + if (uci_load(ctx, package_name, &pkg)) + goto out_ctx; - if (uci_add_section(ctx, pkg, section_name, &s) == UCI_OK) { - struct uci_ptr ptr = {0}; + ptr.p = pkg; + + if (section_name) { + ptr.section = section_name; + ptr.value = section_type; + ptr.option = NULL; + uci_set(ctx, &ptr); + if (uci_save(ctx, ptr.p) != UCI_OK) + goto out_unload; + } else { + if (uci_add_section(ctx, pkg, section_type, &s) != UCI_OK) + goto out_unload; if (uci_save(ctx, pkg) != UCI_OK) - return false; + goto out_unload; - ptr.value = interface_name; - ptr.package = package_name; ptr.section = s->e.name; - ptr.option = "ifname"; - ptr.target = UCI_TYPE_OPTION; - uci_lookup_ptr(ctx, &ptr, NULL, false); - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - uci_commit(ctx, &pkg, false); } + ptr.value = interface_name; + ptr.option = "ifname"; + ptr.target = UCI_TYPE_OPTION; + uci_lookup_ptr(ctx, &ptr, NULL, false); + + uci_set(ctx, &ptr); + uci_save(ctx, ptr.p); + uci_commit(ctx, &pkg, false); + + ret = true; +out_unload: uci_unload(ctx, pkg); +out_ctx: uci_free_context(ctx); - - return true; + return ret; } static int ubus_call(const char *object, const char *method, @@ -751,7 +775,7 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, agent_section); if (!ret) { ret = uci_add_wireless_iface_sec(UCI_AGENT, interface_name, - agent_section); + agent_section, NULL); if (!ret) return M2_PROCESS_ERROR; } @@ -788,8 +812,12 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, ret = uci_check_wifi_iface(UCI_WIRELESS, interface_name, UCI_WLAN_IFACE); if (!ret) { + char name[32] = {0}; + + snprintf(name, sizeof(name), "%s_ap", interface_name); + replace_char(name, '.', '_'); ret = uci_add_wireless_iface_sec(UCI_WIRELESS, interface_name, - UCI_WLAN_IFACE); + UCI_WLAN_IFACE, name); if (!ret) return M2_PROCESS_ERROR; } diff --git a/src/core/config.h b/src/core/config.h index 79356f4985fd00a5983b85b5e74afacd84fa4769..43e6dedc8d9bb9ddb78aa0d0131077bb540cedc7 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -249,7 +249,7 @@ bool uci_set_wireless_interface_option(char *package_name, char *section_type, char *search_key, char *search_val, char *option, char *value); bool uci_add_wireless_iface_sec(char *package_name, char *interface_name, - char *section_name); + char *section_type, char *section_name); void clean_bk(struct netif_bkcfg *p); int clean_all_bk(struct agent_config *cfg);