]> git.meshlink.io Git - catta/commitdiff
* deal with gethostname() failing, use utsname.sysname[] instead in that case
authorLennart Poettering <lennart@poettering.net>
Tue, 8 Nov 2005 23:16:16 +0000 (23:16 +0000)
committerLennart Poettering <lennart@poettering.net>
Tue, 8 Nov 2005 23:16:16 +0000 (23:16 +0000)
* deal with utsname() failing when creating HINFO records

git-svn-id: file:///home/lennart/svn/public/avahi/trunk@938 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe

avahi-core/domain-util.c
avahi-core/server.c
avahi-core/util.c
avahi-core/util.h

index d4cc2ad91f02782e7ef07ce181fedf05175c4faf..f5412264c20ea3382cd4432c30739ecfef628847 100644 (file)
 #include <assert.h>
 #include <string.h>
 #include <unistd.h>
+#include <ctype.h>
+#include <sys/utsname.h>
+#include <stdio.h>
 
 #include <avahi-common/malloc.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];
-#endif
+static void strip_bad_chars(char *s) {
+    char *p, *d;
+
+    s[strcspn(s, ".")] = 0;
     
+    for (p = s, d = s; *p; p++) 
+        if (isalnum(*p) || *p == '-')
+            *(d++) = *p;
+
+    *d = 0;
+}
+
+char *avahi_get_host_name(char *ret_s, size_t size) {
     assert(ret_s);
     assert(size > 0);
+
+    if (gethostname(ret_s, size) >= 0) {
+        ret_s[size-1] = 0;
+        strip_bad_chars(ret_s);
+    } else
+        *ret_s = 0;
+
+    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);
+            strip_bad_chars(ret_s);
+            avahi_strdown(ret_s);
+        }
+
+        if (*ret_s == 0)
+            snprintf(ret_s, size, "unnamed");
+    }
     
-    gethostname(t, sizeof(t));
-    t[sizeof(t)-1] = 0;
-    
-    return avahi_normalize_name(t, ret_s, size);
+    return ret_s;
 }
 
 char *avahi_get_host_name_strdup(void) {
index 0cc4d4e18c1b93cc5765a007e8b32542fb9451de..e42692f198860bb1a573a9aeee1ad7f03fb5a67f 100644 (file)
@@ -1133,13 +1133,20 @@ static void register_hinfo(AvahiServer *s) {
     
     /* Fill in HINFO rr */
     if ((r = avahi_record_new_full(s->host_name_fqdn, AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_HINFO, AVAHI_DEFAULT_TTL_HOST_NAME))) {
-        uname(&utsname);
-        r->data.hinfo.cpu = avahi_strdup(avahi_strup(utsname.machine));
-        r->data.hinfo.os = avahi_strdup(avahi_strup(utsname.sysname));
 
-        if (avahi_server_add(s, s->hinfo_entry_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UNIQUE, r) < 0) {
-            avahi_log_warn("Failed to add HINFO RR: %s", avahi_strerror(s->error));
-            return;
+        if (uname(&utsname) < 0)
+            avahi_log_warn("uname() failed: %s\n", avahi_strerror(errno));
+        else {
+            
+            r->data.hinfo.cpu = avahi_strdup(avahi_strup(utsname.machine));
+            r->data.hinfo.os = avahi_strdup(avahi_strup(utsname.sysname));
+            
+            avahi_log_info("Adding HINFO record with values '%s/%s'", r->data.hinfo.cpu, r->data.hinfo.os);
+            
+            if (avahi_server_add(s, s->hinfo_entry_group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UNIQUE, r) < 0) {
+                avahi_log_warn("Failed to add HINFO RR: %s", avahi_strerror(s->error));
+                return;
+            }
         }
 
         avahi_record_unref(r);
index 41229c5691fa610cc808ac7ea1a7862c82c4fc41..a5e9f52e350436be00c7bac8f348cae92c7225be 100644 (file)
@@ -101,3 +101,13 @@ char *avahi_strup(char *s) {
 
     return s;
 }
+
+char *avahi_strdown(char *s) {
+    char *c;
+    assert(s);
+
+    for (c = s; *c; c++)
+        *c = (char) tolower(*c);
+
+    return s;
+}
index aa386932824e6cad56f13c1b07ea23f14c934ea3..1a073635770ec9992605511c4dc6a9d3a91dde5a 100644 (file)
@@ -35,6 +35,9 @@ char *avahi_format_mac_address(const uint8_t* mac, size_t size);
 /** Change every character in the string to upper case (ASCII), return a pointer to the string */
 char *avahi_strup(char *s);
 
+/** Change every character in the string to lower case (ASCII), return a pointer to the string */
+char *avahi_strdown(char *s);
+
 AVAHI_C_DECL_END
 
 #endif