X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Fdomain-util.c;h=6eed27f21e9338ef13f9acd4336f7eabc0b816e8;hb=9c0f9c65093cfa53d45f9b68782321eb8063a032;hp=d4cc2ad91f02782e7ef07ce181fedf05175c4faf;hpb=c3575017e2137ef664e4735bd6f9ff1209653ef3;p=catta diff --git a/avahi-core/domain-util.c b/avahi-core/domain-util.c index d4cc2ad..6eed27f 100644 --- a/avahi-core/domain-util.c +++ b/avahi-core/domain-util.c @@ -1,18 +1,16 @@ -/* $Id$ */ - /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 @@ -27,25 +25,114 @@ #include #include #include +#include +#include +#include #include +#include "log.h" #include "domain-util.h" +#include "util.h" -char *avahi_get_host_name(char *ret_s, size_t size) { -#ifdef HOST_NAME_MAX - char t[HOST_NAME_MAX]; -#else - char t[256]; +static void strip_bad_chars(char *s) { + char *p, *d; + + s[strcspn(s, ".")] = 0; + + for (p = s, d = s; *p; p++) + if ((*p >= 'a' && *p <= 'z') || + (*p >= 'A' && *p <= 'Z') || + (*p >= '0' && *p <= '9') || + *p == '-') + *(d++) = *p; + + *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); - - gethostname(t, sizeof(t)); - t[sizeof(t)-1] = 0; - - return avahi_normalize_name(t, ret_s, size); + + if (gethostname(ret_s, size) >= 0) { + ret_s[size-1] = 0; + strip_bad_chars(ret_s); + } 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) { + /* No hostname was set, so let's take the OS name */ + +#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) +#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) + ret_s[AVAHI_LABEL_MAX-1] = 0; + + return ret_s; } char *avahi_get_host_name_strdup(void) { @@ -75,7 +162,7 @@ int avahi_binary_domain_cmp(const char *a, const char *b) { if ((r = strcmp(ca, cb))) return r; - + if (!*a && !*b) return 0; } @@ -90,12 +177,12 @@ int avahi_domain_ends_with(const char *domain, const char *suffix) { if (*domain == 0) return 0; - + if (avahi_domain_equal(domain, suffix)) return 1; r = avahi_unescape_label(&domain, dummy, sizeof(dummy)); assert(r); - } + } }