[PATCHES] symbol visibility



Hi,

while looking through the TODO list for 0.7 [1], I decided that I should contribute a bit, especially as it was me, that complained about the long list of exported symbols by libnm-glib and libnm-util.

So I went ahead and studied the docs a bit.
There are basically two approaches, how to trim down the list of exported symbols:

a) GCC's visibility support [2]
 GCC extension, mostly used by C++ libraries

b) ld linker/version scripts  [3]
 b.1) either directly via LDFLAGS -Wl,--version-script
b.2) or indirectly via libtools -export-symbols $FILE or -export-symbols-regex, which will create a version script on the fly.

Before trying to evaluate which approach is best, I analyzed the list of exported symbols (see attached *.symbols files) and checked which symbols are not part of the public API (see attached *.diff files).

There are basically 5 ways
GCC visibility
1.) Use -fvisibility=default (all symbols are exported by default) and augment all function declarations, which shall not be exported with __attribute__ ((visibility("hidden")))

Does not work, as we have autogenerated files, where we cannot add the visibility attribute.

2.) Use -fvisibility=hidden (all symbols are hidden by default) and augment all function declarations, which shall be exported with __attribute__ ((visibility("default"))).

Lots of code changes in the header files. To be manageable we'd have to define a macro like DLLEXPORT. All installed header files would either have to define such a macro or we would have to create a new header file (like visibility.h) which contains this macro and all other header files include that. Imho quite cumbersome

libtool
3.) -export-symbols-regex:
as you can see from the attached symbols and diff files, we can't use a common prefix like nm_.*. We'd have to rename private function to something like _nm_* -> looks of code changes.

4.) -export-symbols $FILE
List all exported symbols in a separate file and pass it to libtool.
I chatted with libtool's upstream a bit, and he recommended though, to directly use a ld version script. as this provides the most flexibility,

5.) LDFLAGS = -Wl,--version-script=$FILE
That's the way I implemented it in the patch. I listed each exported symbol explicitely (although the version script syntax would allow regexes). See patch 0001 and 0002 for the details. Imho this is the nicest and cleanest approaches which requires the least changes. I generated the version scripts automatically (by using objdump and grepping for the symbols in the installed header files, dropping all symbols which are not part of the public API), so a careful review would be very appreciated. NOTE: I didn't enable symbol versioning as I didn't see the need for it yet, I only used the version script to control the list of exported symbols

After applying 0001 and 0002, the test-crypto binary will no longer build, as it uses private symbols from libnm-util. I simply removed it in patch 0003. An alternative would be, to add crypto.c and crypto_(gnutls|nss).c to test_crypto_SOURCES.
If someone has a need for this binary, I could change that.


Comments and feedback welcome.


Michael
P.S: As I have svn commit access now, I could commit those patches myself, if you ack the changes.


[1] http://live.gnome.org/NetworkManager07Release
[2] http://gcc.gnu.org/wiki/Visibility
[3] http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gnu-linker/version.html

--
Why is it that all of the instruments seeking intelligent life in the
universe are pointed away from Earth?
From d452ca3f3f2a9ea6fda182498128b16ea2467990 Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl debian org>
Date: Wed, 13 Aug 2008 02:42:02 +0200
Subject: [PATCH] symbol visibility

Use a ld version script for libnm-util, libnm_glib and libnm_glib_vpn to
control the list of exported symbols.
---
 libnm-glib/Makefile.am |    5 ++++-
 libnm-util/Makefile.am |    5 +++--
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/libnm-glib/Makefile.am b/libnm-glib/Makefile.am
index d3c73b6..a8b4aca 100644
--- a/libnm-glib/Makefile.am
+++ b/libnm-glib/Makefile.am
@@ -91,6 +91,8 @@ libnm_glib_la_LIBADD = \
 	$(GCONF_LIBS)					\
 	$(GNOME_KEYRING_LIBS)
 
+libnm_glib_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libnm_glib.ver
+
 noinst_PROGRAMS = libnm-glib-test
 
 libnm_glib_test_SOURCES = libnm-glib-test.c
@@ -101,6 +103,7 @@ libnm_glib_test_LDADD = libnm_glib.la $(top_builddir)/libnm-util/libnm-util.la $
 libnm_glib_vpn_la_SOURCES = nm-vpn-plugin.c nm-vpn-plugin-ui-interface.c
 libnm_glib_vpn_la_CFLAGS = $(GLIB_CFLAGS) $(DBUS_CFLAGS)
 libnm_glib_vpn_la_LIBADD = $(top_builddir)/libnm-util/libnm-util.la $(GLIB_LIBS) $(DBUS_LIBS)
+libnm_glib_vpn_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libnm_glib_vpn.ver
 
 
 nm-client-bindings.h: $(top_srcdir)/introspection/nm-manager-client.xml
@@ -153,7 +156,7 @@ pkgconfig_DATA = libnm_glib.pc libnm_glib_vpn.pc
 
 DISTCLEANFILES = libnm_glib.pc libnm_glib.pc
 
-EXTRA_DIST = libnm_glib.pc.in libnm_glib_vpn.pc.in
+EXTRA_DIST = libnm_glib.pc.in libnm_glib_vpn.pc.in libnm_glib.ver libnm_glib_vpn.ver
 
 CLEANFILES = \
 	$(BUILT_SOURCES)
diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am
index 21fd6b1..a7b577c 100644
--- a/libnm-util/Makefile.am
+++ b/libnm-util/Makefile.am
@@ -51,6 +51,8 @@ libnm_util_la_SOURCES=			\
 
 libnm_util_la_LIBADD = $(GLIB_LIBS) $(DBUS_LIBS)
 
+libnm_util_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libnm-util.ver
+
 if WITH_GNUTLS
 libnm_util_la_SOURCES += crypto_gnutls.c
 libnm_util_la_CPPFLAGS += $(LIBGCRYPT_CFLAGS) $(GNUTLS_CFLAGS)
@@ -76,6 +78,5 @@ pkgconfig_DATA = libnm-util.pc
 
 DISTCLEANFILES = libnm-util.pc
 
-EXTRA_DIST = \
-	libnm-util.pc.in
+EXTRA_DIST = libnm-util.pc.in libnm-util.ver
 
-- 
1.5.6.3

From d2c2c01f7436ad4031c1f78a3f6f690c1abd2ed8 Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl debian org>
Date: Wed, 13 Aug 2008 03:44:41 +0200
Subject: [PATCH] Add the actual version scripts

---
 libnm-glib/libnm_glib.ver     |  120 +++++++++++++++++++++++++++++++++++++++
 libnm-glib/libnm_glib_vpn.ver |   24 ++++++++
 libnm-util/libnm-util.ver     |  126 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 270 insertions(+), 0 deletions(-)
 create mode 100644 libnm-glib/libnm_glib.ver
 create mode 100644 libnm-glib/libnm_glib_vpn.ver
 create mode 100644 libnm-util/libnm-util.ver

