Re: [Patch] dict based vpnc plugin



Dan Williams schrieb:
> Right, though we should probably get the plugins using libnm-util like
> the applet and NM do, then they wouldn't have to include the sources at
> all.
ACK, would be the cleanest way, as it's shared between NM itself and the
vpn plugins.

> One quick note; your diff is in context diff format, which is hard to
> follow for many people.  Using 'cvs diff -u' is the best option, to
> produce a 'unified' diff format which is much easier to read.
Sure. Done. Didn't notice. Again, I've only diffed the vpn-daemons
directory to avoid too much noise.


Regards,
Thomas


? vpn_daemon-vpnc_dict_api.patch
? vpnc/backup-101920061846-pre-vpnc.tgz
? vpnc/backup-102820061906-pre-networkmanager-vpnc.tgz
? vpnc/description-pak
? vpnc/doc-pak
? vpnc/networkmanager-vpnc_0.7.0-1_i386.deb
? vpnc/auth-dialog/.deps
? vpnc/po/ca.gmo
? vpnc/po/en_GB.gmo
? vpnc/po/es.gmo
? vpnc/po/fi.gmo
? vpnc/po/hu.gmo
? vpnc/po/it.gmo
? vpnc/po/ja.gmo
? vpnc/po/vi.gmo
? vpnc/po/zh_CN.gmo
? vpnc/properties/.deps
? vpnc/src/.deps
Index: vpnc/src/nm-utils.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/vpn-daemons/vpnc/src/nm-utils.c,v
retrieving revision 1.1
diff -u -r1.1 nm-utils.c
--- vpnc/src/nm-utils.c	12 Jun 2005 14:34:54 -0000	1.1
+++ vpnc/src/nm-utils.c	1 Nov 2006 22:35:22 -0000
@@ -24,6 +24,7 @@
 #include <errno.h>
 
 #include <glib.h>
+#include <dbus/dbus.h>
 #include "nm-utils.h"
 
 gchar *nm_dbus_escape_object_path (const gchar *utf8_string)
@@ -130,3 +131,476 @@
 
 	return utf8_string;
 }
