Add support for setting per service domain list
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 13 May 2010 10:39:03 +0000 (12:39 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 13 May 2010 10:41:51 +0000 (12:41 +0200)
Makefile.am
src/service.c
test/list-services
test/monitor-services
test/set-domains [new file with mode: 0755]

index 8a7aca9..6be9e48 100644 (file)
@@ -143,7 +143,7 @@ test_scripts = test/get-state test/list-profiles test/list-services \
                test/test-manager test/test-connman test/monitor-connman \
                test/connect-vpn test/disconnect-vpn test/list-providers \
                test/monitor-manager test/test-counter test/set-ip-method \
-               test/set-nameservers
+               test/set-nameservers test/set-domains
 
 if TEST
 testdir = $(pkglibdir)/test
index d5105c3..386fe55 100644 (file)
@@ -67,6 +67,7 @@ struct connman_service {
        struct connman_network *network;
        char **nameservers;
        char *nameserver;
+       char **domains;
        /* 802.1x settings from the config files */
        char *eap;
        char *identity;
@@ -592,6 +593,27 @@ static void append_dnsconfig(DBusMessageIter *iter, void *user_data)
                                DBUS_TYPE_STRING, &service->nameservers[i]);
 }
 
+static void append_domain(DBusMessageIter *iter, void *user_data)
+{
+       struct connman_service *service = user_data;
+
+       if (is_connected(service) == FALSE)
+               return;
+}
+
+static void append_domainconfig(DBusMessageIter *iter, void *user_data)
+{
+       struct connman_service *service = user_data;
+       int i;
+
+       if (service->domains == NULL)
+               return;
+
+       for (i = 0; service->domains[i]; i++)
+               dbus_message_iter_append_basic(iter,
+                               DBUS_TYPE_STRING, &service->domains[i]);
+}
+
 static void append_proxy(DBusMessageIter *iter, void *user_data)
 {
        struct connman_service *service = user_data;
@@ -639,6 +661,14 @@ static void dns_configuration_changed(struct connman_service *service)
        dns_changed(service);
 }
 
+static void domain_configuration_changed(struct connman_service *service)
+{
+       connman_dbus_property_changed_array(service->path,
+                               CONNMAN_SERVICE_INTERFACE,
+                               "Domains.Configuration",
+                               DBUS_TYPE_STRING, append_domainconfig, service);
+}
+
 static DBusMessage *get_properties(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data)
 {
@@ -790,6 +820,12 @@ static DBusMessage *get_properties(DBusConnection *conn,
        connman_dbus_dict_append_array(&dict, "Nameservers.Configuration",
                                DBUS_TYPE_STRING, append_dnsconfig, service);
 
+       connman_dbus_dict_append_array(&dict, "Domains",
+                               DBUS_TYPE_STRING, append_domain, service);
+
+       connman_dbus_dict_append_array(&dict, "Domains.Configuration",
+                               DBUS_TYPE_STRING, append_domainconfig, service);
+
        connman_dbus_dict_append_dict(&dict, "Proxy", append_proxy, service);
 
        connman_dbus_dict_close(&array, &dict);
@@ -956,6 +992,42 @@ static DBusMessage *set_property(DBusConnection *conn,
                dns_configuration_changed(service);
 
                __connman_storage_save_service(service);
+       } else if (g_str_equal(name, "Domains.Configuration") == TRUE) {
+               DBusMessageIter entry;
+               GString *str;
+
+               if (type != DBUS_TYPE_ARRAY)
+                       return __connman_error_invalid_arguments(msg);
+
+               str = g_string_new(NULL);
+               if (str == NULL)
+                       return __connman_error_invalid_arguments(msg);
+
+               dbus_message_iter_recurse(&value, &entry);
+
+               while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
+                       const char *val;
+                       dbus_message_iter_get_basic(&entry, &val);
+                       dbus_message_iter_next(&entry);
+                       if (str->len > 0)
+                               g_string_append_printf(str, " %s", val);
+                       else
+                               g_string_append(str, val);
+               }
+
+               g_strfreev(service->domains);
+
+               if (str->len > 0)
+                       service->domains = g_strsplit_set(str->str, " ", 0);
+               else
+                       service->domains = NULL;
+
+               g_string_free(str, TRUE);
+
+               //update_domains(service);
+               domain_configuration_changed(service);
+
+               __connman_storage_save_service(service);
        } else if (g_str_equal(name, "IPv4.Configuration") == TRUE) {
                int err;
 
@@ -2910,6 +2982,13 @@ static int service_load(struct connman_service *service)
                service->nameservers = NULL;
        }
 
+       service->domains = g_key_file_get_string_list(keyfile,
+                       service->identifier, "Domains", &length, NULL);
+       if (service->domains != NULL && length == 0) {
+               g_strfreev(service->domains);
+               service->domains = NULL;
+       }
+
 done:
        g_key_file_free(keyfile);
 
@@ -3053,6 +3132,16 @@ update:
                g_key_file_remove_key(keyfile, service->identifier,
                                                        "Nameservers", NULL);
 
+       if (service->domains != NULL) {
+               guint len = g_strv_length(service->domains);
+
+               g_key_file_set_string_list(keyfile, service->identifier,
+                                                               "Domains",
+                               (const gchar **) service->domains, len);
+       } else
+               g_key_file_remove_key(keyfile, service->identifier,
+                                                       "Domains", NULL);
+
        data = g_key_file_to_data(keyfile, &length, NULL);
 
        if (g_file_set_contents(pathname, data, length, NULL) == FALSE)
index e747656..abe8420 100755 (executable)
@@ -35,7 +35,8 @@ for path in properties["Services"]:
        for key in properties.keys():
                if key in ["IPv4", "IPv4.Configuration", "Proxy", "Ethernet"]:
                        val = extract_values(properties[key])
-               elif key in ["Nameservers", "Nameservers.Configuration"]:
+               elif key in ["Nameservers", "Nameservers.Configuration",
+                                       "Domains", "Domains.Configuration"]:
                        val = extract_list(properties[key])
                elif key in ["Favorite", "Immutable", "AutoConnect",
                                "SetupRequired", "PassphraseRequired"]:
index 5657444..93fd758 100755 (executable)
@@ -30,7 +30,8 @@ def property_changed(name, value, path):
                val = val + " ]"
        elif name in ["IPv4", "IPv4.Configuration", "Proxy", "Ethernet"]:
                val = extract_values(value)
-       elif name in ["Nameservers", "Nameservers.Configuration"]:
+       elif name in ["Nameservers", "Nameservers.Configuration",
+                                       "Domains", "Domains.Configuration"]:
                val = extract_list(value)
        elif name in ["Strength", "Priority"]:
                val = int(value)
diff --git a/test/set-domains b/test/set-domains
new file mode 100755 (executable)
index 0000000..c45034c
--- /dev/null
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+import sys
+import dbus
+
+if (len(sys.argv) < 2):
+       print "Usage: %s <service> [domain*]" % (sys.argv[0])
+       sys.exit(1)
+
+bus = dbus.SystemBus()
+path = "/profile/default/" + sys.argv[1]
+service = dbus.Interface(bus.get_object('org.moblin.connman', path),
+                                       'org.moblin.connman.Service')
+
+properties = service.GetProperties()
+
+print "Setting domains to %s" % (sys.argv[2:])
+
+service.SetProperty("Domains.Configuration", 
+       dbus.Array(sys.argv[2:], signature=dbus.Signature('s')))