diff --git a/libnm-glib/libnm_glib.ver b/libnm-glib/libnm_glib.ver
new file mode 100644
index 0000000..0cd1682
--- /dev/null
+++ b/libnm-glib/libnm_glib.ver
@@ -0,0 +1,120 @@
+{
+global:
+	libnm_glib_get_network_state;
+	libnm_glib_init;
+	libnm_glib_register_callback;
+	libnm_glib_shutdown;
+	libnm_glib_unregister_callback;
+	nm_access_point_get_flags;
+	nm_access_point_get_frequency;
+	nm_access_point_get_hw_address;
+	nm_access_point_get_max_bitrate;
+	nm_access_point_get_mode;
+	nm_access_point_get_rsn_flags;
+	nm_access_point_get_ssid;
+	nm_access_point_get_strength;
+	nm_access_point_get_type;
+	nm_access_point_get_wpa_flags;
+	nm_access_point_new;
+	nm_active_connection_get_connection;
+	nm_active_connection_get_default;
+	nm_active_connection_get_devices;
+	nm_active_connection_get_scope;
+	nm_active_connection_get_service_name;
+	nm_active_connection_get_specific_object;
+	nm_active_connection_get_state;
+	nm_active_connection_get_type;
+	nm_active_connection_new;
+	nm_cdma_device_get_type;
+	nm_cdma_device_new;
+	nm_client_activate_connection;
+	nm_client_deactivate_connection;
+	nm_client_get_active_connections;
+	nm_client_get_device_by_path;
+	nm_client_get_devices;
+	nm_client_get_manager_running;
+	nm_client_get_state;
+	nm_client_get_type;
+	nm_client_new;
+	nm_client_sleep;
+	nm_client_wireless_get_enabled;
+	nm_client_wireless_hardware_get_enabled;
+	nm_client_wireless_set_enabled;
+	nm_dbus_connection_get_type;
+	nm_dbus_connection_new;
+	nm_dbus_settings_get_connection_by_path;
+	nm_dbus_settings_get_type;
+	nm_dbus_settings_new;
+	nm_dbus_settings_system_add_connection;
+	nm_dbus_settings_system_get_type;
+	nm_dbus_settings_system_get_unmanaged_devices;
+	nm_dbus_settings_system_new;
+	nm_device_ethernet_get_carrier;
+	nm_device_ethernet_get_hw_address;
+	nm_device_ethernet_get_speed;
+	nm_device_ethernet_get_type;
+	nm_device_ethernet_new;
+	nm_device_get_capabilities;
+	nm_device_get_dhcp4_config;
+	nm_device_get_driver;
+	nm_device_get_iface;
+	nm_device_get_ip4_config;
+	nm_device_get_managed;
+	nm_device_get_product;
+	nm_device_get_state;
+	nm_device_get_type;
+	nm_device_get_udi;
+	nm_device_get_vendor;
+	nm_device_new;
+	nm_device_wifi_get_access_point_by_path;
+	nm_device_wifi_get_access_points;
+	nm_device_wifi_get_active_access_point;
+	nm_device_wifi_get_bitrate;
+	nm_device_wifi_get_capabilities;
+	nm_device_wifi_get_hw_address;
+	nm_device_wifi_get_mode;
+	nm_device_wifi_get_type;
+	nm_device_wifi_new;
+	nm_dhcp4_config_get_one_option;
+	nm_dhcp4_config_get_options;
+	nm_dhcp4_config_get_type;
+	nm_dhcp4_config_new;
+	nm_exported_connection_delete;
+	nm_exported_connection_get_connection;
+	nm_exported_connection_get_id;
+	nm_exported_connection_get_type;
+	nm_exported_connection_new;
+	nm_exported_connection_register_object;
+	nm_exported_connection_signal_removed;
+	nm_exported_connection_signal_updated;
+	nm_exported_connection_update;
+	nm_gsm_device_get_type;
+	nm_gsm_device_new;
+	nm_ip4_config_get_addresses;
+	nm_ip4_config_get_domains;
+	nm_ip4_config_get_hostname;
+	nm_ip4_config_get_nameservers;
+	nm_ip4_config_get_routes;
+	nm_ip4_config_get_type;
+	nm_ip4_config_new;
+	nm_object_array_get_type;
+	nm_object_get_connection;
+	nm_object_get_path;
+	nm_object_get_type;
+	nm_serial_device_get_bytes_received;
+	nm_serial_device_get_bytes_sent;
+	nm_serial_device_get_type;
+	nm_settings_error_quark;
+	nm_settings_get_type;
+	nm_settings_list_connections;
+	nm_settings_signal_new_connection;
+	nm_ssid_get_type;
+	nm_string_array_get_type;
+	nm_uint_array_get_type;
+	nm_vpn_connection_get_banner;
+	nm_vpn_connection_get_type;
+	nm_vpn_connection_get_vpn_state;
+	nm_vpn_connection_new;
+local:
+	*;
+};
diff --git a/libnm-glib/libnm_glib_vpn.ver b/libnm-glib/libnm_glib_vpn.ver
new file mode 100644
index 0000000..99a7ffb
--- /dev/null
+++ b/libnm-glib/libnm_glib_vpn.ver
@@ -0,0 +1,24 @@
+{
+global:
+	nm_vpn_plugin_disconnect;
+	nm_vpn_plugin_error_get_type;
+	nm_vpn_plugin_error_quark;
+	nm_vpn_plugin_failure;
+	nm_vpn_plugin_get_connection;
+	nm_vpn_plugin_get_state;
+	nm_vpn_plugin_get_type;
+	nm_vpn_plugin_set_ip4_config;
+	nm_vpn_plugin_set_login_banner;
+	nm_vpn_plugin_set_state;
+	nm_vpn_plugin_ui_interface_export;
+	nm_vpn_plugin_ui_interface_get_capabilities;
+	nm_vpn_plugin_ui_interface_get_suggested_name;
+	nm_vpn_plugin_ui_interface_get_type;
+	nm_vpn_plugin_ui_interface_import;
+	nm_vpn_plugin_ui_interface_ui_factory;
+	nm_vpn_plugin_ui_widget_interface_get_type;
+	nm_vpn_plugin_ui_widget_interface_get_widget;
+	nm_vpn_plugin_ui_widget_interface_update_connection;
+local:
+	*;
+};
diff --git a/libnm-util/libnm-util.ver b/libnm-util/libnm-util.ver
new file mode 100644
index 0000000..718ab9e
--- /dev/null
+++ b/libnm-util/libnm-util.ver
@@ -0,0 +1,126 @@
+{
+global:
+	nm_connection_add_setting;
+	nm_connection_clear_secrets;
+	nm_connection_compare;
+	nm_connection_create_setting;
+	nm_connection_dump;
+	nm_connection_duplicate;
+	nm_connection_error_get_type;
+	nm_connection_error_quark;
+	nm_connection_for_each_setting_value;
+	nm_connection_get_path;
+	nm_connection_get_scope;
+	nm_connection_get_setting;
+	nm_connection_get_setting_by_name;
+	nm_connection_get_type;
+	nm_connection_lookup_setting_type;
+	nm_connection_lookup_setting_type_by_quark;
+	nm_connection_need_secrets;
+	nm_connection_new;
+	nm_connection_new_from_hash;
+	nm_connection_remove_setting;
+	nm_connection_replace_settings;
+	nm_connection_set_path;
+	nm_connection_set_scope;
+	nm_connection_to_hash;
+	nm_connection_update_secrets;
+	nm_connection_verify;
+	nm_setting_802_1x_error_get_type;
+	nm_setting_802_1x_error_quark;
+	nm_setting_802_1x_get_type;
+	nm_setting_802_1x_new;
+	nm_setting_802_1x_set_ca_cert;
+	nm_setting_802_1x_set_client_cert;
+	nm_setting_802_1x_set_phase2_ca_cert;
+	nm_setting_802_1x_set_phase2_client_cert;
+	nm_setting_802_1x_set_phase2_private_key;
+	nm_setting_802_1x_set_private_key;
+	nm_setting_cdma_error_get_type;
+	nm_setting_cdma_error_quark;
+	nm_setting_cdma_get_type;
+	nm_setting_cdma_new;
+	nm_setting_clear_secrets;
+	nm_setting_compare;
+	nm_setting_connection_error_get_type;
+	nm_setting_connection_error_quark;
+	nm_setting_connection_get_type;
+	nm_setting_connection_new;
+	nm_setting_duplicate;
+	nm_setting_enumerate_values;
+	nm_setting_from_hash;
+	nm_setting_get_name;
+	nm_setting_get_type;
+	nm_setting_gsm_error_get_type;
+	nm_setting_gsm_error_quark;
+	nm_setting_gsm_get_type;
+	nm_setting_gsm_new;
+	nm_setting_ip4_config_error_get_type;
+	nm_setting_ip4_config_error_quark;
+	nm_setting_ip4_config_get_type;
+	nm_setting_ip4_config_new;
+	nm_setting_ip6_config_error_get_type;
+	nm_setting_ip6_config_error_quark;
+	nm_setting_ip6_config_get_type;
+	nm_setting_ip6_config_new;
+	nm_setting_need_secrets;
+	nm_setting_ppp_error_get_type;
+	nm_setting_ppp_error_quark;
+	nm_setting_ppp_get_type;
+	nm_setting_ppp_new;
+	nm_setting_pppoe_error_get_type;
+	nm_setting_pppoe_error_quark;
+	nm_setting_pppoe_get_type;
+	nm_setting_pppoe_new;
+	nm_setting_register;
+	nm_setting_serial_error_get_type;
+	nm_setting_serial_error_quark;
+	nm_setting_serial_get_type;
+	nm_setting_serial_new;
+	nm_setting_to_hash;
+	nm_setting_to_string;
+	nm_setting_unregister;
+	nm_setting_update_secrets;
+	nm_setting_verify;
+	nm_setting_vpn_error_get_type;
+	nm_setting_vpn_error_quark;
+	nm_setting_vpn_get_type;
+	nm_setting_vpn_new;
+	nm_setting_wired_error_get_type;
+	nm_setting_wired_error_quark;
+	nm_setting_wired_get_type;
+	nm_setting_wired_new;
+	nm_setting_wireless_ap_security_compatible;
+	nm_setting_wireless_error_get_type;
+	nm_setting_wireless_error_quark;
+	nm_setting_wireless_get_type;
+	nm_setting_wireless_new;
+	nm_setting_wireless_security_error_get_type;
+	nm_setting_wireless_security_error_quark;
+	nm_setting_wireless_security_get_type;
+	nm_setting_wireless_security_new;
+	nm_utils_escape_ssid;
+	nm_utils_garray_to_string;
+	nm_utils_gvalue_hash_dup;
+	nm_utils_ip4_addresses_from_gvalue;
+	nm_utils_ip4_addresses_to_gvalue;
+	nm_utils_ip4_netmask_to_prefix;
+	nm_utils_ip4_prefix_to_netmask;
+	nm_utils_ip4_routes_from_gvalue;
+	nm_utils_ip4_routes_to_gvalue;
+	nm_utils_ip6_addresses_from_gvalue;
+	nm_utils_ip6_addresses_to_gvalue;
+	nm_utils_ip6_dns_from_gvalue;
+	nm_utils_ip6_dns_to_gvalue;
+	nm_utils_is_empty_ssid;
+	nm_utils_register_value_transformations;
+	nm_utils_same_ssid;
+	nm_utils_security_valid;
+	nm_utils_slist_free;
+	nm_utils_ssid_to_utf8;
+	nm_utils_string_in_list;
+	nm_utils_string_list_contains;
+	nm_utils_string_slist_validate;
+local:
+	*;
+};
-- 
1.5.6.3

