NetworkManager r4255 - in trunk/vpn-daemons/pptp: . src
- From: dcbw svn gnome org
- To: svn-commits-list gnome org
- Subject: NetworkManager r4255 - in trunk/vpn-daemons/pptp: . src
- Date: Tue, 4 Nov 2008 19:06:55 +0000 (UTC)
Author: dcbw
Date: Tue Nov 4 19:06:55 2008
New Revision: 4255
URL: http://svn.gnome.org/viewvc/NetworkManager?rev=4255&view=rev
Log:
2008-11-04 Dan Williams <dcbw redhat com>
Fix bgo #559152
* src/nm-pptp-pppd-plugin.c
- (nm_ip_up): remote peer's address is the PTP address, not the external
gateway address
* src/nm-pptp-service.c
- (construct_pppd_args): allow easier PPP debugging
- (service_ip4_config_cb): insert the VPN gateway's public IP address
into the IP4 config
- (real_connect, real_disconnect, state_changed_cb, dispose): cache
the connection so that the VPN gateway's public IP address can be
retrieved from it when the IP4 config comes back from pppd
Modified:
trunk/vpn-daemons/pptp/ChangeLog
trunk/vpn-daemons/pptp/src/nm-pptp-pppd-plugin.c
trunk/vpn-daemons/pptp/src/nm-pptp-service.c
Modified: trunk/vpn-daemons/pptp/src/nm-pptp-pppd-plugin.c
==============================================================================
--- trunk/vpn-daemons/pptp/src/nm-pptp-pppd-plugin.c (original)
+++ trunk/vpn-daemons/pptp/src/nm-pptp-pppd-plugin.c Tue Nov 4 19:06:55 2008
@@ -179,14 +179,14 @@
* and if that's not right, use the made-up address as a last resort.
*/
if (peer_opts.hisaddr && (peer_opts.hisaddr != pppd_made_up_address)) {
- g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY,
+ g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_PTP,
uint_to_gvalue (peer_opts.hisaddr));
} else if (opts.hisaddr) {
- g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY,
+ g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_PTP,
uint_to_gvalue (opts.hisaddr));
} else if (peer_opts.hisaddr == pppd_made_up_address) {
/* As a last resort, use the made-up address */
- g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY,
+ g_hash_table_insert (hash, NM_VPN_PLUGIN_IP4_CONFIG_PTP,
uint_to_gvalue (peer_opts.hisaddr));
}
Modified: trunk/vpn-daemons/pptp/src/nm-pptp-service.c
==============================================================================
--- trunk/vpn-daemons/pptp/src/nm-pptp-service.c (original)
+++ trunk/vpn-daemons/pptp/src/nm-pptp-service.c Tue Nov 4 19:06:55 2008
@@ -35,6 +35,7 @@
#include <sys/ioctl.h>
#include <asm/types.h>
#include <net/if.h>
+#include <arpa/inet.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>
@@ -357,6 +358,7 @@
GPid pid;
guint32 ppp_timeout_handler;
NMPptpPppService *service;
+ NMConnection *connection;
} NMPptpPluginPrivate;
#define NM_PPTP_PLUGIN_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_PPTP_PLUGIN, NMPptpPluginPrivate))
@@ -710,6 +712,9 @@
tmp = g_strdup_printf ("%s %s --nolaunchpppd --logstring %s", pptp_binary, value, ipparam);
g_ptr_array_add (args, (gpointer) tmp);
+ if (getenv ("NM_PPP_DEBUG"))
+ g_ptr_array_add (args, (gpointer) g_strdup ("debug"));
+
/* PPP options */
g_ptr_array_add (args, (gpointer) g_strdup ("ipparam"));
g_ptr_array_add (args, (gpointer) ipparam);
@@ -900,11 +905,85 @@
}
static void
+nm_gvalue_destroy (gpointer data)
+{
+ g_value_unset ((GValue *) data);
+ g_slice_free (GValue, data);
+}
+
+static GValue *
+nm_gvalue_dup (const GValue *value)
+{
+ GValue *dup;
+
+ dup = g_slice_new0 (GValue);
+ g_value_init (dup, G_VALUE_TYPE (value));
+ g_value_copy (value, dup);
+
+ return dup;
+}
+
+static void
+copy_hash (gpointer key, gpointer value, gpointer user_data)
+{
+ g_hash_table_insert ((GHashTable *) user_data, g_strdup (key), nm_gvalue_dup ((GValue *) value));
+}
+
+static GValue *
+get_pptp_gw_address_as_gvalue (NMConnection *connection)
+{
+ NMSettingVPN *s_vpn;
+ const char *tmp;
+ GValue *value;
+ struct in_addr addr;
+
+ s_vpn = (NMSettingVPN *) nm_connection_get_setting (connection, NM_TYPE_SETTING_VPN);
+ if (!s_vpn) {
+ nm_warning ("couldn't get VPN setting");
+ return NULL;
+ }
+
+ tmp = nm_setting_vpn_get_data_item (s_vpn, NM_PPTP_KEY_GATEWAY);
+ if (!tmp || !strlen (tmp)) {
+ nm_warning ("couldn't get PPTP VPN gateway IP address");
+ return NULL;
+ }
+
+ errno = 0;
+ if (inet_pton (AF_INET, tmp, &addr) <= 0) {
+ nm_warning ("couldn't convert PPTP VPN gateway IP address '%s' (%d)", tmp, errno);
+ return NULL;
+ }
+
+ value = g_slice_new0 (GValue);
+ g_value_init (value, G_TYPE_UINT);
+ g_value_set_uint (value, (guint32) addr.s_addr);
+
+ return value;
+}
+
+static void
service_ip4_config_cb (NMPptpPppService *service,
GHashTable *config_hash,
NMPptpPlugin *plugin)
{
- nm_vpn_plugin_set_ip4_config (NM_VPN_PLUGIN (plugin), config_hash);
+ NMPptpPluginPrivate *priv = NM_PPTP_PLUGIN_GET_PRIVATE (plugin);
+ GHashTable *hash;
+ GValue *value;
+
+ hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, nm_gvalue_destroy);
+ g_hash_table_foreach (config_hash, copy_hash, hash);
+
+ /* Insert the external VPN gateway into the table, which the pppd plugin
+ * simply doesn't know about.
+ */
+ value = get_pptp_gw_address_as_gvalue (priv->connection);
+ if (value)
+ g_hash_table_insert (hash, g_strdup (NM_PPTP_KEY_GATEWAY), value);
+
+ nm_vpn_plugin_set_ip4_config (NM_VPN_PLUGIN (plugin), hash);
+
+ g_hash_table_destroy (hash);
}
static gboolean
@@ -927,6 +1006,10 @@
/* Start our pppd plugin helper service */
if (priv->service)
g_object_unref (priv->service);
+ if (priv->connection) {
+ g_object_unref (priv->connection);
+ priv->connection = NULL;
+ }
priv->service = nm_pptp_ppp_service_new ();
if (!priv->service) {
@@ -937,6 +1020,9 @@
"Could not start pppd plugin helper service.");
return FALSE;
}
+
+ priv->connection = g_object_ref (connection);
+
g_signal_connect (G_OBJECT (priv->service), "plugin-alive", G_CALLBACK (service_plugin_alive_cb), plugin);
g_signal_connect (G_OBJECT (priv->service), "ppp-state", G_CALLBACK (service_ppp_state_cb), plugin);
g_signal_connect (G_OBJECT (priv->service), "ip4-config", G_CALLBACK (service_ip4_config_cb), plugin);
@@ -1001,6 +1087,11 @@
priv->pid = 0;
}
+ if (priv->connection) {
+ g_object_unref (priv->connection);
+ priv->connection = NULL;
+ }
+
if (priv->service) {
g_object_unref (priv->service);
priv->service = NULL;
@@ -1015,13 +1106,19 @@
NMPptpPluginPrivate *priv = NM_PPTP_PLUGIN_GET_PRIVATE (object);
switch (state) {
+ case NM_VPN_SERVICE_STATE_STARTED:
+ remove_timeout_handler (NM_PPTP_PLUGIN (object));
+ break;
case NM_VPN_SERVICE_STATE_UNKNOWN:
case NM_VPN_SERVICE_STATE_INIT:
case NM_VPN_SERVICE_STATE_SHUTDOWN:
- case NM_VPN_SERVICE_STATE_STARTED:
case NM_VPN_SERVICE_STATE_STOPPING:
case NM_VPN_SERVICE_STATE_STOPPED:
remove_timeout_handler (NM_PPTP_PLUGIN (object));
+ if (priv->connection) {
+ g_object_unref (priv->connection);
+ priv->connection = NULL;
+ }
if (priv->service) {
g_object_unref (priv->service);
priv->service = NULL;
@@ -1037,6 +1134,9 @@
{
NMPptpPluginPrivate *priv = NM_PPTP_PLUGIN_GET_PRIVATE (object);
+ if (priv->connection)
+ g_object_unref (priv->connection);
+
if (priv->service)
g_object_unref (priv->service);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]