diff options
author | Michael Elkins <me@sigpipe.org> | 2013-04-11 01:59:26 +0000 |
---|---|---|
committer | Michael Elkins <me@sigpipe.org> | 2013-04-11 01:59:26 +0000 |
commit | 286a0b78cbdbb16adbdc889ca52c8783901592c6 (patch) | |
tree | 0cba759d6b7b1fd0a44d02ed8e68cb7b3bd00267 | |
parent | 001bc020604322d38414291400d6d978001c1f06 (diff) |
Backed out changeset 1142ed8974fa
-rw-r--r-- | getdomain.c | 73 | ||||
-rw-r--r-- | init.c | 34 |
2 files changed, 45 insertions, 62 deletions
diff --git a/getdomain.c b/getdomain.c index 13c4fa25..71636279 100644 --- a/getdomain.c +++ b/getdomain.c @@ -6,10 +6,6 @@ #include <ctype.h> #include <string.h> -/* for getaddrinfo() */ -#include <sys/types.h> -#include <netdb.h> - #include "mutt.h" #ifndef STDC_HEADERS @@ -33,63 +29,40 @@ static void strip_trailing_dot (char *q) int getdnsdomainname (char *s, size_t l) { -#ifdef DOMAIN - /* specified at compile time */ - snprintf(s, l, "%s.%s", Hostname, DOMAIN); -#else FILE *f; char tmp[1024]; char *p = NULL; char *q; - struct addrinfo hints; - struct addrinfo *res; - /* Try a DNS lookup on the hostname to find the canonical name. */ - memset(&hints, 0, sizeof(hints)); - hints.ai_flags = AI_CANONNAME; - if (getaddrinfo(Hostname, NULL, &hints, &res) == 0) - { - snprintf(s, l, "%s", res->ai_canonname); - freeaddrinfo(res); - } - else - { - /* Otherwise inspect /etc/resolve.conf for a hint. */ + if ((f = fopen ("/etc/resolv.conf", "r")) == NULL) return (-1); - if ((f = fopen ("/etc/resolv.conf", "r")) == NULL) return (-1); + tmp[sizeof (tmp) - 1] = 0; - tmp[sizeof (tmp) - 1] = 0; + l--; /* save room for the terminal \0 */ - l--; /* save room for the terminal \0 */ - - while (fgets (tmp, sizeof (tmp) - 1, f) != NULL) + while (fgets (tmp, sizeof (tmp) - 1, f) != NULL) + { + p = tmp; + while (ISSPACE (*p)) p++; + if (mutt_strncmp ("domain", p, 6) == 0 || mutt_strncmp ("search", p, 6) == 0) { - p = tmp; - while (ISSPACE (*p)) p++; - if (mutt_strncmp ("domain", p, 6) == 0 || mutt_strncmp ("search", p, 6) == 0) - { - p += 6; - - for (q = strtok (p, " \t\n"); q; q = strtok (NULL, " \t\n")) - if (strcmp (q, ".")) - break; - - if (q) - { - strip_trailing_dot (q); - snprintf (s, l, "%s.%s", Hostname, q); - safe_fclose (&f); - return 0; - } + p += 6; + + for (q = strtok (p, " \t\n"); q; q = strtok (NULL, " \t\n")) + if (strcmp (q, ".")) + break; + if (q) + { + strip_trailing_dot (q); + strfcpy (s, q, l); + safe_fclose (&f); + return 0; } + } - - safe_fclose (&f); - - /* fall back to using just the bare hostname */ - snprintf(s, l, "%s", Hostname); } -#endif - return 0; + + safe_fclose (&f); + return (-1); } @@ -2887,6 +2887,7 @@ static void mutt_srandom (void) void mutt_init (int skip_sys_rc, LIST *commands) { struct passwd *pw; + struct utsname utsname; char *p, buffer[STRING]; int i, default_rc = 0, need_pause = 0; BUFFER err; @@ -2952,21 +2953,30 @@ void mutt_init (int skip_sys_rc, LIST *commands) #endif /* And about the host... */ + uname (&utsname); + /* some systems report the FQDN instead of just the hostname */ + if ((p = strchr (utsname.nodename, '.'))) { - size_t namelen = sysconf(_SC_HOST_NAME_MAX); - char *name = safe_malloc(namelen + 1); - if (gethostname(name, namelen) == -1) - { - fputs (_("unable to determine hostname"), stderr); - exit (1); - } - Hostname = safe_strdup(name); - FREE (&name); + Hostname = mutt_substrdup (utsname.nodename, p); + p++; + strfcpy (buffer, p, sizeof (buffer)); /* save the domain for below */ } + else + Hostname = safe_strdup (utsname.nodename); - /* determine the DNS domain name */ - getdnsdomainname (buffer, sizeof (buffer)); - Fqdn = safe_strdup(buffer); +#ifndef DOMAIN +#define DOMAIN buffer + if (!p && getdnsdomainname (buffer, sizeof (buffer)) == -1) + Fqdn = safe_strdup ("@"); + else +#endif /* DOMAIN */ + if (*DOMAIN != '@') + { + Fqdn = safe_malloc (mutt_strlen (DOMAIN) + mutt_strlen (Hostname) + 2); + sprintf (Fqdn, "%s.%s", NONULL(Hostname), DOMAIN); /* __SPRINTF_CHECKED__ */ + } + else + Fqdn = safe_strdup(NONULL(Hostname)); if ((p = getenv ("MAIL"))) Spoolfile = safe_strdup (p); |