From 2f737cb3dd195951bd509b7b63b83c814ebff7f4 Mon Sep 17 00:00:00 2001
From: Michael Biebl <biebl debian org>
Date: Wed, 13 Aug 2008 03:46:06 +0200
Subject: [PATCH] Remove test-crypto binary

The test-crypto binary no longer builds, as libnm-util doesn't export the
crypto functions anymore (they are not part of the public API).
---
 libnm-util/Makefile.am   |    6 --
 libnm-util/test-crypto.c |  173 ----------------------------------------------
 2 files changed, 0 insertions(+), 179 deletions(-)
 delete mode 100644 libnm-util/test-crypto.c

diff --git a/libnm-util/Makefile.am b/libnm-util/Makefile.am
index a7b577c..9a18cd6 100644
--- a/libnm-util/Makefile.am
+++ b/libnm-util/Makefile.am
@@ -67,12 +67,6 @@ endif
 
 libnm_util_includedir=$(includedir)/NetworkManager
 
-noinst_PROGRAMS = test-crypto
-
-test_crypto_SOURCES = test-crypto.c
-test_crypto_CPPFLAGS = $(GLIB_CFLAGS) -D_GNU_SOURCE
-test_crypto_LDADD = $(GLIB_LIBS) libnm-util.la
-
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libnm-util.pc
 
diff --git a/libnm-util/test-crypto.c b/libnm-util/test-crypto.c
deleted file mode 100644
index 1063b18..0000000
--- a/libnm-util/test-crypto.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
-
-/*
- * Dan Williams <dcbw redhat com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA.
- *
- * (C) Copyright 2007 - 2008 Red Hat, Inc.
- */
-
-#include <glib.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <glib/gi18n.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "crypto.h"
-
-static const char *pem_rsa_key_begin = "-----BEGIN RSA PRIVATE KEY-----";
-static const char *pem_rsa_key_end = "-----END RSA PRIVATE KEY-----";
-
-static const char *pem_dsa_key_begin = "-----BEGIN DSA PRIVATE KEY-----";
-static const char *pem_dsa_key_end = "-----END DSA PRIVATE KEY-----";
-
-static void
-dump_key_to_pem (const char *key, gsize key_len, int key_type)
-{
-	char *b64 = NULL;
-	GString *str = NULL;
-	const char *start_tag;
-	const char *end_tag;
-	char *p;
-
-	switch (key_type) {
-	case NM_CRYPTO_KEY_TYPE_RSA:
-		start_tag = pem_rsa_key_begin;
-		end_tag = pem_rsa_key_end;
-		break;
-	case NM_CRYPTO_KEY_TYPE_DSA:
-		start_tag = pem_dsa_key_begin;
-		end_tag = pem_dsa_key_end;
-		break;
-	default:
-		g_warning ("Unknown key type %d", key_type);
-		return;
-	}
-
-	b64 = g_base64_encode ((const unsigned char *) key, key_len);
-	if (!b64) {
-		g_warning ("Couldn't base64 encode the key.");
-		goto out;
-	}
-
-	str = g_string_new (NULL);
-	if (!str) {
-		g_warning ("Couldn't allocate buffer to write out key.");
-		goto out;
-	}
-
-	g_string_append (str, start_tag);
-	g_string_append_c (str, '\n');
-
-	for (p = b64; p < (b64 + strlen (b64)); p += 64) {
-		g_string_append_len (str, p, strnlen (p, 64));
-		g_string_append_c (str, '\n');
-	}
-
-	g_string_append (str, end_tag);
-	g_string_append_c (str, '\n');
-
-	g_message ("Decrypted private key:\n\n%s", str->str);
-
-out:
-	g_free (b64);
-	if (str)
-		g_string_free (str, TRUE);
-}
-
-static void
-usage (const char *prgname)
-{
-	fprintf (stderr, "Usage: %s cert <file>\n"
-	                 "       %s key <file> <password>\n",
-	                 prgname, prgname);
-}
-
-#define MODE_CERT 1
-#define MODE_KEY  2
-
-int main (int argc, char **argv)
-{
-	guint32 key_type = 0;
-	int mode = 0;
-	const char *file;
-	GError *error = NULL;
-
-	if (argc < 2) {
-		usage (argv[0]);
-		return 1;
-	}
-
-	if (!strcmp (argv[1], "key")) {
-		if (argc < 4) {
-			usage (argv[0]);
-			return 1;
-		}
-		mode = MODE_KEY;
-	} else if (!strcmp (argv[1], "cert")) {
-		if (argc < 3) {
-			usage (argv[0]);
-			return 1;
-		}
-		mode = MODE_CERT;
-	} else {
-		usage (argv[0]);
-		return 1;
-	}
-
-	if (!crypto_init (&error)) {
-		g_warning ("Couldn't initialize crypto library: %d %s.",
-		           error->code, error->message);
-		return 1;
-	}
-
-	file = argv[2];
-
-	if (mode == MODE_CERT) {
-		GByteArray *array;
-
-		array = crypto_load_and_verify_certificate (file, &error);
-		if (!array) {
-			g_warning ("Couldn't read certificate file '%s': %d %s",
-			           file, error->code, error->message);
-			goto out;
-		}
-		g_byte_array_free (array, TRUE);
-	} else if (mode == MODE_KEY) {
-		const char *password = argv[3];
-		GByteArray *array;
-
-		array = crypto_get_private_key (file, password, &key_type, &error);
-		if (!array) {
-			g_warning ("Couldn't read key file '%s': %d %s",
-			           file, error->code, error->message);
-			goto out;
-		}
-
-		dump_key_to_pem ((const char *) array->data, array->len, key_type);
-		g_byte_array_free (array, TRUE);
-	} else {
-		g_assert_not_reached ();
-	}
-
-out:
-	crypto_deinit ();
-
-	return 0;
-}
-
-- 
1.5.6.3

 dbus_glib_marshal_nm_exported_connection_BOOLEAN__POINTER_POINTER
 dbus_glib_marshal_nm_exported_connection_VOID__BOXED_POINTER
 dbus_glib_marshal_nm_exported_connection_VOID__STRING_BOXED_BOOLEAN_POINTER
 dbus_glib_marshal_nm_settings_BOOLEAN__POINTER_POINTER
 dbus_glib_nm_exported_connection_object_info
 dbus_glib_nm_settings_object_info
 libnm_glib_get_network_state
 libnm_glib_init
 libnm_glib_register_callback
 libnm_glib_shutdown
 libnm_glib_unregister_callback
 nm_access_point_get_flags
 nm_access_point_get_frequency
 nm_access_point_get_hw_address
 nm_access_point_get_max_bitrate
 nm_access_point_get_mode
 nm_access_point_get_rsn_flags
 nm_access_point_get_ssid
 nm_access_point_get_strength
 nm_access_point_get_type
 nm_access_point_get_wpa_flags
 nm_access_point_new
 nm_active_connection_get_connection
 nm_active_connection_get_default
 nm_active_connection_get_devices
 nm_active_connection_get_scope
 nm_active_connection_get_service_name
 nm_active_connection_get_specific_object
 nm_active_connection_get_state
 nm_active_connection_get_type
 nm_active_connection_new
 nm_cdma_device_get_type
 nm_cdma_device_new
 nm_client_activate_connection
 nm_client_deactivate_connection
 nm_client_get_active_connections
 nm_client_get_device_by_path
 nm_client_get_devices
 nm_client_get_manager_running
 nm_client_get_state
 nm_client_get_type
 nm_client_new
 nm_client_sleep
 nm_client_wireless_get_enabled
 nm_client_wireless_hardware_get_enabled
 nm_client_wireless_set_enabled
 nm_dbus_connection_get_type
 nm_dbus_connection_new
 nm_dbus_get_int_property
 nm_dbus_get_object_path_property
 nm_dbus_get_property
 nm_dbus_get_string_property
 nm_dbus_get_uint_property
 nm_dbus_introspect
 nm_dbus_set_property
 nm_dbus_settings_get_connection_by_path
 nm_dbus_settings_get_type
 nm_dbus_settings_new
 nm_dbus_settings_system_add_connection
 nm_dbus_settings_system_get_type
 nm_dbus_settings_system_get_unmanaged_devices
 nm_dbus_settings_system_new
 nm_device_ethernet_get_carrier
 nm_device_ethernet_get_hw_address
 nm_device_ethernet_get_speed
 nm_device_ethernet_get_type
 nm_device_ethernet_new
 nm_device_get_capabilities
 nm_device_get_dhcp4_config
 nm_device_get_driver
 nm_device_get_iface
 nm_device_get_ip4_config
 nm_device_get_managed
 nm_device_get_product
 nm_device_get_state
 nm_device_get_type
 nm_device_get_udi
 nm_device_get_vendor
 nm_device_new
 nm_device_wifi_get_access_point_by_path
 nm_device_wifi_get_access_points
 nm_device_wifi_get_active_access_point
 nm_device_wifi_get_bitrate
 nm_device_wifi_get_capabilities
 nm_device_wifi_get_hw_address
 nm_device_wifi_get_mode
 nm_device_wifi_get_type
 nm_device_wifi_new
 nm_device_wifi_set_wireless_enabled
 nm_dhcp4_config_get_one_option
 nm_dhcp4_config_get_options
 nm_dhcp4_config_get_type
 nm_dhcp4_config_new
 nm_exported_connection_delete
 nm_exported_connection_get_connection
 nm_exported_connection_get_id
 nm_exported_connection_get_type
 nm_exported_connection_new
 nm_exported_connection_register_object
 nm_exported_connection_signal_removed
 nm_exported_connection_signal_updated
 nm_exported_connection_update
 nm_gsm_device_get_type
 nm_gsm_device_new
 nm_ip4_config_get_addresses
 nm_ip4_config_get_domains
 nm_ip4_config_get_hostname
 nm_ip4_config_get_nameservers
 nm_ip4_config_get_routes
 nm_ip4_config_get_type
 nm_ip4_config_new
 nm_marshal_VOID__OBJECT_OBJECT_ENUM
 nm_marshal_VOID__OBJECT_POINTER
 nm_marshal_VOID__OBJECT_POINTER_UINT
 nm_marshal_VOID__OBJECT_STRING
 nm_marshal_VOID__OBJECT_STRING_UINT
 nm_marshal_VOID__OBJECT_UINT
 nm_marshal_VOID__OBJECT_UINT_UINT
 nm_marshal_VOID__POINTER_STRING
 nm_marshal_VOID__STRING_INT
 nm_marshal_VOID__STRING_OBJECT
 nm_marshal_VOID__STRING_STRING
 nm_marshal_VOID__STRING_STRING_POINTER
 nm_marshal_VOID__STRING_STRING_STRING
 nm_marshal_VOID__STRING_UCHAR
 nm_marshal_VOID__STRING_UINT
 nm_marshal_VOID__UINT_UINT
 nm_marshal_VOID__UINT_UINT_UINT
 nm_object_array_demarshal
 nm_object_array_get_type
 nm_object_cache_add
 nm_object_cache_get
 nm_object_cache_remove_by_object
 nm_object_cache_remove_by_path
 nm_object_demarshal_generic
 nm_object_get_boolean_property
 nm_object_get_byte_array_property
 nm_object_get_byte_property
 nm_object_get_connection
 nm_object_get_double_property
 nm_object_get_int_property
 nm_object_get_object_path_property
 nm_object_get_path
 nm_object_get_property
 nm_object_get_string_property
 nm_object_get_type
 nm_object_get_uint_property
 nm_object_handle_properties_changed
 nm_object_queue_notify
 nm_object_set_property
 nm_serial_device_get_bytes_received
 nm_serial_device_get_bytes_sent
 nm_serial_device_get_type
 nm_settings_error_quark
 nm_settings_get_type
 nm_settings_list_connections
 nm_settings_signal_new_connection
 nm_ssid_demarshal
 nm_ssid_get_type
 nm_string_array_demarshal
 nm_string_array_get_type
 nm_uint_array_demarshal
 nm_uint_array_get_type
 nm_vpn_connection_get_banner
 nm_vpn_connection_get_type
 nm_vpn_connection_get_vpn_state
 nm_vpn_connection_new
