Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Jan 2001 19:30:25 -0800 (PST)
From:      cjclark@reflexcom.com
To:        FreeBSD-gnats-submit@freebsd.org
Cc:        current@freebsd.org
Subject:   syslogd(8) does not update hostname
Message-ID:  <200101190330.f0J3UPa75677@rfx-216-196-73-168.users.reflexcom.com>

next in thread | raw e-mail | index | archive | help

>Submitter-Id:   current-users
>Originator:     Crist J. Clark
>Organization:   
>Confidential:   no
>Synopsis:       syslogd(8) does not update hostname
>Severity:       non-critical
>Priority:       medium
>Category:       bin
>Release:        FreeBSD 5.0-CURRENT i386
>Class:          sw-bug
>Environment: 

	All standard FreeBSD distributions. The code discussed is from
5.0-CURRENT, but should trivially merge back to -STABLE.

>Description: 

	Many tools and progams within FreeBSD date back to a time when
it was expected that a machines IP and hostname seldom, if ever,
changed. Even when a IP and hostname were received at boot, it rarely
changed until shutdown. With many users using protocols like DHCP
where IP and hostname change with time, many tools do not deal well
with this behavior.

	One of these tools is syslogd(8). syslogd(8) is typically
started at boot time and runs until shutdown. However, syslogd(8)
loads the hostname at startup and syslogd(8)'s idea of the hostname
can never change while it is running.

	One might expect that a SIGHUP would cause syslogd(8) to load
the new hostname since a SIGHUP can cause syslogd(8) to re-read its
configuration file and re-open the log files, but it does not.

	The fact that the hostname does not change can cause confusion
in the log files. It could be especially troublesome when a machine is
logging to a central loghost. At any given time, the names in the log
files may not have any correspondence to the names the hosts currently
have. There are even issues on a host that gets its IP and hostname
via DHCP at boot and the name never changes. syslogd(8) is started
before any network services are initialized in /etc/rc.

	I propose that syslogd(8) should reload the hostname with a
SIGHUP. I cannot think of any reason that one should not update the
hostname, but as I pointed out, there are reasons why one would want
that behavior.

>How-To-Repeat: 

	# hostname -s
	bubbles
	# hostname bubbles-test.domain.org
	# kill -HUP `cat /var/run/syslog.pid`
	# logger -p user.notice "hostname test"
	# tail -4 /var/log/messages
	Jan 17 21:45:00 bubbles /boot/kernel/kernel: acd0: CDROM <CD-532E-A> at ata0-slave using BIOSPIO
	Jan 17 21:45:00 bubbles /boot/kernel/kernel: Mounting root from ufs:/dev/ad0s1a
	Jan 18 00:41:14 bubbles su: cjc to root on /dev/ttyp0
	Jan 18 00:58:34 bubbles cjc: hostname test

>Fix: 

	I do not see any reason we cannot move the code that gets the
hostname from the main() function into init(). init() is called when
to "reload" settings. The hostname is never used in main() before
init() is called. The patch is against -CURRENT and my box has not
exploded yet.

	Here is what the above test looks like with the change in
place.

	# hostname -s
	bubbles
	# hostname bubbles-test.cjclark.org
	# kill -HUP `cat /var/run/syslog.pid `
	# logger -p user.notice "syslogd hostname test"
	# hostname bubbles.cjclark.org
	# kill -HUP `cat /var/run/syslog.pid `
	# logger -p user.notice "syslogd hostname test"
	# tail -4 /var/log/messages
	Jan 18 13:36:58 bubbles su: BAD SU cjc to root on /dev/ttyp0
	Jan 18 13:37:03 bubbles su: cjc to root on /dev/ttyp0
	Jan 18 13:38:40 bubbles-test cjc: syslogd hostname test
	Jan 18 13:39:11 bubbles cjc: syslogd hostname test


--- syslogd.c   2001/01/18 08:06:34
+++ syslogd.c   2001/01/18 08:09:23
@@ -395,12 +395,6 @@
 
        consfile.f_type = F_CONSOLE;
        (void)strcpy(consfile.f_un.f_fname, ctty + sizeof _PATH_DEV - 1);
-       (void)gethostname(LocalHostName, sizeof(LocalHostName));
-       if ((p = strchr(LocalHostName, '.')) != NULL) {
-               *p++ = '\0';
-               LocalDomain = p;
-       } else
-               LocalDomain = "";
        (void)strcpy(bootfile, getbootfile());
        (void)signal(SIGTERM, die);
        (void)signal(SIGINT, Debug ? die : SIG_IGN);
@@ -1342,6 +1336,16 @@
        char host[MAXHOSTNAMELEN+1];
 
        dprintf("init\n");
+
+       /*
+        * Load hostname (may have changed)
+        */
+       (void)gethostname(LocalHostName, sizeof(LocalHostName));
+       if ((p = strchr(LocalHostName, '.')) != NULL) {
+               *p++ = '\0';
+               LocalDomain = p;
+       } else
+               LocalDomain = "";
 
        /*
         *  Close all open log files.


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200101190330.f0J3UPa75677>