[comp.mail.elm] Elm Patch 4 of 8

taylor@hpldat.UUCP (Dave Taylor) (05/03/87)

This is Elm Patch Kit #4 of 8 and contains patches for:

  src/aliaslib.c   src/domains.c     src/fileio.c   src/return_addr.c
  src/addr_utils.c src/input_utils.c src/mailtime.c src/encode.c
  src/leavembox.c  src/opt_utils.c

Please feed this directly to ``patch''.

Index: src/aliaslib.c

***************
*** 79,82
  
! 	dprint2(6, "expand_system(%s, show-errors=%s)\n", buffer,
! 		onoff(show_errors));
  	findnode(buffer, show_errors);

--- 79,82 -----
  
! 	dprint(6, (debugfile, "expand_system(%s, show-errors=%s)\n", buffer,
! 		onoff(show_errors)));
  	findnode(buffer, show_errors);
***************
*** 108,111
  	    if (! valid_name(word)) {
! 	      dprint2(3, "Encountered illegal address %s (%s)\n",
! 			word, "expand_group");
  	      error1("%s is an illegal address!", word);

--- 108,111 -----
  	    if (! valid_name(word)) {
! 	      dprint(3, (debugfile, "Encountered illegal address %s in %s\n",
! 			word, "expand_group"));
  	      error1("%s is an illegal address!", word);
***************
*** 137,139
  	if (strlen(word) > 20) {
! 	  dprint2(3, "Too long alias name entered [%s] (%s)\n", word, "find");
  	  error1("Bad alias name: %s.  Too long.\n", word);

--- 137,139 -----
  	if (strlen(word) > 20) {
! 	  dprint(3, (debugfile, "Overly long alias name entered: %s\n", word));
  	  error1("Bad alias name: %s.  Too long.\n", word);

Index: src/domains.c

***************
*** 48,51
  	if ((domainfd = fopen(domains, "r")) == NULL) {
! 	  dprint1(1, "Can't open file %s as domains file (open_domain_file)\n", 
! 		  domains);
  	}

--- 48,52 -----
  	if ((domainfd = fopen(domains, "r")) == NULL) {
! 	  dprint(1, (debugfile,
! 		"Can't open file %s as domains file (open_domain_file)\n", 
! 		domains));
  	}
***************
*** 52,56
  	else {
! 	  dprint1(2,
!             "\nOpened '%s' as the domain database. (open_domain_file)\n\n", 
! 		  domains);
  	}

--- 53,56 -----
  	else {
! 	  dprint(2, (debugfile, 
!             "\nOpened '%s' as the domain database\n\n", domains));
  	}
***************
*** 76,78
  	else {	/* invalid format - not "user@host.domain" */
! 	  dprint1(3, 
  		 "Invalid format for domain expansion: %s (expand_domain)\n", 

--- 76,78 -----
  	else {	/* invalid format - not "user@host.domain" */
! 	  dprint(3,  (debugfile,
  		 "Invalid format for domain expansion: %s (expand_domain)\n", 
***************
*** 78,80
  		 "Invalid format for domain expansion: %s (expand_domain)\n", 
! 		   buffer);
  	  return(NULL);

--- 78,80 -----
  		 "Invalid format for domain expansion: %s (expand_domain)\n", 
! 		   buffer));
  	  return(NULL);
***************
*** 200,204
  	else {
! 	  dprint1(2,"Domain info for %s from file broken into THREE fields!!\n",
! 		   domain);
! 	  dprint3(2, "-> %s\n-> %s\n-> %s\n", field1, field2, field3);
  	  error1("Warning: domain %s uses a defunct field!!", domain);

--- 200,207 -----
  	else {
! 	  dprint(2, (debugfile,
! 		   "Domain info for %s from file broken into THREE fields!!\n",
! 		   domain));
! 	  dprint(2, (debugfile,
! 		   "-> %s\n-> %s\n-> %s\n", field1, field2, field3));
! 	  dprint(2, (debugfile, "(this means it's using a defunct field)\n"));
  	  error1("Warning: domain %s uses a defunct field!!", domain);
***************
*** 235,238
  		 if ((expanded = find_path_to(machine, FALSE)) == NULL) {
! 		    dprint2(3,"\nCouldn't expand system path '%s' (%s)\n\n",
! 			    machine, "domains");
  	            error1("Couldn't find a path to %s!", machine);

--- 238,242 -----
  		 if ((expanded = find_path_to(machine, FALSE)) == NULL) {
! 		    dprint(3, (debugfile,
! 			    "\nCouldn't expand system path '%s' (%s)\n\n",
! 			    machine, "domains"));
  	            error1("Couldn't find a path to %s!", machine);
***************
*** 248,251
  		 if ((expanded = find_path_to(path, FALSE)) == NULL) {
! 		    dprint2(3,"\nCouldn't expand system path '%s' (%s)\n\n",
! 			    path, "domains");
  	            error1("I Couldn't find a path to %s!", path);

--- 252,256 -----
  		 if ((expanded = find_path_to(path, FALSE)) == NULL) {
! 		    dprint(3, (debugfile,
! 			"\nCouldn't expand system path '%s' (%s)\n\n",
! 			path, "domains"));
  	            error1("I Couldn't find a path to %s!", path);
***************
*** 259,261
  	      case OBSOLETE:	/* fall through.. */
! 	      default      : dprint2(1,
  	     "\nError: Bad sequence in template file for domain '%s': %%%c\n\n",

--- 264,266 -----
  	      case OBSOLETE:	/* fall through.. */
! 	      default      : dprint(1, (debugfile,
  	     "\nError: Bad sequence in template file for domain '%s': %%%c\n\n",
***************
*** 261,263
  	     "\nError: Bad sequence in template file for domain '%s': %%%c\n\n",
! 			domain, template[i]);
  	    }

--- 266,268 -----
  	     "\nError: Bad sequence in template file for domain '%s': %%%c\n\n",
! 			domain, template[i]));
  	    }

Index: src/fileio.c

***************
*** 8,9
  #include "headers.h"
  #include <ctype.h>

--- 8,11 -----
  #include "headers.h"
+ #include <sys/types.h>
+ #include <sys/stat.h>
  #include <ctype.h>
***************
*** 38,41
      if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
!        dprint2(1,"ERROR: Attempt to seek %d bytes into file failed (%s)",
! 		header_table[current-1].offset, "copy_message");
         error1("ELM [seek] failed trying to read %d bytes into file",

--- 40,44 -----
      if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
!        dprint(1, (debugfile, 
! 		"ERROR: Attempt to seek %d bytes into file failed (%s)",
! 		header_table[current-1].offset, "copy_message"));
         error1("ELM [seek] failed trying to read %d bytes into file",
***************
*** 63,66
  	  else if (! in_header && first_word(buffer, "From ")) {
! 	    dprint0(1,"\n*** Internal Problem...Tried to add the following;\n");
! 	    dprint1(1,"  '%s'\nto output file (copy_message) ***\n", buffer);
  	    ok = 0;	/* STOP NOW! */

--- 66,71 -----
  	  else if (! in_header && first_word(buffer, "From ")) {
! 	    dprint(1, (debugfile,
! 		   "\n*** Internal Problem...Tried to add the following;\n"));
! 	    dprint(1, (debugfile,
! 		   "  '%s'\nto output file (copy_message) ***\n", buffer));
  	    ok = 0;	/* STOP NOW! */
***************
*** 74,75
  
  #ifdef SITE_HIDING

--- 79,103 -----
  
+ /********  the following routines are for a nice clean way to preserve
+    	   the stats related to the file we're currently reading and all 
+ *********/
+ 
+ static struct stat statbuff;
+ 
+ save_file_stats(fname)
+ char *fname;
+ {
+ 	struct stat *stat();
+ 
+ 	stat(fname, &statbuff);
+ }
+ 
+ restore_file_stats(fname)
+ char *fname;
+ {
+ 	chmod(fname, statbuff.st_mode & 0777);
+ 	chown(fname, statbuff.st_uid, statbuff.st_gid);
+ }
+ 
+ /** and finally, here's something for that evil trick: site hiding **/
+ 
  #ifdef SITE_HIDING
***************
*** 87,89
  
! 	this is shit and should be flagged as bad news!
  

--- 115,119 -----
  
! 	this line is deliberately inserted to ensure that you THINK
! 	about what you're doing, and perhaps even contact the author
! 	of Elm before you USE this option...
  
***************
*** 90,93
  	if ((hidden_users = fopen (HIDDEN_SITE_USERS,"r")) == NULL) {
! 	  dprint2(1,"Couldn't open hidden site file %s [%s]\n",
! 		  HIDDEN_SITE_USERS, error_name(errno));
  	  return(FALSE);

--- 120,124 -----
  	if ((hidden_users = fopen (HIDDEN_SITE_USERS,"r")) == NULL) {
! 	  dprint(1, (debugfile,
! 		  "Couldn't open hidden site file %s [%s]\n",
! 		  HIDDEN_SITE_USERS, error_name(errno)));
  	  return(FALSE);
***************
*** 97,100
  	  if (strcmp(buffer, specific_username) == 0) {
! 	    dprint1(3,"** Found user '%s' in hidden site file!\n",
! 		    specific_username);
  	    fclose(hidden_users);

--- 128,131 -----
  	  if (strcmp(buffer, specific_username) == 0) {
! 	    dprint(3, (debugfile, "** Found user '%s' in hidden site file!\n",
! 		    specific_username));
  	    fclose(hidden_users);
***************
*** 104,107
  	fclose(hidden_users);
! 	dprint1(3,"** Couldn't find user '%s' in hidden site file!\n",
! 		specific_username);
  

--- 135,139 -----
  	fclose(hidden_users);
! 	dprint(3, (debugfile, 
! 		"** Couldn't find user '%s' in hidden site file!\n",
! 		specific_username));
  

Index: src/return_addr.c

***************
*** 231,233
      if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
! 	dprint3(1,"Error: seek %ld bytes into file hit errno %s (%s)", 
  		header_table[current-1].offset, error_name(errno), 

--- 231,234 -----
      if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
! 	dprint(1, (debugfile,
! 		"Error: seek %ld bytes into file hit errno %s (%s)", 
  		header_table[current-1].offset, error_name(errno), 
***************
*** 233,235
  		header_table[current-1].offset, error_name(errno), 
! 	        "get_return");
  	error2("couldn't seek %d bytes into file (%s)",

--- 234,236 -----
  		header_table[current-1].offset, error_name(errno), 
! 	        "get_return"));
  	error2("couldn't seek %d bytes into file (%s)",
***************
*** 253,255
  	       name1, name2, alt_name2);
! 	if (strcmp(name2, "from") == 0)
  	  strcpy(name2, alt_name2);

--- 254,256 -----
  	       name1, name2, alt_name2);
! 	if (strcmp(name2, "from") == 0)		/* remote from xyz  */
  	  strcpy(name2, alt_name2);
***************
*** 255,256
  	  strcpy(name2, alt_name2);
  	add_site(buffer, name2, lastname);

--- 256,259 -----
  	  strcpy(name2, alt_name2);
+ 	else if (strcmp(name2, "by") == 0)	/* forwarded by xyz */
+ 	  strcpy(name2, alt_name2);
  	add_site(buffer, name2, lastname);
***************
*** 314,316
          if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
! 	    dprint3(1,"Error: seek %ld bytes into file hit errno %s (%s)", 
  		    header_table[current-1].offset, error_name(errno), 

--- 317,320 -----
          if (fseek(mailfile, header_table[current-1].offset, 0) == -1) {
! 	    dprint(1, (debugfile, 
! 		    "Error: seek %ld bytes into file hit errno %s (%s)", 
  		    header_table[current-1].offset, error_name(errno), 
***************
*** 316,318
  		    header_table[current-1].offset, error_name(errno), 
! 		    "get_existing_address");
  	    error2("couldn't seek %d bytes into the file (%s)",

--- 320,322 -----
  		    header_table[current-1].offset, error_name(errno), 
! 		    "get_existing_address"));
  	    error2("couldn't seek %d bytes into the file (%s)",

Index: src/addr_utils.c

***************
*** 13,15
  
! #ifdef BSD
  #undef tolower

--- 13,15 -----
  
! #ifdef BSD 
  #undef tolower
***************
*** 33,36
  	if (sysname == NULL) {
! 	 dprint0(2,
! 		"Warning - talk_to_sys is currently set to NULL! (talk_to)\n");
  	 return(0);

--- 33,36 -----
  	if (sysname == NULL) {
! 	 dprint(2, (debugfile, 
! 		"Warning: talk_to_sys is currently set to NULL!\n"));
  	 return(0);
***************
*** 201,203
  	  else if (strpbrk(word,"!@:") != NULL)
! #ifdef DONT_TOUCH_ADDRESS
  	    sprintf(full_to, "%s%s%s", full_to,

--- 201,203 -----
  	  else if (strpbrk(word,"!@:") != NULL)
! #ifdef DONT_TOUCH_ADDRESSES
  	    sprintf(full_to, "%s%s%s", full_to,
***************
*** 222,226
  	      fprintf(stderr,"Use \"checkalias\" to find valid addresses!\n\r");
! 	      dprint1(1,
! 		      "Can't expand alias %s - bailing out! (build_address)\n", 
! 		      word);
  	      emergency_exit();

--- 222,226 -----
  	      fprintf(stderr,"Use \"checkalias\" to find valid addresses!\n\r");
! 	      dprint(1, (debugfile,
! 		      "Can't expand alias %s - bailing out of build_address\n", 
! 		      word));
  	      emergency_exit();
***************
*** 228,230
  	    else {
! 	      dprint1(2,"Entered unknown address %s (build_address)\n", word);
  	      sprintf(buffer, "'%s' is an unknown address.  Replace with: ", 

--- 228,230 -----
  	    else {
! 	      dprint(2,(debugfile,"Entered unknown address %s\n", word));
  	      sprintf(buffer, "'%s' is an unknown address.  Replace with: ", 
***************
*** 242,244
  			strlen(new_to_list) > 0? " ":"", word);
! 	        dprint1(3,"Replaced with %s (build_address)\n", word);
  	      }

--- 242,245 -----
  			strlen(new_to_list) > 0? " ":"", word);
! 	        dprint(3,(debugfile, "Replaced with %s in build_address\n", 
! 			 word));
  	      }
***************
*** 245,247
  	      else
! 		dprint0(3,"Address removed from to list (build_address)\n");
  	      if (mail_only) printf("\n\r");

--- 246,249 -----
  	      else
! 		dprint(3,(debugfile, 
! 		    "Address removed from TO list by build_address\n"));
  	      if (mail_only) printf("\n\r");
***************
*** 281,284
  	if (timebuff[1] != ':' && timebuff[2] != ':') { 
! 	  dprint1(3,"real_from returns FAIL [bad time field] on\n-> %s\n", 
! 		  buffer);
  	  return(FALSE);

--- 283,287 -----
  	if (timebuff[1] != ':' && timebuff[2] != ':') { 
! 	  dprint(3,(debugfile, 
! 		"Real_from returns FAIL [bad time field] on\n-> %s\n", 
! 		buffer));
  	  return(FALSE);
***************
*** 289,292
  	  if (junk[0] != '\0') {
! 	    dprint1(3,"real_from returns FAIL [too many fields] on\n-> %s\n", 
! 		    buffer);
  	    return(FALSE);

--- 292,296 -----
  	  if (junk[0] != '\0') {
! 	    dprint(3, (debugfile, 
! 		  "Real_from returns FAIL [too many fields] on\n-> %s\n", 
! 		  buffer));
  	    return(FALSE);
***************
*** 323,325
  
! 	machine[0] = '\0';
  

--- 327,329 -----
  
! 	machine[0] = holding_from[0] = '\0';
  
***************
*** 340,341
  
  	if (machine[0] == '\0')

--- 344,352 -----
  
+ 	/* the following fix is to deal with ">From xyz ... forwarded by xyz"
+ 	   which occasionally shows up within AT&T.  Thanks to Bill Carpenter
+ 	   for the fix! */
+ 
+ 	if (strcmp(machine, holding_from) == 0)
+ 	  machine[0] = '\0';
+ 
  	if (machine[0] == '\0')
***************
*** 341,343
  	if (machine[0] == '\0')
! 	  sprintf(buff,"anonymous");
  	else

--- 352,354 -----
  	if (machine[0] == '\0')
! 	  strcpy(buff, holding_from[0] ? holding_from : "anonymous");
  	else
***************
*** 453,456
  	if (words < 6) {	/* strange format.  We're outta here! */
! 	  dprint1(3,"parse_arpa_date failed [less than six fields] on\n-> %s\n",
! 		  string);
  	  return;

--- 464,468 -----
  	if (words < 6) {	/* strange format.  We're outta here! */
! 	  dprint(3,(debugfile, 
! 		"Parse_arpa_date failed [less than six fields] on\n-> %s\n",
! 		string));
  	  return;
***************
*** 472,475
  	  if (! valid_date(word[1], word[2], word[3])) {
! 	    dprint4(3,"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		  word[1], word[2], word[3], string);
  	    return;		/* strange date! */

--- 484,488 -----
  	  if (! valid_date(word[1], word[2], word[3])) {
! 	    dprint(3,(debugfile, 
! 		  "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		  word[1], word[2], word[3], string));
  	    return;		/* strange date! */
***************
*** 483,486
  	  if (! valid_date(word[2], word[3], word[4])) {
! 	    dprint4(3,"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		  word[2], word[3], word[4], string);
  	    return;		/* strange date! */

--- 496,500 -----
  	  if (! valid_date(word[2], word[3], word[4])) {
! 	    dprint(3,(debugfile,
! 		  "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		  word[2], word[3], word[4], string));
  	    return;		/* strange date! */
***************
*** 496,498
  	    if (! valid_date(word[3], word[2], word[5])) {
! 	     dprint4(3,
  		"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",

--- 510,512 -----
  	    if (! valid_date(word[3], word[2], word[5])) {
! 	     dprint(3, (debugfile,
  		"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
***************
*** 498,500
  		"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		    word[3], word[2], word[5], string);
  	      return;		/* strange date! */

--- 512,514 -----
  		"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		    word[3], word[2], word[5], string));
  	      return;		/* strange date! */
***************
*** 506,509
  	    if (! valid_date(word[3], word[2], word[4])) {
! 	     dprint4(3,"parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		    word[3], word[2], word[4], string);
  	      return;		/* strange date! */

--- 520,524 -----
  	    if (! valid_date(word[3], word[2], word[4])) {
! 	     dprint(3,(debugfile,
! 		    "parse_arpa_date failed [bad date: %s/%s/%s] on\n-> %s\n",
! 		    word[3], word[2], word[4], string));
  	      return;		/* strange date! */
***************
*** 542,545
  	    if (host_count == MAX_HOPS) {
! 	       dprint0(2,
!               "Can't build return address - hit MAX_HOPS (fix_arpa_address)\n");
  	       error("Can't build return address - hit MAX_HOPS limit!");

--- 557,560 -----
  	    if (host_count == MAX_HOPS) {
! 	       dprint(2, (debugfile, 
!            "Can't build return address - hit MAX_HOPS in fix_arpa_address\n"));
  	       error("Can't build return address - hit MAX_HOPS limit!");

Index: src/input_utils.c

***************
*** 9,10
  #include <errno.h>
  

--- 9,11 -----
  #include <errno.h>
+ #include <ctype.h>
  
***************
*** 14,17
  
! #define special_char(c)		(c == ' ' || c == '\t' || c == '/' || c == ',' \
! 				 || c == '\0')
  

--- 15,17 -----
  
! #define isstopchar(c)		(c == ' ' || c == '\t' || c == '/')
  
***************
*** 72,83
  {
! 	/** Display the string on the screen and if RETURN is pressed, return 
! 	    it.  Otherwise, allow standard text input, including backspaces 
! 	    and such until RETURN is hit.  
! 	    If "append_current" is set, then leave the default string in 
! 	    place and edit AFTER it...assume 'x,y' is placing us at the
! 	    beginning of the string...
! 	    This routine returns zero unless INTERRUPT hit, then it returns
! 	    -1 and must be treated accordingly.
! 	    Added ^W and ^R support...
! 	    Also added that if x and y are < 0 don't try any cursor stuff
  	**/

--- 72,85 -----
  {
! 	/** This will display the string on the screen and allow the user to
! 	    either accept it (by pressing RETURN) or alter it according to
! 	    what the user types.   The various flags are:
! 	         string    is the buffer to use (with optional initial value)
! 	 	 x,y	   is the location we're at on the screen (-1,-1 means
! 			   that we can't use this info and need to explicitly
! 			   use backspace-space-backspace sequences)
! 		 append_current  means that we have an initial string and that
! 			   the cursor should be placed at the END of the line,
! 			   not the beginning (the default).
! 	      
! 	    If we hit an interrupt or EOF we'll return non-zero.
  	**/
***************
*** 85,87
  	char ch;
! 	register int index = 0, use_cursor_control;
  

--- 87,89 -----
  	char ch;
! 	register int ch_count = 0, index = 0, use_cursor_control, done=0;
  
***************
*** 87,92
  
! 	use_cursor_control = ((! mail_only) && x >= 0 && y >= 0);
! 	
! 	if (use_cursor_control)
! 	  PutLine1(x,y, "%s", string);	
  	else

--- 89,92 -----
  
! 	if ((use_cursor_control = (! mail_only && x >= 0 && y >= 0)))
! 	  PutLine1(x, y, "%s", string);	
  	else
***************
*** 96,98
  
! 	if (! append_current) 
  	  if (use_cursor_control)

--- 96,98 -----
  
! 	if (! append_current) {
  	  if (use_cursor_control)
***************
*** 101,102
  	    non_destructive_back_up(strlen(string));
  

--- 101,105 -----
  	    non_destructive_back_up(strlen(string));
+ 	}
+ 	else
+ 	  index = strlen(string);
  
***************
*** 105,107
  
! 	ch = getchar();
  

--- 108,113 -----
  
! 	/** now we have the screen as we want it and the cursor in the 
! 	    right place, we can loop around on the input and return the
! 	    string as soon as the user presses <RETURN>
! 	**/
  
***************
*** 107,140
  
- 	if (ch == '\n' || ch == '\r') {
- 	  if (cursor_control)
- 	    transmit_functions(ON);
- 	  return(0);	/* we're done.  No change needed */
- 	}
- 	
- 	CleartoEOLN();
- 
- 	index = (append_current? strlen(string) : 0);
- 
- 	if (ch == kill_line) {
- 	  if (use_cursor_control)
- 	    MoveCursor(x,y);
- 	  else
- 	    back_up(index);
-           CleartoEOLN();
- 	  index = 0;
- 	}
- 	else if (ch != backspace) {
- 	  Writechar(ch);
- 	  string[index++] = ch;
- 	}
- 	else if (index > 0) {
- 	  index--;
- 	  erase_a_char();
- 	}
- 	else {
- 	  Writechar(' ');
- 	  Writechar(BACKSPACE);
- 	  fflush(stdout);
- 	}
- 
  	do {

--- 113,114 -----
  
  	do {
***************
*** 142,143
  
  	  /* the following is converted from a case statement to

--- 116,135 -----
  
+ 	  if (ch == ctrl('D')) {		/* we've hit EOF */
+ 	    if (cursor_control)
+ 	      transmit_functions(ON);
+ 	    return(1);
+ 	  }
+ 
+ 	  if (ch_count++ == 0) {
+ 	    if (ch == '\n' || ch == '\r') {
+ 	      if (cursor_control)
+ 	        transmit_functions(ON);
+ 	      return(0);
+ 	    }
+ 	    else if (! append_current) {
+ 	      CleartoEOLN();
+ 	      index = (append_current? strlen(string) : 0);
+ 	    }
+ 	  }
+ 
  	  /* the following is converted from a case statement to
***************
*** 148,159
  
! 	    if (ch == backspace) {
!               if (index > 0) {
! 	        erase_a_char();
! 		index--;
! 	      }
! 	      else {
! 		Writechar(' ');
! 		Writechar(BACKSPACE);
! 	        fflush(stdout);
! 	      }
  	    }

--- 140,145 -----
  
! 	  if (ch == backspace) {
! 	    if (index > 0) {
! 	      Writechar(BACKSPACE);
!   	      index--;
  	    }
***************
*** 159,165
  	    }
! 	    else if (ch == '\n' || ch == '\r') {
! 	      string[index] = '\0';
! 	      if (cursor_control)
! 	        transmit_functions(ON);
! 	      return(0);
  	    }

--- 145,163 -----
  	    }
! 	    Writechar(' ');
! 	    Writechar(BACKSPACE);
!             fflush(stdout);
! 	  }
! 	  else if (ch == '\n' || ch == '\r') {
! 	    string[index] = '\0';
! 	    if (cursor_control)
! 	      transmit_functions(ON);
! 	    return(0);
! 	  }
! 	  else if (ch == ctrl('W')) {		/* back up a word! */
! 	    if (index == 0)
! 	      continue;		/* no point staying here.. */
! 	    index--;
! 	    while (index >= 0 && isspace(string[index])) {
! 	      index--;
! 	      erase_a_char();
  	    }
***************
*** 165,175
  	    }
! 	    else if (ch == ctrl('W')) {		/* back up a word! */
! 	      if (special_char(string[index]) && index > 0) {
! 		index--;
! 	        erase_a_char();
! 	      }
! 	      while (index > 0 && ! special_char(string[index])) {
! 		index--;
! 	        erase_a_char();
! 	      }
  	    }

--- 163,168 -----
  	    }
! 
! 	    while (index >= 0 && ! isstopchar(string[index])) {
! 	      index--;
! 	      erase_a_char();
  	    }
***************
*** 175,184
  	    }
! 	    else if (ch == ctrl('R')) {
! 	      string[index] = '\0';
! 	      if (use_cursor_control) {
! 	        PutLine1(x,y, "%s", string);	
! 	        CleartoEOLN();
! 	      }
! 	      else
! 	        printf("\n%s", string);	
  	    }

--- 168,176 -----
  	    }
! 	    index++;	/* and make sure we point at the first AVAILABLE slot */
! 	  }
! 	  else if (ch == ctrl('R')) {
! 	    string[index] = '\0';
! 	    if (use_cursor_control) {
! 	      PutLine1(x,y, "%s", string);	
! 	      CleartoEOLN();
  	    }
***************
*** 184,201
  	    }
! 	    else if (ch == kill_line) {
! 	      if (use_cursor_control)
! 	        MoveCursor(x,y);
! 	      else
! 	        back_up(index+1);
!               CleartoEOLN();
! 	      index = 0;
! 	    }
! 	    else if (ch == NULL) {
! 	      if (cursor_control)
! 	        transmit_functions(ON);
! 	      fflush(stdin); 	/* remove extraneous chars, if any */
! 	      string[0] = '\0'; /* clean up string, and... */
! 	      return(-1);
! 	    }
! 	    else {  /* default case */
  		        

--- 176,196 -----
  	    }
! 	    else
! 	      printf("\n%s", string);	
! 	  }
! 	  else if (ch == kill_line) {
! 	    if (use_cursor_control)
! 	       MoveCursor(x,y);
! 	    else
! 	       back_up(index+1);
!             CleartoEOLN();
! 	    index = 0;
! 	  }
! 	  else if (ch == '\0') {
! 	    if (cursor_control)
! 	      transmit_functions(ON);
! 	    fflush(stdin); 	/* remove extraneous chars, if any */
! 	    string[0] = '\0'; /* clean up string, and... */
! 	    return(-1);
! 	  }
! 	  else {  /* default case */
  		        
***************
*** 203,205
  	      Writechar(ch);
! 	   }
  	} while (index < SLEN);

--- 198,200 -----
  	      Writechar(ch);
! 	  }
  	} while (index < SLEN);
***************
*** 210,211
  	  transmit_functions(ON);
  	return(0);

--- 205,207 -----
  	  transmit_functions(ON);
+ 
  	return(0);
***************
*** 226,228
  	char ch;
! 	register index = 0;
  

--- 222,224 -----
  	char ch;
! 	register index = 0, done;
  
***************
*** 300,307
  	    else if (ch == ctrl('W')) {
! 	      /* get to rightmost non-alpha */
! 	      if (special_char (string[index]) && index > 0)
! 		index--;
! 	      while (index > 0 && ! special_char(string[index])) {
! 		erase_a_char();
! 		index--;
  	      }

--- 296,303 -----
  	    else if (ch == ctrl('W')) {
! 	      if (index == 0)
! 	        continue;		/* no point staying here.. */
! 	      index--;
! 	      while (index >= 0 && isspace(string[index])) {
! 	        index--;
! 	        erase_a_char();
  	      }
***************
*** 307,308
  	      }
  	    }

--- 303,310 -----
  	      }
+ 
+ 	      while (index >= 0 && ! isstopchar(string[index])) {
+ 	        index--;
+ 	        erase_a_char();
+ 	      }
+ 	      index++;	/* and make sure we point at the first AVAILABLE slot */
  	    }
***************
*** 322,324
  	    }
! 	    else if (ch == NULL) {
  	      if (cursor_control)

--- 324,326 -----
  	    }
! 	    else if (ch == '\0') {
  	      if (cursor_control)

Index: src/mailtime.c

***************
*** 133,135
  #else
! 	if (utime(filename, NULL) == -1)	/* note no "S"  */
  #endif

--- 133,135 -----
  #else
! 	if (utime(filename, (char *) NULL) == -1)	/* note no "S"  */
  #endif

Index: src/encode.c

***************
*** 52,54
  	  MoveCursor(LINES-1,0);
! 	  if ( strcmp( buffer, getpass( "Please enter it again: "))) {
  	    error("Your keys were not the same!");

--- 52,54 -----
  	  MoveCursor(LINES-1,0);
! 	  if ( send && strcmp( buffer, getpass( "Please enter it again: "))) {
  	    error("Your keys were not the same!");

Index: src/leavembox.c

***************
*** 10,11
  #include <sys/stat.h>
  #include <errno.h>

--- 10,12 -----
  #include <sys/stat.h>
+ #include <unistd.h>
  #include <errno.h>
***************
*** 14,22
  
- /** added due to a bug in the 2.1 OS **/
- 
- struct utimbuf {
- 	time_t	actime;		/** access time **/
- 	time_t  modtime;	/** modification */
-        };
- 
  extern int errno;

--- 15,16 -----
  
  extern int errno;
***************
*** 40,44
  	char outfile[SLEN], buffer[SLEN];
! 	struct stat buf;		/* stat command  */
! 	struct utimbuf times;		/* utime command */
! 	register int to_delete = 0, to_save = 0, i, mode = 00644,
  		     pending = 0, number_saved = 0, last_sortby;

--- 34,38 -----
  	char outfile[SLEN], buffer[SLEN];
! 	struct stat    buf;		/* stat command  */
! 	struct utimbuf utime_buffer;	/* utime command */
! 	register int to_delete = 0, to_save = 0, i,
  		     pending = 0, number_saved = 0, last_sortby;
***************
*** 44,46
  		     pending = 0, number_saved = 0, last_sortby;
! 	char dflt;
  	long bytes();

--- 38,40 -----
  		     pending = 0, number_saved = 0, last_sortby;
! 	char answer;
  	long bytes();
***************
*** 47,49
  
! 	dprint0(1,"\n\n-- leaving_mailbox --\n\n");
  

--- 41,43 -----
  
! 	dprint(1, (debugfile, "\n\n-- leaving_mailbox --\n\n"));
  
***************
*** 56,58
  
! 	dprint2(2,"Count: %d to delete and %d to save\n", to_delete, to_save);
  

--- 50,53 -----
  
! 	dprint(2, (debugfile,
! 		"Count: %d to delete and %d to save\n", to_delete, to_save));
  
***************
*** 66,71
  
! 	if (always_del) 	/* set up the default answer... */
! 	  dflt = 'y';
! 	else 
! 	  dflt = 'n';
  

--- 61,67 -----
  
! 	if (to_delete) {
! 	  if (always_del) 	/* set up the default answer... */
! 	    answer = 'y';
! 	  else 
! 	    answer = 'n';
  
***************
*** 71,73
  
- 	if (question_me && to_delete)
  	  if (to_save) {

--- 67,68 -----
  
  	  if (to_save) {
***************
*** 73,77
  	  if (to_save) {
! 	    fflush(stdin);
! 	    sprintf(buffer, "Delete message%s? (y/n) ", plural(to_delete));
! 	    if (want_to(buffer, dflt, ECHOIT) != 'y') {
  	      if (mbox_specified == 0) unlock();	/* remove lock! */

--- 68,75 -----
  	  if (to_save) {
! 	    if (question_me) {
! 	      fflush(stdin);
! 	      sprintf(buffer, "Delete message%s? (y/n) ", plural(to_delete));
! 	      answer = want_to(buffer, answer, ECHOIT);
! 	    }
! 	    if (answer != 'y') {
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
***************
*** 77,80
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
! 	      dprint1(3,"\tDelete message%s? - answer was NO\n", 
! 			plural(to_delete));
  	      error("Nothing deleted");

--- 75,78 -----
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
! 	      dprint(3, (debugfile, "\tDelete message%s? - answer was NO\n", 
! 			plural(to_delete)));
  	      error("Nothing deleted");
***************
*** 84,87
  	  else if (! to_save) {		/* nothing to save!! */
! 	    fflush(stdin);
! 	    if (want_to("Delete all mail? (y/n) ", dflt, ECHOIT)!='y') {
  	      if (mbox_specified == 0) unlock();	/* remove lock! */

--- 82,88 -----
  	  else if (! to_save) {		/* nothing to save!! */
! 	    if (question_me) {
! 	      fflush(stdin);
! 	      answer = want_to("Delete all mail? (y/n) ", answer, ECHOIT);
! 	    }
! 	    if (answer != 'y') {
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
***************
*** 87,89
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
! 	      dprint0(3,"Delete all mail? - answer was NO\n");
  	      error("Nothing deleted");

--- 88,90 -----
  	      if (mbox_specified == 0) unlock();	/* remove lock! */
! 	      dprint(3, (debugfile, "Delete all mail? - answer was NO\n"));
  	      error("Nothing deleted");
***************
*** 92,93
  	  }
  

--- 93,95 -----
  	  }
+ 	}
  
***************
*** 93,99
  
- 	if (always_leave) 
- 	  dflt = 'y';
- 	else
- 	  dflt = 'n';
- 	  
  	/** we have to check to see what the sorting order was...so that

--- 95,96 -----
  
  	/** we have to check to see what the sorting order was...so that
***************
*** 109,122
  
! 	if (question_me && to_save && mbox_specified == 0) {
! 	  fflush(stdin);
! 	  if (want_to("Keep mail in incoming mailbox? (y/n) ",dflt, ECHOIT)
! 	      == 'y') 
! 	      if (to_delete)	    /* okay - keep undeleted as pending!    */
! 	        pending++;
! 	      else {	   	    /* gag! nothing to delete, don't save!  */	
! 	        unlock();	    /* remove mailfile lock!	   	    */
! 	        dprint0(3,"Keep mail in incoming mailbox? -- answer was YES\n");
! 	        error("Mailbox unchanged");
! 	        return(FALSE);	/* nothing changed! */
! 	      }
  	}

--- 106,128 -----
  
! 	if (to_save && mbox_specified == 0) {
! 	  if (always_leave) 		/* set up default answer */
! 	    answer = 'y';
! 	  else
! 	    answer = 'n';
! 	  if (question_me) {
! 	    fflush(stdin);
! 	    answer = want_to("Keep mail in incoming mailbox? (y/n) ", 
! 		     answer, ECHOIT);
! 	  }
! 	  if (answer == 'y') {
! 	    if (to_delete)	    /* okay - keep undeleted as pending!    */
! 	      pending++;
! 	    else {	   	    /* gag! nothing to delete, don't save!  */	
! 	      unlock();	    /* remove mailfile lock!	   	    */
! 	      dprint(3, (debugfile,
! 		     "Keep mail in incoming mailbox? -- answer was YES\n"));
! 	      error("Mailbox unchanged");
! 	      return(FALSE);	/* nothing changed! */
! 	    }
! 	  }
  	}
***************
*** 147,149
  
! 	dprint1(2,"Action: %s\n", buffer);
  

--- 153,155 -----
  
! 	dprint(2, (debugfile, "Action: %s\n", buffer));
  
***************
*** 172,174
  		 outfile);
! 	    dprint2(1,
  		 "Error: Permission to append to outfile %s denied!! (%s)\n",

--- 178,180 -----
  		 outfile);
! 	    dprint(1, (debugfile, 
  		 "Error: Permission to append to outfile %s denied!! (%s)\n",
***************
*** 174,178
  		 "Error: Permission to append to outfile %s denied!! (%s)\n",
! 		 outfile, "leavembox");
! 	    dprint2(1,"** %s - %s **\n", error_name(errno),
! 		 error_description(errno));
  	    unlock();

--- 180,184 -----
  		 "Error: Permission to append to outfile %s denied!! (%s)\n",
! 		 outfile, "leavembox"));
! 	    dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 		 error_description(errno)));
  	    unlock();
***************
*** 183,188
  	      unlock();		/* remove mailfile lock! */
! 	    dprint1(1,"Error: could not append to file %s\n", 
! 		    outfile);
! 	    dprint2(1,"** %s - %s **\n", error_name(errno),
! 		 error_description(errno));
  	    sprintf(buffer, "           Could not append to file %s!          ",

--- 189,194 -----
  	      unlock();		/* remove mailfile lock! */
! 	    dprint(1, (debugfile, "Error: could not append to file %s\n", 
! 		    outfile));
! 	    dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 		 error_description(errno)));
  	    sprintf(buffer, "           Could not append to file %s!          ",
***************
*** 197,199
  	      if (! number_saved++) {
! 	        dprint2(2,"Saving message%s #%d, ", plural(to_save), current);
  	      }

--- 203,206 -----
  	      if (! number_saved++) {
! 	        dprint(2, (debugfile, "Saving message%s #%d, ", 
! 		       plural(to_save), current));
  	      }
***************
*** 200,202
  	      else {
! 		dprint1(2,"#%d, ", current);
  	      }

--- 207,209 -----
  	      else {
! 		dprint(2, (debugfile, "#%d, ", current));
  	      }
***************
*** 205,207
  	  fclose(temp);
! 	  dprint0(2,"\n\n");
  	}

--- 212,214 -----
  	  fclose(temp);
! 	  dprint(2, (debugfile, "\n\n"));
  	}
***************
*** 211,220
  
! 	/** let's grab the original mode and date/time of the mailfile 
! 	    before removing it **/
! 
!         if (stat(infile, &buf) == 0)
! 	  mode = buf.st_mode & 00777;
! 	else {
! 	  dprint2(1,"Error: errno %s attempting to stat file %s\n", 
! 		     error_name(errno), infile);
            error3("Error %s (%s) on stat(%s)", error_name(errno), 

--- 218,222 -----
  
!         if (stat(infile, &buf) != 0) {	/* grab original times... */
! 	  dprint(1, (debugfile, "Error: errno %s attempting to stat file %s\n", 
! 		     error_name(errno), infile));
            error3("Error %s (%s) on stat(%s)", error_name(errno), 
***************
*** 237,242
  	      if (copy(outfile, infile) != 0) {
! 	        dprint2(1,"leavembox: copy(%s, %s) failed;",
! 			outfile, infile);
! 	        dprint2(1,"** %s - %s **\n", error_name(errno),
! 		     error_description(errno));
  	        error("couldn't modify mail file!");

--- 239,244 -----
  	      if (copy(outfile, infile) != 0) {
! 	        dprint(1, (debugfile, "leavembox: copy(%s, %s) failed;",
! 			outfile, infile));
! 	        dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 		     error_description(errno)));
  	        error("couldn't modify mail file!");
***************
*** 245,250
  		if (copy(outfile, infile) != 0) {
! 	          dprint1(1,"leavembox: couldn't copy to %s either!!  Help;", 
! 			  infile);
! 	          dprint2(1,"** %s - %s **\n", error_name(errno),
! 		          error_description(errno));
  	          error("something godawful is happening to me!!!");

--- 247,253 -----
  		if (copy(outfile, infile) != 0) {
! 	          dprint(1, (debugfile, 
! 			  "leavembox: couldn't copy to %s either!!  Help;", 
! 			  infile));
! 	          dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 		          error_description(errno)));
  	          error("something godawful is happening to me!!!");
***************
*** 253,256
  		else {
! 	          dprint1(1,"\nWoah! Confused - Saved mail in %s (leavembox)\n", 
! 			  infile);
  	          error1("saved mail in %s", infile);

--- 256,260 -----
  		else {
! 	          dprint(1, (debugfile,
! 			  "\nWoah! Confused - Saved mail in %s (leavembox)\n", 
! 			  infile));
  	          error1("saved mail in %s", infile);
***************
*** 260,264
  	    else {
! 	      dprint2(1,"link(%s, %s) failed (leavembox)\n", outfile, infile);
! 	      dprint2(1,"** %s - %s **\n", error_name(errno),
! 			error_description(errno));
  	      error2("link failed! %s - %s", error_name(errno),

--- 264,269 -----
  	    else {
! 	      dprint(1, (debugfile, "link(%s, %s) failed (leavembox)\n", 
! 		     outfile, infile));
! 	      dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 			error_description(errno)));
  	      error2("link failed! %s - %s", error_name(errno),
***************
*** 274,275
  	  fclose(temp);
  	  chmod(infile, mode);

--- 279,282 -----
  	  fclose(temp);
+ 	  restore_file_stats(infile);
+ /**
  	  chmod(infile, mode);
***************
*** 276,277
  	  chown(infile, userid, groupid);
  	}

--- 283,285 -----
  	  chown(infile, userid, groupid);
+ **/
  	}
***************
*** 279,286
  	if (mbox_specified == 0) {
! 	  if (mode != 00644) { /* if not the default mail access mode... */
! 	    if (! pending) { /* if none still being saved */
! 	      temp = fopen(infile, "w");
! 	      fclose(temp);
! 	    }
! 	    chmod(infile,mode);
  

--- 287,294 -----
  	if (mbox_specified == 0) {
! 	  if (! pending) { /* if none still being saved */
! 	    temp = fopen(infile, "w");
! 	    fclose(temp);
! 	  }
! 	
! 	  restore_file_stats(infile);
  
***************
*** 286,289
  
! 	    /* let's set the access times of the new mail file to be
! 	       the same as the OLD one (still sitting in 'buf') ! */
  

--- 294,297 -----
  
! 	  /* let's set the access times of the new mail file to be
! 	     the same as the OLD one (still sitting in 'buf') ! */
  
***************
*** 289,292
  
! 	    times.actime = buf.st_atime;
! 	    times.modtime= buf.st_mtime;
  

--- 297,300 -----
  
! 	  utime_buffer.actime = buf.st_atime;
! 	  utime_buffer.modtime= buf.st_mtime;
  
***************
*** 292,298
  
! 	    if (utime(infile, &times) != 0) {
! 	      dprint0(1,"Error: encountered error doing utime (leavmbox)\n");
! 	      dprint2(1,"** %s - %s **\n", error_name(errno), 
! 		     error_description(errno));
! 	      error2("Error %s trying to change file %s access time", 
  		     error_name(errno), infile);

--- 300,307 -----
  
! 	  if (utime(infile, &utime_buffer) != 0) {
! 	    dprint(1, (debugfile, 
! 		   "Error: encountered error doing utime (leavmbox)\n"));
! 	    dprint(1, (debugfile, "** %s - %s **\n", error_name(errno), 
! 		     error_description(errno)));
! 	    error2("Error %s trying to change file %s access time", 
  		     error_name(errno), infile);
***************
*** 298,300
  		     error_name(errno), infile);
- 	    }
  	  }

--- 307,308 -----
  		     error_name(errno), infile);
  	  }
***************
*** 300,301
  	  }
  	  unlock();	/* remove the lock on the file ASAP! */

--- 308,310 -----
  	  }
+ 
  	  unlock();	/* remove the lock on the file ASAP! */
***************
*** 309,316
  
- #ifdef SAVE_GROUP_MAILBOX_ID
- 	chown(infile, userid, getegid());	/** see the Config Guide **/
- #else
- 	chown(infile, userid, groupid);		/**  file owned by user  **/
- #endif
- 
  	return(to_delete);	

--- 318,319 -----
  
  	return(to_delete);	
***************
*** 343,346
  	while (access_val != -1 && iteration++ < MAX_ATTEMPTS) {
! 	  dprint1(2,"File '%s' currently exists!  Waiting...(lock)\n", 
! 		  lock_name);
  	  if (direction == INCOMING)

--- 346,350 -----
  	while (access_val != -1 && iteration++ < MAX_ATTEMPTS) {
! 	  dprint(2, (debugfile, 
! 		  "File '%s' currently exists!  Waiting...(lock)\n", 
! 		  lock_name));
  	  if (direction == INCOMING)
***************
*** 346,348
  	  if (direction == INCOMING)
! 	    PutLine0(LINES, 0, "\nMail being received!\twaiting...");
  	  else

--- 350,352 -----
  	  if (direction == INCOMING)
! 	    PutLine0(LINES, 0, "Mail being received!\twaiting...");
  	  else
***************
*** 360,363
  
! 	  dprint0(2,
! 	     "Warning: I'm giving up waiting - removing lock file(lock)\n");
  	  if (direction == INCOMING)

--- 364,367 -----
  
! 	  dprint(2, (debugfile, 
! 	     "Warning: I'm giving up waiting - removing lock file(lock)\n"));
  	  if (direction == INCOMING)
***************
*** 368,371
  	  if (unlink(lock_name) != 0) {
! 	    dprint3(1,"Error %s (%s)\n\ttrying to unlink file %s (%s)\n", 
! 		     error_name(errno), error_description(errno), lock_name);
  	    PutLine1(LINES, 0, 

--- 372,376 -----
  	  if (unlink(lock_name) != 0) {
! 	    dprint(1, (debugfile,
! 		  "Error %s (%s)\n\ttrying to unlink file %s (%s)\n", 
! 		     error_name(errno), error_description(errno), lock_name));
  	    PutLine1(LINES, 0, 
***************
*** 391,394
  		"Please try to read your mail again in a few minutes.\n");
! 	    dprint1(2,"Warning:bailing out after %d iterations...(lock)\n", 
! 		    iteration);
  	    leave_locked(0);

--- 396,400 -----
  		"Please try to read your mail again in a few minutes.\n");
! 	    dprint(2, (debugfile, 
! 		    "Warning: bailing out after %d iterations...(lock)\n", 
! 		    iteration));
  	    leave_locked(0);
***************
*** 396,399
  	  else {
! 	    dprint1(2,"Warning: after %d iterations, timed out! (lock)\n", 
! 		    iteration);
  	    leave(error("Timed out on lock file reads.  Leaving program"));

--- 402,406 -----
  	  else {
! 	    dprint(2, (debugfile, 
! 		   "Warning: after %d iterations, timed out! (lock)\n", 
! 		   iteration));
  	    leave(error("Timed out on lock file reads.  Leaving program"));
***************
*** 407,410
  	if ((lock_fd = creat(lock_name, 0)) == -1) {
! 	  dprint2(1,"Can't create lock file: creat(%s) raises error %s (lock)\n", 
! 		  lock_name, error_name(errno));
  	  if (errno == EACCES)

--- 414,418 -----
  	if ((lock_fd = creat(lock_name, 0)) == -1) {
! 	  dprint(1, (debugfile,
! 		 "Can't create lock file: creat(%s) raises error %s (lock)\n", 
! 		  lock_name, error_name(errno)));
  	  if (errno == EACCES)
***************
*** 414,419
  	  else {
! 	    dprint1(1,"Error encountered attempting to create lock %s\n", 
! 		  lock_name);
! 	    dprint2(1,"** %s - %s **\n", error_name(errno),
! 		  error_description(errno));
  	    PutLine1(LINES, 0,

--- 422,428 -----
  	  else {
! 	    dprint(1, (debugfile, 
! 		  "Error encountered attempting to create lock %s\n", 
! 		  lock_name));
! 	    dprint(1, (debugfile, "** %s - %s **\n", error_name(errno),
! 		  error_description(errno)));
  	    PutLine1(LINES, 0,

Index: src/opt_utils.c

***************
*** 17,18
  #ifdef NEED_GETHOSTNAME
  #  include <sys/utsname.h>

--- 17,19 -----
  #ifdef NEED_GETHOSTNAME
+ #  include <sys/types.h>
  #  include <sys/utsname.h>
***************
*** 20,26
  
- #ifdef UTS
- # include <sys/tubio.h>
- # define  TTYIN		0		/* standard input */
- #endif
- 
  #ifdef NEED_GETHOSTNAME

--- 21,22 -----
  
  #ifdef NEED_GETHOSTNAME
***************
*** 31,33
  {
! 	/** Return the name of the current host machine.  UTS only **/
  

--- 27,29 -----
  {
! 	/** Return the name of the current host machine. **/
  
***************
*** 41,43
  	(void) strncpy(hostname,name.nodename,size-1);
! 	hostname[size] = '\0';
  

--- 37,39 -----
  	(void) strncpy(hostname,name.nodename,size-1);
! 	hostname[size - 1] = '\0';
  
***************
*** 47,49
  
! #ifdef UTS
  

--- 43,45 -----
  
! #ifdef NEED_CUSERID
  
***************
*** 49,78
  
- int
- isa3270()
- {
- 	/** Returns TRUE and sets LINES and COLUMNS to the correct values
- 	    for an Amdahl (IBM) tube screen, or returns FALSE if on a normal
- 	    terminal (of course, next to a 3270, ANYTHING is normal!!) **/
- 
- 	struct tubiocb tubecb;
- 
- 	dprint0(3,"Seeing if we're a 3270...");
- 
- 	if (ioctl(TTYIN, TUBGETMOD, &tubecb) == -1) {
- 	  dprint0(3,"We're not!\n");
- 	  return(FALSE);	/* not a tube! */
- 	}
- 	
- 	LINES   = tubecb->line_cnt - 1;
- 	COLUMNS = tubecb->col_cnt;
- 	
- 	dprint2(3,"We are!  %d lines and %d columns!\n",
- 		LINES, COLUMNS);
- 	return(TRUE);
- }
- 
- #endif /* def UTS */
- 
- #ifdef BSD
- 
  cuserid(uname)

--- 45,46 -----
  
  cuserid(uname)
***************
*** 91,92
  }
  

--- 59,64 -----
  }
+ 
+ #endif
+ 
+ #ifdef BSD
  

End of Patch Kit #4