libtt: if local hostname lookup fails, default to localhost
authorJon Trulson <jon@radscan.com>
Wed, 20 Jun 2018 22:59:34 +0000 (16:59 -0600)
committerJon Trulson <jon@radscan.com>
Wed, 20 Jun 2018 22:59:34 +0000 (16:59 -0600)
A recurring problem, mainly on the BSD's, and also on some Linux
installations, is a failure for ttsession to start and any clients
trying to attach to it failing due to having a hostname that is not
associated with an IP address.

This is due to code which looks up the hostname, and if it does not
have a valid host record, then TT just fails.

This has required those users to add an alias for their host name in
their /etc/hosts file.

With this commit, this should no longer be necessary.  Now, if
_XGethostbyname() fails when looking up the local name, a default of
"localhost" is used, which should always exist.

This was run tested on Linux and FreeBSD 11.1.  It was compile tested
on OpenBSD 6.2.

cde/lib/tt/lib/util/tt_host.C

index f73fd4baceaca0d0c17bc4fab63acaf431b4b332..d608b57e112bef14b46bbfb9dcdb803f8ffa26b1 100644 (file)
@@ -207,7 +207,38 @@ init_byname(_Tt_string name)
 
        memset((char*) &host_buf, 0, sizeof(_Xgethostbynameparams));
        if (name.len() == 0) {
-               _name = _tt_gethostname();
+            /* JET - many machines in this modern era have a hostname
+             * that does not have an IP address associated with it.
+             * So, we do a quick check to see if XGethostbyname() is
+             * happy with the returned name.  If it isn't, then we set
+             * the name to "localhost", which should always exist on
+             * any machine with IP networking.  If your machine does
+             * not have IP networking, you shouldn't be running TT :)
+             *
+             * This should fix those cases, particularly on BSD
+             * machines, whereby TT fails to start.  They should no
+             * longer need to add their hostname manually to
+             * /etc/hosts (as an alias to localhost) in order to start
+             * CDE
+             */
+            _name = _tt_gethostname();
+            if(!_XGethostbyname((char *)_name, host_buf))
+            {
+                /* this gets a little verbose - you see one for every
+                 * client, so if-0 out.  Leave for future debugging
+                 * though...
+                 */
+#if 0
+                _tt_syslog(0, LOG_WARNING,  "_XGethostbyname(%s) failed,"
+                           " defaulting to localhost",
+                           (const char *)_name);
+#endif
+
+                /* fall back to localhost */
+                _name = "localhost";
+            }
+            /* clear host_buf again, for the final run below */
+            memset((char*) &host_buf, 0, sizeof(_Xgethostbynameparams));
        } else {
                qual = name.split(':',_name);
                if (_name.len()== 0) {