File 0009-Implement-sending-system-hostname-with-DHCP-client.patch of Package NetworkManager

From dbe22c8f5ff759af4f141351ee36abe0f3b756f3 Mon Sep 17 00:00:00 2001
From: Tambet Ingo <tambet@gmail.com>
Date: Tue, 13 Jan 2009 16:12:50 +0200
Subject: [PATCH] Implement sending system hostname with DHCP client.


Index: b/libnm-util/nm-setting-ip4-config.h
===================================================================
--- a/libnm-util/nm-setting-ip4-config.h
+++ b/libnm-util/nm-setting-ip4-config.h
@@ -69,6 +69,7 @@ GQuark nm_setting_ip4_config_error_quark
 #define NM_SETTING_IP4_CONFIG_METHOD_MANUAL     "manual"
 #define NM_SETTING_IP4_CONFIG_METHOD_SHARED     "shared"
 
+#define NM_SETTING_IP4_CONFIG_DHCP_USE_SYSTEM_HOSTNAME "system-hostname"
 
 typedef struct NMIP4Address NMIP4Address;
 
Index: b/src/NetworkManager.c
===================================================================
--- a/src/NetworkManager.c
+++ b/src/NetworkManager.c
@@ -378,6 +378,8 @@ main (int argc, char *argv[])
 		goto done;
 	}
 
+	nm_dhcp_manager_set_hostname_provider (dhcp_mgr, G_OBJECT (manager));
+
 	/* Start our DBus service */
 	if (!nm_dbus_manager_start_service (dbus_mgr)) {
 		nm_warning ("Failed to start the dbus service.");
Index: b/src/dhcp-manager/nm-dhcp-manager.c
===================================================================
--- a/src/dhcp-manager/nm-dhcp-manager.c
+++ b/src/dhcp-manager/nm-dhcp-manager.c
@@ -52,6 +52,7 @@ typedef struct {
 	NMDBusManager * dbus_mgr;
 	GHashTable *	devices;
 	DBusGProxy *	proxy;
+	GObject *       hostname_provider;
 } NMDHCPManagerPrivate;
 
 
@@ -71,6 +72,8 @@ static NMDHCPManager *nm_dhcp_manager_ne
 
 static void nm_dhcp_manager_cancel_transaction_real (NMDHCPDevice *device);
 
+static void hostname_provider_destroyed (gpointer data, GObject *destroyed_object);
+
 NMDHCPManager *
 nm_dhcp_manager_get (void)
 {
@@ -95,6 +98,11 @@ finalize (GObject *object)
 {
 	NMDHCPManagerPrivate *priv = NM_DHCP_MANAGER_GET_PRIVATE (object);
 
+	if (priv->hostname_provider) {
+		g_object_weak_unref (priv->hostname_provider, hostname_provider_destroyed, object);
+		priv->hostname_provider = NULL;
+	}
+
 	g_hash_table_destroy (priv->devices);
 	g_object_unref (priv->proxy);
 	g_object_unref (priv->dbus_mgr);
@@ -583,6 +591,7 @@ nm_dhcp_manager_begin_transaction (NMDHC
 {
 	NMDHCPManagerPrivate *priv;
 	NMDHCPDevice *device;
+	gboolean hostname_modified = FALSE;
 
 	g_return_val_if_fail (NM_IS_DHCP_MANAGER (manager), FALSE);
 	g_return_val_if_fail (iface != NULL, FALSE);
@@ -598,9 +607,33 @@ nm_dhcp_manager_begin_transaction (NMDHC
 		nm_dhcp_manager_cancel_transaction_real (device);
 	}
 
-	nm_info ("Activation (%s) Beginning DHCP transaction.", iface);
+	if (s_ip4 && priv->hostname_provider) {
+		const char *dhcp_hostname;
+
+		dhcp_hostname = nm_setting_ip4_config_get_dhcp_hostname (s_ip4);
+		if (dhcp_hostname && !strcmp (dhcp_hostname, NM_SETTING_IP4_CONFIG_DHCP_USE_SYSTEM_HOSTNAME)) {
+			char *system_hostname;
+
+			g_object_get (priv->hostname_provider, "hostname", &system_hostname, NULL);
+			if (system_hostname) {
+				hostname_modified = TRUE;
+				g_object_set (G_OBJECT (s_ip4), NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, system_hostname, NULL);
+				g_free (system_hostname);
+			}
+		}
+	}
 
+	nm_info ("Activation (%s) Beginning DHCP transaction.", iface);
 	device->pid = nm_dhcp_client_start (device, uuid, s_ip4);
+
+	if (hostname_modified) {
+		/* Restore the saved hostname */
+		g_object_set (G_OBJECT (s_ip4),
+					  NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME,
+					  NM_SETTING_IP4_CONFIG_DHCP_USE_SYSTEM_HOSTNAME,
+					  NULL);
+	}
+
 	if (device->pid == 0)
 		return FALSE;
 
@@ -1076,3 +1109,28 @@ nm_dhcp_manager_foreach_dhcp4_option (NM
 	return TRUE;
 }
 
+static void
+hostname_provider_destroyed (gpointer data, GObject *destroyed_object)
+{
+	NM_DHCP_MANAGER_GET_PRIVATE (data)->hostname_provider = NULL;
+}
+
+void
+nm_dhcp_manager_set_hostname_provider (NMDHCPManager *manager, GObject *provider)
+{
+	NMDHCPManagerPrivate *priv;
+
+	g_return_if_fail (NM_IS_DHCP_MANAGER (manager));
+
+	priv = NM_DHCP_MANAGER_GET_PRIVATE (manager);
+
+	if (priv->hostname_provider) {
+		g_object_weak_unref (priv->hostname_provider, hostname_provider_destroyed, manager);
+		priv->hostname_provider = NULL;
+	}
+
+	if (G_IS_OBJECT (provider)) {
+		priv->hostname_provider = provider;
+		g_object_weak_ref (provider, hostname_provider_destroyed, manager);
+	}
+}
Index: b/src/dhcp-manager/nm-dhcp-manager.h
===================================================================
--- a/src/dhcp-manager/nm-dhcp-manager.h
+++ b/src/dhcp-manager/nm-dhcp-manager.h
@@ -116,4 +116,6 @@ gboolean       nm_dhcp_client_process_cl
 NMIP4Config *nm_dhcp_manager_options_to_ip4_config (const char *iface,
                                                     GHashTable *options);
 
+void           nm_dhcp_manager_set_hostname_provider (NMDHCPManager *manager, GObject *provider);
+
 #endif /* NM_DHCP_MANAGER_H */
openSUSE Build Service is sponsored by