Send inn-committers mailing list submissions to
        inn-committers@lists.isc.org

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.isc.org/mailman/listinfo/inn-committers
or, via email, send a message with subject or body 'help' to
        inn-committers-requ...@lists.isc.org

You can reach the person managing the list at
        inn-committers-ow...@lists.isc.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of inn-committers digest..."


Today's Topics:

   1. INN commit: trunk/lib (getfqdn.c) (INN Commit)
   2. INN commit: branches/2.6/lib (getfqdn.c) (INN Commit)
   3. INN commit: trunk (8 files) (INN Commit)
   4. INN commit: trunk/lib (getfqdn.c) (INN Commit)


----------------------------------------------------------------------

Message: 1
Date: Sat,  3 Feb 2018 12:52:21 -0800 (PST)
From: INN Commit <r...@isc.org>
To: inn-committ...@isc.org
Subject: INN commit: trunk/lib (getfqdn.c)
Message-ID: <20180203205221.58ebf68...@hope.eyrie.org>

    Date: Saturday, February 3, 2018 @ 12:52:20
  Author: eagle
Revision: 10234

Handle hostnames not in DNS in GetFQDN

If the local hostname isn't in DNS at all, GetFQDN currently returns
NULL.  If a domain was provided but the hostname isn't in DNS, append
the domain to the hostname anyway and return the results.  This is
possibly still a local configuration error, but it seems like
friendlier behavior, and also lets the test suite run on hosts with
an unresolvable local hostname.

Modified:
  trunk/lib/getfqdn.c

-----------+
 getfqdn.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Modified: getfqdn.c
===================================================================
--- getfqdn.c   2018-01-29 14:45:53 UTC (rev 10233)
+++ getfqdn.c   2018-02-03 20:52:20 UTC (rev 10234)
@@ -35,9 +35,13 @@
     if (strchr(buff, '.') != NULL)
        return buff;
 
-    /* See if DNS (or /etc/hosts) gives us a full domain name. */
+    /*
+    ** See if DNS (or /etc/hosts) gives us a full domain name.  If the host
+    ** doesn't exist in DNS at all but we were given a domain name, use the
+    ** fallback of appending that domain to the hostname.
+    */
     if ((hp = gethostbyname(buff)) == NULL)
-       return NULL;
+       goto fallback;
 #if    0
     /* This code is a "feature" that allows multiple domains (NIS or
      * DNS, I'm not sure) to work with a single INN server.  However,
@@ -80,6 +84,7 @@
            }
 
     /* Give up:  Get the domain config param and append it. */
+fallback:
     if ((p = domain) == NULL || *p == '\0')
        return NULL;
     if (strlen(buff) + 1 + strlen(p) > sizeof buff - 1)



------------------------------

Message: 2
Date: Sat,  3 Feb 2018 12:52:30 -0800 (PST)
From: INN Commit <r...@isc.org>
To: inn-committ...@isc.org
Subject: INN commit: branches/2.6/lib (getfqdn.c)
Message-ID: <20180203205230.9279668...@hope.eyrie.org>

    Date: Saturday, February 3, 2018 @ 12:52:30
  Author: eagle
Revision: 10235

Handle hostnames not in DNS in GetFQDN

If the local hostname isn't in DNS at all, GetFQDN currently returns
NULL.  If a domain was provided but the hostname isn't in DNS, append
the domain to the hostname anyway and return the results.  This is 
possibly still a local configuration error, but it seems like 
friendlier behavior, and also lets the test suite run on hosts with
an unresolvable local hostname.

Modified:
  branches/2.6/lib/getfqdn.c

-----------+
 getfqdn.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Modified: getfqdn.c
===================================================================
--- getfqdn.c   2018-02-03 20:52:20 UTC (rev 10234)
+++ getfqdn.c   2018-02-03 20:52:30 UTC (rev 10235)
@@ -35,9 +35,13 @@
     if (strchr(buff, '.') != NULL)
        return buff;
 