+
+
+/**
+ * Start a dict in a dbus message.  Should be paired with a call to
+ * { link nmu_dbus_dict_close_write}.
+ *
+ * @param iter A valid dbus message iterator
+ * @param iter_dict (out) A dict iterator to pass to further dict functions
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_open_write (DBusMessageIter *iter, DBusMessageIter *iter_dict)
+{	
+	if (!iter || !iter_dict)
+		return FALSE;
+
+	return dbus_message_iter_open_container (iter,
+					  DBUS_TYPE_ARRAY,
+					  DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+					  DBUS_TYPE_STRING_AS_STRING
+					  DBUS_TYPE_VARIANT_AS_STRING
+					  DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+					  iter_dict);
+}
+
+/**
+ * End a dict element in a dbus message.  Should be paired with
+ * a call to { link nmu_dbus_dict_open_write}.
+ *
+ * @param iter valid dbus message iterator, same as passed to
+ *    nmu_dbus_dict_open_write()
+ * @param iter_dict a dbus dict iterator returned from { link nmu_dbus_dict_open_write}
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_close_write (DBusMessageIter *iter, DBusMessageIter *iter_dict)
+{	
+	if (!iter || !iter_dict)
+		return FALSE;
+
+	return dbus_message_iter_close_container (iter, iter_dict);
+}
+
+
+static const char *
+_nmu_get_type_as_string_from_type (const int type)
+{
+	switch (type)
+	{
+		case DBUS_TYPE_BYTE:
+			return DBUS_TYPE_BYTE_AS_STRING;
+		case DBUS_TYPE_BOOLEAN:
+			return DBUS_TYPE_BOOLEAN_AS_STRING;
+		case DBUS_TYPE_INT16:
+			return DBUS_TYPE_INT16_AS_STRING;
+		case DBUS_TYPE_UINT16:
+			return DBUS_TYPE_UINT16_AS_STRING;
+		case DBUS_TYPE_INT32:
+			return DBUS_TYPE_INT32_AS_STRING;
+		case DBUS_TYPE_UINT32:
+			return DBUS_TYPE_UINT32_AS_STRING;
+		case DBUS_TYPE_INT64:
+			return DBUS_TYPE_INT64_AS_STRING;
+		case DBUS_TYPE_UINT64:
+			return DBUS_TYPE_UINT64_AS_STRING;
+		case DBUS_TYPE_DOUBLE:
+			return DBUS_TYPE_DOUBLE_AS_STRING;
+		case DBUS_TYPE_STRING:
+			return DBUS_TYPE_STRING_AS_STRING;
+		case DBUS_TYPE_OBJECT_PATH:
+			return DBUS_TYPE_OBJECT_PATH_AS_STRING;
+		case DBUS_TYPE_ARRAY:
+			return DBUS_TYPE_ARRAY_AS_STRING;
+		default:
+			return NULL;
+	}
+	return NULL;
+}
+
+
+static dbus_bool_t
+_nmu_dbus_add_dict_entry_start (DBusMessageIter *iter_dict,
+                                DBusMessageIter *iter_dict_entry,
+                                const char *key,
+                                const int value_type)
+{
+	if (!dbus_message_iter_open_container (iter_dict,
+					  DBUS_TYPE_DICT_ENTRY,
+					  NULL,
+					  iter_dict_entry))
+		return FALSE;
+
+	if (!dbus_message_iter_append_basic (iter_dict_entry, DBUS_TYPE_STRING, &key))
+		return FALSE;
+
+	return TRUE;
+}
+
+
+static dbus_bool_t
+_nmu_dbus_add_dict_entry_end (DBusMessageIter *iter_dict,
+                              DBusMessageIter *iter_dict_entry,
+                              DBusMessageIter *iter_dict_val)
+{
+	if (!dbus_message_iter_close_container (iter_dict_entry, iter_dict_val))
+		return FALSE;
+	if (!dbus_message_iter_close_container (iter_dict, iter_dict_entry))
+		return FALSE;
+
+	return TRUE;
+}
+
+
+static dbus_bool_t
+_nmu_dbus_add_dict_entry_basic (DBusMessageIter *iter_dict,
+                                const char *key,
+                                const int value_type,
+                                const void *value)
+{
+	DBusMessageIter iter_dict_entry, iter_dict_val;
+	const char * type_as_string = NULL;
+
+	type_as_string = _nmu_get_type_as_string_from_type (value_type);
+	if (!type_as_string)
+		return FALSE;
+
+	if (!_nmu_dbus_add_dict_entry_start (iter_dict, &iter_dict_entry,
+			key, value_type))
+		return FALSE;
+
+	if (!dbus_message_iter_open_container (&iter_dict_entry,
+					  DBUS_TYPE_VARIANT,
+					  type_as_string,
+					  &iter_dict_val))
+		return FALSE;
+
+	if (!dbus_message_iter_append_basic (&iter_dict_val, value_type, value))
+		return FALSE;
+
+	if (!_nmu_dbus_add_dict_entry_end (iter_dict, &iter_dict_entry,
+			&iter_dict_val))
+		return FALSE;
+
+	return TRUE;
+}
+
+
+static dbus_bool_t
+_nmu_dbus_add_dict_entry_byte_array (DBusMessageIter *iter_dict,
+                                     const char *key,
+                                     const char *value,
+                                     const dbus_uint32_t value_len)
+{
+	DBusMessageIter iter_dict_entry, iter_dict_val, iter_array;
+	dbus_uint32_t i;
+
+	if (!_nmu_dbus_add_dict_entry_start (iter_dict, &iter_dict_entry,
+			key, DBUS_TYPE_ARRAY))
+		return FALSE;
+
+	if (!dbus_message_iter_open_container (&iter_dict_entry,
+					  DBUS_TYPE_VARIANT,
+					  DBUS_TYPE_ARRAY_AS_STRING
+					  DBUS_TYPE_BYTE_AS_STRING,
+					  &iter_dict_val))
+		return FALSE;
+
+	if (!dbus_message_iter_open_container (&iter_dict_val, DBUS_TYPE_ARRAY,
+			DBUS_TYPE_BYTE_AS_STRING, &iter_array))
+		return FALSE;
+
+	for (i = 0; i < value_len; i++)
+	{
+		if (!dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_BYTE,
+				&(value[i])))
+			return FALSE;
+	}
+	
+	if (!dbus_message_iter_close_container (&iter_dict_val, &iter_array))
+		return FALSE;
+
+	if (!_nmu_dbus_add_dict_entry_end (iter_dict, &iter_dict_entry,
+			&iter_dict_val))
+		return FALSE;
+
+	return TRUE;
+}
+
+
+static dbus_bool_t
+_nmu_dbus_add_dict_entry_string_array (DBusMessageIter *iter_dict,
+                                       const char *key,
+                                       const char **items,
+                                       const dbus_uint32_t num_items)
+{
+	DBusMessageIter iter_dict_entry, iter_dict_val, iter_array;
+	dbus_uint32_t i;
+
+	if (!_nmu_dbus_add_dict_entry_start (iter_dict, &iter_dict_entry,
+			key, DBUS_TYPE_ARRAY))
+		return FALSE;
+
+	if (!dbus_message_iter_open_container (&iter_dict_entry,
+					  DBUS_TYPE_VARIANT,
+					  DBUS_TYPE_ARRAY_AS_STRING
+					  DBUS_TYPE_STRING_AS_STRING,
+					  &iter_dict_val))
+		return FALSE;
+
+	if (!dbus_message_iter_open_container (&iter_dict_val, DBUS_TYPE_ARRAY,
+			DBUS_TYPE_BYTE_AS_STRING, &iter_array))
+		return FALSE;
+
+	for (i = 0; i < num_items; i++)
+	{
+		if (!dbus_message_iter_append_basic (&iter_array, DBUS_TYPE_STRING,
+				&(items[i])))
+			return FALSE;
+	}
+	
+	if (!dbus_message_iter_close_container (&iter_dict_val, &iter_array))
+		return FALSE;
+
+	if (!_nmu_dbus_add_dict_entry_end (iter_dict, &iter_dict_entry,
+			&iter_dict_val))
+		return FALSE;
+
+	return TRUE;
+}
+
+/**
+ * Add a string entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The string value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_string (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const char * value)
+{
+	if (!key || !value) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_STRING, &value);
+}
+
+/**
+ * Add a byte entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The byte value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_byte (DBusMessageIter *iter_dict,
+                           const char * key,
+                           const char value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_BYTE, &value);
+}
+
+/**
+ * Add a boolean entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The boolean value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_bool (DBusMessageIter *iter_dict,
+                           const char * key,
+                           const dbus_bool_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_BOOLEAN, &value);
+}
+
+/**
+ * Add a 16-bit signed integer entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 16-bit signed integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_int16 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int16_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_INT16, &value);
+}
+
+/**
+ * Add a 16-bit unsigned integer entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 16-bit unsigned integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_uint16 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint16_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_UINT16, &value);
+}
+
+/**
+ * Add a 32-bit signed integer to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 32-bit signed integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_int32 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int32_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_INT32, &value);
+}
+
+/**
+ * Add a 32-bit unsigned integer entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 32-bit unsigned integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_uint32 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint32_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_UINT32, &value);
+}
+
+/**
+ * Add a 64-bit integer entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 64-bit integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_int64 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int64_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_INT64, &value);
+}
+
+/**
+ * Add a 64-bit unsigned integer entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The 64-bit unsigned integer value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_uint64 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint64_t value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_UINT64, &value);
+}
+
+/**
+ * Add a double-precision floating point entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The double-precision floating point value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_double (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const double value)
+{
+	if (!key) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_DOUBLE, &value);
+}
+
+/**
+ * Add a DBus object path entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The DBus object path value
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_object_path (DBusMessageIter *iter_dict,
+                                  const char * key,
+                                  const char * value)
+{
+	if (!key || !value) return FALSE;
+	return _nmu_dbus_add_dict_entry_basic (iter_dict, key, DBUS_TYPE_OBJECT_PATH, &value);
+}
+
+/**
+ * Add a byte array entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param value The byte array
+ * @param value_len The length of the byte array, in bytes
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_byte_array (DBusMessageIter *iter_dict,
+                                 const char * key,
+                                 const char * value,
+                                 const dbus_uint32_t value_len)
+{
+	if (!key) return FALSE;
+	if (!value && (value_len != 0)) return FALSE;
+	return _nmu_dbus_add_dict_entry_byte_array (iter_dict, key, value, value_len);
+}
+
+
+/**
+ * Add a string array entry to the dict.
+ *
+ * @param iter_dict A valid DBusMessageIter returned from { link nmu_dbus_dict_open_write}
+ * @param key The key of the dict item
+ * @param items The array of strings
+ * @param num_items The number of strings in the array
+ * @return TRUE on success, FALSE on failure
+ *
+ */
+dbus_bool_t
+nmu_dbus_dict_append_string_array (DBusMessageIter *iter_dict,
+                                   const char * key,
+                                   const char ** items,
+                                   const dbus_uint32_t num_items)
+{
+	if (!key) return FALSE;
+	if (!items && (num_items != 0)) return FALSE;
+	return _nmu_dbus_add_dict_entry_string_array (iter_dict, key, items, num_items);
+}
+
Index: vpnc/src/nm-utils.h
===================================================================
RCS file: /cvs/gnome/NetworkManager/vpn-daemons/vpnc/src/nm-utils.h,v
retrieving revision 1.2
diff -u -r1.2 nm-utils.h
--- vpnc/src/nm-utils.h	16 Jan 2006 22:26:17 -0000	1.2
+++ vpnc/src/nm-utils.h	1 Nov 2006 22:35:23 -0000
@@ -128,4 +128,83 @@
 gchar *nm_dbus_escape_object_path (const gchar *utf8_string);
 gchar *nm_dbus_unescape_object_path (const gchar *object_path);
 
