Store PAC URL configuration in DHCP and provider elements
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 4 Jan 2010 21:36:08 +0000 (13:36 -0800)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 4 Jan 2010 21:36:08 +0000 (13:36 -0800)
include/element.h
include/property.h
src/dhcp.c
src/element.c
src/provider.c

index b6491cd..1d9aa69 100644 (file)
@@ -107,6 +107,7 @@ struct connman_element {
                gchar *broadcast;
                gchar *nameserver;
                gchar *timeserver;
+               gchar *pac;
        } ipv4;
 };
 
index a0fa6a0..c7f2a7b 100644 (file)
@@ -47,6 +47,7 @@ enum connman_property_id {
        CONNMAN_PROPERTY_ID_IPV4_BROADCAST,
        CONNMAN_PROPERTY_ID_IPV4_NAMESERVER,
        CONNMAN_PROPERTY_ID_IPV4_TIMESERVER,
+       CONNMAN_PROPERTY_ID_IPV4_PAC,
 };
 
 enum connman_property_type {
index 0e890c2..eb6d52c 100644 (file)
@@ -123,6 +123,8 @@ void connman_dhcp_set_value(struct connman_dhcp *dhcp,
                dhcp->element->ipv4.timeserver = g_strdup(value);
        } else if (g_strcmp0(key, "MTU") == 0) {
        } else if (g_strcmp0(key, "PAC") == 0) {
+               g_free(dhcp->element->ipv4.pac);
+               dhcp->element->ipv4.pac = g_strdup(value);
        }
 }
 
index f81b0b3..e0c4c00 100644 (file)
@@ -683,6 +683,7 @@ void connman_element_unref(struct connman_element *element)
                g_free(element->ipv4.broadcast);
                g_free(element->ipv4.nameserver);
                g_free(element->ipv4.timeserver);
+               g_free(element->ipv4.pac);
                g_free(element->devname);
                g_free(element->path);
                g_free(element->name);
@@ -876,6 +877,14 @@ int connman_element_get_value(struct connman_element *element,
                *((char **) value) = element->ipv4.timeserver;
                __connman_element_unlock(element);
                break;
+       case CONNMAN_PROPERTY_ID_IPV4_PAC:
+               if (element->ipv4.pac == NULL)
+                       return connman_element_get_value(element->parent,
+                                                               id, value);
+               __connman_element_lock(element);
+               *((char **) value) = element->ipv4.pac;
+               __connman_element_unlock(element);
+               break;
        default:
                return -EINVAL;
        }
@@ -1099,7 +1108,7 @@ int __connman_element_append_ipv4(struct connman_element *element,
        const char *method = NULL;
        const char *address = NULL, *netmask = NULL, *gateway = NULL;
        const char *broadcast = NULL, *nameserver = NULL;
-       const char *timeserver = NULL;
+       const char *timeserver = NULL, *pac = NULL;
 
        connman_element_get_value(element,
                                CONNMAN_PROPERTY_ID_IPV4_METHOD, &method);
@@ -1116,6 +1125,8 @@ int __connman_element_append_ipv4(struct connman_element *element,
                        CONNMAN_PROPERTY_ID_IPV4_NAMESERVER, &nameserver);
        connman_element_get_value(element,
                        CONNMAN_PROPERTY_ID_IPV4_TIMESERVER, &timeserver);
+       connman_element_get_value(element,
+                       CONNMAN_PROPERTY_ID_IPV4_PAC, &pac);
 
        if (method != NULL)
                connman_dbus_dict_append_basic(dict, "IPv4.Method",
@@ -1145,6 +1156,10 @@ int __connman_element_append_ipv4(struct connman_element *element,
                connman_dbus_dict_append_basic(dict, "IPv4.Timeserver",
                                                DBUS_TYPE_STRING, &timeserver);
 
+       if (pac != NULL)
+               connman_dbus_dict_append_basic(dict, "IPv4.PAC",
+                                               DBUS_TYPE_STRING, &pac);
+
        return 0;
 }
 
@@ -1242,7 +1257,19 @@ int __connman_element_set_ipv4(struct connman_element *element,
                dbus_message_iter_get_basic(value, &timeserver);
 
                g_free(element->ipv4.timeserver);
-               element->ipv4.nameserver = g_strdup(timeserver);
+               element->ipv4.timeserver = g_strdup(timeserver);
+
+               connman_element_update(element);
+       } else if (g_str_equal(name, "IPv4.PAC") == TRUE) {
+               const char *pac;
+
+               if (type != DBUS_TYPE_STRING)
+                       return -EINVAL;
+
+               dbus_message_iter_get_basic(value, &pac);
+
+               g_free(element->ipv4.pac);
+               element->ipv4.pac = g_strdup(pac);
 
                connman_element_update(element);
        }
index e33f02e..81c7b4d 100644 (file)
@@ -43,7 +43,6 @@ struct connman_provider {
        enum connman_provider_error error;
        char *name;
        char *type;
-       char *pac;
        char *dns;
        char *domain;
        DBusMessage *pending;
@@ -133,6 +132,9 @@ static void connman_provider_setup_vpn_ipv4(struct connman_provider *provider,
        g_free(element->ipv4.broadcast);
        element->ipv4.broadcast = g_strdup(provider->element.ipv4.broadcast);
 
+       g_free(element->ipv4.pac);
+       element->ipv4.pac = g_strdup(provider->element.ipv4.pac);
+
        DBG("VPN exist");
 }
 
@@ -361,11 +363,13 @@ static int connman_provider_connect(struct connman_provider *provider)
        g_free(provider->element.ipv4.netmask);
        g_free(provider->element.ipv4.gateway);
        g_free(provider->element.ipv4.broadcast);
+       g_free(provider->element.ipv4.pac);
 
        provider->element.ipv4.address = NULL;
        provider->element.ipv4.netmask = NULL;
        provider->element.ipv4.gateway = NULL;
        provider->element.ipv4.broadcast = NULL;
+       provider->element.ipv4.pac = NULL;
 
        if (provider->driver != NULL && provider->driver->connect != NULL)
                err = provider->driver->connect(provider);
@@ -539,7 +543,6 @@ static void provider_free(gpointer user_data)
        g_free(provider->domain);
        g_free(provider->identifier);
        g_free(provider->dns);
-       g_free(provider->pac);
 }
 
 static void unregister_provider(gpointer data)
@@ -576,10 +579,10 @@ static void __connman_provider_initialize(struct connman_provider *provider)
        provider->element.ipv4.netmask = NULL;
        provider->element.ipv4.gateway = NULL;
        provider->element.ipv4.broadcast = NULL;
+       provider->element.ipv4.pac = NULL;
 
        provider->name = NULL;
        provider->type = NULL;
-       provider->pac = NULL;
        provider->dns = NULL;
        provider->domain = NULL;
        provider->identifier = NULL;
@@ -797,8 +800,8 @@ int connman_provider_set_string(struct connman_provider *provider,
                g_free(provider->element.ipv4.netmask);
                provider->element.ipv4.netmask = g_strdup(value);
        } else if (g_str_equal(key, "PAC") == TRUE) {
-               g_free(provider->pac);
-               provider->pac = g_strdup(value);
+               g_free(provider->element.ipv4.pac);
+               provider->element.ipv4.pac = g_strdup(value);
        } else if (g_str_equal(key, "DNS") == TRUE) {
                g_free(provider->dns);
                provider->dns = g_strdup(value);