--- libnm-glib0.symbols.save	2008-08-13 04:29:17.000000000 +0200
+++ libnm-glib0.symbols	2008-08-13 04:15:42.000000000 +0200
@@ -1,10 +1,4 @@
- dbus_glib_marshal_nm_exported_connection_BOOLEAN__POINTER_POINTER
- dbus_glib_marshal_nm_exported_connection_VOID__BOXED_POINTER
- dbus_glib_marshal_nm_exported_connection_VOID__STRING_BOXED_BOOLEAN_POINTER
- dbus_glib_marshal_nm_settings_BOOLEAN__POINTER_POINTER
- dbus_glib_nm_exported_connection_object_info
- dbus_glib_nm_settings_object_info
  libnm_glib_get_network_state
  libnm_glib_init
  libnm_glib_register_callback
@@ -47,13 +41,6 @@
  nm_client_wireless_set_enabled
  nm_dbus_connection_get_type
  nm_dbus_connection_new
- nm_dbus_get_int_property
- nm_dbus_get_object_path_property
- nm_dbus_get_property
- nm_dbus_get_string_property
- nm_dbus_get_uint_property
- nm_dbus_introspect
- nm_dbus_set_property
  nm_dbus_settings_get_connection_by_path
  nm_dbus_settings_get_type
  nm_dbus_settings_new