+/*
+ * Adding a dict to a DBusMessage
+ */
+
+dbus_bool_t
+nmu_dbus_dict_open_write (DBusMessageIter *iter,
+                          DBusMessageIter *iter_dict);
+
+dbus_bool_t
+nmu_dbus_dict_close_write (DBusMessageIter *iter,
+                           DBusMessageIter *iter_dict);
+
+dbus_bool_t
+nmu_dbus_dict_append_string (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const char * value);
+
+dbus_bool_t
+nmu_dbus_dict_append_byte (DBusMessageIter *iter_dict,
+                           const char * key,
+                           const char value);
+
+dbus_bool_t
+nmu_dbus_dict_append_bool (DBusMessageIter *iter_dict,
+                           const char * key,
+                           const dbus_bool_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_int16 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int16_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_uint16 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint16_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_int32 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int32_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_uint32 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint32_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_int64 (DBusMessageIter *iter_dict,
+                            const char * key,
+                            const dbus_int64_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_uint64 (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const dbus_uint64_t value);
+
+dbus_bool_t
+nmu_dbus_dict_append_double (DBusMessageIter *iter_dict,
+                             const char * key,
+                             const double value);
+
+dbus_bool_t
+nmu_dbus_dict_append_object_path (DBusMessageIter *iter_dict,
+                                  const char * key,
+                                  const char * value);
+
+dbus_bool_t
+nmu_dbus_dict_append_byte_array (DBusMessageIter *iter_dict,
+                                 const char * key,
+                                 const char * value,
+                                 const dbus_uint32_t value_len);
+
+dbus_bool_t
+nmu_dbus_dict_append_string_array (DBusMessageIter *iter_dict,
+                                   const char * key,
+                                   const char ** items,
+                                   const dbus_uint32_t num_items);
+
 #endif /* NM_UTILS_H */
Index: vpnc/src/nm-vpnc-service.c
===================================================================
RCS file: /cvs/gnome/NetworkManager/vpn-daemons/vpnc/src/nm-vpnc-service.c,v
retrieving revision 1.19
diff -u -r1.19 nm-vpnc-service.c
--- vpnc/src/nm-vpnc-service.c	21 May 2006 20:28:25 -0000	1.19
+++ vpnc/src/nm-vpnc-service.c	1 Nov 2006 22:35:24 -0000
@@ -869,31 +869,39 @@
  */
 static void nm_vpnc_dbus_process_helper_ip4_config (DBusConnection *con, DBusMessage *message, NmVpncData *data)
 {
-	guint32		ip4_vpn_gateway;
-	char *		tundev;
-	guint32		ip4_address;
-	guint32		ip4_ptp_address;
-	guint32		ip4_netmask;
-	guint32 *		ip4_dns;
-	guint32		ip4_dns_len;
-	guint32 *		ip4_nbns;
-	guint32		ip4_nbns_len;
-	guint32		mss;
+	guint32		    ip4_vpn_gateway;
+	char *		    tundev;
+	guint32		    ip4_address;
+	guint32		    ip4_ptp_address;
+	guint32		    ip4_netmask;
+	guint32 *		    ip4_dns = NULL;
+	guint32		    ip4_dns_len;
+	guint32 		    ip4_dns1;
+	guint32 		    ip4_dns2;
+	guint32 *		    ip4_nbns = NULL;
+	guint32		    ip4_nbns_len;
 	char *		cisco_def_domain;
-	char *		cisco_banner;
-	gboolean		success = FALSE;
-	DBusMessage *	signal;
+	char *		cisco_banner;	
+	guint32 		    ip4_nbns1;
+	guint32 		    ip4_nbns2;
+	guint32			mtu;
+	guint32			mss;
+	gboolean		    success = FALSE;
+	char *            empty = "";
+	DBusMessage	*signal;
+	int               i;
+	DBusMessageIter iter, iter_dict;
 
 	g_return_if_fail (data != NULL);
 	g_return_if_fail (con != NULL);
 	g_return_if_fail (message != NULL);
-
+	
 	/* Only accept the config info if we're in STARTING state */
 	if (data->state != NM_VPN_STATE_STARTING)
 		return;
-
+	
 	nm_vpnc_cancel_helper_timer (data);
-
+	
 	if (!dbus_message_get_args(message, NULL,
 	                          DBUS_TYPE_UINT32, &ip4_vpn_gateway,
 	                          DBUS_TYPE_STRING, &tundev,
@@ -904,10 +912,10 @@
 	                          DBUS_TYPE_STRING, &cisco_def_domain,
 	                          DBUS_TYPE_STRING, &cisco_banner, DBUS_TYPE_INVALID))
 		goto out;
-
+	
 	/* For Cisco/vpnc, PtP address == local VPN address */
 	ip4_ptp_address = ip4_address;
-
+	
 	/* and we don't specify an MSS */
 	mss = 0;
 
@@ -916,27 +924,74 @@
 					ip4_dns, ip4_dns_len, ip4_nbns, ip4_nbns_len,
 					cisco_def_domain, cisco_banner);
 #endif
-
+	
 	if (!(signal = dbus_message_new_signal (NM_DBUS_PATH_VPNC, NM_DBUS_INTERFACE_VPNC, NM_DBUS_VPN_SIGNAL_IP4_CONFIG)))
+	{
+		nm_warning ("Not enough memory for new dbus message!");
+		goto out;
+	}
+	
+	dbus_message_iter_init_append (signal, &iter);
+	if (!nmu_dbus_dict_open_write (&iter, &iter_dict)) {
+		nm_warning ("dict open write failed!");
 		goto out;
+	}
+
+	if (!nmu_dbus_dict_append_uint32 (&iter_dict, "gateway", ip4_vpn_gateway)) {
+    	nm_warning ("couldn't append gateway to dict");
+    	goto out;
+	}
+
+	if (!nmu_dbus_dict_append_string (&iter_dict, "tundev", tundev)) {
+    	nm_warning ("couldn't append tundev to dict");
+    	goto out;
+	}
+
+	if (!nmu_dbus_dict_append_uint32 (&iter_dict, "local_addr", ip4_address)) {
+    	nm_warning ("couldn't append local_address to dict");
+    	goto out;
+	}
+
+	if (!nmu_dbus_dict_append_uint32 (&iter_dict, "local_netmask", ip4_netmask)) {
+    	nm_warning ("couldn't append local_netmask to dict");
+	    goto out;
+	}
+
+	if (!nmu_dbus_dict_append_uint32 (&iter_dict, "ptp_addr", ip4_ptp_address)) {
+    	nm_warning ("couldn't append ptp_address to dict");
+    	goto out;
+	}
+
+	for (i=0; i < ip4_dns_len; i++) {
+		if (!nmu_dbus_dict_append_uint32 (&iter_dict, "dns_server", ip4_dns[i])) {
+			nm_warning ("couldn't append dns_server (number %d) to dict",i);
+			goto out;
+		}
+	}
+
+	for (i=0; i < ip4_nbns_len; i++) {
+		if (!nmu_dbus_dict_append_uint32 (&iter_dict, "nbns_server", ip4_dns[i])) {
+			nm_warning ("couldn't append nbns_server (number %d) to dict",i);
+			goto out;
+		}
+	}
+
+	if (!nmu_dbus_dict_append_string (&iter_dict, "login_banner", cisco_banner)) {
+		nm_warning ("couldn't append login_banner to dict");
+		goto out;
+	}
+
+	if (!nmu_dbus_dict_close_write (&iter, &iter_dict)) {
+		nm_warning ("dict close write failed!");
+		goto out;
+	}
 
-	dbus_message_append_args (signal,
-	                          DBUS_TYPE_UINT32, &ip4_vpn_gateway,
-	                          DBUS_TYPE_STRING, &tundev,
-	                          DBUS_TYPE_UINT32, &ip4_address,
-	                          DBUS_TYPE_UINT32, &ip4_ptp_address,
-	                          DBUS_TYPE_UINT32, &ip4_netmask,
-	                          DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &ip4_dns, ip4_dns_len,
-	                          DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &ip4_nbns, ip4_nbns_len,
-						 DBUS_TYPE_UINT32, &mss,
-	                          DBUS_TYPE_STRING, &cisco_def_domain,
-	                          DBUS_TYPE_STRING, &cisco_banner, DBUS_TYPE_INVALID);
 	if (!dbus_connection_send (data->con, signal, NULL))
 	{
 		nm_warning ("Could not raise the "NM_DBUS_VPN_SIGNAL_IP4_CONFIG" signal!");
 		goto out;
 	}
-
+	
 	dbus_message_unref (signal);
 	nm_vpnc_set_state (data, NM_VPN_STATE_STARTED);
 	success = TRUE;
@@ -944,7 +999,7 @@
 out:
 	if (!success)
 	{
-		nm_warning ("Received invalid IP4 Config information from helper, terminating vpnc.");
+	nm_warning ("Received invalid IP4 Config information from helper, terminating vpnc.");
 		nm_vpnc_dbus_handle_stop_vpn (data);
 	}
 }

Attachment: signature.asc
Description: OpenPGP digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]