---
include/service.h | 27 +++
src/service.c | 629 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 651 insertions(+), 5 deletions(-)
diff --git a/include/service.h b/include/service.h
index 170cd6c..22ee8df 100644
--- a/include/service.h
+++ b/include/service.h
@@ -22,6 +22,8 @@
#ifndef __CONNMAN_SERVICE_H
#define __CONNMAN_SERVICE_H
+#include <stdint.h>
+#include <glib.h>
#include <connman/types.h>
#ifdef __cplusplus
@@ -84,6 +86,27 @@ enum connman_service_error {
CONNMAN_SERVICE_ERROR_CONNECT_FAILED = 4,
};
+enum connman_service_proxy_method {
+ CONNMAN_SERVICE_PROXY_METHOD_DIRECT = 0,
+ CONNMAN_SERVICE_PROXY_METHOD_AUTO = 1,
+ CONNMAN_SERVICE_PROXY_METHOD_MANUAL = 2,
+ CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG = 3,
+};
+
+struct connman_manual_proxy {
+ char *http;
+ uint16_t http_port;
+ char *https;
+ uint16_t https_port;
+ char *ftp;
+ uint16_t ftp_port;
+ char *socks;
+ uint16_t socks_port;
+ char *rtsp;
+ uint16_t rtsp_port;
+ GSList *ignore;
+};
+
struct connman_service;
struct connman_service *connman_service_create(void);
@@ -93,6 +116,10 @@ void connman_service_unref(struct connman_service *service);
enum connman_service_type connman_service_get_type(struct connman_service
*service);
char *connman_service_get_interface(struct connman_service *service);
+struct connman_manual_proxy *
+connman_service_get_default_proxy(struct connman_service *service,
+ enum connman_service_proxy_method *method);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/service.c b/src/service.c
index eb467a0..08b003b 100644
--- a/src/service.c
+++ b/src/service.c
@@ -117,6 +117,9 @@ struct connman_service {
struct connman_location *location;
struct connman_stats stats;
struct connman_stats stats_roaming;
+
+ enum connman_service_proxy_method proxy_method;
+ struct connman_manual_proxy *manual_proxy;
};
static void append_path(gpointer value, gpointer user_data)
@@ -642,7 +645,490 @@ static void reset_stats(struct connman_service *service)
g_timer_reset(service->stats_roaming.timer);
}
-static struct connman_service *get_default(void)
+static void free_proxy_ignore(GSList *ignore_list)
+{
+ GSList *list;
+ for (list = ignore_list; list; list = list->next) {
+ g_free(list->data);
+ list->data = NULL;
+ }
+
+ g_slist_free(ignore_list);
+}
+
+static void free_proxy(struct connman_manual_proxy *proxy)
+{
+ if (!proxy)
+ return;
+
+ g_free(proxy->http);
+ g_free(proxy->https);
+ g_free(proxy->ftp);
+ g_free(proxy->socks);
+ g_free(proxy->rtsp);
+
+ proxy->http = proxy->https = proxy->ftp = proxy->socks =
+ proxy->rtsp = NULL;
+ proxy->http_port = proxy->https_port = proxy->ftp_port =
+ proxy->socks_port = proxy->rtsp_port = 0;
+
+ free_proxy_ignore(proxy->ignore);
+ proxy->ignore = NULL;
+}
+
+static int update_proxy(char **host, uint16_t *port,
+ char *new_host, uint16_t new_port)
+{
+ int num_proxies = 0;
+
+ if (new_host) {
+ /* Proxy host update requested */
+ if (new_host[0]) {
+ num_proxies++;
+ if (new_port)
+ *port = new_port;
+
+ if (*port) {
+ /* Update proxy only if port is valid */
+ g_free(*host);
+ *host = g_strdup(new_host);
+ }
+ } else {
+ /* Empty proxy, clear settings */
+ g_free(*host);
+ *host = NULL;
+ *port = 0;
+ }
+ }
+
+ if (*host) {
+ /* Update port if new one is valid */
+ num_proxies++;
+
+ if (new_port)
+ *port = new_port;
+ }
+
+ return num_proxies;
+}
+
+static struct connman_manual_proxy *
+update_manual_proxy(struct connman_manual_proxy *proxy,
+ char *proxy_http,
+ uint16_t proxy_http_port,
+ char *proxy_https,
+ uint16_t proxy_https_port,
+ char *proxy_ftp,
+ uint16_t proxy_ftp_port,
+ char *proxy_socks,
+ uint16_t proxy_socks_port,
+ char *proxy_rtsp,
+ uint16_t proxy_rtsp_port,
+ GSList *proxy_ignore)
+{
+ int num_proxies = 0;
+
+ DBG("proxy %p/%s:%d/%s:%d/%s:%d/%s:%d/%s:%d/%p", proxy,
+ proxy_http, proxy_http_port, proxy_https, proxy_https_port,
+ proxy_ftp, proxy_ftp_port, proxy_socks, proxy_socks_port,
+ proxy_rtsp, proxy_rtsp_port, proxy_ignore);
+
+ if (!proxy) {
+ proxy = g_try_new0(struct connman_manual_proxy, 1);
+ if (proxy == NULL)
+ return NULL;
+ }
+
+ num_proxies += update_proxy(&proxy->http, &proxy->http_port,
+ proxy_http, proxy_http_port);
+ num_proxies += update_proxy(&proxy->https, &proxy->https_port,
+ proxy_https, proxy_https_port);
+ num_proxies += update_proxy(&proxy->ftp, &proxy->ftp_port,
+ proxy_ftp, proxy_ftp_port);
+ num_proxies += update_proxy(&proxy->socks, &proxy->socks_port,
+ proxy_socks, proxy_socks_port);
+ num_proxies += update_proxy(&proxy->rtsp, &proxy->rtsp_port,
+ proxy_rtsp, proxy_rtsp_port);
+
+ if (proxy_ignore) {
+ free_proxy_ignore(proxy->ignore);
+ proxy->ignore = NULL;
+ if (proxy_ignore && proxy_ignore->data &&
+ ((char *)(proxy_ignore->data))[0]) {
+ proxy->ignore = proxy_ignore;
+ num_proxies++;
+ }
+ if (!proxy->ignore)
+ free_proxy_ignore(proxy_ignore);
+ }
+
+ DBG("proxy %p, proxies %d", proxy, num_proxies);
+
+ if (num_proxies == 0) {
+ free_proxy(proxy);
+ proxy = NULL;
+ }
+
+ return proxy;
+}
+
+static enum connman_service_proxy_method string2proxymethod(const char *method)
+{
+ if (!g_strcmp0(method, "direct"))
+ return CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
+ else if (!g_strcmp0(method, "auto"))
+ return CONNMAN_SERVICE_PROXY_METHOD_AUTO;
+ else if (!g_strcmp0(method, "manual"))
+ return CONNMAN_SERVICE_PROXY_METHOD_MANUAL;
+ else if (!g_strcmp0(method, "auto-config"))
+ return CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG;
+ else
+ return CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
+}
+
+static const char *proxymethod2string(enum connman_service_proxy_method method)
+{
+ switch(method) {
+ case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
+ return "auto";
+ case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
+ return "manual";
+ case CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG:
+ return "auto-config";
+ }
+ return "direct";
+}
+
+static int set_proxy_configuration(struct connman_service *service,
+ DBusMessageIter *array)
+{
+ enum connman_service_proxy_method method =
CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
+ DBusMessageIter dict;
+ char *proxy_http = NULL;
+ uint16_t proxy_http_port = 0;
+ char *proxy_https = NULL;
+ uint16_t proxy_https_port = 0;
+ char *proxy_ftp = NULL;
+ uint16_t proxy_ftp_port = 0;
+ char *proxy_socks = NULL;
+ uint16_t proxy_socks_port = 0;
+ char *proxy_rtsp = NULL;
+ uint16_t proxy_rtsp_port = 0;
+ GSList *proxy_ignore = NULL;
+ char *url = NULL;
+
+ DBG("service %p", service);
+
+ if (dbus_message_iter_get_arg_type(array) != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(array, &dict);
+
+ while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) {
+ DBusMessageIter entry, variant;
+ const char *key;
+ int type;
+
+ dbus_message_iter_recurse(&dict, &entry);
+
+ if (dbus_message_iter_get_arg_type(&entry) != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&entry, &key);
+ dbus_message_iter_next(&entry);
+
+ dbus_message_iter_recurse(&entry, &variant);
+ type = dbus_message_iter_get_arg_type(&variant);
+
+ if (g_str_equal(key, "Method") == TRUE) {
+ const char *str;
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &str);
+ method = string2proxymethod(str);
+ } else if (g_str_equal(key, "URL") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &url);
+ } else if (g_str_equal(key, "Http") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_http);
+ } else if (g_str_equal(key, "HttpPort") == TRUE) {
+ if (type != DBUS_TYPE_UINT16)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_http_port);
+ } else if (g_str_equal(key, "Https") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_https);
+ } else if (g_str_equal(key, "HttpsPort") == TRUE) {
+ if (type != DBUS_TYPE_UINT16)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant,
&proxy_https_port);
+ } else if (g_str_equal(key, "Ftp") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_ftp);
+ } else if (g_str_equal(key, "FtpPort") == TRUE) {
+ if (type != DBUS_TYPE_UINT16)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_ftp_port);
+ } else if (g_str_equal(key, "Socks") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_socks);
+ } else if (g_str_equal(key, "SocksPort") == TRUE) {
+ if (type != DBUS_TYPE_UINT16)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant,
&proxy_socks_port);
+ } else if (g_str_equal(key, "Rtsp") == TRUE) {
+ if (type != DBUS_TYPE_STRING)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_rtsp);
+ } else if (g_str_equal(key, "RtspPort") == TRUE) {
+ if (type != DBUS_TYPE_UINT16)
+ return -EINVAL;
+
+ dbus_message_iter_get_basic(&variant, &proxy_rtsp_port);
+ } else if (g_str_equal(key, "Ignore") == TRUE) {
+ DBusMessageIter str_array;
+
+ if (type != DBUS_TYPE_ARRAY)
+ return -EINVAL;
+
+ dbus_message_iter_recurse(&variant, &str_array);
+
+ while (dbus_message_iter_get_arg_type(&str_array) ==
+ DBUS_TYPE_STRING) {
+ char *val = NULL;
+ dbus_message_iter_get_basic(&str_array, &val);
+ proxy_ignore = g_slist_append(proxy_ignore,
+ g_strdup(val));
+ dbus_message_iter_next(&str_array);
+ }
+ }
+ dbus_message_iter_next(&dict);
+ }
+
+ DBG("method %d", method);
+
+ switch (method) {
+ case CONNMAN_SERVICE_PROXY_METHOD_MANUAL:
+
+ service->manual_proxy =
+ update_manual_proxy(service->manual_proxy,
+ proxy_http,
+ proxy_http_port,
+ proxy_https,
+ proxy_https_port,
+ proxy_ftp,
+ proxy_ftp_port,
+ proxy_socks,
+ proxy_socks_port,
+ proxy_rtsp,
+ proxy_rtsp_port,
+ proxy_ignore);
+
+ if (service->manual_proxy)
+ service->proxy_method =
CONNMAN_SERVICE_PROXY_METHOD_MANUAL;
+ else
+ service->proxy_method =
CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
+
+ break;
+
+ case CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG:
+ service->proxy_method =
CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG;
+ __connman_ipconfig_set_proxy_autoconfig(service->ipconfig,
+ url);
+ break;
+
+ case CONNMAN_SERVICE_PROXY_METHOD_DIRECT:
+ case CONNMAN_SERVICE_PROXY_METHOD_AUTO:
+ default:
+ service->proxy_method = CONNMAN_SERVICE_PROXY_METHOD_DIRECT;
+ break;
+ }
+
+ return 0;
+}
+
+static void append_ignore_list(DBusMessageIter *iter, void *user_data)
+{
+ GSList *list, *proxy_ignore = user_data;
+ int i;
+
+ for (list = proxy_ignore; list; list = list->next)
+ dbus_message_iter_append_basic(iter,
+ DBUS_TYPE_STRING, &list->data);
+}
+
+static int proxy_load(struct connman_service *service, GKeyFile *keyfile)
+{
+ const char *str;
+ enum connman_service_proxy_method method;
+
+ str = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.method", NULL);
+
+ service->proxy_method = string2proxymethod(str);
+ g_free(str);
+
+ if (service->proxy_method == CONNMAN_SERVICE_PROXY_METHOD_MANUAL) {
+ char *http, *https, *ftp, *socks, *rtsp, **ignore;
+ uint16_t http_port, https_port, ftp_port, socks_port,
+ rtsp_port;
+ gsize len;
+ GSList *ignore_list = NULL;
+
+ http = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.http", NULL);
+ http_port = g_key_file_get_integer(keyfile, service->identifier,
+ "Proxy.http_port", NULL);
+
+ https = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.https", NULL);
+ https_port = g_key_file_get_integer(keyfile,
service->identifier,
+ "Proxy.https_port", NULL);
+
+ ftp = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.ftp", NULL);
+ ftp_port = g_key_file_get_integer(keyfile, service->identifier,
+ "Proxy.ftp_port", NULL);
+
+ socks = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.socks", NULL);
+ socks_port = g_key_file_get_integer(keyfile,
service->identifier,
+ "Proxy.socks_port", NULL);
+
+ rtsp = g_key_file_get_string(keyfile, service->identifier,
+ "Proxy.rtsp", NULL);
+ rtsp_port = g_key_file_get_integer(keyfile, service->identifier,
+ "Proxy.rtsp_port", NULL);
+
+ ignore = g_key_file_get_string_list(keyfile,
service->identifier,
+ "Proxy.ignore", &len, NULL);
+ if (ignore && len>0) {
+ int i;
+ for (i=0; i<len; i++)
+ ignore_list = g_slist_append(ignore_list,
+ ignore[i]);
+ g_free(ignore);
+ }
+
+ service->manual_proxy =
+ update_manual_proxy(service->manual_proxy,
+ http, http_port,
+ https, https_port,
+ ftp, ftp_port,
+ socks, socks_port,
+ rtsp, rtsp_port,
+ ignore_list);
+ }
+
+ return 0;
+}
+
+static void proxy_save_entry(GKeyFile *keyfile, char *identifier,
+ char **host, uint16_t *port,
+ char *host_key, char *port_key)
+{
+ if (host && *host && (*host)[0]) {
+ g_key_file_set_string(keyfile, identifier, host_key, *host);
+ g_key_file_set_integer(keyfile, identifier, port_key, *port);
+ } else {
+ g_key_file_remove_key(keyfile, identifier, host_key, NULL);
+ g_key_file_remove_key(keyfile, identifier, port_key, NULL);
+
+ if (host) {
+ g_free(*host);
+ *host = NULL;
+ if (port)
+ *port = 0;
+ }
+ }
+}
+
+static int proxy_save(struct connman_service *service, GKeyFile *keyfile)
+{
+ struct connman_manual_proxy *proxy = service->manual_proxy;
+
+ DBG("service %p identifier %s method %d", service,
+ service->identifier, service->proxy_method);
+
+ g_key_file_set_string(keyfile, service->identifier, "Proxy.method",
+ proxymethod2string(service->proxy_method));
+
+ proxy_save_entry(keyfile, service->identifier,
+ proxy ? &proxy->http : NULL,
+ proxy ? &proxy->http_port : NULL,
+ "Proxy.http", "Proxy.http_port");
+
+ proxy_save_entry(keyfile, service->identifier,
+ proxy ? &proxy->https : NULL,
+ proxy ? &proxy->https_port : NULL,
+ "Proxy.https", "Proxy.https_port");
+
+ proxy_save_entry(keyfile, service->identifier,
+ proxy ? &proxy->ftp : NULL,
+ proxy ? &proxy->ftp_port : NULL,
+ "Proxy.ftp", "Proxy.ftp_port");
+
+ proxy_save_entry(keyfile, service->identifier,
+ proxy ? &proxy->socks : NULL,
+ proxy ? &proxy->socks_port : NULL,
+ "Proxy.socks", "Proxy.socks_port");
+
+ proxy_save_entry(keyfile, service->identifier,
+ proxy ? &proxy->rtsp : NULL,
+ proxy ? &proxy->rtsp_port : NULL,
+ "Proxy.rtsp", "Proxy.rtsp_port");
+
+ if (proxy && proxy->ignore) {
+ GSList *lst;
+ char **array = 0;
+ int num = 0;
+
+ for (lst = proxy->ignore; lst; lst = lst->next) {
+ array = (char **)g_realloc(array,
+ (num + 1) * sizeof(char *));
+ array[num++] = lst->data;
+ }
+
+ if (num)
+ g_key_file_set_string_list(keyfile,
+ service->identifier,
+ "Proxy.ignore",
+ (const char **)array,
+ num);
+ else {
+ g_key_file_remove_key(keyfile,
+ service->identifier,
+ "Proxy.ignore",
+ NULL);
+ free_proxy_ignore(proxy->ignore);
+ proxy->ignore = NULL;
+ }
+ g_free(array);
+ } else
+ g_key_file_remove_key(keyfile, service->identifier,
+ "Proxy.ignore", NULL);
+
+ return 0;
+}
+
+static struct connman_service *get_default_service()
{
struct connman_service *service;
GSequenceIter *iter;
@@ -654,6 +1140,18 @@ static struct connman_service *get_default(void)
service = g_sequence_get(iter);
+ return service;
+}
+
+static struct connman_service *get_default()
+{
+ struct connman_service *service;
+
+ service = get_default_service();
+
+ if (!service)
+ return NULL;
+
if (is_connected(service) == FALSE)
return NULL;
@@ -961,12 +1459,86 @@ static void append_domainconfig(DBusMessageIter *iter,
void *user_data)
static void append_proxy(DBusMessageIter *iter, void *user_data)
{
struct connman_service *service = user_data;
+ const char *method = "direct";
- if (is_connected(service) == FALSE)
- return;
+ if (service->proxy_method ==
+ CONNMAN_SERVICE_PROXY_METHOD_AUTO_CONFIG) {
- if (service->ipconfig != NULL)
- __connman_ipconfig_append_proxy(service->ipconfig, iter);
+ method = "auto-config";
+
+ if (service->ipconfig)
+ __connman_ipconfig_append_proxy(service->ipconfig,
+ iter);
+
+ } else if (service->proxy_method ==
+ CONNMAN_SERVICE_PROXY_METHOD_MANUAL) {
+
+ struct connman_manual_proxy *proxy = service->manual_proxy;
+ if (proxy == NULL)
+ goto done;
+
+ method = "manual";
+
+ if (proxy->http) {
+ connman_dbus_dict_append_basic(iter, "Http",
+ DBUS_TYPE_STRING,
+ &proxy->http);
+ connman_dbus_dict_append_basic(iter, "HttpPort",
+ DBUS_TYPE_UINT16,
+ &proxy->http_port);
+ }
+
+ if (proxy->https) {
+ connman_dbus_dict_append_basic(iter, "Https",
+ DBUS_TYPE_STRING,
+ &proxy->https);
+ connman_dbus_dict_append_basic(iter, "HttpsPort",
+ DBUS_TYPE_UINT16,
+ &proxy->https_port);
+ }
+
+ if (proxy->ftp) {
+ connman_dbus_dict_append_basic(iter, "Ftp",
+ DBUS_TYPE_STRING,
+ &proxy->ftp);
+ connman_dbus_dict_append_basic(iter, "FtpPort",
+ DBUS_TYPE_UINT16,
+ &proxy->ftp_port);
+ }
+
+ if (proxy->socks) {
+ connman_dbus_dict_append_basic(iter, "Socks",
+ DBUS_TYPE_STRING,
+ &proxy->socks);
+ connman_dbus_dict_append_basic(iter, "SocksPort",
+ DBUS_TYPE_UINT16,
+ &proxy->socks_port);
+ }
+
+ if (proxy->rtsp) {
+ connman_dbus_dict_append_basic(iter, "Rtsp",
+ DBUS_TYPE_STRING,
+ &proxy->rtsp);
+ connman_dbus_dict_append_basic(iter, "RtspPort",
+ DBUS_TYPE_UINT16,
+ &proxy->rtsp_port);
+ }
+
+ if (proxy->ignore)
+ connman_dbus_dict_append_array(iter, "Ignore",
+ DBUS_TYPE_STRING,
+ append_ignore_list,
+ proxy->ignore);
+ }
+
+done:
+ connman_dbus_dict_append_basic(iter, "Method",
+ DBUS_TYPE_STRING, &method);
+}
+
+static void append_proxyconfig(DBusMessageIter *iter, void *user_data)
+{
+ append_proxy(iter, user_data);
}
static void append_provider(DBusMessageIter *iter, void *user_data)
@@ -1051,6 +1623,14 @@ static void proxy_changed(struct connman_service
*service)
append_proxy, service);
}
+static void proxy_configuration_changed(struct connman_service *service)
+{
+ connman_dbus_property_changed_dict(service->path,
+ CONNMAN_SERVICE_INTERFACE,
+ "Proxy.Configuration",
+ append_proxyconfig, service);
+}
+
static void stats_append(DBusMessageIter *dict,
struct connman_stats *stats,
connman_bool_t append_all)
@@ -1285,6 +1865,9 @@ static void append_properties(DBusMessageIter *dict,
dbus_bool_t limited,
connman_dbus_dict_append_dict(dict, "Proxy", append_proxy, service);
+ connman_dbus_dict_append_dict(dict, "Proxy.Configuration",
+ append_proxyconfig, service);
+
connman_dbus_dict_append_dict(dict, "Provider", append_provider,
service);
}
@@ -1663,6 +2246,13 @@ static DBusMessage *set_property(DBusConnection *conn,
service->ipconfig);
__connman_storage_save_service(service);
+ } else if (g_str_equal(name, "Proxy.Configuration") == TRUE) {
+
+ if (!set_proxy_configuration(service, &value)) {
+ proxy_configuration_changed(service);
+ __connman_storage_save_service(service);
+ }
+
} else
return __connman_error_invalid_property(msg);
@@ -2186,6 +2776,9 @@ static void service_free(gpointer user_data)
g_free(service->private_key_passphrase);
g_free(service->phase2);
+ free_proxy(service->manual_proxy);
+ g_free(service->manual_proxy);
+
if (service->stats.timer != NULL)
g_timer_destroy(service->stats.timer);
if (service->stats_roaming.timer != NULL)
@@ -2398,6 +2991,30 @@ char *connman_service_get_interface(struct
connman_service *service)
}
/**
+ * connman_service_get_active_proxy:
+ * @service: service structure
+ * @method: current proxy method for this service
+ *
+ * Get the proxy settings for currently default service
+ */
+struct connman_manual_proxy *
+connman_service_get_default_proxy(struct connman_service *service,
+ enum connman_service_proxy_method *method)
+{
+ if (!service)
+ return NULL;
+
+ if (service == get_default_service()) {
+ if (method)
+ *method = service->proxy_method;
+
+ return service->manual_proxy;
+ }
+
+ return NULL;
+}
+
+/**
* connman_service_get_network:
* @service: service structure
*
@@ -3927,6 +4544,7 @@ static int service_load(struct connman_service *service)
}
stats_load(service, keyfile);
+ proxy_load(service, keyfile);
done:
g_key_file_free(keyfile);
@@ -4089,6 +4707,7 @@ update:
"Domains", NULL);
stats_save(service, keyfile);
+ proxy_save(service, keyfile);
data = g_key_file_to_data(keyfile, &length, NULL);
--
1.7.0.4
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman