1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
When reading hostname from NM keyfile, if no hostname is set, read from the
system file at /etc/conf.d/hostname to set hostname. This patch is not meant to
be ever upstreamed. Proper fix is to write a gentoo-specific ifcfg plugin.
To change hostname, touch nm-system-settings.conf, which will reload the keyfile
and cause /etc/conf.d/hostname to be reloaded.
This horrible hack fixes http://bugs.gentoo.org/176873
Author: Nirbheek Chauhan <nirbheek@gentoo.org>
Reviewed-by: Arun Raghavan <ford_prefect@gentoo.org>
---
--- system-settings/plugins/keyfile/plugin.c
+++ system-settings/plugins/keyfile/plugin.c
@@ -43,6 +43,9 @@
#define KEYFILE_PLUGIN_INFO "(c) 2007 - 2008 Red Hat, Inc. To report bugs please use the NetworkManager mailing list."
#define CONF_FILE SYSCONFDIR "/NetworkManager/nm-system-settings.conf"
+#ifdef TARGET_GENTOO
+#define HOSTNAME_FILE SYSCONFDIR "/conf.d/hostname"
+#endif
static char *plugin_get_hostname (SCPluginKeyfile *plugin);
static void system_config_interface_init (NMSystemConfigInterface *system_config_interface_class);
@@ -381,6 +384,12 @@
GKeyFile *key_file;
char *hostname = NULL;
GError *error = NULL;
+#ifdef TARGET_GENTOO
+ char *contents = NULL;
+ char **lines = NULL, **line;
+ GError *contents_err = NULL;
+ gsize contents_len = 0;
+#endif
key_file = g_key_file_new ();
if (g_key_file_load_from_file (key_file, CONF_FILE, G_KEY_FILE_NONE, &error))
@@ -392,7 +401,37 @@
g_key_file_free (key_file);
+ if (hostname)
+ goto out;
+#ifdef TARGET_GENTOO
+ /* If hostname is unset in keyfile, read system file to get hostname */
+ if (!g_file_get_contents (HOSTNAME_FILE, &contents,
+ &contents_len, &contents_err))
+ goto out;
+
+ lines = g_strsplit_set (contents, "\n\r", 0);
+ if (!lines)
+ goto out;
+
+ for (line = lines; *line; line++) {
+ if (!g_str_has_prefix (*line, "hostname="))
+ continue;
+ hostname = g_strsplit_set (g_strsplit_set (*line, "=", 0)[1], "#", 0)[0];
+ g_strstrip (hostname);
+ if (!hostname)
+ goto out;
+ /* Remove quotes surrounding hostname */
+ if (hostname[0] == '"' && hostname[strlen(hostname)-1] == '"')
+ contents = g_strndup(&hostname[1], strlen(hostname)-2);
+ /* Un-escape before using to imitate librc behaviour */
+ hostname = g_strcompress (contents);
+ }
+
+out:
+ g_error_free(contents_err);
+
return hostname;
+#endif
}
static gboolean
|