-    /* See if DNS (or /etc/hosts) gives us a full domain name. */
+    /*
+    ** See if DNS (or /etc/hosts) gives us a full domain name.  If the host
+    ** doesn't exist in DNS at all but we were given a domain name, use the
+    ** fallback of appending that domain to the hostname.
+    */
     if ((hp = gethostbyname(buff)) == NULL)
-       return NULL;
+       goto fallback;
 #if    0
     /* This code is a "feature" that allows multiple domains (NIS or
      * DNS, I'm not sure) to work with a single INN server.  However,
@@ -80,6 +84,7 @@
            }
 
     /* Give up:  Get the domain config param and append it. */
+fallback:
     if ((p = domain) == NULL || *p == '\0')
        return NULL;
     if (strlen(buff) + 1 + strlen(p) > sizeof buff - 1)



------------------------------

Message: 3
Date: Sat,  3 Feb 2018 13:33:33 -0800 (PST)
From: INN Commit <r...@isc.org>
To: inn-committ...@isc.org
Subject: INN commit: trunk (8 files)
Message-ID: <20180203213333.baa1268...@hope.eyrie.org>

    Date: Saturday, February 3, 2018 @ 13:33:33
  Author: eagle
Revision: 10236

Rewrite GetFQDN and rename to inn_getfqdn

Use getaddrinfo with AI_CANONNAME instead of the tedious code to
find an FQDN in gethostbyname results.  Return a newly-allocated
string instead of using a static buffer, since this function isn't
performance-critical, avoiding buffer management complexity.  Adjust
call sites to do proper memory allocation handling of the return
value.

Remove some old disabled code to try to force canonicalization by
adding a period to the end of the DNS query.

Modified:
  trunk/doc/man/libinn.3
  trunk/doc/pod/inn.conf.pod
  trunk/frontends/inews.c
  trunk/include/inn/libinn.h
  trunk/lib/getfqdn.c
  trunk/lib/innconf.c
  trunk/lib/messageid.c
  trunk/nnrpd/post.c

----------------------+
 doc/man/libinn.3     |   12 +++--
 doc/pod/inn.conf.pod |    4 -
 frontends/inews.c    |    6 +-
 include/inn/libinn.h |   11 +++-
 lib/getfqdn.c        |  109 ++++++++++++++-----------------------------------
 lib/innconf.c        |    9 ++--
 lib/messageid.c      |    8 ++-
 nnrpd/post.c         |   11 +++-
 8 files changed, 74 insertions(+), 96 deletions(-)

Modified: doc/man/libinn.3
===================================================================
--- doc/man/libinn.3    2018-02-03 20:52:30 UTC (rev 10235)
+++ doc/man/libinn.3    2018-02-03 21:33:33 UTC (rev 10236)
@@ -61,8 +61,8 @@
 .B "    bool   block;"
 
 .B "char *"
-.B "GetFQDN(domain)"
-.B "    char    *domain;"
+.B "inn_getfqdn(domain)"
+.B "    const char *domain;"
 
 .B "char *"
 .B "GetModeratorAddress(FromServer, ToServer, group, moderatormailer)"
@@ -276,11 +276,13 @@
 is one of: INN_LOCK_READ, INN_LOCK_WRITE, or INN_LOCK_UNLOCK.
 It returns false on failure or true on success.
 .PP
-.I GetFQDN
+.I inn_getfqdn
 returns the fully qualified domain name of the local host.
 .I Domain
-is used if local host can not be resolved.
-The returned value points to static space that is reused on subsequent calls,
+is used to qualify the local host name if local host can not be resolved
+in DNS.
+The returned value points to newly-allocated memory that the caller is
+responsible for freeing,
 or NULL on error.
 .PP
 .I GetModeratorAddress

Modified: doc/pod/inn.conf.pod
===================================================================
--- doc/pod/inn.conf.pod        2018-02-03 20:52:30 UTC (rev 10235)
+++ doc/pod/inn.conf.pod        2018-02-03 21:33:33 UTC (rev 10236)
@@ -60,8 +60,8 @@
 
 This should be the domain name of the local host.  It should not have a
 leading period, and it should not be a full host address.  It is used only
