diff options
| author | Lennart Poettering <lennart@poettering.net> | 2007-02-02 14:11:07 +0000 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2007-02-02 14:11:07 +0000 | 
| commit | 92173aaff6999f50da80663915a5843d4053ecbf (patch) | |
| tree | 87e633dd5d26bc7b5870f876ff8f87abb55d7067 | |
| parent | a1cc4c609a6868cf59935eb85174e87272773d38 (diff) | |
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
| -rw-r--r-- | avahi-core/domain-util.c | 65 | 
1 files 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 <avahi-common/malloc.h> +#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)  | 
