[comp.sources.unix] v22i085: ELM mail syste, release 2.3, Part23/26

rsalz@uunet.uu.net (Rich Salz) (06/06/90)

Submitted-by: Syd Weinstein <syd@dsinc.dsi.com>
Posting-number: Volume 22, Issue 85
Archive-name: elm2.3/part23

#!/bin/sh
# this is part 23 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file src/syscall.c continued
#
CurArch=23
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file src/syscall.c"
sed 's/^X//' << 'SHAR_EOF' >> src/syscall.c
X	int  old_raw, helpful, ret;
X
X	helpful = (user_level == 0);
X
X	if (helpful)
X	  PutLine0(LINES-3,COLUMNS-40,"(Use the shell name for a shell.)");
X	PutLine0(LINES-2,0,"Shell command: ");
X	CleartoEOS();
X	command[0] = '\0';
X	(void) optionally_enter(command, LINES-2, 15, FALSE, FALSE);
X	if (command[0] == 0) {
X	  if (helpful)
X	    MoveCursor(LINES-3,COLUMNS-40);
X	  else
X	    MoveCursor(LINES-2,0);
X	  CleartoEOS();
X	  return 0;
X	}
X
X	MoveCursor(LINES,0);
X	CleartoEOLN();
X
X	if ((old_raw = RawState()) == ON)
X	  Raw(OFF);
X	softkeys_off();
X	if (cursor_control)
X	  transmit_functions(OFF);
X	
X	umask(original_umask);	/* restore original umask so users new files are ok */
X	ret = system_call(command, USER_SHELL, TRUE, TRUE);
X	umask(077);		/* now put it back to private for mail files */
X
X	PutLine0(LINES, 0, "\n\nPress any key to return to ELM: ");
X	Raw(ON);
X	(void) getchar();
X	if (old_raw == OFF)
X	  Raw(OFF);
X	softkeys_on();
X	if (cursor_control)
X	  transmit_functions(ON);
X
X	if (ret)
X	  error1("Return code was %d.", ret);
X
X	return 1;
X}
X
X#endif /* ALLOW_SUBSHELL */
X
Xsystem_call(string, shell_type, allow_signals, allow_interrupt)
Xchar *string;
Xint   shell_type, allow_signals, allow_interrupt;
X{
X	/** execute 'string', setting uid to userid... **/
X	/** if shell-type is "SH" /bin/sh is used regardless of the 
X	    users shell setting.  Otherwise, "USER_SHELL" is sent.
X	    If allow_signals is TRUE, then allow the executed
X	    command handle hangup, and optionally if allow_interrupt
X	    is also true handle interrupt in its own way.
X	    This is useful for executed programs with
X	    user interaction that handle those signals on their
X	    own terms. It is especially important for vi, so that
X	    a message being edited when a user connection is
X	    dropped is recovered by vi's expreserve program **/
X
X	int stat = 0, pid, w;
X#if defined(BSD) && !defined(WEXITSTATUS)
X	union wait status;
X#else
X	int status;
X#endif
X#ifdef VOIDSIG
X	register void (*istat)(), (*qstat)();
X# ifdef SIGTSTP
X	register void (*oldstop)(), (*oldstart)();
X# endif
X#else
X	register int (*istat)(), (*qstat)();
X# ifdef SIGTSTP
X	register int (*oldstop)(), (*oldstart)();
X# endif 
X#endif
X	
X	dprint(2, (debugfile,
X		"System Call: %s\n\t%s\n", shell_type == SH? "/bin/sh" : shell,
X		string));
X
X#ifdef VFORK
X	if ((pid = vfork()) == 0)
X#else
X	if ((pid = fork()) == 0)
X#endif
X	{
X	  setgid(groupid);	/* and group id		    */
X	  setuid(userid);	/* back to the normal user! */
X
X	  if(allow_signals) {
X	    /* program to exec should handle interrupt, accidental hangup, and stop signals */
X	    (void)signal(SIGHUP, SIG_DFL);
X	    if (allow_interrupt)
X	      (void)signal(SIGINT, SIG_DFL);
X	    else
X	      (void)signal(SIGINT, SIG_IGN);
X#ifdef SIGTSTP
X	    (void)signal(SIGTSTP, SIG_DFL);
X	    (void)signal(SIGCONT, SIG_DFL);
X#endif
X	  } else {
X	    /* program to exec should ignore interrupt, accidental hangup, and stop signals */
X	    (void)signal(SIGHUP, SIG_IGN);
X	    (void)signal(SIGINT, SIG_IGN);
X#ifdef SIGTSTP
X	    (void)signal(SIGTSTP, SIG_IGN);
X	    (void)signal(SIGCONT, SIG_IGN);
X#endif
X	  }
X
X	  if (strlen(shell) > 0 && shell_type == USER_SHELL) {
X	    execl(shell, argv_zero(shell), "-c", string, (char *) 0);
X	  }
X	  else 
X	    execl("/bin/sh", "sh", "-c", string, (char *) 0);
X	  _exit(127);
X	}
X
X	istat = signal(SIGINT, SIG_IGN);
X	qstat = signal(SIGQUIT, SIG_IGN);
X#ifdef SIGTSTP
X	oldstop = signal(SIGTSTP, SIG_DFL);
X	oldstart = signal(SIGCONT, SIG_DFL);
X#endif
X
X	while ((w = wait(&status)) != pid && w != -1)
X		;
X
X
X	if (w == pid) {
X#ifdef	WEXITSTATUS
X	  stat = WEXITSTATUS(status);
X#else
X# ifdef	BSD
X	  if (status.w_retcode != 0) stat = status.w_retcode;
X# else
X	  stat = status;
X# endif
X#endif
X	}
X
X	(void)signal(SIGINT, istat);
X	(void)signal(SIGQUIT, qstat);
X#ifdef SIGTSTP
X	(void)signal(SIGTSTP, oldstop);
X	(void)signal(SIGCONT, oldstart);
X#endif
X
X	return(stat);
X}
X
Xint
Xdo_pipe()
X{
X	/** pipe the current message or tagged messages to
X	    the specified sequence.. **/
X
X	char command[SLEN], buffer[SLEN], message_list[SLEN];
X	register int  ret, to_pipe;
X	int	old_raw;
X
X	to_pipe = make_msg_list(message_list);
X	sprintf(buffer, "Pipe message%s to: ", plural(to_pipe));
X        PutLine0(LINES-2,0,buffer);
X
X	command[0] = '\0';
X
X	(void) optionally_enter(command, LINES-2, strlen(buffer), FALSE, FALSE);
X	if (strlen(command) == 0) {
X	  MoveCursor(LINES-2,0);	CleartoEOLN();
X	  return(0);
X	}
X
X	MoveCursor(LINES,0); 	CleartoEOLN();
X	if (( old_raw = RawState()) == ON)
X	  Raw(OFF);
X
X	if (cursor_control)  transmit_functions(OFF);
X	
X	sprintf(buffer, "%s -f %s -h %s | %s",
X		readmsg,
X		(folder_type == NON_SPOOL ? cur_folder : cur_tempfolder),
X		message_list,
X		command);
X	
X	ret = system_call(buffer, USER_SHELL, TRUE, TRUE);
X
X	PutLine0(LINES, 0, "\n\nPress any key to return to ELM.");
X	if (old_raw == ON)
X	   Raw(ON);
X	(void) getchar();
X	if (cursor_control)  transmit_functions(ON);
X
X	if (ret != 0) error1("Return code was %d.", ret);
X	return(1);
X}
X
Xprint_msg()
X{
X	/** Print current message or tagged messages using 'printout' 
X	    variable.  Error message iff printout not defined! **/
X
X	char buffer[SLEN], filename[SLEN], printbuffer[SLEN];
X	char message_list[SLEN];
X	register int  retcode, to_print;
X
X	if (strlen(printout) == 0) {
X	  error("Don't know how to print - option \"printmail\" undefined!");
X	  return;
X	}
X	
X	to_print = make_msg_list(message_list);
X
X	sprintf(filename,"%s%s%d", temp_dir, temp_print, getpid());
X
X	if (in_string(printout, "%s"))
X	  sprintf(printbuffer, printout, filename);
X	else
X	  sprintf(printbuffer, "%s %s", printout, filename);
X
X	sprintf(buffer,"(%s -p -f %s%s > %s; %s 2>&1) > /dev/null",
X		readmsg,
X		(folder_type == NON_SPOOL ? cur_folder : cur_tempfolder),
X		message_list, 
X		filename,
X		printbuffer);
X	
X	dprint(2, (debugfile, "Printing system call...\n"));
X
X  	Centerline(LINES, "Queuing...");
X
X	if ((retcode = system_call(buffer, SH, FALSE, FALSE)) == 0) {
X	  sprintf(buffer, "Message%s queued up to print.", plural(to_print));
X	  Centerline(LINES, buffer);
X	}
X	else
X	  error1("Printout failed with return code %d.", retcode);
X
X	unlink(filename);	/* remove da temp file! */
X}
X
Xmake_msg_list(message_list)
Xchar *message_list;
X{
X	/** make a list of the tagged or just the current, if none tagged.
X		check for overflow on messsage length
X         **/
X
X	int i, msgs_selected = 0;
X
X	*message_list = '\0';	/* start with an empty list */
X
X	for (i=0; i < message_count; i++) 
X	  if (headers[i]->status & TAGGED) {
X	    if (strlen(message_list) + 6 >= SLEN) {
X	      error1("Too many messages selected, messages from %d on not used", i);
X	      return(msgs_selected);
X	      }
X	    sprintf(message_list, "%s %d", message_list, 
X		    headers[i]->index_number);
X	    msgs_selected++;
X	  }
X
X	if (! msgs_selected) {
X	  sprintf(message_list," %d", headers[current-1]->index_number);
X	  msgs_selected = 1;
X	}
X	
X	return(msgs_selected);
X}
X
Xlist_folders(numlines, helpmsg)
Xunsigned numlines;
Xchar *helpmsg;
X{
X	/** list the folders in the users FOLDERHOME directory.  This is
X	    simply a call to "ls -C"
X	    Numlines is the number of lines to scroll afterwards. This is
X	    useful when a portion of the screen needs to be cleared for
X	    subsequent prompts, but you don't want to overwrite the
X	    list of folders.
X	    Helpmsg is what should be printed before the listing if not NULL.
X	**/
X
X	char buffer[SLEN];
X
X	Raw(OFF);
X	ClearScreen();
X	MoveCursor(LINES, 0);
X	if(helpmsg)
X	  printf(helpmsg);
X	sprintf(buffer, "cd %s;ls -C", folders);
X	printf("\n\rContents of your folder directory:\n\r\n\r");
X	system_call(buffer, SH, FALSE, FALSE); 
X	while(numlines--)
X	    printf("\n\r");
X	Raw(ON);
X}
SHAR_EOF
echo "File src/syscall.c is complete"
chmod 0444 src/syscall.c || echo "restore of src/syscall.c fails"
echo "x - extracting src/utils.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/utils.c &&
X
Xstatic char rcsid[] = "@(#)$Id: utils.c,v 4.1 90/04/28 22:44:19 syd Exp $";
X
X/*******************************************************************************
X *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
X *
X * 			Copyright (c) 1986, 1987 Dave Taylor
X * 			Copyright (c) 1988, 1989, 1990 USENET Community Trust
X *******************************************************************************
X * Bug reports, patches, comments, suggestions should be sent to:
X *
X *	Syd Weinstein, Elm Coordinator
X *	elm@DSI.COM			dsinc!elm
X *
X *******************************************************************************
X * $Log:	utils.c,v $
X * Revision 4.1  90/04/28  22:44:19  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/** Utility routines for ELM
X
X**/
X
X#include "headers.h"
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <ctype.h>
X#include <errno.h>
X
X#ifdef BSD
X#undef tolower
X#endif
X
X#include <signal.h>
X
Xextern int errno;
X
Xchar *error_name();
Xvoid   exit();
X
Xcreate_new_folders()
X{
X	/* this creates a new folders directory */
X
X#ifdef MKDIR
X	(void) mkdir(folders, 0700);
X#else
X	char com[SLEN];
X
X	/** Some systems don't have a mkdir call - how inconvienient! **/
X
X	sprintf(com, "mkdir %s", folders);
X	system_call(com, SH, FALSE, FALSE);
X	sprintf(com, "chmod 700 %s", folders);
X	system_call(com, SH, FALSE, FALSE);
X#endif /* MKDIR */
X
X	chown(folders, userid, groupid);
X}
X
Xcreate_new_elmdir()
X{
X	/** this routine is just for allowing new users who don't have the
X	    old elm files to create a new .elm directory **/
X
X	char source[SLEN];
X#ifdef MKDIR
X	sprintf(source, "%s/.elm", home);
X	(void) mkdir(source, 0700);
X#else
X	char com[SLEN];
X
X	/** Some systems don't have a mkdir call - how inconvienient! **/
X
X	sprintf(com, "mkdir %s/.elm", home);
X	system_call(com, SH, FALSE, FALSE);
X	sprintf(com, "chmod 700 %s/.elm", home);
X	system_call(com, SH, FALSE, FALSE);
X#endif /* MKDIR */
X
X	chown( source, userid, groupid);
X}
X
Xmove_old_files_to_new()
X{
X	/** this routine is just for allowing people to transition from
X	    the old Elm, where things are all kept in their $HOME dir,
X	    to the new one where everything is in $HOME/.elm... **/
X
X	char source[SLEN], dest[SLEN], temp[SLEN];
X	char com[SLEN];
X
X	/** simply go through all the files... **/
X
X	sprintf(source, "%s/.alias_text", home);
X	if (access(source, ACCESS_EXISTS) != -1) {
X	  sprintf(dest,   "%s/%s", home, ALIAS_TEXT);
X	  printf("\n\rCopying from: %s\n\rCopying to:   %s\n\r", source, dest);
X
X	  sprintf(temp, "/tmp/%d", getpid());
X	  sprintf(com, "%s -e 's/:/=/g' %s > %s\n", sed_cmd, source, temp);
X	  (void) system_call(com, SH, FALSE, FALSE);
X	  sprintf(com, "%s %s %s\n", move_cmd, temp, dest);
X	  (void) system_call(com, SH, FALSE, FALSE);
X	  (void) system_call("newalias", SH, FALSE, FALSE);
X	}
X
X	sprintf(source, "%s/.elmheaders", home);
X	if (access(source, ACCESS_EXISTS) != -1) {
X	  sprintf(dest,   "%s/%s", home, mailheaders);
X	  printf("\n\rCopying from: %s\n\rCopying to:   %s\n\r", source, dest);
X	  copy(source, dest);
X	}
X
X	sprintf(source, "%s/.elmrc", home);
X	if (access(source, ACCESS_EXISTS) != -1) {
X	  sprintf(dest,   "%s/%s", home, elmrcfile);
X	  printf("\n\rCopying from: %s\n\rCopying to:   %s\n\r", source, dest);
X	  copy(source, dest);
X	}
X
X	printf(
X	"\n\rWelcome to the new version of ELM!\n\n\rHit return to continue.");
X	getchar();
X}
X
Xemergency_exit()
X{
X	/** used in dramatic cases when we must leave without altering
X	    ANYTHING about the system... **/
X	char *mk_lockname();
X
X	dprint(1, (debugfile,
X     "\nERROR: Something dreadful is happening!  Taking emergency exit!!\n\n"));
X	dprint(1, (debugfile,
X	     "  possibly leaving behind the following files;\n"));
X	dprint(1, (debugfile,
X	     "     The mailbox tempfile : %s\n", cur_tempfolder));
X	if(folder_type == SPOOL) dprint(1, (debugfile,
X	     "     The mailbox lock file: %s\n", mk_lockname(cur_folder)));
X	dprint(1, (debugfile,
X	     "     The composition file : %s%s%d\n", temp_dir, temp_file, getpid()));
X	dprint(1, (debugfile,
X	     "     The readmsg data file: %s/%s\n", home, readmsg_file));
X
X	Raw(OFF);
X	if (cursor_control)  transmit_functions(OFF);
X	if (hp_terminal)     softkeys_off();
X
X	if (cursor_control)
X	  MoveCursor(LINES, 0);
X
X	PutLine0(LINES,0,
X		"\nEmergency exit taken! All temp files intact!\n\n");
X
X	exit(1);
X}
Xrm_temps_exit()
X{
X      char buffer[SLEN];
X      PutLine0(LINES,0,
X         "\nWrite to temp file failed, exiting leaving mailbox intact!\n\n");
X      dprint(2, (debugfile, "\nrm_temps_exit, deleteing temp files\n"));
X      Raw(OFF);
X      if (cursor_control)  transmit_functions(OFF);
X      if (hp_terminal)     softkeys_off();
X      sprintf(buffer,"%s%d",temp_file, getpid());  /* editor buffer */
X      (void) unlink(buffer);
X      if (folder_type == SPOOL) {
X        (void) unlink(cur_tempfolder);
X      }
X      sprintf(buffer,"%s/%s", home, readmsg_file);  /* readmsg temp */
X      (void) unlink(buffer);
X      unlock();                               /* remove lock file if any */
X      if(!batch_only) {
X        MoveCursor(LINES,0);
X        NewLine();
X      }
X      exit(1);
X}
X
X/*ARGSUSED*/
X/*VARARGS0*/
X
Xleave(val)
Xint val;	/* not used, placeholder for signal catching! */
X{
X	char buffer[SLEN];
X
X	dprint(2, (debugfile, "\nLeaving mailer normally (leave)\n"));
X
X	Raw(OFF);
X	if (cursor_control)  transmit_functions(OFF);
X	if (hp_terminal)     softkeys_off();
X
X	sprintf(buffer,"%s%s%d", temp_dir, temp_file, getpid());  /* editor buffer */
X	(void) unlink(buffer);
X
X	if (folder_type == SPOOL) {
X	  (void) unlink(cur_tempfolder);
X	}
X
X	sprintf(buffer,"%s/%s", home, readmsg_file);  /* readmsg temp */
X	(void) unlink(buffer);
X
X	unlock();				/* remove lock file if any */
X
X	if(!batch_only) {
X	  MoveCursor(LINES,0);
X	  NewLine();
X	}
X
X	exit(0);
X}
X
Xsilently_exit()
X{
X	/** This is the same as 'leave', but it doesn't remove any non-pid
X	    files.  It's used when we notice that we're trying to create a
X	    temp mail file and one already exists!!
X	**/
X	char buffer[SLEN];
X
X	dprint(2, (debugfile, "\nLeaving mailer quietly (silently_exit)\n"));
X
X	Raw(OFF);
X	if (cursor_control)  transmit_functions(OFF);
X	if (hp_terminal)     softkeys_off();
X
X	sprintf(buffer,"%s%s%d", temp_dir, temp_file, getpid());  /* editor buffer */
X	(void) unlink(buffer);
X
X	MoveCursor(LINES,0);
X	NewLine();
X
X	exit(0);
X}
X
X/*ARGSUSED0*/
X
X#ifndef REMOVE_AT_LAST
Xleave_locked(val)
Xint val;	/* not used, placeholder for signal catching! */
X{
X	/** same as leave routine, but don't disturb lock file **/
X
X	char buffer[SLEN];
X
X        dprint(3, (debugfile,
X	    "\nLeaving mailer due to presence of lock file (leave_locked)\n"));
X
X	Raw(OFF);
X	if (cursor_control)  transmit_functions(OFF);
X	if (hp_terminal)     softkeys_off();
X
X	sprintf(buffer,"%s%s%d", temp_dir, temp_file, getpid());  /* editor buffer */
X	(void) unlink(buffer);
X
X	(void) unlink(cur_tempfolder);			/* temp mailbox */
X
X	MoveCursor(LINES,0);
X	NewLine();
X	exit(0);
X}
X#endif
X
Xint
Xget_page(msg_pointer)
Xint msg_pointer;
X{
X	/** Ensure that 'current' is on the displayed page,
X	    returning NEW_PAGE iff the page changed! **/
X
X	register int first_on_page, last_on_page;
X
X	first_on_page = (header_page * headers_per_page) + 1;
X
X	last_on_page = first_on_page + headers_per_page - 1;
X
X	if (selected)	/* but what is it on the SCREEN??? */
X	  msg_pointer = compute_visible(msg_pointer);
X
X	if (selected && msg_pointer > selected)
X	  return(SAME_PAGE);	/* too far - page can't change! */
X
X	if (msg_pointer > last_on_page) {
X	  header_page = (int) (msg_pointer-1)/ headers_per_page;
X	  return(NEW_PAGE);
X	}
X	else if (msg_pointer < first_on_page) {
X	  header_page = (int) (msg_pointer-1) / headers_per_page;
X	  return(NEW_PAGE);
X	}
X	else
X	  return(SAME_PAGE);
X}
X
Xchar *nameof(filename)
Xchar *filename;
X{
X	/** checks to see if 'filename' has any common prefixes, if
X	    so it returns a string that is the same filename, but
X	    with '=' as the folder directory, or '~' as the home
X	    directory..
X	**/
X
X	static char buffer[STRING];
X	register int i = 0, iindex = 0;
X
X	if (strncmp(filename, folders, strlen(folders)) == 0) {
X	  if (strlen(folders) > 0) {
X	    buffer[i++] = '=';
X	    iindex = strlen(folders);
X	    if(filename[iindex] == '/')
X	      iindex++;
X	  }
X	}
X	else if (strncmp(filename, home, strlen(home)) == 0) {
X	  if (strlen(home) > 1) {
X	    buffer[i++] = '~';
X	    iindex = strlen(home);
X	  }
X	}
X	else iindex = 0;
X
X	while (filename[iindex] != '\0')
X	  buffer[i++] = filename[iindex++];
X	buffer[i] = '\0';
X
X	return( (char *) buffer);
X}
SHAR_EOF
chmod 0444 src/utils.c || echo "restore of src/utils.c fails"
echo "x - extracting src/validname.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/validname.c &&
X
Xstatic char rcsid[] = "@(#)$Id: validname.c,v 4.1 90/04/28 22:44:21 syd Exp $";
X
X/*******************************************************************************
X *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
X *
X * 			Copyright (c) 1986, 1987 Dave Taylor
X * 			Copyright (c) 1988, 1989, 1990 USENET Community Trust
X *******************************************************************************
X * Bug reports, patches, comments, suggestions should be sent to:
X *
X *	Syd Weinstein, Elm Coordinator
X *	elm@DSI.COM			dsinc!elm
X *
X *******************************************************************************
X * $Log:	validname.c,v $
X * Revision 4.1  90/04/28  22:44:21  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X#include "defs.h"
X
X#include <stdio.h>
X
X#ifndef NOCHECK_VALIDNAME		 /* Force a return of valid */
X# ifdef PWDINSYS
X#  include <sys/pwd.h>
X# else
X#  include <pwd.h>
X# endif
X#endif
X
Xint
Xvalid_name(name)
Xchar *name;
X{
X	/** Determine whether "name" is a valid logname on this system.
X	    It is valid if there is a password entry, or if there is
X	    a mail file in the mail spool directory for "name".
X	 **/
X
X#ifdef NOCHECK_VALIDNAME		 /* Force a return of valid */
X
X	return(TRUE);
X
X#else
X
X	char filebuf[SLEN];
X	struct passwd *getpwnam();
X
X	if(getpwnam(name) != NULL)
X	  return(TRUE);
X
X	sprintf(filebuf,"%s/%s", mailhome, name);
X	if (access(filebuf, ACCESS_EXISTS) == 0)
X	  return(TRUE);
X
X	return(FALSE);
X
X#endif
X}
SHAR_EOF
chmod 0444 src/validname.c || echo "restore of src/validname.c fails"
echo "x - extracting test/test.empty (Text)"
sed 's/^X//' << 'SHAR_EOF' > test/test.empty &&
SHAR_EOF
chmod 0444 test/test.empty || echo "restore of test/test.empty fails"
echo "x - extracting test/test.mail (Text)"
sed 's/^X//' << 'SHAR_EOF' > test/test.mail &&
XFrom root Wed Oct 30 14:03:36 1985
X>From srmmail Wed Oct 30 14:10:08 1985  remote from veeger
X>From hplabs Wed Oct 30 14:00:16 1985 remote from hpcnof
X>From hpl-opus!poulton  Wed Oct 30 02:06:16 1985 remote from hplabs
XDate: Wed, 30 Oct 85 01:55:05 pst
XFrom: <hplabs!hpl-opus!poulton>
XReceived: by HP-VENUS id AA26352; Wed, 30 Oct 85 01:55:05 pst
XMessage-Id: <8510300955.AA26352@HP-VENUS>
XTo: hplabs!hpldat!taylor
XSubject: Re: announce(1)
X
XThe announce I got was shar'd July 8.   NLEN was not defined in that
Xsource, just used.  LONG_SLEN is not defined in the newmail(1)
Xthat you sent me.  What system are you running on?
XMy s500 doesn't have these def's.
X
X	-> Monday, January 3rd: Call your mother
X
XAs to announce --> newmail: why the switch?
XSeems like both are useful, in different situations.
X
XKen Poulton
XHPL
X
X
X
X
XFrom root Wed Oct 30 14:03:39 1985
X>From srmmail Wed Oct 30 14:10:12 1985  remote from veeger
X>From hplabs Wed Oct 30 13:59:53 1985 remote from hpcnof
X>From fowler  Wed Oct 30 12:57:11 1985 remote from hplabs
XDate: Wed, 30 Oct 85 12:57:11 pst
XFrom: Greg Fowler <hplabs!fowler>
XReceived: by HP-VENUS id AA12562; Wed, 30 Oct 85 12:57:11 pst
XMessage-Id: <8510302057.AA12562@HP-VENUS>
XTo: mail-men@rochester
XSubject: Re: Summary of Network Mail Headers
XReferences: <36700044@hpcnof.UUCP>
XPriority: Most Urgent
X
XI believe your introduction referred to the uucp network.  usenet is the network news
Xsoftware mechanism and isn't a "network".
X
X	- > February 19, 1986
X	-
X	-    A longer test of the system
X	-
X
X	Greg
X
X
X
XFrom root Wed Oct 30 14:13:23 1985
X>From srmmail Wed Oct 30 14:20:08 1985  remote from veeger
X>From root Wed Oct 30 14:01:57 1985 remote from hpcnof
XTo: DCC@hplabs
XSubject: Log of backup tape #1
X
X 
XFull Backup starting at Wed Oct 30 12:45:14 MST 1985
X 
X
X
Xbacking up directories: 
X	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./lost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
X
X
X
X
X
XFrom root Wed Oct 30 15:33:24 1985
X>From srmmail Wed Oct 30 15:40:26 1985  remote from veeger
X>From root Wed Oct 30 15:37:17 1985 remote from hpcnof
XTo: root, uucp, taylor@hplabs.ARPA
XSubject: Log of backup tape #2
X
Xbacking up directories: 
X	./users/fh ./users/rmd ./users/vince ./users/roberts ./users/row ./users/dt ./lost+found ./users/lost+found ./users/scb ./users/kevin ./users/du
X
X
X
X
Xbacking up directories: 
X	./users/sbh ./users/ges ./users/cpb ./users/amy ./net ./users/root ./users/balza ./dev ./users/remple ./users/jr ./users/mwr ./users/larryf
X
X
X
X
X
XFrom root Sun Dec  8 22:50:18 1985
X>From srmmail Mon Dec  9 00:50:05 1985 remote from veeger
X>From root Mon Dec  9 00:41:15 1985 remote from hpcnof
X>From JLarson.pa@Xerox.ARPA  Sun Dec  8 20:45:55 1985 remote from hplabs
XDate: 8 Dec 85 20:36:36 PST (Sunday)
XFrom: hplabs!JLarson.pa@Xerox.ARPA
XSubject: How's it going, anyway?
XTo: hpcnou!dat@HPLABS.ARPA (Dave Taylor)
XCc: JLarson.pa@Xerox.ARPA
X
XHow are things with you?  Could you send me that paper we were talking
Xabout?  
X
X	Thanks
X
XJohn Larson
XXerox Palo Alto Research Center
X3333 Coyote Hill Road
XPalo Alto, Ca  94304
X
X
X
X
XFrom To:host!root@hplabs.HP.COM Wed Aug  7 19:58:30 1985
X#From uucp Wed Aug  7 19:55:12 1985  remote from veeger
X#From hplabs Wed Aug  7 19:48:10 1985 remote from hpcnof
X#From RICHER@SUMEX-AIM  Wed Aug  7 09:23:12 1985 remote from hplabs
XReceived: by HP-VENUS id AA18269; Wed, 7 Aug 85 09:11:48 pdt
XDate: Tue 6 Aug 85 09:12:37-PDT
X#From: Mark Richer <hplabs!RICHER@SUMEX-AIM>
XReceived: by HP-VENUS via CSNET; 7 Aug 1985 09:11:37-PDT (Wed)
XReceived: from sumex-aim.arpa by csnet-relay.arpa id a015812; 6 Aug 85 12:14 EDT
XTo: hpcnof!veeger!hpcnou!dat%hplabs.csnet@CSNET-RELAY
XVia:  CSNet; 7 Aug 85 9:11-PDT
XSubject: Re: AI in Education mailing list...
XCc: RICHER@SUMEX-AIM
XIn-Reply-To: <8508030243.AA27641@HP-VENUS>
XMessage-Id: <12132987812.61.RICHER@SUMEX-AIM.ARPA>
X
XI added you to aied.  This message may be of interest to you:
X
XArtificial Intelligence in Education Meeting at IJCAI 85
X---------- ------------ -- --------- ------- -- ----- --
X
XPlace: Math Sciences Auditorium (a.k.a. Math 4000A), UCLA campus
XTime: 6:30 pm, Tuesday, Aug. 20, 1985  (length: 1 - 1 1/4 hr)
X
XAgenda:
X	I have two speakers scheduled to make presentations that
Xshould stimulate questions and discussions:
X
X	(1) Short Announcements
X
X	(2) Jeff Bonar, Research Scientist, Learning Research and
X	Development Center (LRDC), University of Pittsburgh
X
X	--- on-going ICAI research projects at LRDC
X	--- dissemination of ICAI technology in the form of software
X	tools, workshops, written materials, and video tapes.
X
X	(3) Gary Fine, Product Engineering Manager, INTELLICORP,
X	formerly with a company producing CAI products, also graduate
X	work in ICAI  
X
X	--- bridging the gap between current ICAI technology and the
X	real world
X
X[IJCAI-85, the 9th International Joint Conference on Artificial
XIntelligence is being held at UCLA Campus, August 18-23, 1985.  This
Xconference is co-sponsered by the American Association for Artificial
XIntelligence (AAAI) this year, and I have been told by their office
Xthat only walk-in registration is available at this time.  For more
Xinformation, contact AAAI:  AAAI-OFFICE@SUMEX-AIM.ARPA
X			    AAAI, 445 Burgess Drive, Menlo Park, CA 94025
X			    or call (415) 328-3123]
X
XDirect questions on the AI in ED meeting (only) to Mark Richer,
XRICHER@SUMEX-AIM.ARPA
X-------
X
X
X
X
XFrom root Tue Sep 24 09:53:24 1985
X>From HPMAIL-gateway Tue Sep 24  9:46:47 1985  remote from veeger
X>From Simon_CINTZ_/_HPD600/TR  Tue Sep 24  9:46:47 1985  remote from hpmail
XDate:   Tue, 24 Sep 85  9:14:00 MDT
XFrom:   Simon_CINTZ_/_HPD600/TR  (Simon Cintz)
XSubject: ITF
XFrom:   Simon_CINTZ_/_HPD600/TR  (Simon Cintz)
XTo:     Dave_TAYLOR_/_HPF100/00
X
XDave -
X
XJust as one programming language doesn't suit the needs of
Xall programmers, one authoring facility will probably not
Xsuit the needs of all HP entities that require CBT -- at least
Xnot in the near future.  Of course, this is my personal opinion
Xand if I'm wrong, it won't be the first time.
X
XGood luck.
X
X
X                                           - Simon
X
XFrom root Mon Oct 21 10:43:37 1985
X>From srmmail Mon Oct 21 10:30:16 1985  remote from veeger
X>From root Mon Oct 21 10:28:58 1985 remote from hpcnof
X>From DLS.MDC%office-X.arpa@CSNET-RELAY  Mon Oct 21 01:57:05 1985 remote from hplabs
XReceived: by HP-VENUS id AA17376; Mon, 21 Oct 85 01:57:05 pdt
XDate: 21 Oct 85 01:02 EDT
XFrom: Duane Stone / McDonnell Douglas / CSC-ASD <hplabs!DLS.MDC%office-1.arpa@CSNET-RELAY>
XReceived: by HP-VENUS via CSNET; 21 Oct 1985 01:57:01-PDT (Mon)
XReceived: from office-1.arpa by CSNET-RELAY.ARPA id a019220; 21 Oct 85 1:18 EDT
XTo: Dave Taylor <hpcnou!dat%hplabs.csnet@CSNET-RELAY>
XVia:  CSNet; 21 Oct 85 1:56-PDT
XSubject: Re: More Mail Headers...
XMessage-Id: <MDC-DLS-7W9CS@OFFICE-1>
XComment: Dave -- this is the body of the message I previously 'sent' to you via
X
Xa Journal.
X
XI might suggest re-wording the para on Author -- my associates might object to 
X'strange' -- something like:
X
X   This is used to credit the original author, or to give credit on article 
X   excerpts (from Newspapers, magazines, books, etc).
X
XOne field which I forgot is:
X
X   Length:  This is computed when the message is sent and gives the recipients 
X   an estimate of the number of pages in the document.
X
X   Example:
X
X      Length: 6 pages [estimate]
X
XAccess:
X
X   Used to declare whether a Journal item should be Public or Private (to those
X   that are on the distribution list or Extended Access list)
X
X   Example:
X
X      Access: Unrestricted
X
XAcknowledge-Delivery:
X
X   Used to request the system mailer send back a message when it has 
X   successfully delivered the item.
X
X   Example:
X
X      Acknowledge-Delivery: Requested
X
XAcknowledge-Receipt:
X
X   Used to to ask the recipient to acknowledge receipt of the message.
X
X   Example:
X
X   Acknowledge-Receipt: Requested
X
XAddendum-To:
X
X   A pointer to a previously submitted Journal item.
X
X   Example:
X
X      Addendum-To: <ASD,1234,>
X
XDelivery-Timing:
X
X   Used by the sender to indicate when the message should be submitted to the 
X   mailer.
X
X      Examples:
X
X         Rush:       -   immediate
X
X         Soon:       -   as soon as possible
X
X         Defer:      -   overnight
X
X         Start-Delivery: DATE TIME
X
X         Stop-Delivery:  DATE TIME (if not yet delivered)
X
XDisposition-Code:
X
X   Used by the system to group Journal items into one of several classes for 
X   eventual archive to tape and as an indicator of how long the archive tapes 
X   should be retained.
X
X   Example:
X
X      Disposition-Code: Temporary (2 years)
X
XExtended-access:
X
X   Used with private Journal items to allow access by other than those on the 
X   distribution list.
X
X   Example:
X
X      Extended-access: ASD.MDC
X
XLocation:
X
X   Used to submit the message to the Journal.  The adressees receive a short 
X   citation with other header fields and a "Location:" field pointing to a file
X   in an electronic library.
X
X   Example:
X
X      Location: <MDC,1234,>
X
XPart-Of:
X
X   A pointer to a previously submitted Journal item.
X
X   Example:
X
X      Part-Of: <MDC,1234,>
X
XRoute-To:
X
X   Used to send a message "in-turn" to addressees in the "To:" field -- as 
X   opposed to the broadcast method of delivery where everyone gets the message 
X   "simultaneously".  Any addresses in the "Cc:" field receive a copy of the 
X   message each time it is passed from one adressee to the next in the "To:" 
X   field.
X
X   Example:
X
X      Routed-to: {addresses in To field}
X
XSigned:
X
X   Created when the user employs the Sign command; used to electronically sign 
X   a message.  It affixes a signature-block to a message.  A "Verify Signature"
X   command is available to recipients that lets them find out if anyone has 
X   changed the body of the message since the message was signed.
X
X   Example:
X
X          SIGNED
X      
X      Duane L. Stone
X      App. Dev. Mgr.
X
XSupersedes:
X
X   A pointer to a previously submitted Journal item.
X
X   Example:
X
X      Supersedes: <MDC,1234,>
X
X
X--- last line of the file --
SHAR_EOF
chmod 0444 test/test.mail || echo "restore of test/test.mail fails"
echo "x - extracting utils/Makefile.SH (Text)"
sed 's/^X//' << 'SHAR_EOF' > utils/Makefile.SH &&
Xcase $CONFIG in
X'')
X    if test ! -f config.sh; then
X	ln ../config.sh . || \
X	ln ../../config.sh . || \
X	ln ../../../config.sh . || \
X	(echo "Can't find config.sh."; exit 1)
X    fi
X    . ./config.sh
X    ;;
Xesac
Xcase "$0" in
X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
Xesac
X
Xecho "Extracting utils/Makefile (with variable substitutions)"
Xcat >Makefile <<!GROK!THIS!
X
X# @(#)$Id: Makefile.SH,v 4.1 90/04/28 22:44:26 syd Exp $
X#
X#  Makefile for the Elm system utilities
X#
X#	Copyright (c) 1986, 1987 Dave Taylor
X#	Copyright (c) 1988, 1989, 1990 USENET Community Trust
X#
X# Bug reports, patches, comments, suggestions should be sent to:
X#
X#	Syd Weinstein - elm@DSI.COM
X#			dsinc!elm
X#
X# $Log:	Makefile.SH,v $
X# Revision 4.1  90/04/28  22:44:26  syd
X# checkin of Elm 2.3 as of Release PL0
X# 
X#
X# Variables
X#	Variables established by Configure
XCC		=	$cc
XCCFLAGS		=	$ccflags $xencf
XCHMOD		=	$chmod
XCP		=	$cp
XDEST		=	$bin
XECHO		=	$echo
XLFLAGS		=	$ldflags $xenlf
XLIB		=	$lib
XLIB2		= 	$libs
XLIBS		=	$termlib $dbm
XLINT		=	$lint
XLN		=	$ln
XMAKE		=	$make
XMV		=	$mv
XOPTIMIZE	=	$optimize
XRM		= 	$rm -f
XTOUCH		=	$touch
X!GROK!THIS!
X
Xcat >>Makefile <<'!NO!SUBS!'
X#	Variables you may want to manually edit
X#		If you want debug logging then you'll
X#		want to uncomment the following.
X#DEBUG		=	-DDEBUG
X
X#	Other general variables
XBIN		=	../bin
XCFLAGS		=	$(CCFLAGS) $(OPTIMIZE) -I$(INCLDIR) $(DEBUG) $(DACSNET) 
XINCLDIR		=	../hdrs
XLINTFLAGS	=	-I$(INCLDIR)
XSHELL		=	/bin/sh
X
X#	Lists
X#		List of installed programs - excludes wnewmail, which is
X#		handled separately
XINSTALL_LIST	=	$(DEST)/answer		\
X			$(DEST)/arepdaemon	\
X			$(DEST)/autoreply	\
X			$(DEST)/checkalias	\
X			$(DEST)/fastmail	\
X			$(DEST)/frm		\
X			$(DEST)/listalias	\
X			$(DEST)/messages	\
X			$(DEST)/newalias	\
X			$(DEST)/newmail		\
X			$(DEST)/printmail	\
X			$(DEST)/readmsg
X
X#		List of remotely install programs
XREMOTE_LIST	=	$(REMOTE)$(DEST)/answer		\
X			$(REMOTE)$(DEST)/arepdaemon	\
X			$(REMOTE)$(DEST)/autoreply	\
X			$(REMOTE)$(DEST)/checkalias	\
X			$(REMOTE)$(DEST)/fastmail	\
X			$(REMOTE)$(DEST)/frm		\
X			$(REMOTE)$(DEST)/listalias	\
X			$(REMOTE)$(DEST)/messages	\
X			$(REMOTE)$(DEST)/newalias	\
X			$(REMOTE)$(DEST)/newmail	\
X			$(REMOTE)$(DEST)/printmail	\
X			$(REMOTE)$(DEST)/readmsg
X
X#		List of programs in bin directory
XBINARY_LIST	=	$(BIN)/answer		\
X			$(BIN)/arepdaemon	\
X			$(BIN)/autoreply	\
X			$(BIN)/checkalias	\
X			$(BIN)/fastmail		\
X			$(BIN)/frm		\
X			$(BIN)/listalias	\
X			$(BIN)/messages		\
X			$(BIN)/newalias		\
X			$(BIN)/newmail		\
X			$(BIN)/printmail	\
X			$(BIN)/readmsg
X
X#		List of programs to $(LINT) - only C programs
XLINT_LIST	=	answer_lint	\
X			arepdaemon_lint	\
X			autoreply_lint	\
X			fastmail_lint	\
X			frm_lint	\
X			listalias_lint	\
X			newalias_lint	\
X			newmail_lint	\
X			readmsg_lint
X
X#	List of all object files in all util programs (used in parallel makes)
XUTIL_OBJ	=	answer.o		\
X			arepdaem.o 		\
X			autoreply.o		\
X			expand.o		\
X			fastmail.o		\
X			from.o			\
X			listalias.o		\
X			newalias.o		\
X			newmail.o		\
X			readmsg.o		\
X			../src/opt_utils.o	\
X			../src/string2.o	\
X			../src/validname.o
X
X#	Lists of source and object files for each C program
XANSWER_SRC	=	answer.c ../src/opt_utils.c ../src/string2.c
XANSWER_OBJ	=	answer.o ../src/opt_utils.o ../src/string2.o
XAREPDAEMON_SRC	=	arepdaem.c ../src/opt_utils.c ../src/errno.c
XAREPDAEMON_OBJ	=	arepdaem.o ../src/opt_utils.o ../src/errno.o
XAUTOREPLY_SRC	=	autoreply.c ../src/opt_utils.c
XAUTOREPLY_OBJ	=	autoreply.o ../src/opt_utils.o
XFASTMAIL_SRC	=	fastmail.c ../src/opt_utils.c
XFASTMAIL_OBJ	=	fastmail.o ../src/opt_utils.o
XFRM_SRC		=	from.c expand.c ../src/opt_utils.c ../src/string2.c
XFRM_OBJ		=	from.o expand.o ../src/opt_utils.o ../src/string2.o
XLISTALIAS_SRC	=	listalias.c
XLISTALIAS_OBJ	=	listalias.o
XNEWALIAS_SRC	=	newalias.c ../src/validname.c ../src/opt_utils.c ../src/string2.c
XNEWALIAS_OBJ	=	newalias.o ../src/validname.o ../src/opt_utils.o ../src/string2.o
XNEWMAIL_SRC	=	newmail.c expand.c ../src/opt_utils.c ../src/string2.c
XNEWMAIL_OBJ	=	newmail.o expand.o ../src/opt_utils.o ../src/string2.o
XREADMSG_SRC	=	readmsg.c expand.c ../src/opt_utils.c ../src/string2.c
XREADMSG_OBJ	=	readmsg.o expand.o ../src/opt_utils.o ../src/string2.o
X
X# Standard targets
Xall:			objects $(BINARY_LIST)
X
X#	This unusual target enables highly efficial compilation of object files
X#	on systems that have the parallel make feature.
Xobjects:		$& $(UTIL_OBJ)
X
Xinstall:		$(INSTALL_LIST) $(DEST)/wnewmail
X
Xuninstall:		
X			$(RM) $(INSTALL_LIST) $(DEST)/wnewmail
X
X#	This is the only target that gets installed even if not out-of-date
X#	with respect the files from which it is installed.
Xrmt-install:		rmt-defined
X			-$(MV) $(DEST)/answer $(DEST)/answer.old
X			-$(MV) $(DEST)/arepdaemon $(DEST)/arepdaemon.old
X			-$(MV) $(DEST)/autoreply $(DEST)/autoreply.old
X			-$(MV) $(DEST)/checkalias $(DEST)/checkalias.old
X			-$(MV) $(DEST)/fastmail $(DEST)/fastmail.old
X			-$(MV) $(DEST)/frm $(DEST)/frm.old
X			-$(MV) $(DEST)/listalias $(DEST)/listalias.old
X			-$(MV) $(DEST)/messages $(DEST)/messages.old
X			-$(MV) $(DEST)/newalias $(DEST)/newalias.old
X			-$(MV) $(DEST)/newmail $(DEST)/newmail.old
X			-$(MV) $(DEST)/printmail $(DEST)/printmail.old
X			-$(MV) $(DEST)/readmsg $(DEST)/readmsg.old
X			-$(MV) $(DEST)/wnewmail $(DEST)/wnewmail.old
X			-$(RM) $(DEST)/answer.old
X			-$(RM) $(DEST)/arepdaemon.old
X			-$(RM) $(DEST)/autoreply.old
X			-$(RM) $(DEST)/checkalias.old
X			-$(RM) $(DEST)/fastmail.old
X			-$(RM) $(DEST)/frm.old
X			-$(RM) $(DEST)/listalias.old
X			-$(RM) $(DEST)/messages.old
X			-$(RM) $(DEST)/newalias.old
X			-$(RM) $(DEST)/newmail.old
X			-$(RM) $(DEST)/printmail.old
X			-$(RM) $(DEST)/readmsg.old
X			-$(RM) $(DEST)/wnewmail.old
X			$(CP) $(REMOTE_LIST) $(DEST)
X			$(LN) $(DEST)/newmail $(DEST)/wnewmail
X			$(CHMOD) a+rx $(INSTALL_LIST)
X
Xrmt-defined:
X	@(if [ "$(REMOTE)" = "" ];\
X	  then\
X	    $(ECHO) "You need to define 'REMOTE' as the remote file system";\
X	    $(ECHO) "for this particular command. The easiest way to do this";\
X	    $(ECHO) "to type:";\
X	    $(ECHO) "        make REMOTE=<remote file system> rmt-install";\
X	    exit 1;\
X	  fi);
X
X#	This rule allows us to put lint output for each program on the
X#	same file, but make sure we start off fresh each time.
Xlint:			
X			$(RM) LINT.OUT; $(MAKE) -$(MAKEFLAGS) $(LINT_LIST)
X
Xclean:			
X			$(RM) $(UTIL_OBJ) $(BINARY_LIST)
X
X# Dependencies and rules
X#	Dependencies and rules for compiling and linting C programs
X.PRECIOUS:		$(INCLDIR)/defs.h $(INCLDIR)/elm.h $(INCLDIR)/headers.h
X
X$(BIN)/answer:		$(ANSWER_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(ANSWER_OBJ) $(LIB2)
X
Xanswer_lint:		$(ANSWER_SRC)
X			$(LINT) $(LINTFLAGS) $(ANSWER_SRC) >> LINT.OUT
X
X$(BIN)/arepdaemon:	$(AREPDAEMON_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(AREPDAEMON_OBJ) $(LIB2)
X
Xarepdaemon_lint:	$(AREPDAEMON_SRC)
X			$(LINT) $(LINTFLAGS) $(AREPDAEMON_SRC) >> LINT.OUT
X
X$(BIN)/autoreply:	$(AUTOREPLY_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(AUTOREPLY_OBJ) $(LIB2)
X
Xautoreply_lint:		$(AUTOREPLY_SRC)
X			$(LINT) $(LINTFLAGS) $(AUTOREPLY_SRC) >> LINT.OUT
X
X$(BIN)/fastmail:	$(FASTMAIL_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(FASTMAIL_OBJ) $(LIB2)
X
Xfastmail_lint:		$(FASTMAIL_SRC)
X			$(LINT) $(LINTFLAGS) $(FASTMAIL_SRC) >> LINT.OUT
X
X$(BIN)/frm:		$(FRM_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(FRM_OBJ) $(LIB2)
X
Xfrm_lint:		$(FRM_SRC)
X			$(LINT) $(LINTFLAGS) $(FRM_SRC) >> LINT.OUT
X
X$(BIN)/listalias:	$(LISTALIAS_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(LISTALIAS_OBJ) $(LIB2)
X
Xlistalias_lint:		$(LISTALIAS_SRC)
X			$(LINT) $(LINTFLAGS) $(LISTALIAS_SRC) >> LINT.OUT
X
X$(BIN)/newalias:	$(NEWALIAS_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(NEWALIAS_OBJ) $(LIB2)
X
Xnewalias_lint:		$(NEWALIAS_SRC)
X			$(LINT) $(LINTFLAGS) $(NEWALIAS_SRC) >> LINT.OUT
X
X$(BIN)/newmail:		$(NEWMAIL_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(NEWMAIL_OBJ) $(LIB2)
X
Xnewmail_lint:		$(NEWMAIL_SRC)
X			$(LINT) $(LINTFLAGS) $(NEWMAIL_SRC) >> LINT.OUT
X
X$(BIN)/readmsg:		$(READMSG_OBJ)
X			$(CC) $(LFLAGS) -o $@ $(READMSG_OBJ) $(LIB2)
X
Xreadmsg_lint:		$(READMSG_SRC)
X			$(LINT) $(LINTFLAGS) $(READMSG_SRC) >> LINT.OUT
X
X
X#	Rules to make shell scripts in bin directory
X$(BIN)/checkalias:	checkalias
X			$(CP) $? $@
X			$(CHMOD) u+w,a+rx $@
X
X$(BIN)/messages:	messages
X			$(CP) $? $@
X			$(CHMOD) u+w,a+rx $@
X
X$(BIN)/printmail:	printmail
X			$(CP) $? $@
X			$(CHMOD) u+w,a+rx $@
X
X#	Dependencies of header files upon other header files they include
X$(INCLDIR)/defs.h:	$(INCLDIR)/../config.h $(INCLDIR)/sysdefs.h
X			$(CHMOD) u+w $@
X			$(TOUCH) $@
X
X$(INCLDIR)/elm.h:	$(INCLDIR)/curses.h $(INCLDIR)/defs.h
X			$(CHMOD) u+w $@
X			$(TOUCH) $@
X
X$(INCLDIR)/headers.h:	$(INCLDIR)/curses.h $(INCLDIR)/defs.h
X			$(CHMOD) u+w $@
X			$(TOUCH) $@
X
X#	Rules to make objects from src directory
X../src/opt_utils.o:
X			cd ../src; $(MAKE) -$(MAKEFLAGS) opt_utils.o
X
X../src/string2.o:
X			cd ../src; $(MAKE) -$(MAKEFLAGS) string2.o
X
X../src/validname.o:
X			cd ../src; $(MAKE) -$(MAKEFLAGS) validname.o
X
X#	Dependencies of C object files
Xanswer.o:	$(INCLDIR)/defs.h
Xarepdaem.o:	$(INCLDIR)/defs.h
Xautoreply.o:	$(INCLDIR)/defs.h
Xexpand.o:	$(INCLDIR)/defs.h
Xfastmail.o:	$(INCLDIR)/defs.h $(INCLDIR)/patchlevel.h
Xfrom.o:		$(INCLDIR)/defs.h
Xlistalias.o:	$(INCLDIR)/defs.h $(INCLDIR)/sysdefs.h
Xnewalias.o:	$(INCLDIR)/defs.h $(INCLDIR)/sysdefs.h
Xnewmail.o:	$(INCLDIR)/defs.h
Xreadmsg.o:	$(INCLDIR)/defs.h
X
X#	Dependencies and rules for installing programs from bin directory
X$(DEST)/answer:		$(BIN)/answer
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/arepdaemon:	$(BIN)/arepdaemon
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/autoreply:	$(BIN)/autoreply
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X			$(CHMOD) u+s $@
X
X$(DEST)/checkalias:	$(BIN)/checkalias
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+rx $@
X
X$(DEST)/fastmail:	$(BIN)/fastmail
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/frm:		$(BIN)/frm
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/listalias:	$(BIN)/listalias
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/messages:	$(BIN)/messages
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+rx $@
X
X$(DEST)/newalias:	$(BIN)/newalias
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/newmail:	$(BIN)/newmail
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(RM) $@
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/printmail:	$(BIN)/printmail
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+rx $@
X
X$(DEST)/readmsg:	$(BIN)/readmsg
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(CP) $? $@
X			$(CHMOD) a+x $@
X
X$(DEST)/wnewmail:	$(DEST)/newmail
X			-$(MV) $@ $@.old
X			-$(RM) $@.old
X			$(RM) $@
X			$(LN) $? $@
X
X!NO!SUBS!
SHAR_EOF
chmod 0444 utils/Makefile.SH || echo "restore of utils/Makefile.SH fails"
echo "x - extracting utils/answer.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > utils/answer.c &&
X
Xstatic char rcsid[] = "@(#)$Id: answer.c,v 4.1 90/04/28 22:44:27 syd Exp $";
X
X/*******************************************************************************
X *  The Elm Mail System  -  $Revision: 4.1 $   $State: Exp $
X *
X * 			Copyright (c) 1986, 1987 Dave Taylor
X * 			Copyright (c) 1988, 1989, 1990 USENET Community Trust
X *******************************************************************************
X * Bug reports, patches, comments, suggestions should be sent to:
X *
X *	Syd Weinstein, Elm Coordinator
X *	elm@DSI.COM			dsinc!elm
X *
X *******************************************************************************
X * $Log:	answer.c,v $
X * Revision 4.1  90/04/28  22:44:27  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/** This program is a phone message transcription system, and
X    is designed for secretaries and the like, to allow them to
X    painlessly generate electronic mail instead of paper forms.
X
X    Note: this program ONLY uses the local alias file, and does not
X	  even read in the system alias file at all.
X
X**/
X
X#include <stdio.h>
X#include <fcntl.h>
X#include <ctype.h>
X
X#include "defs.h"			/* ELM system definitions      */
X
X#define  ELM		"elm"		/* where the elm program lives */
X
X#define  answer_temp_file	"/tmp/answer."
X
Xstatic char ident[] = { WHAT_STRING };
X
Xstruct alias_rec user_hash_table  [MAX_UALIASES];
X
Xint user_data;		/* fileno of user data file   */
X
Xchar *expand_group(), *get_alias_address(), *get_token(), *strip_parens(),
X	*shift_lower();
X
Xmain()
X{
X	FILE *fd;
X	char *address, buffer[LONG_STRING], tempfile[SLEN], *cp;
X	char  name[SLEN], user_name[SLEN];
X	int   msgnum = 0, eof;
X	
X	read_alias_files();
X
X	while (1) {
X	  if (msgnum > 9999) msgnum = 0;
X	
X	  printf("\n-------------------------------------------------------------------------------\n");
X
Xprompt:   printf("\nMessage to: ");
X	  if (fgets(user_name, SLEN, stdin) == NULL) {
X		putchar('\n');
X		exit(0);
X	  }
X	  if(user_name[0] == '\0')
X	    goto prompt;
X	  
X	  cp = &user_name[strlen(user_name)-1];
X	  if(*cp == '\n') *cp = '\0';
X	  if(user_name[0] == '\0')
X		goto prompt;
X
X	  if ((strcmp(user_name,"quit") == 0) ||
X	      (strcmp(user_name,"exit") == 0) ||
X	      (strcmp(user_name,"done") == 0) ||
X	      (strcmp(user_name,"bye")  == 0))
X	     exit(0);
X
X	  if (translate(user_name, name) == 0)
X	    goto prompt;
X
X	  address = get_alias_address(name, 1, 0);
X
X	  printf("address '%s'\n", address);
X
X	  if (address == NULL || strlen(address) == 0) {
X	    printf("Sorry, could not find '%s' [%s] in list!\n", user_name, 
X		   name);
X	    goto prompt;
X	  }
X
X	  sprintf(tempfile, "%s%d", answer_temp_file, msgnum++);
X
X	  if ((fd = fopen(tempfile,"w")) == NULL)
X	    exit(printf("** Fatal Error: could not open %s to write\n",
X		 tempfile));
X
X
X	  printf("\nEnter message for %s ending with a blank line.\n\n", 
X		 user_name);
X
X	  fprintf(fd,"\n\n");
X
X	  do {
X	   printf("> ");
X	   if (! (eof = (fgets(buffer, SLEN, stdin) == NULL))) 
X	     fprintf(fd, "%s", buffer);
X	  } while (! eof && strlen(buffer) > 1);
X	
X	  fclose(fd);
X 
X	  sprintf(buffer, 
X	     "((%s -s \"While You Were Out\" %s ; %s %s) & ) < %s > /dev/null",
X	     ELM, strip_parens(address), remove_cmd, tempfile, tempfile);
X
X	  system(buffer);
X	}
X}
X
Xint
Xtranslate(fullname, name)
Xchar *fullname, *name;
X{
X	/** translate fullname into name..
X	       'first last'  translated to first_initial - underline - last
X	       'initial last' translated to initial - underline - last
X	    Return 0 if error.
X	**/
X	register int i, lastname = 0, len;
X
X	for (i=0, len = strlen(fullname); i < len; i++) {
X
X	  if (isupper(fullname[i]))
X	     fullname[i] = tolower(fullname[i]);
X
X	  if (fullname[i] == ' ') 
X	    if (lastname) {
X	      printf(
X	      "** Can't have more than 'FirstName LastName' as address!\n");
X	      return(0);
X	    }
X	    else
X	      lastname = i+1;
X	
X	}
X
X	if (lastname) 
X	  sprintf(name, "%c_%s", fullname[0], (char *) fullname + lastname);
X	else
X	  strcpy(name, fullname);
X
X	return(1);
X}
X
X	    
Xread_alias_files()
X{
X	/** read the user alias file **/
X
X	char fname[SLEN];
X	int  hash;
X
X	sprintf(fname,  "%s/.elm/aliases.hash", getenv("HOME")); 
X
X	if ((hash = open(fname, O_RDONLY)) == -1) 
X	  exit(printf("** Fatal Error: Could not open %s!\n", fname));
X
X	read(hash, user_hash_table, sizeof user_hash_table);
X	close(hash);
X
X	sprintf(fname,  "%s/.elm/aliases.data", getenv("HOME")); 
X
X	if ((user_data = open(fname, O_RDONLY)) == -1) 
X	  return;
X}
X
Xchar *get_alias_address(name, mailing, depth)
Xchar *name;
Xint   mailing, depth;
X{
X	/** return the line from either datafile that corresponds 
X	    to the specified name.  If 'mailing' specified, then
X	    fully expand group names.  Returns NULL if not found.
X	    Depth is the nesting depth, and varies according to the
X	    nesting level of the routine.  **/
X
X	static char buffer[VERY_LONG_STRING];
X	int    loc;
X
X	name = shift_lower(name);
X	if ((loc = find(name, user_hash_table, MAX_UALIASES)) >= 0) {
X	  lseek(user_data, ntohl(user_hash_table[loc].byte), 0L);
X	  get_line(user_data, buffer);
X	  if (buffer[0] == '!' && mailing)
X	    return( (char *) expand_group(buffer, depth));
X	  else
X	    return( (char *) buffer);
X	}
X	
X	return( (char *) NULL);
X}
X
Xchar *expand_group(members, depth)
Xchar *members;
Xint   depth;
X{
X	/** given a group of names separated by commas, this routine
X	    will return a string that is the full addresses of each
X	    member separated by spaces.  Depth is the current recursion
X	    depth of the expansion (for the 'get_token' routine) **/
X
X	char   buffer[VERY_LONG_STRING];
X	char   buf[LONG_STRING], *word, *address, *bufptr;
X
X	strcpy(buf, members); 	/* parameter safety! */
X	buffer[0] = '\0';	/* nothing in yet!   */
X	bufptr = (char *) buf;	/* grab the address  */
X	depth++;		/* one more deeply into stack */
X
X	while ((word = (char *) get_token(bufptr, "!, ", depth)) != NULL) {
X	  if ((address = (char *) get_alias_address(word, 1, depth)) == NULL) {
X	    fprintf(stderr, "Alias %s not found for group expansion!", word);
X	    return( (char *) NULL);
X	  }
X	  else if (strcmp(buffer,address) != 0) {
X	    sprintf(buffer,"%s %s", buffer, address);
X	  }
X
X	  bufptr = NULL;
X	}
X
X	return( (char *) buffer);
X}
X
Xint
Xfind(word, table, size)
Xchar *word;
Xstruct alias_rec table[];
Xint size;
X{
X	/** find word and return loc, or -1 **/
X	register int loc;
X	
X	if (strlen(word) > 20)
X	  exit(printf("Bad alias name: %s.  Too long.\n", word));
X
X	loc = hash_it(word, size);
X
X	while (strcmp(word, table[loc].name) != 0) {
X	  if (table[loc].name[0] == '\0') 
X	    return(-1);
X	  loc = (loc + 1) % size; 
X	}
X
X	return(loc);
X}
X
Xint
Xhash_it(string, table_size)
Xchar *string;
Xint   table_size;
X{
X	/** compute the hash function of the string, returning
X	    it (mod table_size) **/
X
X	register int i, sum = 0;
X	
X	for (i=0; string[i] != '\0'; i++)
X	  sum += (int) string[i];
X
X	return(sum % table_size);
X}
X
Xget_line(fd, buffer)
Xint fd;
Xchar *buffer;
X{
X	/* read from file fd.  End read upon reading either 
X	   EOF or '\n' character (this is where it differs 
X	   from a straight 'read' command!) */
X
X	register int i= 0;
X	char     ch;
X
X	while (read(fd, &ch, 1) > 0)
X	  if (ch == '\n' || ch == '\r') {
X	    buffer[i] = 0;
X	    return;
X	  }
X	  else
X	    buffer[i++] = ch;
X}
X
Xprint_long(buffer, init_len)
Xchar *buffer;
Xint   init_len;
X{
X	/** print buffer out, 80 characters (or less) per line, for
X	    as many lines as needed.  If 'init_len' is specified, 
X	    it is the length that the first line can be.
X	**/
X
X	register int i, loc=0, space, length, len; 
X
X	/* In general, go to 80 characters beyond current character
X	   being processed, and then work backwards until space found! */
X
X	length = init_len;
X
X	do {
X	  if (strlen(buffer) > loc + length) {
X	    space = loc + length;
X	    while (buffer[space] != ' ' && space > loc + 50) space--;
X	    for (i=loc;i <= space;i++)
X	      putchar(buffer[i]);
X	    putchar('\n');
X	    loc = space;
X	  }
X	  else {
X	    for (i=loc, len = strlen(buffer);i < len;i++)
X	      putchar(buffer[i]);
X	    putchar('\n');
X	    loc = len;
X	  }
X	  length = 80;
X	} while (loc < strlen(buffer));
X}
X
X/****
X     The following is a newly chopped version of the 'strtok' routine
X  that can work in a recursive way (up to 20 levels of recursion) by
SHAR_EOF
echo "End of part 23"
echo "File utils/answer.c is continued in part 24"
echo "24" > s2_seq_.tmp
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.