-if the GetFQDN() routine in libinn(3) cannot get the fully qualified
-domain name by using either the gethostname(3) or gethostbyname(3) calls.
+if the inn_getfqdn() routine in libinn(3) cannot get the fully qualified
+domain name by using either the gethostname(3) or getaddrinfo(3) calls.
 The check is very simple; if either routine returns a name with a period
 in it, then it is assumed to have the full domain name.  As this parameter
 is rarely used, do not use it to affect the righthand side of

Modified: frontends/inews.c
===================================================================
--- frontends/inews.c   2018-02-03 20:52:30 UTC (rev 10235)
+++ frontends/inews.c   2018-02-03 21:33:33 UTC (rev 10236)
@@ -610,9 +610,11 @@
                 HDR(_path) = concat(Exclusions, PATHFLUFF, (char *) 0);
        }
        else if (innconf->server != NULL) {
-           if ((p = GetFQDN(innconf->domain)) == NULL)
-                sysdie("cannot get hostname");
+           p = inn_getfqdn(innconf->domain);
+           if (p == NULL)
+               sysdie("cannot get hostname");
            HDR(_path) = concat(Exclusions, p, "!", PATHFLUFF, (char *) 0);
+           free(p);
        }
        else {
            HDR(_path) = concat(Exclusions, PATHFLUFF, (char *) 0);

Modified: include/inn/libinn.h
===================================================================
--- include/inn/libinn.h        2018-02-03 20:52:30 UTC (rev 10235)
+++ include/inn/libinn.h        2018-02-03 21:33:33 UTC (rev 10236)
@@ -137,10 +137,15 @@
                            const char *request);
 extern void     CAclose(void);
 
-extern char *    GetFQDN(char *domain);
-extern char *    GetModeratorAddress(FILE *FromServer, FILE *ToServer,
-                                     char *group, char *moderatormailer); 
+/* Return the fully-qualified domain name of the local system in
+   newly-allocated memory, or NULL if it cannot be discovered.  The caller is
+   responsible for freeing.  If the host's domain cannot be found in DNS, use
+   the domain argument as a fallback. */
+extern char *   inn_getfqdn(const char *domain);
 
+extern char *   GetModeratorAddress(FILE *FromServer, FILE *ToServer,
+                                    char *group, char *moderatormailer); 
+
 #define TEMPORARYOPEN   0
 #define INND_HISTORY    1
 #define INND_HISLOG     2

Modified: lib/getfqdn.c
===================================================================
--- lib/getfqdn.c       2018-02-03 20:52:30 UTC (rev 10235)
+++ lib/getfqdn.c       2018-02-03 21:33:33 UTC (rev 10236)
@@ -1,96 +1,53 @@
 /*  $Id$
 **
+**  Discover the fully-qualified domain name of the local host.
 */
 
 #include "config.h"
 #include "clibrary.h"
-#include <netdb.h>
+#include "portable/socket.h"
 
 #include "inn/libinn.h"
-#include "inn/paths.h"
+#include "inn/xmalloc.h"
 
 
 /*
-**  Get the fully qualified domain name for this host, as reported
-**  by the system.
+**  Return the fully-qualified domain name of the local system in
+**  newly-allocated memory, or NULL if it cannot be discovered.  The caller is
+**  responsible for freeing.  If the host's domain cannot be found in DNS, use
+**  the domain argument as a fallback.
 */
