Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Mar 2002 15:44:32 +0100
From:      Matthias Buelow <mkb@informatik.uni-wuerzburg.de>
To:        Scott Blachowicz <scott@sabami.seaslug.org>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: ports/36307: nmh port cuts off last part of sender domain 
Message-ID:  <20020327144432.4CE71AEB8@reiher.informatik.uni-wuerzburg.de>
In-Reply-To: Your message of "Tue, 26 Mar 2002 20:14:08 PST." <20020326201407.A55900@sabami.seaslug.org> 

next in thread | previous in thread | raw e-mail | index | archive | help
Scott Blachowicz <scott@sabami.seaslug.org> writes:


(freebsd-hackers, please see comment about sys/utsname.h / SYS_NMLN
below; you might ignore the nmh bug correspondence above.)


>OK...it looks like there's this zotnet/mts/mts.c file with a LocalName()
>function that calls various functions (uname(), gethostbyname(), ...) to get
>the canonical hostname for a system.  I've put some debug tracing in my copy
>to figure out which calls are returning what.  Also, I put some code in the
>mts/smtp/smtp.c to dump everything written to the SMTP socket into a /tmp/
>file.  Those files should be attached to this message.
>
>So, after building with this stuff, you do
>
>	env DEBUG_SMTP=1 comp
>
>to send something.  I just did that here and got this:


Heh, I've found the bug.  Your debugging code put me on the correct
trail.  nmh now spits out:

What now? s
LocalName() - got from uname(): reiher.informatik.uni-wuerzburg
LocalName() - returning: reiher.informatik.uni-wuerzburg
LocalName() - got from uname(): reiher.informatik.uni-wuerzburg
LocalName() - returning: reiher.informatik.uni-wuerzburg
smtp.c[138]: calling LocalName()

which made me look up uname(3) and write a little test program:

    #include <sys/utsname.h>
    #include <stdio.h>

    int main()
    {
	struct utsname u;

	if (-1 == (uname(&u))) {
	    perror("uname failed");
	    return 1;
	}
	printf("sysname: %s\nnodename: %s\nrelease: %s\nmachine: %s\n",
		u.sysname, u.nodename, u.release, u.version, u.machine);
	return 0;
    }

which prints:

$ ./a.out
sysname: FreeBSD
nodename: reiher.informatik.uni-wuerzburg
release: 4.5-STABLE
machine: FreeBSD 4.5-STABLE #0: Fri Mar 

Note that not only the "nodename" is truncated but the "machine"
entry also.  Which made me look into sys/utsname.h, suspecting
a small constant width for these struct entries, which actually
turns out to be the case:

    #define SYS_NMLN        32
...
        char    nodename[SYS_NMLN];     /* Name of this network node. */
...

Thus, if nmh calls uname(3) to get the name, everything longer than
31 characters is truncated.

This is both a problem in nmh aswell as FreeBSD; nmh shouldn't rely
on uname(3) for getting a full Internet hostname as "nodename";
FreeBSD should raise SYS_NMLN to provide enough place for an Internet
hostname.  For example, on Solaris 8, it is defined as:

    #define _SYS_NMLN       257     /* 4.0 size of utsname elements */
				    /* Must be at least 257 to      */
				    /* support Internet hostnames.  */

On NetBSD (1.5.1) it is:

    #define _SYS_NMLN       256

That's also the reason why the "problem" didn't show up on NetBSD
or Solaris.

My proposal:

Make nmh depend on sth. else than uname(3), and also push up
FreeBSD's SYS_NMLN (if not already done so in -CURRENT, haven't
checked.)

--mkb

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




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