This is patch #3 to the Zephyr sources.

After applying the patch, rebuild the server, zctl, znol, zpopnotify,
zmailnotify and zhm.

BE SURE TO APPLY THIS PATCH WITH

   patch -p

TO PRESERVE THE DIRECTORY HIERARCHY.

CHANGES in this patch file:
	- remove support for zinit (it is now part of the separate
		Athena program "attach")
	- fix unsubscriptions in zctl
	- turn off ATHENA_COMPAT for zmailnotify
	- add support for "-f -" for znol
	- fix bug in zpopnotify which sent all notices to the same
		recipient
	- bug fixes for acl_files.c in library
	- clean up installation step of server so it only removes old
		.acl files 
	- make server truly case-insensitive
	- put some fake message logging in server, improve other error messages
	- fix bad xfree() call in server
	- parameterize pid file name for zhm
	- update affected manual pages

Prereq: 2
diff -rc patchlevel2/patchlevel.h src/patchlevel.h
*** patchlevel2/patchlevel.h	Fri Oct 27 13:29:25 1989
--- src/patchlevel.h	Mon Dec 18 13:52:21 1989
***************
*** 1 ****
! #define PATCHLEVEL 2
--- 1 ----
! #define PATCHLEVEL 3
diff -rc patchlevel2/clients/Imakefile src/clients/Imakefile
*** patchlevel2/clients/Imakefile	Wed Apr  5 16:57:11 1989
--- src/clients/Imakefile	Mon Oct 30 16:53:56 1989
***************
*** 3,11 ****
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /mit/zephyr/src/clients/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: Imakefile,v 1.5 89/04/05 16:56:59 jtkohl Exp $
  /**/#
  #define have_subdirs
  #define no_curdir_lint
--- 3,11 ----
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/RCS/Imakefile,v 1.6 89/10/30 16:53:53 jtkohl Exp $
  /**/#
  #define have_subdirs
  #define no_curdir_lint
***************
*** 27,33 ****
  ZMAILNOTIFY=
  #endif /* HESIOD && KERBEROS */
  
! SUBDIRS = zaway zctl zinit zleave zlocate \
  	$(ZMAILNOTIFY) znol zpopnotify zshutdown_notify zstat zwrite $(SYSLOGD)
  
  #ifdef OLD_ATHENA_COMPAT
--- 27,33 ----
  ZMAILNOTIFY=
  #endif /* HESIOD && KERBEROS */
  
! SUBDIRS = zaway zctl zleave zlocate \
  	$(ZMAILNOTIFY) znol zpopnotify zshutdown_notify zstat zwrite $(SYSLOGD)
  
  #ifdef OLD_ATHENA_COMPAT
diff -rc patchlevel2/clients/zctl/zctl.c src/clients/zctl/zctl.c
*** patchlevel2/clients/zctl/zctl.c	Thu Mar 23 17:04:18 1989
--- src/clients/zctl/zctl.c	Wed Nov 15 12:01:00 1989
***************
*** 3,9 ****
   *
   *	Created by:	Robert French
   *
!  *	$Source: /mit/zephyr/src/clients/zctl/RCS/zctl.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
--- 3,9 ----
   *
   *	Created by:	Robert French
   *
!  *	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/zctl/RCS/zctl.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
***************
*** 21,27 ****
  #include <sys/file.h>
  #include <sys/param.h>
  #ifndef lint
! static char rcsid_zctl_c[] = "$Header: zctl.c,v 1.13 89/03/23 17:03:56 jtkohl Exp $";
  #endif lint
  
  #define SUBSATONCE 7
--- 21,27 ----
  #include <sys/file.h>
  #include <sys/param.h>
  #ifndef lint
! static char rcsid_zctl_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/zctl/RCS/zctl.c,v 1.14 89/11/15 12:00:51 jtkohl Exp $";
  #endif lint
  
  #define SUBSATONCE 7
***************
*** 119,125 ****
  		exit((code != 0));
  	} 
  
! 	printf("ZCTL $Revision: 1.13 $ (Protocol %s%d.%d) - Type '?' for a list of commands.\n\n",
  	       ZVERSIONHDR,
  	       ZVERSIONMAJOR,ZVERSIONMINOR);
  	
--- 119,125 ----
  		exit((code != 0));
  	} 
  
! 	printf("ZCTL $Revision: 1.14 $ (Protocol %s%d.%d) - Type '?' for a list of commands.\n\n",
  	       ZVERSIONHDR,
  	       ZVERSIONMAJOR,ZVERSIONMINOR);
  	
***************
*** 703,710 ****
  			if (type == UNSUB)
  				continue;
  			unsubs[unind].class =
! 				malloc((unsigned)(strlen(subline)+1));
! 			(void) strcpy(unsubs[unind].class,subline);
  			unsubs[unind].classinst =
  				malloc((unsigned)(strlen(comma+1)+1));
  			(void) strcpy(unsubs[unind].classinst,comma+1);
--- 703,711 ----
  			if (type == UNSUB)
  				continue;
  			unsubs[unind].class =
! 				malloc((unsigned)(strlen(subline)));
! 			/* skip the leading '!' */
! 			(void) strcpy(unsubs[unind].class,subline+1);
  			unsubs[unind].classinst =
  				malloc((unsigned)(strlen(comma+1)+1));
  			(void) strcpy(unsubs[unind].classinst,comma+1);