-char *GetFQDN(char *domain)
+char *inn_getfqdn(const char *domain)
 {
-    static char                buff[SMBUF];
-    struct hostent     *hp;
-    char               *p;
-    char               **ap;
-#if    0
-    /* See comments below. */
-    char               temp[SMBUF + 2];
-#endif /* 0 */
+    char hostname[BUFSIZ];
+    struct addrinfo hints, *res;
+    char *fqdn, *canon;
 
-    /* Return any old results. */
-    if (buff[0])
-       return buff;
+    /* If gethostname fails, there's nothing we can do. */
+    if (gethostname(hostname, sizeof(hostname)) < 0)
+        return NULL;
 
-    /* Try gethostname. */
-    if (gethostname(buff, (int)sizeof buff) < 0)
-       return NULL;
-    if (strchr(buff, '.') != NULL)
-       return buff;
+    /* If the local hostname is already fully qualified, just return it. */
+    if (strchr(hostname, '.') != NULL)
+        return xstrdup(hostname);
 
-    /*
-    ** See if DNS (or /etc/hosts) gives us a full domain name.  If the host
-    ** doesn't exist in DNS at all but we were given a domain name, use the
-    ** fallback of appending that domain to the hostname.
-    */
-    if ((hp = gethostbyname(buff)) == NULL)
-       goto fallback;
-#if    0
-    /* This code is a "feature" that allows multiple domains (NIS or
-     * DNS, I'm not sure) to work with a single INN server.  However,
-     * it turns out to cause more problems for people, and they have to
-     * use hacks like __switch_gethostbyname, etc.  So if you need this,
-     * turn it on, but don't complain to me. */
-    if (strchr(hp->h_name, '.') == NULL) {
-       /* Try to force DNS lookup if NIS/whatever gets in the way. */
-        strlcpy(temp, buff, sizeof(temp));
-        strlcat(temp, ".", sizeof(temp));
-       hp = gethostbyname(temp);
-    }
-    if (hp == NULL) {
-        return NULL;
-    }
-#endif /* 0 */
-
-    /* First, see if the main name is a FQDN.  It should be. */
-    if (strchr(hp->h_name, '.') != NULL) {
-       if (strlen(hp->h_name) < sizeof buff - 1) {
-           strlcpy(buff, hp->h_name, sizeof(buff));
-            return buff;
+    /* Attempt to canonicalize with DNS. */
+    memset(&hints, 0, sizeof(hints));
+    hints.ai_family = AF_UNSPEC;
+    hints.ai_flags = AI_CANONNAME;
+    if (getaddrinfo(hostname, NULL, &hints, &res) == 0) {
+        canon = res->ai_canonname;
+        if (canon != NULL && strchr(canon, '.') != NULL) {
+            fqdn = xstrdup(canon);
+            freeaddrinfo(res);
+            return fqdn;
         }
-       /* Doesn't fit; make sure we don't return bad data next time. */
-       buff[0] = '\0';
-       return hp->h_name;
+        freeaddrinfo(res);
     }
 
-    /* Second, see if any aliases are. */
-    if ((ap = hp->h_aliases) != NULL)
-       while ((p = *ap++) != NULL)
-           if (strchr(p, '.') != NULL) {
-               /* Deja-vous all over again. */
-               if (strlen(p) < sizeof buff - 1) {
-                   strlcpy(buff, p, sizeof(buff));
-                    return buff;
-                }
-               buff[0] = '\0';
-               return p ;
-           }
-
-    /* Give up:  Get the domain config param and append it. */
-fallback:
-    if ((p = domain) == NULL || *p == '\0')
-       return NULL;
-    if (strlen(buff) + 1 + strlen(p) > sizeof buff - 1)
-       /* Doesn't fit. */
-       return NULL;
-    strlcat(buff, ".", sizeof(buff));
-    strlcat(buff, p, sizeof(buff));
-    return buff;
+    /* Fall back on canonicalizing with a provided domain. */
+    if (domain == NULL || domain[0] == '\0')
+        return NULL;
+    xasprintf(&fqdn, "%s.%s", hostname, domain);
+    return fqdn;
 }

Modified: lib/innconf.c
===================================================================
--- lib/innconf.c       2018-02-03 20:52:30 UTC (rev 10235)
+++ lib/innconf.c       2018-02-03 21:33:33 UTC (rev 10236)
@@ -331,9 +331,9 @@
 
     /* Some parameters have defaults that depend on other parameters. */
     if (innconf->fromhost == NULL)
-        innconf->fromhost = xstrdup(GetFQDN(innconf->domain));
+        innconf->fromhost = inn_getfqdn(innconf->domain);
     if (innconf->pathhost == NULL)
-        innconf->pathhost = xstrdup(GetFQDN(innconf->domain));
+        innconf->pathhost = inn_getfqdn(innconf->domain);
     if (innconf->pathtmp == NULL)
         innconf->pathtmp = xstrdup(INN_PATH_TMP);
 
@@ -471,11 +471,14 @@
 innconf_validate(struct config_group *group)
 {
     bool okay = true;
+    char *fqdn;
 
-    if (GetFQDN(innconf->domain) == NULL) {
+    fqdn = inn_getfqdn(innconf->domain);
+    if (fqdn == NULL) {
         warn("hostname does not resolve or domain not set in inn.conf");
         okay = false;
     }
+    free(fqdn);
     if (innconf->mta == NULL) {
         warn("must set mta in inn.conf");
         okay = false;

Modified: lib/messageid.c
===================================================================
--- lib/messageid.c     2018-02-03 20:52:30 UTC (rev 10235)
+++ lib/messageid.c     2018-02-03 21:33:33 UTC (rev 10236)
@@ -30,6 +30,7 @@
     static char                buff[SMBUF];
     static int         count;
     char               *p;
+    char               *fqdn = NULL;
     char               sec32[10];
     char               pid32[10];
     time_t             now;
@@ -42,10 +43,13 @@
          && strcmp(domain, innconf->domain) != 0)) {
        p = domain;
     } else {
-       if ((p = GetFQDN(domain)) == NULL)
-           return NULL;
+        fqdn = inn_getfqdn(domain);
+        if (fqdn == NULL)
+            return NULL;
+        p = fqdn;
     }
     snprintf(buff, sizeof(buff), "<%s$%s$%d@%s>", sec32, pid32, ++count, p);
+    free(fqdn);
     return buff;
 }
 

Modified: nnrpd/post.c
===================================================================
--- nnrpd/post.c        2018-02-03 20:52:30 UTC (rev 10235)
+++ nnrpd/post.c        2018-02-03 21:33:33 UTC (rev 10236)
@@ -346,6 +346,7 @@
     static char                *newpath = NULL;
     HEADER             *hp;
     char               *p;
+    char               *fqdn = NULL;
     time_t             t, now;
     const char          *error;
     pid_t               pid;
@@ -559,11 +560,15 @@
     if (VirtualPathlen > 0) {
         p = PERMaccessconf->domain;
     } else {
-        if ((p = GetFQDN(PERMaccessconf->domain)) == NULL) {
-            p = (char *) "unknown";
-        }
+       fqdn = inn_getfqdn(PERMaccessconf->domain);
+       if (fqdn == NULL)
+           p = (char *) "unknown";
+       else
+           p = fqdn;
     }
     snprintf(pathidentitybuff, sizeof(pathidentitybuff), "%s", p);
+    free(fqdn);
+    p = NULL;
 
     /* Set the posting-account value. */
      if (PERMaccessconf->addinjectionpostingaccount && PERMuser[0] != '\0') {



------------------------------

Message: 4
Date: Sat,  3 Feb 2018 13:36:35 -0800 (PST)
From: INN Commit <r...@isc.org>
To: inn-committ...@isc.org
Subject: INN commit: trunk/lib (getfqdn.c)
Message-ID: <20180203213635.b05e168...@hope.eyrie.org>

    Date: Saturday, February 3, 2018 @ 13:36:35
  Author: eagle
Revision: 10237

Add blank line in inn_getfqdn signature

Use the new coding style with a line break between the return
type and the function name.

Modified:
  trunk/lib/getfqdn.c

-----------+
 getfqdn.c |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Modified: getfqdn.c
===================================================================
--- getfqdn.c   2018-02-03 21:33:33 UTC (rev 10236)
+++ getfqdn.c   2018-02-03 21:36:35 UTC (rev 10237)
@@ -17,7 +17,8 @@
 **  responsible for freeing.  If the host's domain cannot be found in DNS, use
 **  the domain argument as a fallback.
 */
-char *inn_getfqdn(const char *domain)
+char *
+inn_getfqdn(const char *domain)
 {
     char hostname[BUFSIZ];
     struct addrinfo hints, *res;



------------------------------

Subject: Digest Footer

_______________________________________________
inn-committers mailing list
inn-committers@lists.isc.org
https://lists.isc.org/mailman/listinfo/inn-committers

------------------------------

End of inn-committers Digest, Vol 104, Issue 1
**********************************************

Reply via email to