diff -ru NetworkManager-0.7.0.orig/src/NetworkManagerPolicy.c NetworkManager-0.7.0/src/NetworkManagerPolicy.c --- NetworkManager-0.7.0.orig/src/NetworkManagerPolicy.c 2008-11-12 22:29:43.000000000 +0100 +++ NetworkManager-0.7.0/src/NetworkManagerPolicy.c 2008-11-19 21:14:52.049100794 +0100 @@ -24,6 +24,7 @@ #include #include #include +#include #include "NetworkManagerPolicy.h" #include "NetworkManagerUtils.h" @@ -332,6 +333,21 @@ g_string_free (new_contents, TRUE); return success; } +static char *findHostNameMatch(const char *inputString) { + if(!inputString) return NULL; + char pattern[50]="HOSTNAME[ ]*=[ \"]*([a-zA-z0-9]+)[\"]*"; + regmatch_t pmatch[2]; + int start=0, end=0; + regex_t predicate; + if(regcomp(&predicate, pattern, REG_EXTENDED) || + regexec(&predicate, inputString, 2, pmatch, 0) || + pmatch[1].rm_so < 0 || pmatch[1].rm_eo < 0 ) + return NULL; + start=pmatch[1].rm_so; + end=pmatch[1].rm_eo; + if(start>=end || end > strlen(inputString) ) return NULL; + return strndup(&inputString[start], end-start); +} static void set_system_hostname (const char *new_hostname, const char *msg) @@ -339,6 +355,24 @@ char old_hostname[HOST_NAME_MAX + 1]; int ret = 0; const char *name = new_hostname ? new_hostname : FALLBACK_HOSTNAME; + if (!new_hostname) { + static char* sysconf_hostname = NULL; + char *contents = NULL; + gsize contents_len; + GError *error = NULL; + if (!sysconf_hostname && !g_file_get_contents (SYSCONFDIR "/conf.d/hostname", &contents, &contents_len, &error)) { + nm_warning ("%s: couldn't read " SYSCONFDIR "/conf.d/hostname: (%d) %s", + __func__, error ? error->code : 0, + (error && error->message) ? error->message : "(unknown)"); + } else if (!sysconf_hostname) { + sysconf_hostname = g_strstrip(contents); + sysconf_hostname = strstr(sysconf_hostname, "HOSTNAME"); + sysconf_hostname = findHostNameMatch(sysconf_hostname); + } + if(sysconf_hostname) + name = sysconf_hostname; + } + old_hostname[HOST_NAME_MAX] = '\0'; errno = 0;