diff -rc patchlevel2/clients/zmailnotify/Imakefile src/clients/zmailnotify/Imakefile
*** patchlevel2/clients/zmailnotify/Imakefile	Thu Mar 23 11:18:43 1989
--- src/clients/zmailnotify/Imakefile	Wed Nov 15 10:31:41 1989
***************
*** 3,16 ****
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /mit/zephyr/src/clients/zmailnotify/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: Imakefile,v 1.2 89/03/23 11:18:38 jtkohl Exp $
  /**/#
  
  LIBS= ${ZEPHYR_LIB} ${COMERR_LIB} ${KRB_LIB} ${DES_LIB} ${HES_LIB}
  LINTLIBS= ${ZEPHYR_LINTLIB} ${COMERR_LINTLIB} ${KRB_LINTLIB} ${DES_LINTLIB}
! DEFINES= -DKPOP -DATHENA_COMPAT
  
  SRCS = zmailnotify.c
  OBJS = zmailnotify.o
--- 3,16 ----
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/zmailnotify/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Id: Imakefile,v 1.3 89/11/15 10:31:28 jtkohl Exp $
  /**/#
  
  LIBS= ${ZEPHYR_LIB} ${COMERR_LIB} ${KRB_LIB} ${DES_LIB} ${HES_LIB}
  LINTLIBS= ${ZEPHYR_LINTLIB} ${COMERR_LINTLIB} ${KRB_LINTLIB} ${DES_LINTLIB}
! DEFINES= -DKPOP
  
  SRCS = zmailnotify.c
  OBJS = zmailnotify.o
diff -rc patchlevel2/clients/znol/znol.c src/clients/znol/znol.c
*** patchlevel2/clients/znol/znol.c	Fri Oct 27 13:29:27 1989
--- src/clients/znol/znol.c	Mon Oct 30 09:47:30 1989
***************
*** 19,25 ****
  #include <string.h>
  
  #ifndef lint
! static char rcsid_znol_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/znol/RCS/znol.c,v 1.6 89/10/25 14:17:51 jtkohl Exp $";
  #endif lint
  
  #define SUBSATONCE 7
--- 19,25 ----
  #include <string.h>
  
  #ifndef lint
! static char rcsid_znol_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/znol/RCS/znol.c,v 1.7 89/10/30 09:47:10 jtkohl Exp $";
  #endif lint
  
  #define SUBSATONCE 7
***************
*** 47,65 ****
  		exit (1);
  	}
  
- 	envptr = getenv("HOME");
- 	if (envptr)
- 		(void) strcpy(anyonename,envptr);
- 	else {
- 		if (!(pwd = getpwuid((int) getuid()))) {
- 			fprintf(stderr,"Who are you?\n");
- 			exit (1);
- 		}
- 
- 		(void) strcpy(anyonename,pwd->pw_dir);
- 	} 
- 	(void) strcat(anyonename,"/.anyone");
- 
  	for (arg=1;arg<argc;arg++) {
  		if (!strcmp(argv[arg],"on")) {
  			onoff = ON;
--- 47,52 ----
***************
*** 114,123 ****
  			exit(1);
  		}
  	
  
! 	if (!useronly && !(fp = fopen(anyonename,"r"))) {
! 		fprintf(stderr,"Can't open %s for input\n",anyonename);
! 		exit (1);
  	}
  
  	ind = 0;
--- 101,129 ----
  			exit(1);
  		}
  	
+ 	if (!useronly) {
+ 		/* If no filename specified, get the default */
+ 		if (!filenamed) {
+ 			envptr = getenv("HOME");
+ 			if (envptr)
+ 			    (void) strcpy(anyonename,envptr);
+ 			else {
+ 				if (!(pwd = getpwuid((int) getuid()))) {
+ 					fprintf(stderr,"You are not listed in the password file.\n");
+ 					exit (1);
+ 				}
+ 				(void) strcpy(anyonename,pwd->pw_dir);
+ 			}
+ 			(void) strcat(anyonename,"/.anyone");
+ 		}
  
! 		/* if the filename is "-", read stdin */
! 		if (strcmp(anyonename,"-") == 0) {
! 			fp = stdin;
! 		} else if (!(fp = fopen(anyonename,"r"))) {
! 			fprintf(stderr,"Can't open %s for input\n",anyonename);
! 			exit (1);
! 		}
  	}
  
  	ind = 0;
*** patchlevel2/clients/zpopnotify/zpopnotify.c	Wed May 10 16:54:01 1989
--- src/clients/zpopnotify/zpopnotify.c	Wed Nov  8 15:42:24 1989
***************
*** 3,9 ****
   *
   *	Created by:	Robert French
   *
!  *	$Source: /mit/zephyr/src/clients/zpopnotify/RCS/zpopnotify.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
--- 3,9 ----
   *
   *	Created by:	Robert French
   *
!  *	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/zpopnotify/RCS/zpopnotify.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
***************
*** 19,25 ****
  #include <sys/param.h>			/* for MAXHOSTNAMELEN */
  
  #ifndef lint
! static char rcsid_zpopnotify_c[] = "$Header: zpopnotify.c,v 1.5 89/05/10 16:53:48 jtkohl Exp $";
  #endif lint
  
  #define MAIL_CLASS "MAIL"
--- 19,25 ----
  #include <sys/param.h>			/* for MAXHOSTNAMELEN */
  
  #ifndef lint
! static char rcsid_zpopnotify_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/clients/zpopnotify/RCS/zpopnotify.c,v 1.6 89/11/08 15:42:11 jtkohl Exp $";
  #endif lint
  
  #define MAIL_CLASS "MAIL"
***************
*** 78,85 ****
  	    notice.z_opcode = "";
  	    notice.z_sender = mysender;
  	    notice.z_default_format = "From Post Office $1:\n$2";
! 	
! 	    notice.z_recipient = (char *)rindex(argv[1],'/');
  	    if (notice.z_recipient)
  		notice.z_recipient++;
  	    else
--- 78,86 ----
  	    notice.z_opcode = "";
  	    notice.z_sender = mysender;
  	    notice.z_default_format = "From Post Office $1:\n$2";
