diff options
author | Jukka Rissanen <jukka.rissanen@linux.intel.com> | 2012-11-30 11:30:35 +0200 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-11-30 15:01:18 +0200 |
commit | a4c8f6b74733d0cf1d8c730aabd2ff5a7be0c124 (patch) | |
tree | 482caff971b44e952ae053cbd40e02c346c28d55 /vpn/plugins | |
parent | 2e9c60a0539679ac982282ebe9fc9c9cc43e492c (diff) | |
download | connman-a4c8f6b74733d0cf1d8c730aabd2ff5a7be0c124.tar.gz connman-a4c8f6b74733d0cf1d8c730aabd2ff5a7be0c124.tar.bz2 connman-a4c8f6b74733d0cf1d8c730aabd2ff5a7be0c124.zip |
vpn: Add initial support for async connect
Needed for agent VPN support.
Diffstat (limited to 'vpn/plugins')
-rw-r--r-- | vpn/plugins/l2tp.c | 27 | ||||
-rw-r--r-- | vpn/plugins/openconnect.c | 23 | ||||
-rw-r--r-- | vpn/plugins/openvpn.c | 14 | ||||
-rw-r--r-- | vpn/plugins/pptp.c | 24 | ||||
-rw-r--r-- | vpn/plugins/vpn.c | 5 | ||||
-rw-r--r-- | vpn/plugins/vpn.h | 3 | ||||
-rw-r--r-- | vpn/plugins/vpnc.c | 18 |
7 files changed, 80 insertions, 34 deletions
diff --git a/vpn/plugins/l2tp.c b/vpn/plugins/l2tp.c index 4cb4b6a9..05341d5f 100644 --- a/vpn/plugins/l2tp.c +++ b/vpn/plugins/l2tp.c @@ -447,7 +447,8 @@ static void l2tp_died(struct connman_task *task, int exit_code, void *user_data) } static int l2tp_connect(struct vpn_provider *provider, - struct connman_task *task, const char *if_name) + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data) { const char *host; char *l2tp_name, *pppd_name; @@ -455,13 +456,16 @@ static int l2tp_connect(struct vpn_provider *provider, int err; if (connman_task_set_notify(task, "getsec", - l2tp_get_sec, provider)) - return -ENOMEM; + l2tp_get_sec, provider) != 0) { + err = -ENOMEM; + goto done; + } host = vpn_provider_get_string(provider, "Host"); if (host == NULL) { connman_error("Host not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } l2tp_name = g_strdup_printf("/var/run/connman/connman-xl2tpd.conf"); @@ -470,7 +474,8 @@ static int l2tp_connect(struct vpn_provider *provider, if (l2tp_fd < 0) { g_free(l2tp_name); connman_error("Error writing l2tp config"); - return -EIO; + err = -EIO; + goto done; } pppd_name = g_strdup_printf("/var/run/connman/connman-ppp-option.conf"); @@ -481,7 +486,8 @@ static int l2tp_connect(struct vpn_provider *provider, g_free(l2tp_name); g_free(pppd_name); close(l2tp_fd); - return -EIO; + err = -EIO; + goto done; } l2tp_write_config(provider, pppd_name, l2tp_fd); @@ -498,10 +504,15 @@ static int l2tp_connect(struct vpn_provider *provider, NULL, NULL, NULL); if (err < 0) { connman_error("l2tp failed to start"); - return -EIO; + err = -EIO; + goto done; } - return 0; +done: + if (cb != NULL) + cb(provider, user_data, err); + + return err; } static int l2tp_error_code(int exit_code) diff --git a/vpn/plugins/openconnect.c b/vpn/plugins/openconnect.c index 0f54108c..143e175c 100644 --- a/vpn/plugins/openconnect.c +++ b/vpn/plugins/openconnect.c @@ -161,21 +161,24 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider) } static int oc_connect(struct vpn_provider *provider, - struct connman_task *task, const char *if_name) + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data) { const char *vpnhost, *vpncookie, *cafile, *certsha1, *mtu; - int fd, err; + int fd, err = 0; vpnhost = vpn_provider_get_string(provider, "Host"); if (!vpnhost) { connman_error("Host not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } vpncookie = vpn_provider_get_string(provider, "OpenConnect.Cookie"); if (!vpncookie) { connman_error("OpenConnect.Cookie not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } certsha1 = vpn_provider_get_string(provider, @@ -207,17 +210,23 @@ static int oc_connect(struct vpn_provider *provider, &fd, NULL, NULL); if (err < 0) { connman_error("openconnect failed to start"); - return -EIO; + err = -EIO; + goto done; } if (write(fd, vpncookie, strlen(vpncookie)) != (ssize_t)strlen(vpncookie) || write(fd, "\n", 1) != 1) { connman_error("openconnect failed to take cookie on stdin"); - return -EIO; + err = -EIO; + goto done; } - return 0; +done: + if (cb != NULL) + cb(provider, user_data, err); + + return err; } static int oc_save(struct vpn_provider *provider, GKeyFile *keyfile) diff --git a/vpn/plugins/openvpn.c b/vpn/plugins/openvpn.c index 84583cdd..87549ca0 100644 --- a/vpn/plugins/openvpn.c +++ b/vpn/plugins/openvpn.c @@ -229,10 +229,11 @@ static int task_append_config_data(struct vpn_provider *provider, } static int ov_connect(struct vpn_provider *provider, - struct connman_task *task, const char *if_name) + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data) { const char *option; - int err, fd; + int err = 0, fd; option = vpn_provider_get_string(provider, "Host"); if (option == NULL) { @@ -304,10 +305,15 @@ static int ov_connect(struct vpn_provider *provider, NULL, &fd, &fd); if (err < 0) { connman_error("openvpn failed to start"); - return -EIO; + err = -EIO; + goto done; } - return 0; +done: + if (cb != NULL) + cb(provider, user_data, err); + + return err; } static struct vpn_driver vpn_driver = { diff --git a/vpn/plugins/pptp.c b/vpn/plugins/pptp.c index 68437937..1da5144a 100644 --- a/vpn/plugins/pptp.c +++ b/vpn/plugins/pptp.c @@ -241,27 +241,32 @@ static void pptp_write_bool_option(struct connman_task *task, } static int pptp_connect(struct vpn_provider *provider, - struct connman_task *task, const char *if_name) + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data) { const char *opt_s, *host; char *str; int err, i; if (connman_task_set_notify(task, "getsec", - pptp_get_sec, provider)) - return -ENOMEM; + pptp_get_sec, provider)) { + err = -ENOMEM; + goto done; + } host = vpn_provider_get_string(provider, "Host"); if (host == NULL) { connman_error("Host not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } str = g_strdup_printf("%s %s --nolaunchpppd --loglevel 2", PPTP, host); if (str == NULL) { connman_error("can not allocate memory"); - return -ENOMEM; + err = -ENOMEM; + goto done; } connman_task_add_argument(task, "pty", str); @@ -299,10 +304,15 @@ static int pptp_connect(struct vpn_provider *provider, NULL, NULL, NULL); if (err < 0) { connman_error("pptp failed to start"); - return -EIO; + err = -EIO; + goto done; } - return 0; +done: + if (cb != NULL) + cb(provider, user_data, err); + + return err; } static int pptp_error_code(int exit_code) diff --git a/vpn/plugins/vpn.c b/vpn/plugins/vpn.c index d0b3381a..66a75d2a 100644 --- a/vpn/plugins/vpn.c +++ b/vpn/plugins/vpn.c @@ -353,7 +353,8 @@ exist_err: return ret; } -static int vpn_connect(struct vpn_provider *provider) +static int vpn_connect(struct vpn_provider *provider, + vpn_provider_connect_cb_t cb, void *user_data) { struct vpn_data *data = vpn_provider_get_data(provider); struct vpn_driver_data *vpn_driver_data; @@ -410,7 +411,7 @@ static int vpn_connect(struct vpn_provider *provider) } ret = vpn_driver_data->vpn_driver->connect(provider, data->task, - data->if_name); + data->if_name, cb, user_data); if (ret < 0) { stop_vpn(provider); connman_task_destroy(data->task); diff --git a/vpn/plugins/vpn.h b/vpn/plugins/vpn.h index 6693cdba..d1e322c1 100644 --- a/vpn/plugins/vpn.h +++ b/vpn/plugins/vpn.h @@ -44,7 +44,8 @@ struct vpn_driver { int flags; int (*notify) (DBusMessage *msg, struct vpn_provider *provider); int (*connect) (struct vpn_provider *provider, - struct connman_task *task, const char *if_name); + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data); void (*disconnect) (void); int (*error_code) (int exit_code); int (*save) (struct vpn_provider *provider, GKeyFile *keyfile); diff --git a/vpn/plugins/vpnc.c b/vpn/plugins/vpnc.c index 9fd1dec8..9f69850f 100644 --- a/vpn/plugins/vpnc.c +++ b/vpn/plugins/vpnc.c @@ -263,20 +263,23 @@ static int vc_save(struct vpn_provider *provider, GKeyFile *keyfile) } static int vc_connect(struct vpn_provider *provider, - struct connman_task *task, const char *if_name) + struct connman_task *task, const char *if_name, + vpn_provider_connect_cb_t cb, void *user_data) { const char *option; - int err, fd; + int err = 0, fd; option = vpn_provider_get_string(provider, "Host"); if (option == NULL) { connman_error("Host not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } option = vpn_provider_get_string(provider, "VPNC.IPSec.ID"); if (option == NULL) { connman_error("Group not set; cannot enable VPN"); - return -EINVAL; + err = -EINVAL; + goto done; } connman_task_add_argument(task, "--non-inter", NULL); @@ -298,13 +301,18 @@ static int vc_connect(struct vpn_provider *provider, &fd, NULL, NULL); if (err < 0) { connman_error("vpnc failed to start"); - return -EIO; + err = -EIO; + goto done; } err = vc_write_config_data(provider, fd); close(fd); +done: + if (cb != NULL) + cb(provider, user_data, err); + return err; } |