@@ -87,7 +74,6 @@
  nm_device_wifi_get_mode
  nm_device_wifi_get_type
  nm_device_wifi_new
- nm_device_wifi_set_wireless_enabled
  nm_dhcp4_config_get_one_option
  nm_dhcp4_config_get_options
  nm_dhcp4_config_get_type
@@ -110,45 +96,10 @@
  nm_ip4_config_get_routes
  nm_ip4_config_get_type
  nm_ip4_config_new
- nm_marshal_VOID__OBJECT_OBJECT_ENUM
- nm_marshal_VOID__OBJECT_POINTER
- nm_marshal_VOID__OBJECT_POINTER_UINT
- nm_marshal_VOID__OBJECT_STRING
- nm_marshal_VOID__OBJECT_STRING_UINT
- nm_marshal_VOID__OBJECT_UINT
- nm_marshal_VOID__OBJECT_UINT_UINT
- nm_marshal_VOID__POINTER_STRING
- nm_marshal_VOID__STRING_INT
- nm_marshal_VOID__STRING_OBJECT
- nm_marshal_VOID__STRING_STRING
- nm_marshal_VOID__STRING_STRING_POINTER
- nm_marshal_VOID__STRING_STRING_STRING
- nm_marshal_VOID__STRING_UCHAR
- nm_marshal_VOID__STRING_UINT
- nm_marshal_VOID__UINT_UINT
- nm_marshal_VOID__UINT_UINT_UINT
- nm_object_array_demarshal
  nm_object_array_get_type
- nm_object_cache_add
- nm_object_cache_get
- nm_object_cache_remove_by_object
- nm_object_cache_remove_by_path
- nm_object_demarshal_generic
- nm_object_get_boolean_property
- nm_object_get_byte_array_property
- nm_object_get_byte_property
  nm_object_get_connection
- nm_object_get_double_property
- nm_object_get_int_property
- nm_object_get_object_path_property
  nm_object_get_path
- nm_object_get_property
- nm_object_get_string_property
  nm_object_get_type
- nm_object_get_uint_property
- nm_object_handle_properties_changed
- nm_object_queue_notify
- nm_object_set_property
  nm_serial_device_get_bytes_received
  nm_serial_device_get_bytes_sent
  nm_serial_device_get_type
@@ -156,11 +107,8 @@
  nm_settings_get_type
  nm_settings_list_connections
  nm_settings_signal_new_connection
- nm_ssid_demarshal
  nm_ssid_get_type
- nm_string_array_demarshal
  nm_string_array_get_type
- nm_uint_array_demarshal
  nm_uint_array_get_type
  nm_vpn_connection_get_banner
  nm_vpn_connection_get_type
 dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__BOXED_POINTER
 dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__BOXED_POINTER_POINTER
 dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__POINTER
 dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__STRING_POINTER
 dbus_glib_nm_vpn_plugin_object_info
 nm_vpn_plugin_disconnect
 nm_vpn_plugin_error_get_type
 nm_vpn_plugin_error_quark
 nm_vpn_plugin_failure
 nm_vpn_plugin_get_connection
 nm_vpn_plugin_get_state
 nm_vpn_plugin_get_type
 nm_vpn_plugin_set_ip4_config
 nm_vpn_plugin_set_login_banner
 nm_vpn_plugin_set_state
 nm_vpn_plugin_ui_interface_export
 nm_vpn_plugin_ui_interface_get_capabilities
 nm_vpn_plugin_ui_interface_get_suggested_name
 nm_vpn_plugin_ui_interface_get_type
 nm_vpn_plugin_ui_interface_import
 nm_vpn_plugin_ui_interface_ui_factory
 nm_vpn_plugin_ui_widget_interface_get_type
 nm_vpn_plugin_ui_widget_interface_get_widget
 nm_vpn_plugin_ui_widget_interface_update_connection
