diff options
Diffstat (limited to 'src/dhcp-manager/nm-dhcp-manager.c')
| -rw-r--r-- | src/dhcp-manager/nm-dhcp-manager.c | 380 |
1 files changed, 205 insertions, 175 deletions
diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index d40eb48d..ab6966cb 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -15,7 +15,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * - * Copyright (C) 2005 - 2010 Red Hat, Inc. + * Copyright (C) 2005 - 2013 Red Hat, Inc. * Copyright (C) 2006 - 2008 Novell, Inc. * */ @@ -37,12 +37,12 @@ #include "nm-dhcp-manager.h" #include "nm-dhcp-dhclient.h" #include "nm-dhcp-dhcpcd.h" -#include "nm-marshal.h" #include "nm-logging.h" #include "nm-dbus-manager.h" -#include "nm-hostname-provider.h" +#include "nm-config.h" #include "nm-dbus-glib-types.h" #include "nm-glib-compat.h" +#include "NetworkManagerUtils.h" GQuark nm_dhcp_manager_error_quark (void) @@ -55,23 +55,30 @@ nm_dhcp_manager_error_quark (void) return ret; } -#define NM_DHCP_CLIENT_DBUS_SERVICE "org.freedesktop.nm_dhcp_client" #define NM_DHCP_CLIENT_DBUS_IFACE "org.freedesktop.nm_dhcp_client" #define DHCP_TIMEOUT 45 /* default DHCP timeout, in seconds */ -static NMDHCPManager *singleton = NULL; +#define PRIV_SOCK_PATH NMRUNDIR "/private-dhcp" +#define PRIV_SOCK_TAG "dhcp" + +/* default to installed helper, but can be modified for testing */ +const char *nm_dhcp_helper_path = LIBEXECDIR "/nm-dhcp-helper"; typedef GSList * (*GetLeaseConfigFunc) (const char *iface, const char *uuid, gboolean ipv6); typedef struct { GType client_type; - GetLeaseConfigFunc get_lease_config_func; + GetLeaseConfigFunc get_lease_ip_configs_func; NMDBusManager * dbus_mgr; + guint new_conn_id; + guint dis_conn_id; + GHashTable * proxies; + GHashTable * clients; DBusGProxy * proxy; - NMHostnameProvider *hostname_provider; + char * default_hostname; } NMDHCPManagerPrivate; @@ -119,7 +126,6 @@ get_client_for_pid (NMDHCPManager *manager, GPid pid) GHashTableIter iter; gpointer value; - g_return_val_if_fail (manager != NULL, NULL); g_return_val_if_fail (NM_IS_DHCP_MANAGER (manager), NULL); priv = NM_DHCP_MANAGER_GET_PRIVATE (manager); @@ -144,7 +150,6 @@ get_client_for_iface (NMDHCPManager *manager, GHashTableIter iter; gpointer value; - g_return_val_if_fail (manager != NULL, NULL); g_return_val_if_fail (NM_IS_DHCP_MANAGER (manager), NULL); g_return_val_if_fail (iface, NULL); @@ -186,50 +191,46 @@ nm_dhcp_manager_handle_event (DBusGProxy *proxy, GHashTable *options, gpointer user_data) { - NMDHCPManager *manager; - NMDHCPManagerPrivate *priv; + NMDHCPManager *manager = NM_DHCP_MANAGER (user_data); NMDHCPClient *client; char *iface = NULL; char *pid_str = NULL; char *reason = NULL; - unsigned long temp; - - manager = NM_DHCP_MANAGER (user_data); - priv = NM_DHCP_MANAGER_GET_PRIVATE (manager); + long pid; iface = get_option (options, "interface"); if (iface == NULL) { - nm_log_warn (LOGD_DHCP, "DHCP event didn't have associated interface."); + nm_log_warn (LOGD_DHCP, "DHCP event: didn't have associated interface."); goto out; } pid_str = get_option (options, "pid"); - if (pid_str == NULL) { - nm_log_warn (LOGD_DHCP, "DHCP event didn't have associated PID."); - goto out; - } - - temp = strtoul (pid_str, NULL, 10); - if ((temp == ULONG_MAX) && (errno == ERANGE)) { - nm_log_warn (LOGD_DHCP, "couldn't convert PID"); + pid = nm_utils_ascii_str_to_int64 (pid_str, 10, 0, LONG_MAX, -1); + if (pid == -1 || pid != (GPid)pid) { + nm_log_warn (LOGD_DHCP, "DHCP event: couldn't convert PID '%s' to an integer", pid_str ? pid_str : "(null)"); goto out; } - client = get_client_for_pid (manager, (GPid) temp); + reason = get_option (options, "reason"); + client = get_client_for_pid (manager, (GPid) pid); if (client == NULL) { - nm_log_warn (LOGD_DHCP, "(pid %ld) unhandled DHCP event for interface %s", temp, iface); + if (reason && g_ascii_strcasecmp (reason, "RELEASE") == 0) { + /* This happens regularly, when the dhcp client gets killed and we receive its last message. + * Don't log a warning in this case. */ + nm_log_dbg (LOGD_DHCP, "(pid %ld) unhandled RELEASE DHCP event for interface %s", pid, iface); + } else + nm_log_warn (LOGD_DHCP, "(pid %ld) unhandled DHCP event for interface %s", pid, iface); goto out; } if (strcmp (iface, nm_dhcp_client_get_iface (client))) { nm_log_warn (LOGD_DHCP, "(pid %ld) received DHCP event from unexpected interface '%s' (expected '%s')", - temp, iface, nm_dhcp_client_get_iface (client)); + pid, iface, nm_dhcp_client_get_iface (client)); goto out; } - reason = get_option (options, "reason"); if (reason == NULL) { - nm_log_warn (LOGD_DHCP, "(pid %ld) DHCP event didn't have a reason", temp); + nm_log_warn (LOGD_DHCP, "(pid %ld) DHCP event didn't have a reason", pid); goto out; } @@ -241,6 +242,48 @@ out: g_free (reason); } +#if HAVE_DBUS_GLIB_100 +static void +new_connection_cb (NMDBusManager *mgr, + DBusGConnection *connection, + NMDHCPManager *self) +{ + NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); + DBusGProxy *proxy; + + /* Create a new proxy for the client */ + proxy = dbus_g_proxy_new_for_peer (connection, "/", NM_DHCP_CLIENT_DBUS_IFACE); + dbus_g_proxy_add_signal (proxy, + "Event", + DBUS_TYPE_G_MAP_OF_VARIANT, + G_TYPE_INVALID); + dbus_g_proxy_connect_signal (proxy, + "Event", + G_CALLBACK (nm_dhcp_manager_handle_event), + self, + NULL); + g_hash_table_insert (priv->proxies, connection, proxy); +} + +static void +dis_connection_cb (NMDBusManager *mgr, + DBusGConnection *connection, + NMDHCPManager *self) +{ + NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); + DBusGProxy *proxy; + + proxy = g_hash_table_lookup (priv->proxies, connection); + if (proxy) { + dbus_g_proxy_disconnect_signal (proxy, + "Event", + G_CALLBACK (nm_dhcp_manager_handle_event), + self); + g_hash_table_remove (priv->proxies, connection); + } +} +#endif + static GType get_client_type (const char *client, GError **error) { @@ -250,8 +293,10 @@ get_client_type (const char *client, GError **error) /* If a client was disabled at build-time, its *_PATH define will be * an empty string. */ + /* coverity[array_null] */ if (DHCLIENT_PATH && strlen (DHCLIENT_PATH)) dhclient_path = nm_dhcp_dhclient_get_path (DHCLIENT_PATH); + /* coverity[array_null] */ if (DHCPCD_PATH && strlen (DHCPCD_PATH)) dhcpcd_path = nm_dhcp_dhcpcd_get_path (DHCPCD_PATH); @@ -264,7 +309,7 @@ get_client_type (const char *client, GError **error) g_set_error_literal (error, NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT, _("no usable DHCP client could be found.")); - return 0; + return G_TYPE_INVALID; } } @@ -273,7 +318,7 @@ get_client_type (const char *client, GError **error) g_set_error_literal (error, NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT, _("'dhclient' could be found.")); - return 0; + return G_TYPE_INVALID; } return NM_TYPE_DHCP_DHCLIENT; } @@ -283,7 +328,7 @@ get_client_type (const char *client, GError **error) g_set_error_literal (error, NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT, _("'dhcpcd' could be found.")); - return 0; + return G_TYPE_INVALID; } return NM_TYPE_DHCP_DHCPCD; } @@ -291,54 +336,7 @@ get_client_type (const char *client, GError **error) g_set_error (error, NM_DHCP_MANAGER_ERROR, NM_DHCP_MANAGER_ERROR_BAD_CLIENT, _("unsupported DHCP client '%s'"), client); - return 0; -} - -NMDHCPManager * -nm_dhcp_manager_new (const char *client, GError **error) -{ - NMDHCPManagerPrivate *priv; - DBusGConnection *g_connection; - - g_warn_if_fail (singleton == NULL); - - singleton = g_object_new (NM_TYPE_DHCP_MANAGER, NULL); - priv = NM_DHCP_MANAGER_GET_PRIVATE (singleton); - - /* Client-specific setup */ - priv->client_type = get_client_type (client, error); - if (priv->client_type == NM_TYPE_DHCP_DHCLIENT) - priv->get_lease_config_func = nm_dhcp_dhclient_get_lease_config; - else if (priv->client_type == NM_TYPE_DHCP_DHCPCD) - priv->get_lease_config_func = nm_dhcp_dhcpcd_get_lease_config; - else { - nm_log_warn (LOGD_DHCP, "No usable DHCP client found! DHCP configurations will fail."); - } - - priv->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, - (GDestroyNotify) g_object_unref); - g_assert (priv->clients); - - priv->dbus_mgr = nm_dbus_manager_get (); - g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr); - priv->proxy = dbus_g_proxy_new_for_name (g_connection, - NM_DHCP_CLIENT_DBUS_SERVICE, - "/", - NM_DHCP_CLIENT_DBUS_IFACE); - g_assert (priv->proxy); - - dbus_g_proxy_add_signal (priv->proxy, - "Event", - DBUS_TYPE_G_MAP_OF_VARIANT, - G_TYPE_INVALID); - - dbus_g_proxy_connect_signal (priv->proxy, "Event", - G_CALLBACK (nm_dhcp_manager_handle_event), - singleton, - NULL); - - return singleton; + return G_TYPE_INVALID; } #define REMOVE_ID_TAG "remove-id" @@ -372,10 +370,10 @@ add_client (NMDHCPManager *self, NMDHCPClient *client) NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); guint id; - id = g_signal_connect_swapped (client, "remove", G_CALLBACK (remove_client), self); + id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_REMOVE, G_CALLBACK (remove_client), self); g_object_set_data (G_OBJECT (client), REMOVE_ID_TAG, GUINT_TO_POINTER (id)); - id = g_signal_connect_swapped (client, "timeout", G_CALLBACK (remove_client), self); + id = g_signal_connect_swapped (client, NM_DHCP_CLIENT_SIGNAL_TIMEOUT, G_CALLBACK (remove_client), self); g_object_set_data (G_OBJECT (client), TIMEOUT_ID_TAG, GUINT_TO_POINTER (id)); g_hash_table_insert (priv->clients, client, g_object_ref (client)); @@ -386,11 +384,11 @@ client_start (NMDHCPManager *self, const char *iface, const GByteArray *hwaddr, const char *uuid, + guint priority, gboolean ipv6, - NMSettingIP4Config *s_ip4, - NMSettingIP6Config *s_ip6, + const char *dhcp_client_id, guint32 timeout, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, const char *hostname, gboolean info_only) { @@ -421,15 +419,16 @@ client_start (NMDHCPManager *self, NM_DHCP_CLIENT_HWADDR, hwaddr, NM_DHCP_CLIENT_IPV6, ipv6, NM_DHCP_CLIENT_UUID, uuid, + NM_DHCP_CLIENT_PRIORITY, priority, NM_DHCP_CLIENT_TIMEOUT, timeout ? timeout : DHCP_TIMEOUT, NULL); g_return_val_if_fail (client != NULL, NULL); add_client (self, client); if (ipv6) - success = nm_dhcp_client_start_ip6 (client, s_ip6, dhcp_anycast_addr, hostname, info_only); + success = nm_dhcp_client_start_ip6 (client, dhcp_anycast_addr, hostname, info_only); else - success = nm_dhcp_client_start_ip4 (client, s_ip4, dhcp_anycast_addr, hostname); + success = nm_dhcp_client_start_ip4 (client, dhcp_client_id, dhcp_anycast_addr, hostname); if (!success) { remove_client (self, client); @@ -440,54 +439,42 @@ client_start (NMDHCPManager *self, return client; } +static const char * +get_send_hostname (NMDHCPManager *self, const char *setting_hostname) +{ + NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); + + /* Always prefer the explicit dhcp-send-hostname if given */ + return setting_hostname ? setting_hostname : priv->default_hostname; +} + /* Caller owns a reference to the NMDHCPClient on return */ NMDHCPClient * nm_dhcp_manager_start_ip4 (NMDHCPManager *self, const char *iface, const GByteArray *hwaddr, const char *uuid, + guint priority, NMSettingIP4Config *s_ip4, guint32 timeout, - guint8 *dhcp_anycast_addr) + GByteArray *dhcp_anycast_addr) { - NMDHCPManagerPrivate *priv; - const char *hostname = NULL; - gboolean send_hostname = TRUE; + const char *hostname = NULL, *method; + gboolean send_hostname; g_return_val_if_fail (self, NULL); g_return_val_if_fail (NM_IS_DHCP_MANAGER (self), NULL); - priv = NM_DHCP_MANAGER_GET_PRIVATE (self); - - if (s_ip4) { - const char *method = nm_setting_ip4_config_get_method (s_ip4); - - if (method) { - /* Method must be 'auto' */ - g_return_val_if_fail (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0, NULL); - } - - send_hostname = nm_setting_ip4_config_get_dhcp_send_hostname (s_ip4); - if (send_hostname) - hostname = nm_setting_ip4_config_get_dhcp_hostname (s_ip4); - } + method = nm_setting_ip4_config_get_method (s_ip4); + g_return_val_if_fail (strcmp (method, NM_SETTING_IP4_CONFIG_METHOD_AUTO) == 0, NULL); - if (send_hostname) { - /* If we're supposed to send the hostname to the DHCP server but - * the user didn't specify one, then use the hostname from the - * hostname provider if there is one, otherwise use the persistent - * hostname. - */ - if (!hostname && priv->hostname_provider) { - hostname = nm_hostname_provider_get_hostname (priv->hostname_provider); - if ( hostname - && (!strcmp (hostname, "localhost.localdomain") || - !strcmp (hostname, "localhost6.localdomain6"))) - hostname = NULL; - } - } + send_hostname = nm_setting_ip4_config_get_dhcp_send_hostname (s_ip4); + if (send_hostname) + hostname = get_send_hostname (self, nm_setting_ip4_config_get_dhcp_hostname (s_ip4)); - return client_start (self, iface, hwaddr, uuid, FALSE, s_ip4, NULL, timeout, dhcp_anycast_addr, hostname, FALSE); + return client_start (self, iface, hwaddr, uuid, priority, FALSE, + nm_setting_ip4_config_get_dhcp_client_id (s_ip4), + timeout, dhcp_anycast_addr, hostname, FALSE); } /* Caller owns a reference to the NMDHCPClient on return */ @@ -496,63 +483,42 @@ nm_dhcp_manager_start_ip6 (NMDHCPManager *self, const char *iface, const GByteArray *hwaddr, const char *uuid, + guint priority, NMSettingIP6Config *s_ip6, guint32 timeout, - guint8 *dhcp_anycast_addr, + GByteArray *dhcp_anycast_addr, gboolean info_only) { - NMDHCPManagerPrivate *priv; - const char *hostname = NULL; + const char *hostname; - g_return_val_if_fail (self, NULL); g_return_val_if_fail (NM_IS_DHCP_MANAGER (self), NULL); - priv = NM_DHCP_MANAGER_GET_PRIVATE (self); - - if (s_ip6) - hostname = nm_setting_ip6_config_get_dhcp_hostname (s_ip6); - if (!hostname && priv->hostname_provider) { - hostname = nm_hostname_provider_get_hostname (priv->hostname_provider); - if ( g_strcmp0 (hostname, "localhost.localdomain") == 0 - || g_strcmp0 (hostname, "localhost6.localdomain6") == 0) - hostname = NULL; - } - - return client_start (self, iface, hwaddr, uuid, TRUE, NULL, s_ip6, timeout, dhcp_anycast_addr, hostname, info_only); -} + hostname = get_send_hostname (self, nm_setting_ip6_config_get_dhcp_hostname (s_ip6)); -static void -hostname_provider_destroyed (gpointer data, GObject *destroyed_object) -{ - NM_DHCP_MANAGER_GET_PRIVATE (data)->hostname_provider = NULL; + return client_start (self, iface, hwaddr, uuid, priority, TRUE, + NULL, timeout, dhcp_anycast_addr, hostname, info_only); } void -nm_dhcp_manager_set_hostname_provider (NMDHCPManager *manager, - NMHostnameProvider *provider) +nm_dhcp_manager_set_default_hostname (NMDHCPManager *manager, const char *hostname) { - NMDHCPManagerPrivate *priv; - - g_return_if_fail (NM_IS_DHCP_MANAGER (manager)); + NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (manager); - priv = NM_DHCP_MANAGER_GET_PRIVATE (manager); + g_clear_pointer (&priv->default_hostname, g_free); - if (priv->hostname_provider) { - g_object_weak_unref (G_OBJECT (priv->hostname_provider), hostname_provider_destroyed, manager); - priv->hostname_provider = NULL; - } + /* Never send 'localhost'-type names to the DHCP server */ + if (g_strcmp0 (hostname, "localhost.localdomain") == 0 || + g_strcmp0 (hostname, "localhost6.localdomain6") == 0) + return; - if (provider) { - priv->hostname_provider = provider; - g_object_weak_ref (G_OBJECT (provider), hostname_provider_destroyed, manager); - } + priv->default_hostname = g_strdup (hostname); } GSList * -nm_dhcp_manager_get_lease_config (NMDHCPManager *self, - const char *iface, - const char *uuid, - gboolean ipv6) +nm_dhcp_manager_get_lease_ip_configs (NMDHCPManager *self, + const char *iface, + const char *uuid, + gboolean ipv6) { NMDHCPManagerPrivate *priv; @@ -562,10 +528,8 @@ nm_dhcp_manager_get_lease_config (NMDHCPManager *self, priv = NM_DHCP_MANAGER_GET_PRIVATE (self); - if (priv->get_lease_config_func) - return priv->get_lease_config_func (iface, uuid, ipv6); - - nm_log_warn (LOGD_DHCP, "Cannot get a DHCP lease config (no usable DHCP client was found!)"); + if (priv->get_lease_ip_configs_func) + return priv->get_lease_ip_configs_func (iface, uuid, ipv6); return NULL; } @@ -603,13 +567,70 @@ nm_dhcp_manager_test_ip4_options_to_config (const char *dhcp_client, NMDHCPManager * nm_dhcp_manager_get (void) { - g_warn_if_fail (singleton != NULL); - return g_object_ref (singleton); + static NMDHCPManager *singleton = NULL; + + if (G_UNLIKELY (singleton == NULL)) + singleton = g_object_new (NM_TYPE_DHCP_MANAGER, NULL); + g_assert (singleton); + return singleton; } static void -nm_dhcp_manager_init (NMDHCPManager *manager) +nm_dhcp_manager_init (NMDHCPManager *self) { + NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (self); + const char *client; + GError *error = NULL; +#if !HAVE_DBUS_GLIB_100 + DBusGConnection *g_connection; +#endif + + /* Maps DBusGConnection :: DBusGProxy */ + priv->proxies = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref); + + /* Client-specific setup */ + client = nm_config_get_dhcp_client (nm_config_get ()); + priv->client_type = get_client_type (client, &error); + + if (priv->client_type == NM_TYPE_DHCP_DHCLIENT) + priv->get_lease_ip_configs_func = nm_dhcp_dhclient_get_lease_ip_configs; + else if (priv->client_type == G_TYPE_INVALID) { + nm_log_warn (LOGD_DHCP, "No usable DHCP client found (%s)! DHCP configurations will fail.", + error->message); + } + g_clear_error (&error); + + priv->clients = g_hash_table_new_full (g_direct_hash, g_direct_equal, + NULL, + (GDestroyNotify) g_object_unref); + g_assert (priv->clients); + + priv->dbus_mgr = nm_dbus_manager_get (); + +#if HAVE_DBUS_GLIB_100 + /* Register the socket our DHCP clients will return lease info on */ + nm_dbus_manager_private_server_register (priv->dbus_mgr, PRIV_SOCK_PATH, PRIV_SOCK_TAG); + priv->new_conn_id = g_signal_connect (priv->dbus_mgr, + NM_DBUS_MANAGER_PRIVATE_CONNECTION_NEW "::" PRIV_SOCK_TAG, + (GCallback) new_connection_cb, + self); + priv->dis_conn_id = g_signal_connect (priv->dbus_mgr, + NM_DBUS_MANAGER_PRIVATE_CONNECTION_DISCONNECTED "::" PRIV_SOCK_TAG, + (GCallback) dis_connection_cb, + self); +#else + g_connection = nm_dbus_manager_get_connection (priv->dbus_mgr); + priv->proxy = dbus_g_proxy_new_for_name (g_connection, + "org.freedesktop.nm_dhcp_client", + "/", + NM_DHCP_CLIENT_DBUS_IFACE); + g_assert (priv->proxy); + dbus_g_proxy_add_signal (priv->proxy, "Event", DBUS_TYPE_G_MAP_OF_VARIANT, G_TYPE_INVALID); + dbus_g_proxy_connect_signal (priv->proxy, "Event", + G_CALLBACK (nm_dhcp_manager_handle_event), + self, + NULL); +#endif } static void @@ -625,6 +646,23 @@ dispose (GObject *object) g_list_free (values); } + if (priv->new_conn_id) { + g_signal_handler_disconnect (priv->dbus_mgr, priv->new_conn_id); + priv->new_conn_id = 0; + } + if (priv->dis_conn_id) { + g_signal_handler_disconnect (priv->dbus_mgr, priv->dis_conn_id); + priv->dis_conn_id = 0; + } + priv->dbus_mgr = NULL; + + if (priv->proxies) { + g_hash_table_destroy (priv->proxies); + priv->proxies = NULL; + } + if (priv->proxy) + g_object_unref (priv->proxy); + G_OBJECT_CLASS (nm_dhcp_manager_parent_class)->dispose (object); } @@ -633,17 +671,10 @@ finalize (GObject *object) { NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (object); - if (priv->hostname_provider) { - g_object_weak_unref (G_OBJECT (priv->hostname_provider), hostname_provider_destroyed, object); - priv->hostname_provider = NULL; - } + g_free (priv->default_hostname); if (priv->clients) g_hash_table_destroy (priv->clients); - if (priv->proxy) - g_object_unref (priv->proxy); - if (priv->dbus_mgr) - g_object_unref (priv->dbus_mgr); G_OBJECT_CLASS (nm_dhcp_manager_parent_class)->finalize (object); } @@ -659,4 +690,3 @@ nm_dhcp_manager_class_init (NMDHCPManagerClass *manager_class) object_class->finalize = finalize; object_class->dispose = dispose; } - |