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 */