! 
! 	    /* in case it's a mailbox name (pathname), strip to username */
! 	    notice.z_recipient = (char *)rindex(argv[i],'/');
  	    if (notice.z_recipient)
  		notice.z_recipient++;
  	    else
diff -rc patchlevel2/lib/acl_files.c src/lib/acl_files.c
*** patchlevel2/lib/acl_files.c	Thu Mar 23 09:32:53 1989
--- src/lib/acl_files.c	Wed Dec 13 11:19:41 1989
***************
*** 3,9 ****
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /mit/zephyr/src/lib/RCS/acl_files.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
--- 3,9 ----
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/lib/RCS/acl_files.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
***************
*** 14,20 ****
  #include <zephyr/mit-copyright.h>
  
  #ifndef lint
! static char rcsid_acl_files_c[] = "$Header: acl_files.c,v 1.2 89/03/23 09:32:41 jtkohl Exp $";
  #endif lint
  
  /*** Routines for manipulating access control list files ***/
--- 14,20 ----
  #include <zephyr/mit-copyright.h>
  
  #ifndef lint
! static char rcsid_acl_files_c[] = "$Id: acl_files.c,v 1.3 89/12/13 11:17:56 jtkohl Exp $";
  #endif lint
  
  /*** Routines for manipulating access control list files ***/
***************
*** 389,395 ****
  	i = acl_cache_next;
  	acl_cache_next = (acl_cache_next + 1) % CACHED_ACLS;
  	close(acl_cache[i].fd);
! 	if(acl_cache[i].acl) destroy_hash(acl_cache[i].acl);
      }
  
      /* Set up the acl */
--- 389,398 ----
  	i = acl_cache_next;
  	acl_cache_next = (acl_cache_next + 1) % CACHED_ACLS;
  	close(acl_cache[i].fd);
! 	if(acl_cache[i].acl) {
! 	    destroy_hash(acl_cache[i].acl);
! 	    acl_cache[i].acl = (struct hashtbl *) 0;
! 	}
      }
  
      /* Set up the acl */
***************
*** 399,406 ****
      acl_cache[i].acl = (struct hashtbl *) 0;
  
   got_it:
!     /* See if the stat matches */
!     if(fstat(acl_cache[i].fd, &s) < 0) return(-1);
      if(acl_cache[i].acl == (struct hashtbl *) 0
         || s.st_nlink != acl_cache[i].status.st_nlink
         || s.st_mtime != acl_cache[i].status.st_mtime
--- 402,415 ----
      acl_cache[i].acl = (struct hashtbl *) 0;
  
   got_it:
!     /*
!      * See if the stat matches
!      *
!      * Use stat(), not fstat(), as the file may have been re-created by
!      * acl_add or acl_delete.  If this happens, the old inode will have
!      * no changes in the mod-time and the following test will fail.
!      */
!     if(stat(acl_cache[i].filename, &s) < 0) return(-1);
      if(acl_cache[i].acl == (struct hashtbl *) 0
         || s.st_nlink != acl_cache[i].status.st_nlink
         || s.st_mtime != acl_cache[i].status.st_mtime
***************
*** 416,421 ****
--- 425,431 ----
  	       acl_canonicalize_principal(buf, canon);
  	       add_hash(acl_cache[i].acl, canon);
  	   }
+ 	   fclose(f);
  	   acl_cache[i].status = s;
         }
      return(i);
diff -rc patchlevel2/man/man1/znol.1 src/man/man1/znol.1
*** patchlevel2/man/man1/znol.1	Fri Oct 27 13:29:35 1989
--- src/man/man1/znol.1	Mon Oct 30 09:47:04 1989
***************
*** 1,6 ****
  .\"	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man1/RCS/znol.1,v $
  .\"	$Author: jtkohl $
! .\"	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man1/RCS/znol.1,v 1.6 89/10/25 14:23:06 jtkohl Exp $
  .\"
  .\" Copyright 1987,1988 by the Massachusetts Institute of Technology
  .\" All rights reserved.  The file /usr/include/zephyr/mit-copyright.h
--- 1,6 ----
  .\"	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man1/RCS/znol.1,v $
  .\"	$Author: jtkohl $
! .\"	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man1/RCS/znol.1,v 1.7 89/10/30 09:46:58 jtkohl Exp $
  .\"
  .\" Copyright 1987,1988 by the Massachusetts Institute of Technology
  .\" All rights reserved.  The file /usr/include/zephyr/mit-copyright.h
***************
*** 46,51 ****
--- 46,53 ----
  The namelist file is taken to be
  .I file.
  If
+ .I file
+ is "-", then the standard input is used instead of a file. If
  .I file
  does not exist, an error message is printed, and
  .I znol
diff -rc patchlevel2/man/man8/Imakefile src/man/man8/Imakefile
*** patchlevel2/man/man8/Imakefile	Thu Mar 23 11:54:40 1989
--- src/man/man8/Imakefile	Fri Dec 15 09:08:30 1989
***************
*** 3,15 ****
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /mit/zephyr/src/man/man8/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: Imakefile,v 1.2 89/03/23 11:54:34 jtkohl Exp $
  /**/#
  #define no_curdir_lint
  
! MAN8 = zhm.8 zephyrd.8 zstat.8 zinit.8 zpopnotify.8 zshutdown_notify.8
  
  SRCDIR= ${SRCTOP}/man/man8
  CODE= ${MAN8} Imakefile
--- 3,15 ----
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man8/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/man/man8/RCS/Imakefile,v 1.4 89/12/15 09:08:28 jtkohl Exp $
  /**/#
  #define no_curdir_lint
  
