Subject: mkhosts(8) does not handle mixed upper + lower case (#270)
Index:	etc/mkhosts.c 2.11BSD

Description:
	The mkhosts(8) program used to build the dbm hosts file
	does not handle upper case characters in hostnames correctly.

Repeat-By:
	Have an entry like this:

		127.0.0.1  LocalHost.domain  

	in the /etc/hosts file and run "/etc/mkhosts /etc/hosts".  Programs
	which use 'gethostbyname(3)' will not be able to find the host
	"localhost".

Fix:
	Systems which are attached to the Internet should use the
	resolver routines to talk to a host running a DNS server.  Hosts
	which are connected only by uucp (or not connected to the Internet
	at all) are likely to use hosts files - this fix will allow those
	systems to use mixed case names.

	The change to mkhosts was simply to force the 'key' used to write
	records into the dbm database files to be lower case.  This is
	what the gethost*() do when looking up hostnames.  The 'content'
	of each record written is left exactly as given in /etc/hosts.

	Cut where indicated and save to a file (/tmp/270).  Then

		patch -p0 < /tmp/270

	If you are not using host files then you need not (in fact you can 
	not) recompile mkhosts.  If you are using host files then:

		cd /usr/src/etc
		make mkhosts
		install -s -m 755 mkhosts /etc/mkhosts
		/etc/mkhosts /etc/hosts

		All 2.11BSD updates are located in /pub/2.11BSD on the
		system FTP.IIPO.GTEGSC.COM.

========================cut here===================
*** /usr/src/etc/mkhosts.c.old	Thu Oct  5 14:17:40 1989
--- /usr/src/etc/mkhosts.c	Fri Aug 18 21:00:16 1995
***************
*** 4,25 ****
   * specifies the terms and conditions for redistribution.
   */
  
! #ifndef lint
  char copyright[] =
  "@(#) Copyright (c) 1980 Regents of the University of California.\n\
   All rights reserved.\n";
- #endif not lint
  
- #ifndef lint
  /* static char sccsid[] = "@(#)mkhosts.c	5.1 (Berkeley) 5/28/85"; */
! static char sccsid[] = "@(#)mkhosts.c	1.1 (2.10BSD) 10/04/89";
! #endif not lint
  
  #include <sys/file.h>
  #include <stdio.h>
  #include <netdb.h>
  #include <ndbm.h>
  
  char	buf[BUFSIZ];
  
  main(argc, argv)
--- 4,26 ----
   * specifies the terms and conditions for redistribution.
   */
  
! #if	!defined(lint) && defined(DOSCCS)
  char copyright[] =
  "@(#) Copyright (c) 1980 Regents of the University of California.\n\
   All rights reserved.\n";
  
  /* static char sccsid[] = "@(#)mkhosts.c	5.1 (Berkeley) 5/28/85"; */
! static char sccsid[] = "@(#)mkhosts.c	1.2 (2.11BSD) 1995/08/17";
! #endif
  
+ #include <ctype.h>
+ #include <sys/param.h>
  #include <sys/file.h>
  #include <stdio.h>
  #include <netdb.h>
  #include <ndbm.h>
  
+ void	keylower();
  char	buf[BUFSIZ];
  
  main(argc, argv)
***************
*** 34,39 ****
--- 35,41 ----
  	int naliases, naddrs;
  	int verbose = 0, entries = 0, maxlen = 0, error = 0;
  	char tempname[BUFSIZ], newname[BUFSIZ];
+ 	char lowname[MAXHOSTNAMELEN + 1];
  
  	if (argc > 1 && strcmp(argv[1], "-v") == 0) {
  		verbose++;
***************
*** 65,72 ****
  			;
  		nap = (int *)cp;
  		cp += sizeof (int);
! 		key.dptr = hp->h_name;
! 		key.dsize = strlen(hp->h_name);
  		hp2 = (struct hostent *)fetchhost(dp, key);
  		if (hp2) {
  			merge(hp, hp2);
--- 67,80 ----
  			;
  		nap = (int *)cp;
  		cp += sizeof (int);
! 
! 		keylower(lowname, hp->h_name);
! 		key.dptr = lowname;
! 		key.dsize = strlen(lowname);
! /*
! 			key.dptr = hp->h_name;
! 			key.dsize = strlen(hp->h_name);
! */
  		hp2 = (struct hostent *)fetchhost(dp, key);
  		if (hp2) {
  			merge(hp, hp2);
***************
*** 98,105 ****
  			goto err;
  		}
  		for (sp = hp->h_aliases; *sp; sp++) {
! 			key.dptr = *sp;
! 			key.dsize = strlen(*sp);
  			if (dbm_store(dp, key, content, DBM_REPLACE) < 0) {
  				perror(*sp);
  				goto err;
--- 106,118 ----
  			goto err;
  		}
  		for (sp = hp->h_aliases; *sp; sp++) {
! 			keylower(lowname, *sp);
! 			key.dptr = lowname;
! 			key.dsize = strlen(lowname);
! /*
! 				key.dptr = *sp;
! 				key.dsize = strlen(*sp);
! */
  			if (dbm_store(dp, key, content, DBM_REPLACE) < 0) {
  				perror(*sp);
  				goto err;
***************
*** 231,233 ****
--- 244,261 ----
  		}
  	}
  }
+ 
+ void
+ keylower(out, in)
+ 	register char *out, *in;
+ 	{
+ 
+ 	while	(*in)
+ 		{
+ 		if	(isupper(*in))
+ 			*out++ = tolower(*in++);
+ 		else
+ 			*out++ = *in++;
+ 		}
+ 	*out++ = '\0';
+ 	}
*** /VERSION.old	Mon Jul 24 20:28:31 1995
--- /VERSION	Sat Aug 12 00:13:20 1995
***************
*** 1,4 ****
! Current Patch Level: 269
  
  2.11 BSD
  ============
--- 1,4 ----
! Current Patch Level: 270
  
  2.11 BSD
  ============
