From d1f6f5dde456507804ac34f76c24bd8bb70ac3c1 Mon Sep 17 00:00:00 2001 From: Robert Love Date: Mon, 23 Jan 2006 21:02:39 +0000 Subject: [PATCH] 2006-01-23 Robert Love * dhcp-manager/nm-dhcp-manager.c, nm-device.c, nm-ip4-config.c, nm-ip4-config.h, NetworkManagerSystem.h: Save the hostname reported by DHCP and pass it to the backends, allowing distribution-specific behavior with respect to the DHCP-supplied hostname (if nothing else, some distributions might not want to set the hostname). * backends/NetworkManagerSuSE.c: Set the hostname if the variable DHCLIENT_SET_HOSTNAME is set to "yes" in /etc/sysconfig/network/dhcp. Also update our NIS behavior. * backends/NetworkManagerDebian.c, backends/NetworkManagerGentoo.c, backends/NetworkManagerRedHat.c, backends/NetworkManagerSlackware.c: Add stub functions. git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1382 4912f4e0-d625-0410-9fb7-b9a5a253dbdc --- ChangeLog | 14 +++ src/NetworkManagerSystem.h | 1 + src/backends/NetworkManagerDebian.c | 10 +++ src/backends/NetworkManagerGentoo.c | 10 +++ src/backends/NetworkManagerRedHat.c | 10 +++ src/backends/NetworkManagerSlackware.c | 10 +++ src/backends/NetworkManagerSuSE.c | 116 ++++++++++++++++++------- src/dhcp-manager/nm-dhcp-manager.c | 37 ++++++-- src/nm-device.c | 1 + src/nm-ip4-config.c | 21 +++++ src/nm-ip4-config.h | 3 + 11 files changed, 199 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index 841358f558..aa86941c16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-01-23 Robert Love + + * dhcp-manager/nm-dhcp-manager.c, nm-device.c, nm-ip4-config.c, + nm-ip4-config.h, NetworkManagerSystem.h: Save the hostname reported + by DHCP and pass it to the backends, allowing distribution-specific + behavior with respect to the DHCP-supplied hostname (if nothing else, + some distributions might not want to set the hostname). + * backends/NetworkManagerSuSE.c: Set the hostname if the variable + DHCLIENT_SET_HOSTNAME is set to "yes" in /etc/sysconfig/network/dhcp. + Also update our NIS behavior. + * backends/NetworkManagerDebian.c, backends/NetworkManagerGentoo.c, + backends/NetworkManagerRedHat.c, backends/NetworkManagerSlackware.c: + Add stub functions. + 2006-01-23 Robert Love * Makefile.am, nm-applet.desktop: Add autostart .desktop file, now that diff --git a/src/NetworkManagerSystem.h b/src/NetworkManagerSystem.h index a3910bb486..38931a0cb9 100644 --- a/src/NetworkManagerSystem.h +++ b/src/NetworkManagerSystem.h @@ -78,6 +78,7 @@ void nm_system_deactivate_all_dialup (GSList *list); gboolean nm_system_activate_dialup (GSList *list, const char *dialup); gboolean nm_system_deactivate_dialup (GSList *list, const char *dialup); +void nm_system_set_hostname (NMIP4Config *config); void nm_system_activate_nis (NMIP4Config *config); void nm_system_shutdown_nis (void); diff --git a/src/backends/NetworkManagerDebian.c b/src/backends/NetworkManagerDebian.c index 8e699cca1a..95b288f273 100644 --- a/src/backends/NetworkManagerDebian.c +++ b/src/backends/NetworkManagerDebian.c @@ -780,3 +780,13 @@ void nm_system_shutdown_nis (void) { } +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ +} + diff --git a/src/backends/NetworkManagerGentoo.c b/src/backends/NetworkManagerGentoo.c index 3ea1b0897c..9b5a4559cb 100644 --- a/src/backends/NetworkManagerGentoo.c +++ b/src/backends/NetworkManagerGentoo.c @@ -552,3 +552,13 @@ void nm_system_shutdown_nis (void) { } +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ +} + diff --git a/src/backends/NetworkManagerRedHat.c b/src/backends/NetworkManagerRedHat.c index 8256d4c79d..63f5dc113e 100644 --- a/src/backends/NetworkManagerRedHat.c +++ b/src/backends/NetworkManagerRedHat.c @@ -891,3 +891,13 @@ void nm_system_shutdown_nis (void) { } +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ +} + diff --git a/src/backends/NetworkManagerSlackware.c b/src/backends/NetworkManagerSlackware.c index bd886fe3e2..915a8679ec 100644 --- a/src/backends/NetworkManagerSlackware.c +++ b/src/backends/NetworkManagerSlackware.c @@ -404,3 +404,13 @@ void nm_system_shutdown_nis (void) { } +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ +} + diff --git a/src/backends/NetworkManagerSuSE.c b/src/backends/NetworkManagerSuSE.c index a2ef95c166..8ae89cb5dc 100644 --- a/src/backends/NetworkManagerSuSE.c +++ b/src/backends/NetworkManagerSuSE.c @@ -921,7 +921,8 @@ out_gfree: */ void nm_system_activate_nis (NMIP4Config *config) { - gchar *nis_domain = NULL; + shvarFile *file; + gchar *nis_domain, *name, *buf = NULL; int num_nis_servers = 0; struct in_addr temp_addr; int i; @@ -930,42 +931,63 @@ void nm_system_activate_nis (NMIP4Config *config) g_return_if_fail (config != NULL); nis_domain = nm_ip4_config_get_nis_domain(config); - num_nis_servers = nm_ip4_config_get_num_nis_servers(config); - /* set the nis domain */ - if (nis_domain && setdomainname (nis_domain, strlen (nis_domain)) < 0) + name = g_strdup_printf (SYSCONFDIR"/sysconfig/network/dhcp"); + file = svNewFile (name); + if (!file) + goto out_gfree; + + buf = svGetValue (file, "DHCLIENT_SET_DOMAINNAME"); + if (!buf) + goto out_close; + + if ((!strcmp (buf, "yes")) && nis_domain && (setdomainname (nis_domain, strlen (nis_domain)) < 0)) nm_warning ("Could not set nis domain name."); + free (buf); - /* write out yp.conf and restart the daemon */ - if (num_nis_servers > 0) - { - struct stat sb; + buf = svGetValue (file, "DHCLIENT_MODIFY_NIS_CONF"); + if (!buf) + goto out_close; - ypconf = fopen ("/etc/yp.conf", "w"); - - if (ypconf) + if (!strcmp (buf, "yes")) { + num_nis_servers = nm_ip4_config_get_num_nis_servers(config); + /* write out yp.conf and restart the daemon */ + if (num_nis_servers > 0) { - fprintf (ypconf, "# generated by NetworkManager, do not edit!\n\n"); - for (i = 0; i < num_nis_servers; i++) { - temp_addr.s_addr = nm_ip4_config_get_nis_server (config, i); - fprintf (ypconf, "domain %s server %s\n", nis_domain, inet_ntoa (temp_addr)); + struct stat sb; + + ypconf = fopen ("/etc/yp.conf", "w"); + + if (ypconf) + { + fprintf (ypconf, "# generated by NetworkManager, do not edit!\n\n"); + for (i = 0; i < num_nis_servers; i++) { + temp_addr.s_addr = nm_ip4_config_get_nis_server (config, i); + fprintf (ypconf, "domain %s server %s\n", nis_domain, inet_ntoa (temp_addr)); + } + fprintf (ypconf, "\n"); + fclose (ypconf); + } else + nm_warning ("Could not commit NIS changes to /etc/yp.conf."); + + if (stat ("/usr/sbin/rcypbind", &sb) != -1) + { + nm_info ("Restarting ypbind."); + nm_spawn_process ("/usr/sbin/rcypbind restart"); + } + if (stat ("/usr/sbin/rcautofs", &sb) != -1) + { + nm_info ("Restarting autofs."); + nm_spawn_process ("/usr/sbin/rcautofs restart"); } - fprintf (ypconf, "\n"); - fclose (ypconf); - } else - nm_warning ("Could not commit NIS changes to /etc/yp.conf."); - - if (stat ("/usr/sbin/rcypbind", &sb) != -1) - { - nm_info ("Restarting ypbind."); - nm_spawn_process ("/usr/sbin/rcypbind restart"); - } - if (stat ("/usr/sbin/rcautofs", &sb) != -1) - { - nm_info ("Restarting autofs."); - nm_spawn_process ("/usr/sbin/rcautofs restart"); } } + free (buf); + +out_close: + svCloseFile (file); +out_gfree: + g_free (name); } @@ -990,3 +1012,39 @@ void nm_system_shutdown_nis (void) nm_spawn_process ("/usr/sbin/rcautofs restart"); } } + +/* + * nm_system_set_hostname + * + * set the hostname + * + */ +void nm_system_set_hostname (NMIP4Config *config) +{ + shvarFile *file; + gchar *name, *buf, *hostname = NULL; + + g_return_if_fail (config != NULL); + + name = g_strdup_printf (SYSCONFDIR"/sysconfig/network/dhcp"); + file = svNewFile (name); + if (!file) + goto out_gfree; + + buf = svGetValue (file, "DHCLIENT_SET_HOSTNAME"); + if (!buf) + goto out_close; + + if (!strcmp (buf, "yes")) { + hostname = nm_ip4_config_get_hostname (config); + if (hostname && sethostname (hostname, strlen (hostname)) < 0) + nm_warning ("Could not set hostname."); + } + free (buf); + +out_close: + svCloseFile (file); +out_gfree: + g_free (name); +} + diff --git a/src/dhcp-manager/nm-dhcp-manager.c b/src/dhcp-manager/nm-dhcp-manager.c index 0e2709b6cd..2a990afe9c 100644 --- a/src/dhcp-manager/nm-dhcp-manager.c +++ b/src/dhcp-manager/nm-dhcp-manager.c @@ -422,13 +422,32 @@ static gboolean get_ip4_string (NMDHCPManager *manager, NMDevice *dev, const cha dbus_error_init (&error); if ((reply = dbus_connection_send_with_reply_and_block (manager->data->dbus_connection, message, -1, &error))) { - char *dbus_string; + DBusMessageIter iter; - dbus_error_init (&error); - if (dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_string, DBUS_TYPE_INVALID)) + dbus_message_iter_init (reply, &iter); + if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_STRING) { - *string = g_strdup (dbus_string); - success = TRUE; + char *dbus_string; + + dbus_error_init (&error); + if (dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_string, DBUS_TYPE_INVALID)) + { + *string = g_strdup (dbus_string); + success = TRUE; + } + } + else if (dbus_message_iter_get_arg_type (&iter) == DBUS_TYPE_ARRAY) + { + char *byte_array = NULL; + int len = 0; + + dbus_error_init (&error); + if (dbus_message_get_args (reply, &error, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &byte_array, &len, DBUS_TYPE_INVALID)) + { + *string = g_strdup (byte_array); + *string[len] = '\0'; + success = TRUE; + } } } @@ -480,6 +499,7 @@ NMIP4Config * nm_dhcp_manager_get_ip4_config (NMDHCPManager *manager, NMActReque guint32 * ip4_gateway = NULL; guint32 num_ip4_nameservers = 0; guint32 num_ip4_nis_servers = 0; + char * hostname = NULL; char * domain_names = NULL; char * nis_domain = NULL; guint32 * ip4_nis_servers = NULL; @@ -524,6 +544,7 @@ NMIP4Config * nm_dhcp_manager_get_ip4_config (NMDHCPManager *manager, NMActReque goto out; } + get_ip4_string (manager, dev, "host_name", &hostname, TRUE); get_ip4_uint32s (manager, dev, "domain_name_servers", &ip4_nameservers, &num_ip4_nameservers, FALSE); get_ip4_string (manager, dev, "domain_name", &domain_names, FALSE); get_ip4_string (manager, dev, "nis_domain", &nis_domain, TRUE); @@ -555,6 +576,12 @@ NMIP4Config * nm_dhcp_manager_get_ip4_config (NMDHCPManager *manager, NMActReque nm_info (" nameserver %s", inet_ntoa (temp_addr)); } + if (hostname) + { + nm_ip4_config_set_hostname (ip4_config, hostname); + nm_info (" hostname '%s'", hostname); + } + if (domain_names) { char **searches = g_strsplit (domain_names, " ", 0); diff --git a/src/nm-device.c b/src/nm-device.c index d3a160a56f..b8ad41c603 100644 --- a/src/nm-device.c +++ b/src/nm-device.c @@ -1223,6 +1223,7 @@ nm_device_activate_stage5_ip_config_commit (NMActRequest *req) nm_device_update_ip4_address (self); nm_system_device_add_ip6_link_address (self); nm_system_restart_mdns_responder (); + nm_system_set_hostname (self->priv->ip4_config); nm_system_activate_nis (self->priv->ip4_config); if (NM_DEVICE_GET_CLASS (self)->update_link) NM_DEVICE_GET_CLASS (self)->update_link (self); diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 852c389058..f61f46a3ee 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -44,6 +44,7 @@ struct NMIP4Config GSList * nameservers; GSList * domains; + gchar * hostname; gchar * nis_domain; GSList * nis_servers; @@ -80,6 +81,7 @@ NMIP4Config *nm_ip4_config_copy (NMIP4Config *src_config) dst_config->ip4_netmask = nm_ip4_config_get_netmask (src_config); dst_config->ip4_broadcast = nm_ip4_config_get_broadcast (src_config); + dst_config->hostname = g_strdup (nm_ip4_config_get_hostname (src_config)); dst_config->nis_domain = g_strdup (nm_ip4_config_get_nis_domain (src_config)); len = nm_ip4_config_get_num_nameservers (src_config); @@ -111,6 +113,7 @@ void nm_ip4_config_unref (NMIP4Config *config) config->refcount--; if (config->refcount <= 0) { + g_free (config->hostname); g_free (config->nis_domain); g_slist_free (config->nameservers); g_slist_foreach (config->domains, (GFunc) g_free, NULL); @@ -269,6 +272,24 @@ void nm_ip4_config_add_domain (NMIP4Config *config, const char *domain) config->domains = g_slist_append (config->domains, g_strdup (domain)); } +void nm_ip4_config_set_hostname (NMIP4Config *config, const char *hostname) +{ + g_return_if_fail (config != NULL); + g_return_if_fail (hostname != NULL); + + if (!strlen (hostname)) + return; + + config->hostname = g_strdup (hostname); +} + +gchar *nm_ip4_config_get_hostname (NMIP4Config *config) +{ + g_return_val_if_fail (config != NULL, NULL); + + return config->hostname; +} + void nm_ip4_config_set_nis_domain (NMIP4Config *config, const char *domain) { g_return_if_fail (config != NULL); diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h index 5fb770e133..89db02abcb 100644 --- a/src/nm-ip4-config.h +++ b/src/nm-ip4-config.h @@ -58,6 +58,9 @@ void nm_ip4_config_add_nis_server (NMIP4Config *config, guint32 nis_server); guint32 nm_ip4_config_get_nis_server (NMIP4Config *config, guint i); guint32 nm_ip4_config_get_num_nis_servers (NMIP4Config *config); +void nm_ip4_config_set_hostname (NMIP4Config *config, const char *hostname); +gchar *nm_ip4_config_get_hostname (NMIP4Config *config); + void nm_ip4_config_set_nis_domain (NMIP4Config *config, const char *domain); gchar *nm_ip4_config_get_nis_domain (NMIP4Config *config);