! MAN8 = zhm.8 zephyrd.8 zstat.8 zpopnotify.8 zshutdown_notify.8
  
  SRCDIR= ${SRCTOP}/man/man8
  CODE= ${MAN8} Imakefile
***************
*** 17,22 ****
  manpage(8,zhm.8)
  manpage(8,zephyrd.8)
  manpage(8,zstat.8)
- manpage(8,zinit.8)
  manpage(8,zpopnotify.8)
  manpage(8,zshutdown_notify.8)
--- 17,21 ----
diff -rc patchlevel2/server/Imakefile src/server/Imakefile
*** patchlevel2/server/Imakefile	Fri Oct 27 13:29:36 1989
--- src/server/Imakefile	Mon Dec 18 13:25:11 1989
***************
*** 5,11 ****
  /**/#
  /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/Imakefile,v 1.8 89/10/18 13:10:47 jtkohl Exp $
  /**/#
  
  #if defined(DO_SYSLOG) && defined(SYSLOG_COMPAT42)
--- 5,11 ----
  /**/#
  /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/Imakefile,v 1.9 89/12/18 13:25:04 jtkohl Exp $
  /**/#
  
  #if defined(DO_SYSLOG) && defined(SYSLOG_COMPAT42)
***************
*** 71,77 ****
  
  install::
  	-mkdir ${DESTDIR}${ACLDIR}
! 	-rm -f ${DESTDIR}${ACLDIR}/?*
  	cp acldir/?* ${DESTDIR}${ACLDIR}
  	${INSTALLFILE} default.subscriptions ${DESTDIR}${ACLDIR}/default.subscriptions
  
--- 71,77 ----
  
  install::
  	-mkdir ${DESTDIR}${ACLDIR}
! 	-rm -f ${DESTDIR}${ACLDIR}/?*.acl
  	cp acldir/?* ${DESTDIR}${ACLDIR}
  	${INSTALLFILE} default.subscriptions ${DESTDIR}${ACLDIR}/default.subscriptions
  
diff -rc patchlevel2/server/class.c src/server/class.c
*** patchlevel2/server/class.c	Wed Oct 19 22:49:38 1988
--- src/server/class.c	Thu Dec 14 08:42:18 1989
***************
*** 3,10 ****
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /paris/source/4.3/athena.lib/zephyr/server/RCS/class.c,v $
!  *	$Author: raeburn $
   *
   *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
   *	For copying and distribution information, see the file
--- 3,10 ----
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/class.c,v $
!  *	$Author: jtkohl $
   *
   *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
   *	For copying and distribution information, see the file
***************
*** 15,26 ****
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_class_c[] = "$Header: class.c,v 1.11 88/10/19 22:49:18 raeburn Exp $";
  #endif SABER
  #endif lint
  
  #include "zserver.h"			/* includes zephyr/zephyr.h */
  
  /*
   * Class manager subsystem.
   *
--- 15,28 ----
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_class_c[] = "$Id: class.c,v 1.13 89/12/14 08:42:10 jtkohl Exp $";
  #endif SABER
  #endif lint
  
  #include "zserver.h"			/* includes zephyr/zephyr.h */
  
+ #include <ctype.h>			/* for isupper, tolower */
+ 
  /*
   * Class manager subsystem.
   *
***************
*** 128,134 ****
  	} else {
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  			/* walk down the list, looking for a match */
! 			if (!strcmp(ptr2->zct_classname, class_buf))
  				return(insert_client(ptr2, client));
  
  		/* fell off the end, no match */
--- 130,136 ----
  	} else {
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  			/* walk down the list, looking for a match */
! 			if (!strcasecmp(ptr2->zct_classname, class_buf))
  				return(insert_client(ptr2, client));
  
  		/* fell off the end, no match */
***************
*** 157,163 ****
  	
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  		/* walk down the list, looking for a match */
! 		if (!strcmp(ptr2->zct_classname, class_buf)) {
  			if ((retval = remove_client(ptr2, client)) == EMPTY_CLASS) {
  				zdbug((LOG_DEBUG,"empty class"));
  				/* Don't free up restricted classes. */
--- 159,165 ----
  	
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  		/* walk down the list, looking for a match */
! 		if (!strcasecmp(ptr2->zct_classname, class_buf)) {
  			if ((retval = remove_client(ptr2, client)) == EMPTY_CLASS) {
  				zdbug((LOG_DEBUG,"empty class"));
  				/* Don't free up restricted classes. */
***************
*** 199,205 ****
  		/* go search the list for the class */
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  			/* walk down the list, looking for a match */
! 			if (!strcmp(ptr2->zct_classname, class_buf)) {
  				list = ptr2->zct_clientlist;
  				break;
  			}
--- 201,207 ----
  		/* go search the list for the class */
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  			/* walk down the list, looking for a match */
! 			if (!strcasecmp(ptr2->zct_classname, class_buf)) {
  				list = ptr2->zct_clientlist;
  				break;
  			}
***************
*** 212,218 ****
  		/* go search the list for the class */
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  			/* walk down the list, looking for a match */
! 			if (!strcmp(ptr2->zct_classname, class_buf)) {
  				wc_list = ptr2->zct_clientlist;
  				break;
  			}
--- 214,220 ----
  		/* go search the list for the class */
  		for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw) {
  			/* walk down the list, looking for a match */
! 			if (!strcasecmp(ptr2->zct_classname, class_buf)) {
  				wc_list = ptr2->zct_clientlist;
  				break;
  			}
***************
*** 274,280 ****
  class_is_control(notice)
  ZNotice_t *notice;
  {
! 	return(!strcmp(notice->z_class, ZEPHYR_CTL_CLASS));
  }
  
  int
--- 276,282 ----
  class_is_control(notice)
  ZNotice_t *notice;
  {
! 	return(!strcasecmp(notice->z_class, ZEPHYR_CTL_CLASS));
  }
  
  int
***************
*** 281,287 ****
  class_is_admin(notice)
  ZNotice_t *notice;
  {
! 	return(!strcmp(notice->z_class, ZEPHYR_ADMIN_CLASS));
  }
  
  int
--- 283,289 ----
  class_is_admin(notice)
  ZNotice_t *notice;
  {
! 	return(!strcasecmp(notice->z_class, ZEPHYR_ADMIN_CLASS));
  }
  
  int
***************
*** 288,294 ****
  class_is_hm(notice)
  ZNotice_t *notice;
  {
! 	return(!strcmp(notice->z_class, HM_CTL_CLASS));
  }
  
  int
--- 290,296 ----
  class_is_hm(notice)
  ZNotice_t *notice;
  {
! 	return(!strcasecmp(notice->z_class, HM_CTL_CLASS));
  }
  
  int
***************
*** 295,301 ****
  class_is_ulogin(notice)
  ZNotice_t *notice;
  {
! 	return(!strcmp(notice->z_class, LOGIN_CLASS));
  }
  
  int
--- 297,303 ----
  class_is_ulogin(notice)
  ZNotice_t *notice;
  {
! 	return(!strcasecmp(notice->z_class, LOGIN_CLASS));
  }
  
  int
***************
*** 302,308 ****
  class_is_ulocate(notice)
  ZNotice_t *notice;
  {
! 	return(!strcmp(notice->z_class, LOCATE_CLASS));
  }
  
  /*
--- 304,310 ----
  class_is_ulocate(notice)
  ZNotice_t *notice;
  {
! 	return(!strcasecmp(notice->z_class, LOCATE_CLASS));
  }
  
  /*
***************
*** 322,328 ****
  
  	/* walk down the list, looking for a match */
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
! 		if (!strcmp(ptr2->zct_classname, class))
  			return(ptr2->zct_acl);
  
  	/* fell off the end, no match ==> not restricted */
--- 324,330 ----
  
  	/* walk down the list, looking for a match */
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
! 		if (!strcasecmp(ptr2->zct_classname, class))
  			return(ptr2->zct_acl);
  
  	/* fell off the end, no match ==> not restricted */
***************
*** 349,355 ****
  		return(ZSRV_NOCLASS);
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  		/* walk down the list, looking for a match */
! 		if (!strcmp(ptr2->zct_classname, class)) {
  			if (ptr2->zct_acl)
  				return(ZSRV_CLASSRESTRICTED);
  			ptr2->zct_acl = acl;
--- 351,357 ----
  		return(ZSRV_NOCLASS);
  	for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  		/* walk down the list, looking for a match */
! 		if (!strcasecmp(ptr2->zct_classname, class)) {
  			if (ptr2->zct_acl)
  				return(ZSRV_CLASSRESTRICTED);
  			ptr2->zct_acl = acl;
***************
*** 397,403 ****
  	} else {
  	    for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  		/* walk down the list, looking for a match */
! 		if (!strcmp(ptr2->zct_classname, class))
  		    return(ZSRV_CLASSXISTS);
  	    if (!(ptr2 = class_alloc(class)))
  		return(ENOMEM);
--- 399,405 ----
  	} else {
  	    for (ptr2 = ptr->q_forw; ptr2 != ptr; ptr2 = ptr2->q_forw)
  		/* walk down the list, looking for a match */
! 		if (!strcasecmp(ptr2->zct_classname, class))
  		    return(ZSRV_CLASSXISTS);
  	    if (!(ptr2 = class_alloc(class)))
  		return(ENOMEM);
***************
*** 418,425 ****
  	register unsigned int hval = 0;
  	register unsigned char *cp = (unsigned char *) string;
  
! 	while (*cp)
  		hval = (hval + (*cp++) * HASHMUL) % HASHSIZE;
  	return(hval);
  }
  
--- 420,432 ----
  	register unsigned int hval = 0;
  	register unsigned char *cp = (unsigned char *) string;
  
! 	while (*cp) {
! 	    if (isupper(*cp)) {
! 		hval = (hval + (tolower(*cp)) * HASHMUL) % HASHSIZE;
! 		cp++;
! 	    } else
  		hval = (hval + (*cp++) * HASHMUL) % HASHSIZE;
+ 	}
  	return(hval);
  }
  
diff -rc patchlevel2/server/dispatch.c src/server/dispatch.c
*** patchlevel2/server/dispatch.c	Thu May  4 17:36:51 1989
--- src/server/dispatch.c	Wed Dec 13 10:31:59 1989
***************
*** 3,9 ****
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /mit/zephyr/src/server/RCS/dispatch.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
--- 3,9 ----
   *
   *	Created by:	John T. Kohl
   *
!  *	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/dispatch.c,v $
   *	$Author: jtkohl $
   *
   *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
***************
*** 15,21 ****
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_dispatch_c[] = "$Header: dispatch.c,v 1.29 89/05/04 17:36:32 jtkohl Exp $";
  #endif SABER
  #endif lint
  
--- 15,21 ----
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_dispatch_c[] = "$Id: dispatch.c,v 1.32 89/12/13 10:31:44 jtkohl Exp $";
  #endif SABER
  #endif lint
  
***************
*** 171,177 ****
  		break;
  	}
  	if (whoisit.sin_port != hm_port &&
! 	    strcmp(new_notice.z_class,ZEPHYR_ADMIN_CLASS) &&
  	    whoisit.sin_port != sock_sin.sin_port &&
  	    new_notice.z_kind != CLIENTACK) {
  		syslog(LOG_ERR,
--- 171,177 ----
  		break;
  	}
  	if (whoisit.sin_port != hm_port &&
! 	    strcasecmp(new_notice.z_class,ZEPHYR_ADMIN_CLASS) &&
  	    whoisit.sin_port != sock_sin.sin_port &&
  	    new_notice.z_kind != CLIENTACK) {
  		syslog(LOG_ERR,
***************
*** 302,307 ****
--- 302,317 ----
  		return;
  	    }
  	}
+ 	if (bcmp(&notice->z_sender_addr.s_addr, &who->sin_addr.s_addr,
+ 		 sizeof(notice->z_sender_addr.s_addr))) {
+ 	    /* someone is playing games... */
+ 	    /* inet_ntoa returns pointer to static area */
+ 	    /* max size is 255.255.255.255 */
+ 	    char buffer[16];
+ 	    (void) strcpy(buffer, inet_ntoa(who->sin_addr));
+ 	    syslog(LOG_WARNING, "sendit addr mismatch: claimed %s, real %s",
+ 		   inet_ntoa(notice->z_sender_addr), buffer);
+ 	}
  	if ((clientlist = subscr_match_list(notice))) {
  		for (ptr = clientlist->q_forw;
  		     ptr != clientlist;
***************
*** 487,493 ****
  		return;
  	}
  	if ((retval = ZSendPacket(noticepack, packlen, 0)) != ZERR_NONE) {
! 		syslog(LOG_WARNING, "xmit xmit: %s", error_message(retval));
  		xfree(noticepack);
  		return;
  	}
--- 497,505 ----
  		return;
  	}
  	if ((retval = ZSendPacket(noticepack, packlen, 0)) != ZERR_NONE) {
! 		syslog(LOG_WARNING, "xmit xmit: (%s/%d) %s",
! 		       inet_ntoa(dest->sin_addr), ntohs(dest->sin_port),
! 		       error_message(retval));
  		xfree(noticepack);
  		return;
  	}
***************
*** 719,725 ****
  	 *	CLIENT_CANCELSUB:   ""
  	 */
  
! 	if (!strcmp(notice->z_class_inst, ZEPHYR_CTL_HM))
  		return(hostm_dispatch(notice, auth, who, server));
  	else if (!strcmp(opcode, CLIENT_GIMMESUBS) ||
  		 !strcmp(opcode, CLIENT_GIMMEDEFS)) {
--- 731,737 ----
  	 *	CLIENT_CANCELSUB:   ""
  	 */
  
! 	if (!strcasecmp(notice->z_class_inst, ZEPHYR_CTL_HM))
  		return(hostm_dispatch(notice, auth, who, server));
  	else if (!strcmp(opcode, CLIENT_GIMMESUBS) ||
  		 !strcmp(opcode, CLIENT_GIMMEDEFS)) {
diff -rc patchlevel2/server/server.c src/server/server.c
*** patchlevel2/server/server.c	Fri Oct 27 13:29:38 1989
--- src/server/server.c	Thu Dec 14 08:36:39 1989
***************
*** 15,21 ****
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_server_c[] = "$Id: server.c,v 1.41 89/10/27 11:33:34 jtkohl Exp $";
  #endif SABER
  #endif lint
  
--- 15,21 ----
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_server_c[] = "$Id: server.c,v 1.43 89/12/14 08:36:27 jtkohl Exp $";
  #endif SABER
  #endif lint
  
***************
*** 710,726 ****
  	if ((status = extract_addr(notice, &who)) != ZERR_NONE)
  		return(status);
  	if (!(host = hostm_find_host(&who.sin_addr))) {
! 		syslog(LOG_WARNING, "recover_clt h not found, from %s",
! 		       inet_ntoa(server->zs_addr.sin_addr));
! 		syslog(LOG_WARNING, "%s", inet_ntoa(who.sin_addr));
  		return(ZERR_NONE);	/* XXX */
  	}
  	if (host->zh_locked)
  		return(ZSRV_REQUEUE);
  	if (!(client = client_which_client(&who, notice))) {
! 		syslog(LOG_WARNING, "recover_clt not found, from %s",
! 		       inet_ntoa(server->zs_addr.sin_addr));
! 		syslog(LOG_WARNING, "%s/%d",inet_ntoa(who.sin_addr),
  		       ntohs(who.sin_port));
  		return(ZERR_NONE);	/* XXX */
  	}
--- 710,728 ----
  	if ((status = extract_addr(notice, &who)) != ZERR_NONE)
  		return(status);
  	if (!(host = hostm_find_host(&who.sin_addr))) {
! 		char buf[16];		/* long enough for 255.255.255.255\0 */
! 		(void) strncpy(buf, inet_ntoa(who.sin_addr), sizeof(buf));
! 		syslog(LOG_WARNING, "recover_clt h not found, from %s for %s",
! 		       inet_ntoa(server->zs_addr.sin_addr), buf);
  		return(ZERR_NONE);	/* XXX */
  	}
  	if (host->zh_locked)
  		return(ZSRV_REQUEUE);
  	if (!(client = client_which_client(&who, notice))) {
! 		char buf[16];		/* long enough for 255.255.255.255\0 */
! 		(void) strncpy(buf, inet_ntoa(who.sin_addr), sizeof(buf));
! 		syslog(LOG_WARNING, "recover_clt not found, from %s for %s/%d",
! 		       inet_ntoa(server->zs_addr.sin_addr), buf,
  		       ntohs(who.sin_port));
  		return(ZERR_NONE);	/* XXX */
  	}
***************
*** 1122,1133 ****
  register char **list;
  {
  	register int i;
  
  	if (!nhosts)			/* nothing allocated */
  		return;
  	for (; *list; list++)
  	    xfree(*list);
! 	xfree(list);
  	return;
  }
  #endif !HESIOD
--- 1124,1136 ----
  register char **list;
  {
  	register int i;
+ 	char **orig_list = list;
  
  	if (!nhosts)			/* nothing allocated */
  		return;
  	for (; *list; list++)
  	    xfree(*list);
! 	xfree(orig_list);
  	return;
  }
  #endif !HESIOD
diff -rc patchlevel2/server/subscr.c src/server/subscr.c
*** patchlevel2/server/subscr.c	Fri Oct 27 13:29:39 1989
--- src/server/subscr.c	Wed Dec 13 10:32:27 1989
***************
*** 15,21 ****
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_subscr_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/subscr.c,v 1.36 89/10/26 14:18:28 jtkohl Exp $";
  #endif SABER
  #endif lint
  
--- 15,21 ----
  
  #ifndef lint
  #ifndef SABER
! static char rcsid_subscr_c[] = "$Id: subscr.c,v 1.37 89/12/13 10:32:14 jtkohl Exp $";
  #endif SABER
  #endif lint
  
***************
*** 173,179 ****
  		     subs2 != who->zct_subs;
  		     subs2 = subs2->q_forw) {
  			/* for each existing subscription */
! 			relation = strcmp(subs->zst_class, subs2->zst_class);
  			if (relation > 0) /* we have passed the last
  					     possible one */
  				break;
--- 173,179 ----
  		     subs2 != who->zct_subs;
  		     subs2 = subs2->q_forw) {
  			/* for each existing subscription */
! 			relation = strcasecmp(subs->zst_class, subs2->zst_class);
  			if (relation > 0) /* we have passed the last
  					     possible one */
  				break;
***************
*** 372,378 ****
  		     subs2 != who->zct_subs;) {
  			/* for each existing subscription */
  			/* is this what we are canceling? */
! 			relation = strcmp(subs4->zst_class, subs2->zst_class);
  			if (relation > 0) /* we have passed the last
  					     possible one */
  				break;
--- 372,378 ----
  		     subs2 != who->zct_subs;) {
  			/* for each existing subscription */
  			/* is this what we are canceling? */
! 			relation = strcasecmp(subs4->zst_class, subs2->zst_class);
  			if (relation > 0) /* we have passed the last
  					     possible one */
  				break;
***************
*** 1086,1098 ****
  	     subs != client->zct_subs;
  	     subs = subs->q_forw) {
  		/* for each subscription, do matching */
! 		relation = strcmp(notice->z_class, subs->zst_class);
  		if (relation > 0)	/* past the last possible one */
  			return(0);
  		if (relation < 0)
  			continue;	/* no match */
  		if (strcmp(subs->zst_classinst, WILDCARD_INSTANCE) &&
! 		    strcmp(subs->zst_classinst, notice->z_class_inst))
  			continue;
  		if (strcmp(notice->z_recipient, subs->zst_recipient))
  			continue;
--- 1086,1098 ----
  	     subs != client->zct_subs;
  	     subs = subs->q_forw) {
  		/* for each subscription, do matching */
! 		relation = strcasecmp(notice->z_class, subs->zst_class);
  		if (relation > 0)	/* past the last possible one */
  			return(0);
  		if (relation < 0)
  			continue;	/* no match */
  		if (strcmp(subs->zst_classinst, WILDCARD_INSTANCE) &&
! 		    strcasecmp(subs->zst_classinst, notice->z_class_inst))
  			continue;
  		if (strcmp(notice->z_recipient, subs->zst_recipient))
  			continue;
***************
*** 1143,1149 ****
  subscr_equiv(s1, s2)
  register ZSubscr_t *s1, *s2;
  {
! 	if (strcmp(s1->zst_classinst,s2->zst_classinst))
  		return(0);
  	if (strcmp(s1->zst_recipient,s2->zst_recipient))
  		return(0);
--- 1143,1149 ----
  subscr_equiv(s1, s2)
  register ZSubscr_t *s1, *s2;
  {
! 	if (strcasecmp(s1->zst_classinst,s2->zst_classinst))
  		return(0);
  	if (strcmp(s1->zst_recipient,s2->zst_recipient))
  		return(0);
diff -rc patchlevel2/server/uloc.c src/server/uloc.c
*** patchlevel2/server/uloc.c	Fri Oct 27 13:29:40 1989
--- src/server/uloc.c	Wed Dec 13 10:29:58 1989
***************
*** 14,20 ****
  #include <zephyr/mit-copyright.h>
  
  #ifndef lint
! static char rcsid_uloc_c[] = "$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/server/RCS/uloc.c,v 1.33 89/10/26 14:19:13 jtkohl Exp $";
  #endif lint
  
  #include "zserver.h"
--- 14,20 ----
  #include <zephyr/mit-copyright.h>
  
  #ifndef lint
! static char rcsid_uloc_c[] = "$Id: uloc.c,v 1.34 89/12/13 10:29:46 jtkohl Exp $";
  #endif lint
  
  #include "zserver.h"
***************
*** 895,901 ****
  ul_equiv(l1, l2)
  register ZLocation_t *l1, *l2;
  {
! 	if (strcmp(l1->zlt_machine, l2->zlt_machine))
  		return(0);
  	if (strcmp(l1->zlt_tty, l2->zlt_tty))
  		return(0);
--- 895,901 ----
  ul_equiv(l1, l2)
  register ZLocation_t *l1, *l2;
  {
! 	if (strcasecmp(l1->zlt_machine, l2->zlt_machine))
  		return(0);
  	if (strcmp(l1->zlt_tty, l2->zlt_tty))
  		return(0);
***************
*** 1099,1105 ****
  	       !strcmp(locations[idx].zlt_user, loc2.zlt_user)) {
  
  		/* change exposure and owner for each loc on that host */
! 		if (!strcmp(locations[idx].zlt_machine, loc2.zlt_machine)) {
  			notfound = 0;
  			locations[idx].zlt_exposure = exposure;
  			locations[idx].zlt_port = notice->z_port;
--- 1099,1105 ----
  	       !strcmp(locations[idx].zlt_user, loc2.zlt_user)) {
  
  		/* change exposure and owner for each loc on that host */
! 		if (!strcasecmp(locations[idx].zlt_machine, loc2.zlt_machine)) {
  			notfound = 0;
  			locations[idx].zlt_exposure = exposure;
  			locations[idx].zlt_port = notice->z_port;
diff -rc patchlevel2/server/version.c src/server/version.c
*** patchlevel2/server/version.c	Fri Oct 27 13:29:41 1989
--- src/server/version.c	Wed Dec 13 10:33:22 1989
***************
*** 14,26 ****
  #include <zephyr/mit-copyright.h>
  
  #ifdef DEBUG
! char version[] = "Zephyr Server (DEBUG) $Revision: 3.15 $";
  #else
! char version[] = "Zephyr Server $Revision: 3.15 $";
  #endif DEBUG
  #ifndef lint
  #ifndef SABER
! static char rcsid_version_c[] = "$Id: version.c,v 3.15 89/10/26 14:20:07 jtkohl Exp $";
  char copyright[] = "Copyright (c) 1987,1988,1989 Massachusetts Institute of Technology.\n";
  #ifdef CONCURRENT
  char concurrent[] = "Brain-dump concurrency enabled";
--- 14,26 ----
  #include <zephyr/mit-copyright.h>
  
  #ifdef DEBUG
! char version[] = "Zephyr Server (DEBUG) $Revision: 3.19 $";
  #else
! char version[] = "Zephyr Server $Revision: 3.19 $";
  #endif DEBUG
  #ifndef lint
  #ifndef SABER
! static char rcsid_version_c[] = "$Id: version.c,v 3.19 89/12/13 10:32:54 jtkohl Exp $";
  char copyright[] = "Copyright (c) 1987,1988,1989 Massachusetts Institute of Technology.\n";
  #ifdef CONCURRENT
  char concurrent[] = "Brain-dump concurrency enabled";
diff -rc patchlevel2/zhm/Imakefile src/zhm/Imakefile
*** patchlevel2/zhm/Imakefile	Thu May  4 21:14:33 1989
--- src/zhm/Imakefile	Mon Dec 18 13:20:04 1989
***************
*** 3,11 ****
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /mit/zephyr/src/zhm/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: Imakefile,v 1.6 89/05/04 21:14:25 jtkohl Exp $
  /**/#
  
  #if defined(DO_SYSLOG) && defined(SYSLOG_COMPAT42)
--- 3,11 ----
  /**/#	For copying and distribution information, see the file
  /**/#	"mit-copyright.h". 
  /**/#
! /**/#	$Source: /afs/athena.mit.edu/astaff/project/zephyr/src/zhm/RCS/Imakefile,v $
  /**/#	$Author: jtkohl $
! /**/#	$Header: /afs/athena.mit.edu/astaff/project/zephyr/src/zhm/RCS/Imakefile,v 1.7 89/12/18 13:19:55 jtkohl Exp $
  /**/#
  
  #if defined(DO_SYSLOG) && defined(SYSLOG_COMPAT42)
***************
*** 22,27 ****
--- 22,34 ----
  
  SRCDIR= ${SRCTOP}/zhm
  CODE= ${HDRS} ${SRCS} Imakefile
+ 
+ /*
+  * The pathname for the pid file.
+  */
+ ZHMPIDFILE=$(ETCATHDIR)/zhm.pid
+ 
+ DEFINES=-DPIDFILE=\"$(ZHMPIDFILE)\"
  
  normal_obj_rule()
  
diff -rc patchlevel2/zhm/zhm.c src/zhm/zhm.c
*** patchlevel2/zhm/zhm.c	Fri Oct 27 13:29:41 1989
--- src/zhm/zhm.c	Mon Dec 18 13:20:20 1989
***************
*** 13,19 ****
  
  #include "zhm.h"
  
! static char rcsid_hm_c[] = "$Id: zhm.c,v 1.42 89/10/27 10:55:13 jtkohl Exp $";
  
  #include <ctype.h>
  #include <signal.h>
--- 13,19 ----
  
  #include "zhm.h"
  
! static char rcsid_hm_c[] = "$Id: zhm.c,v 1.43 89/12/18 13:20:06 jtkohl Exp $";
  
  #include <ctype.h>
  #include <signal.h>
***************
*** 29,34 ****
--- 29,38 ----
  #include <hesiod.h>
  #endif HESIOD
  
+ #ifndef PIDFILE
+ #define	PIDFILE	"/etc/athena/zhm.pid"
+ #endif /* PIDFILE */
+ 
  int hmdebug = 0, rebootflag = 0, errflg = 0, dieflag = 0, inetd = 0, oldpid;
  int no_server = 1, nservchang = 0, nserv = 0, nclt = 0;
  int booting = 1, timeout_type = 0, deactivated = 1;
***************
*** 42,48 ****
  struct hostent *hp;
  char **clust_info;
  char hostname[MAXHOSTNAMELEN], loopback[4];
! char *PidFile = "/etc/athena/zhm.pid";
  
  extern int errno;
  extern char *index(), *strcpy(), *sbrk();
--- 46,52 ----
  struct hostent *hp;
  char **clust_info;
  char hostname[MAXHOSTNAMELEN], loopback[4];
! char *PidFile = PIDFILE;
  
  extern int errno;
  extern char *index(), *strcpy(), *sbrk();
