Refactor set_property's Nameservers.Configuration to a separate function. --- src/connman.h | 2 + src/service.c | 131 +++++++++++++++++++++++++++++++--------------------------- 2 files changed, 73 insertions(+), 60 deletions(-)
diff --git a/src/connman.h b/src/connman.h index d1cb71b..8f64e65 100644 --- a/src/connman.h +++ b/src/connman.h @@ -761,6 +761,8 @@ bool __connman_service_index_is_split_routing(int index); int __connman_service_get_index(struct connman_service *service); bool __connman_service_set_autoconnect(struct connman_service *service, bool autoconnect); +bool __connman_service_set_nameservers_conf(struct connman_service *service, + char **nameservers); void __connman_service_set_hidden(struct connman_service *service); void __connman_service_set_hostname(struct connman_service *service, const char *hostname); diff --git a/src/service.c b/src/service.c index 9027810..0ed3bdb 100644 --- a/src/service.c +++ b/src/service.c @@ -2472,6 +2472,72 @@ bool __connman_service_set_autoconnect(struct connman_service *service, return true; } +static char **remove_empty_strings(char **strv) +{ + int index = 0; + char **iter = strv; + + while (*iter) { + if (**iter) + strv[index++] = *iter; + else + g_free(*iter); + iter++; + } + + strv[index] = NULL; + return strv; +} + +bool __connman_service_set_nameservers_conf(struct connman_service *service, + char **nameservers) +{ + int index; + const char *gw; + char **iter; + + if (!service->nameservers_config && !nameservers) + return false; + + index = __connman_service_get_index(service); + gw = __connman_ipconfig_get_gateway_from_index(index, + CONNMAN_IPCONFIG_TYPE_ALL); + + if (gw && strlen(gw)) + __connman_service_nameserver_del_routes(service, + CONNMAN_IPCONFIG_TYPE_ALL); + + nameserver_remove_all(service, CONNMAN_IPCONFIG_TYPE_ALL); + g_strfreev(service->nameservers_config); + service->nameservers_config = NULL; + + if (nameservers) { + for (iter = nameservers; *iter; iter++) + if (connman_inet_check_ipaddress(*iter) <= 0) + *iter[0] = '\0'; + + nameservers = remove_empty_strings(nameservers); + service->nameservers_config = nameservers; + } + + nameserver_add_all(service, CONNMAN_IPCONFIG_TYPE_ALL); + dns_configuration_changed(service); + + if (__connman_service_is_connected_state(service, + CONNMAN_IPCONFIG_TYPE_IPV4)) + __connman_wispr_start(service, + CONNMAN_IPCONFIG_TYPE_IPV4); + + if (__connman_service_is_connected_state(service, + CONNMAN_IPCONFIG_TYPE_IPV6)) + __connman_wispr_start(service, + CONNMAN_IPCONFIG_TYPE_IPV6); + + service_save(service); + + return true; +} + void __connman_service_set_hidden(struct connman_service *service) { if (!service || service->hidden) @@ -2941,23 +3007,6 @@ static DBusMessage *get_properties(DBusConnection *conn, return reply; } -static char **remove_empty_strings(char **strv) -{ - int index = 0; - char **iter = strv; - - while (*iter) { - if (**iter) - strv[index++] = *iter; - else - g_free(*iter); - iter++; - } - - strv[index] = NULL; - return strv; -} - static int update_proxy_configuration(struct connman_service *service, DBusMessageIter *array) { @@ -3252,8 +3301,7 @@ static DBusMessage *set_property(DBusConnection *conn, } else if (g_str_equal(name, "Nameservers.Configuration")) { DBusMessageIter entry; GString *str; - int index; - const char *gw; + char **nameservers = NULL; if (__connman_provider_is_immutable(service->provider) || service->immutable) @@ -3266,14 +3314,6 @@ static DBusMessage *set_property(DBusConnection *conn, if (!str) return __connman_error_invalid_arguments(msg); - index = __connman_service_get_index(service); - gw = __connman_ipconfig_get_gateway_from_index(index, - CONNMAN_IPCONFIG_TYPE_ALL); - - if (gw && strlen(gw)) - __connman_service_nameserver_del_routes(service, - CONNMAN_IPCONFIG_TYPE_ALL); - dbus_message_iter_recurse(&value, &entry); while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) { @@ -3290,43 +3330,14 @@ static DBusMessage *set_property(DBusConnection *conn, g_string_append(str, val); } - nameserver_remove_all(service, CONNMAN_IPCONFIG_TYPE_ALL); - g_strfreev(service->nameservers_config); - - if (str->len > 0) { - char **nameservers, **iter; - + if (str->len > 0) nameservers = g_strsplit_set(str->str, " ", 0); - for (iter = nameservers; *iter; iter++) - if (connman_inet_check_ipaddress(*iter) <= 0) - *iter[0] = '\0'; - - nameservers = remove_empty_strings(nameservers); - service->nameservers_config = nameservers; - } else { - service->nameservers_config = NULL; - } - g_string_free(str, TRUE); - if (gw && strlen(gw)) - __connman_service_nameserver_add_routes(service, gw); - - nameserver_add_all(service, CONNMAN_IPCONFIG_TYPE_ALL); - dns_configuration_changed(service); - - if (__connman_service_is_connected_state(service, - CONNMAN_IPCONFIG_TYPE_IPV4)) - __connman_wispr_start(service, - CONNMAN_IPCONFIG_TYPE_IPV4); - - if (__connman_service_is_connected_state(service, - CONNMAN_IPCONFIG_TYPE_IPV6)) - __connman_wispr_start(service, - CONNMAN_IPCONFIG_TYPE_IPV6); - - service_save(service); + if (!__connman_service_set_nameservers_conf(service, + nameservers)) + return __connman_error_invalid_arguments(msg); } else if (g_str_equal(name, "Timeservers.Configuration")) { DBusMessageIter entry; GString *str; -- 2.5.3 _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman