From 92173aaff6999f50da80663915a5843d4053ecbf Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 2 Feb 2007 14:11:07 +0000 Subject: [PATCH] re #94: don't accept "localhost" as hostname; read distribution id from /etc/lsb_release. This is not a complete fix for this issue, since it doesn't work in a chroot, and it doesn't support /usr/bin/lsb_release. Oh, and did I mention how much the idea of having /usr/bin/lsb_release sucks? On Debian that is a Python script. i.e. on every Avahi startup we'd have to load an entire python interpreter into memory! That takes ages! I am not quite sure if we really should pursue this bug any further because of this problem. First, Debian should replace lsb_release by a saner implementation. In effect, I will now mark this bug as WONTFIX. git-svn-id: file:///home/lennart/svn/public/avahi/trunk@1379 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-core/domain-util.c | 65 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/avahi-core/domain-util.c b/avahi-core/domain-util.c index 3aeba12..777a064 100644 --- a/avahi-core/domain-util.c +++ b/avahi-core/domain-util.c @@ -33,6 +33,7 @@ #include +#include "log.h" #include "domain-util.h" #include "util.h" @@ -51,6 +52,40 @@ static void strip_bad_chars(char *s) { *d = 0; } +#ifdef __linux__ +static int load_lsb_distrib_id(char *ret_s, size_t size) { + FILE *f; + + assert(ret_s); + assert(size > 0); + + if (!(f = fopen("/etc/lsb-release", "r"))) + return -1; + + while (!feof(f)) { + char ln[256], *p; + + if (!fgets(ln, sizeof(ln), f)) + break; + + if (strncmp(ln, "DISTRIB_ID=", 11)) + continue; + + p = ln + 11; + p += strspn(p, "\""); + p[strcspn(p, "\"")] = 0; + + snprintf(ret_s, size, "%s", p); + + fclose(f); + return 0; + } + + fclose(f); + return -1; +} +#endif + char *avahi_get_host_name(char *ret_s, size_t size) { assert(ret_s); assert(size > 0); @@ -61,19 +96,39 @@ char *avahi_get_host_name(char *ret_s, size_t size) { } else *ret_s = 0; + if (strcmp(ret_s, "localhost") == 0 || strncmp(ret_s, "localhost.", 10) == 0) { + *ret_s = 0; + avahi_log_warn("System host name is set to 'localhost'. This is not a suitable mDNS host name, looking for alternatives."); + } + if (*ret_s == 0) { - struct utsname utsname; - /* No hostname was set, so let's take the OS name */ - if (uname(&utsname) >= 0) { - snprintf(ret_s, size, "%s", utsname.sysname); +#ifdef __linux__ + + /* Try LSB distribution name first */ + if (load_lsb_distrib_id(ret_s, size) >= 0) { strip_bad_chars(ret_s); avahi_strdown(ret_s); } if (*ret_s == 0) - snprintf(ret_s, size, "unnamed"); +#endif + + { + /* Try uname() second */ + struct utsname utsname; + + if (uname(&utsname) >= 0) { + snprintf(ret_s, size, "%s", utsname.sysname); + strip_bad_chars(ret_s); + avahi_strdown(ret_s); + } + + /* Give up */ + if (*ret_s == 0) + snprintf(ret_s, size, "unnamed"); + } } if (size >= AVAHI_LABEL_MAX) -- 2.39.5