--- libnm-glib-vpn0.symbols.save	2008-08-13 04:29:17.000000000 +0200
+++ libnm-glib-vpn0.symbols	2008-08-13 04:17:49.000000000 +0200
@@ -1,9 +1,4 @@
- dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__BOXED_POINTER
- dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__BOXED_POINTER_POINTER
- dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__POINTER
- dbus_glib_marshal_nm_vpn_plugin_BOOLEAN__STRING_POINTER
- dbus_glib_nm_vpn_plugin_object_info
  nm_vpn_plugin_disconnect
  nm_vpn_plugin_error_get_type
  nm_vpn_plugin_error_quark
 crypto_decrypt
 crypto_deinit
 crypto_get_private_key
 crypto_init
 crypto_load_and_verify_certificate
 crypto_md5_hash
 crypto_verify_cert
 nm_connection_add_setting
 nm_connection_clear_secrets
 nm_connection_compare
 nm_connection_create_setting
 nm_connection_dump
 nm_connection_duplicate
 nm_connection_error_get_type
 nm_connection_error_quark
 nm_connection_for_each_setting_value
 nm_connection_get_path
 nm_connection_get_scope
 nm_connection_get_setting
 nm_connection_get_setting_by_name
 nm_connection_get_type
 nm_connection_lookup_setting_type
 nm_connection_lookup_setting_type_by_quark
 nm_connection_need_secrets
 nm_connection_new
 nm_connection_new_from_hash
 nm_connection_remove_setting
 nm_connection_replace_settings
 nm_connection_set_path
 nm_connection_set_scope
 nm_connection_to_hash
 nm_connection_update_secrets
 nm_connection_verify
 nm_crypto_error_quark
 nm_param_spec_specialized
 nm_param_spec_specialized_get_type
 nm_setting_802_1x_error_get_type
 nm_setting_802_1x_error_quark
 nm_setting_802_1x_get_type
 nm_setting_802_1x_new
 nm_setting_802_1x_set_ca_cert
 nm_setting_802_1x_set_client_cert
 nm_setting_802_1x_set_phase2_ca_cert
 nm_setting_802_1x_set_phase2_client_cert
 nm_setting_802_1x_set_phase2_private_key
 nm_setting_802_1x_set_private_key
 nm_setting_cdma_error_get_type
 nm_setting_cdma_error_quark
 nm_setting_cdma_get_type
 nm_setting_cdma_new
 nm_setting_clear_secrets
 nm_setting_compare
 nm_setting_connection_error_get_type
 nm_setting_connection_error_quark
 nm_setting_connection_get_type
 nm_setting_connection_new
 nm_setting_duplicate
 nm_setting_enumerate_values
 nm_setting_from_hash
 nm_setting_get_name
 nm_setting_get_type
 nm_setting_gsm_error_get_type
 nm_setting_gsm_error_quark
 nm_setting_gsm_get_type
 nm_setting_gsm_new
 nm_setting_ip4_config_error_get_type
 nm_setting_ip4_config_error_quark
 nm_setting_ip4_config_get_type
 nm_setting_ip4_config_new
 nm_setting_ip6_config_error_get_type
 nm_setting_ip6_config_error_quark
 nm_setting_ip6_config_get_type
 nm_setting_ip6_config_new
 nm_setting_need_secrets
 nm_setting_ppp_error_get_type
 nm_setting_ppp_error_quark
 nm_setting_ppp_get_type
 nm_setting_ppp_new
 nm_setting_pppoe_error_get_type
 nm_setting_pppoe_error_quark
 nm_setting_pppoe_get_type
 nm_setting_pppoe_new
 nm_setting_register
 nm_setting_serial_error_get_type
 nm_setting_serial_error_quark
 nm_setting_serial_get_type
 nm_setting_serial_new
 nm_setting_to_hash
 nm_setting_to_string
 nm_setting_unregister
 nm_setting_update_secrets
 nm_setting_verify
 nm_setting_vpn_error_get_type
 nm_setting_vpn_error_quark
 nm_setting_vpn_get_type
 nm_setting_vpn_new
 nm_setting_wired_error_get_type
 nm_setting_wired_error_quark
 nm_setting_wired_get_type
 nm_setting_wired_new
 nm_setting_wireless_ap_security_compatible
 nm_setting_wireless_error_get_type
 nm_setting_wireless_error_quark
 nm_setting_wireless_get_type
 nm_setting_wireless_new
 nm_setting_wireless_security_error_get_type
 nm_setting_wireless_security_error_quark
 nm_setting_wireless_security_get_type
 nm_setting_wireless_security_new
 nm_utils_escape_ssid
 nm_utils_garray_to_string
 nm_utils_gvalue_hash_dup
 nm_utils_ip4_addresses_from_gvalue
 nm_utils_ip4_addresses_to_gvalue
 nm_utils_ip4_netmask_to_prefix
 nm_utils_ip4_prefix_to_netmask
 nm_utils_ip4_routes_from_gvalue
 nm_utils_ip4_routes_to_gvalue
 nm_utils_ip6_addresses_from_gvalue
 nm_utils_ip6_addresses_to_gvalue
 nm_utils_ip6_dns_from_gvalue
 nm_utils_ip6_dns_to_gvalue
 nm_utils_is_empty_ssid
 nm_utils_register_value_transformations
 nm_utils_same_ssid
 nm_utils_security_valid
 nm_utils_slist_free
 nm_utils_ssid_to_utf8
 nm_utils_string_in_list
 nm_utils_string_list_contains
 nm_utils_string_slist_validate
--- libnm-util0.symbols.save	2008-08-13 04:29:17.000000000 +0200
+++ libnm-util0.symbols	2008-08-13 04:26:29.000000000 +0200
@@ -1,11 +1,4 @@
- crypto_decrypt
- crypto_deinit
- crypto_get_private_key
- crypto_init
- crypto_load_and_verify_certificate
- crypto_md5_hash
- crypto_verify_cert
  nm_connection_add_setting
  nm_connection_clear_secrets
  nm_connection_compare
@@ -32,9 +25,6 @@
  nm_connection_to_hash
  nm_connection_update_secrets
  nm_connection_verify
- nm_crypto_error_quark
- nm_param_spec_specialized
- nm_param_spec_specialized_get_type
  nm_setting_802_1x_error_get_type
  nm_setting_802_1x_error_quark
  nm_setting_802_1x_get_type

Attachment: signature.asc
Description: OpenPGP digital signature



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