[comp.sources.unix] v22i069: ELM mail syste, release 2.3, Part10/26

rsalz@bbn.com (Rich Salz) (05/31/90)

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

#!/bin/sh
# this is part 10 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file hdrs/defs.h continued
#
CurArch=10
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 hdrs/defs.h"
sed 's/^X//' << 'SHAR_EOF' >> hdrs/defs.h
X/** a few for the usage of function keys... **/
X
X#define f1	1
X#define f2	2
X#define f3	3
X#define f4	4
X#define f5	5
X#define f6	6
X#define f7	7
X#define f8	8
X
X#define MAIN	0
X#define ALIAS   1
X#define YESNO	2
X#define CHANGE  3
X#define READ	4
X
X#define MAIN_HELP    0
X#define OPTIONS_HELP 1
X#define ALIAS_HELP   2
X#define PAGER_HELP   3
X
X/** types of folders **/
X#define NO_NAME		0		/* variable contains no file name */
X#define NON_SPOOL	1		/* mailfile not in mailhome */
X#define SPOOL		2		/* mailfile in mailhome */
X
X/* the following is true if the current mailfile is the user's spool file*/
X#define USERS_SPOOL	(strcmp(cur_folder, defaultfile) == 0)
X
X/** some possible sort styles... **/
X
X#define REVERSE		-		/* for reverse sorting           */
X#define SENT_DATE	1		/* the date message was sent     */
X#define RECEIVED_DATE	2		/* the date message was received */
X#define SENDER		3		/* the name/address of sender    */
X#define SIZE		4		/* the # of lines of the message */
X#define SUBJECT		5		/* the subject of the message    */
X#define STATUS		6		/* the status (deleted, etc)     */
X#define MAILBOX_ORDER	7		/* the order it is in the file   */
X
X/* some stuff for our own malloc call - pmalloc */
X
X#define PMALLOC_THRESHOLD	256	/* if greater, then just use malloc */
X#define PMALLOC_BUFFER_SIZE    2048	/* internal [memory] buffer size... */
X
X/** the following macro is as suggested by Larry McVoy.  Thanks! **/
X
X# ifdef DEBUG
X#  define   dprint(n,x)		{ 				\
X				   if (debug >= n)  {		\
X				     fprintf x ; 		\
X				     fflush(debugfile);         \
X				   }				\
X				}
X# else
X#  define   dprint(n,x)
X# endif
X
X/* some random structs... */
X
Xstruct date_rec {
X	int  month;		/** this record stores a **/
X	int  day;		/**   specific date and  **/
X	int  year;		/**     time...		 **/
X	int  hour;
X	int  minute;
X       };
X
Xstruct header_rec {
X	int  lines;		/** # of lines in the message  **/
X	int  status;		/** Urgent, Deleted, Expired?  **/
X	int  index_number;	/** relative loc in file...    **/
X	int  encrypted;		/** whether msg has encryption **/
X	int  exit_disposition;	/** whether to keep, store, delete **/
X	int  status_chgd;	/** whether became read or old, etc. **/
X	long offset;		/** offset in bytes of message **/
X	struct date_rec received; /** when elm received here   **/
X	char from[STRING];	/** who sent the message?      **/
X	char to[STRING];	/** who it was sent to	       **/
X	char messageid[STRING];	/** the Message-ID: value      **/
X	char dayname[8];	/**  when the                  **/
X	char month[10];		/**        message             **/
X	char day[3];		/**          was 	       **/
X	char year[5];		/**            sent            **/
X	char time[NLEN];	/**              to you!       **/
X	char time_zone[12];	/**                incl. tz    */
X	long time_sent;		/** gmt when sent for sorting  **/
X	char subject[STRING];   /** The subject of the mail    **/
X	char mailx_status[WLEN];/** mailx status flags (RO...) **/
X       };
X
Xstruct alias_rec {
X	char   name[NLEN];	/* alias name 			     */
X	long   byte;		/* offset into data file for address */
X       };
X
Xstruct lsys_rec {
X	char   name[NLEN];	/* name of machine connected to      */
X	struct lsys_rec *next;	/* linked list pointer to next       */
X       };
X
Xstruct addr_rec {
X	 char   address[NLEN];	/* machine!user you get mail as      */
X	 struct addr_rec *next;	/* linked list pointer to next       */
X	};
X
X#ifdef SHORTNAMES	/* map long names to shorter ones */
X# include <shortname.h>
X#endif
X
X/** Let's make sure that we're not going to have any annoying problems with 
X    int pointer sizes versus char pointer sizes by guaranteeing that every-
X    thing vital is predefined... (Thanks go to Detlev Droege for this one)
X**/
X
X#ifdef STRINGS
X#  include <strings.h>
X#else
X#  include <string.h>
X#endif
X
X/*
X * Macros for network/external number representation conversion.
X */
X#ifdef NETWORK_ORDER
Xunsigned short	ntohs(), htons();
Xunsigned long	ntohl(), htonl();
X#else
X#define	ntohl(x)	(x)
X#define	ntohs(x)	(x)
X#define	htonl(x)	(x)
X#define	htons(x)	(x)
X#endif
X
Xchar *argv_zero();
Xchar *bounce_off_remote();
Xchar *ctime();
Xchar *error_description();
Xchar *error_name();
Xchar *error_number();
Xchar *expand_address();
Xchar *expand_domain();
Xchar *expand_group();
Xchar *expand_logname();
Xchar *expand_system();
Xchar *find_path_to();
Xchar *format_long();
Xchar *get_alias_address();
Xchar *get_arpa_date();
Xchar *get_ctime_date();
Xchar *get_date();
Xchar *get_token();
Xchar *getenv();
Xchar *getlogin();
Xchar *level_name();
Xchar *match_and_expand_domain();
Xchar *shift_lower();
Xchar *strip_commas();
Xchar *strip_parens();
Xchar *strpbrk();
Xchar *strtok();
Xchar *tail_of_string();
Xchar *tgetstr();
Xchar *pmalloc();
X
Xlong lseek();
Xlong times();
Xlong ulimit();
SHAR_EOF
echo "File hdrs/defs.h is complete"
chmod 0444 hdrs/defs.h || echo "restore of hdrs/defs.h fails"
echo "x - extracting hdrs/elm.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/elm.h &&
X
X/* $Id: elm.h,v 4.1 90/04/28 22:42:08 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:	elm.h,v $
X * Revision 4.1  90/04/28  22:42:08  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/**  Main header file for ELM mail system.  **/
X
X
X#include <stdio.h>
X#include <fcntl.h>
X#include <errno.h>
X
X#include "../hdrs/curses.h"
X#include "../hdrs/defs.h"
X
X#ifdef	BSD
X#include <setjmp.h>
X#endif
X
X/******** static character string containing the version number  *******/
X
Xstatic char ident[] = { WHAT_STRING };
X
X/******** and another string for the copyright notice            ********/
X
Xstatic char copyright[] = { 
X		"@(#)          (C) Copyright 1986, 1987, Dave Taylor\n@(#)          (C) Copyright 1988, 1989, 1990, The Usenet Community Trust\n" };
X
X/******** global variables accessable by all pieces of the program *******/
X
Xint check_size = 0;		/* don't start mailer if no mail */
Xint current = 0;		/* current message number  */
Xint header_page = 0;     	/* current header page     */
Xint last_header_page = -1;     	/* last header page        */
Xint message_count = 0;		/* max message number      */
Xint headers_per_page;		/* number of headers/page  */
Xint original_umask = 0;		/* original umask, for restore before subshell */
Xint sendmail_verbose = 0;       /* Extended mail debugging */
Xchar cur_folder[SLEN];          /* name of current folder */
Xchar cur_tempfolder[SLEN];      /* name of temp folder open for a mailbox */
Xchar defaultfile[SLEN];         /* name of default folder */
Xchar temp_dir[SLEN] = {0};      /* name of temp directory */
Xchar hostname[SLEN];            /* name of machine we're on*/
Xchar hostdomain[SLEN];          /* name of domain we're in */
Xchar hostfullname[SLEN];        /* name of FQDN we're in */
Xchar username[SLEN];            /* return address name!    */
Xchar full_username[SLEN];       /* Full username - gecos   */
Xchar home[SLEN];                /* home directory of user  */
Xchar folders[SLEN];             /* folder home directory   */
Xchar raw_folders[SLEN];         /* unexpanded folder home directory   */
Xchar recvd_mail[SLEN];          /* folder for storing received mail     */
Xchar raw_recvdmail[SLEN];       /* unexpanded recvd_mail name */
Xchar editor[SLEN];              /* editor for outgoing mail*/
Xchar raw_editor[SLEN];          /* unexpanded editor for outgoing mail*/
Xchar alternative_editor[SLEN];  /* alternative editor...   */
Xchar printout[SLEN];            /* how to print messages   */
Xchar raw_printout[SLEN];        /* unexpanded how to print messages   */
Xchar sent_mail[SLEN];           /* name of file to save copies to */
Xchar raw_sentmail[SLEN];        /* unexpanded name of file to save to */
Xchar calendar_file[SLEN];       /* name of file for clndr  */
Xchar raw_calendar_file[SLEN];   /* unexpanded name of file for clndr  */
Xchar attribution[SLEN];         /* attribution string for replies     */
Xchar prefixchars[SLEN] = "> ";	/* prefix char(s) for msgs */
Xchar shell[SLEN];               /* current system shell    */
Xchar raw_shell[SLEN];           /* unexpanded current system shell    */
Xchar pager[SLEN];               /* what pager to use       */
Xchar raw_pager[SLEN];           /* unexpanded what pager to use       */
Xchar batch_subject[SLEN];       /* subject buffer for batchmail */
Xchar local_signature[SLEN];     /* local msg signature file     */
Xchar raw_local_signature[SLEN]; /* unexpanded local msg signature file     */
Xchar remote_signature[SLEN];    /* remote msg signature file    */
Xchar raw_remote_signature[SLEN];/* unexpanded remote msg signature file    */
Xchar version_buff[SLEN];        /* version buffer */
X
Xchar backspace,			/* the current backspace char */
X     escape_char = TILDE_ESCAPE,/* '~' or something else..    */
X     kill_line;			/* the current kill-line char */
X
Xchar up[SHORT], down[SHORT],	/* cursor control seq's    */
X     left[SHORT], right[SHORT];
Xint  cursor_control = FALSE;	/* cursor control avail?   */
X
Xchar start_highlight[SHORT],
X     end_highlight[SHORT];	/* stand out mode...       */
X
Xint  has_highlighting = FALSE;	/* highlighting available? */
X
Xchar *weedlist[MAX_IN_WEEDLIST];
Xint  weedcount;
X
Xint allow_forms = NO;		/* flag: are AT&T Mail forms okay?  */
Xint mini_menu = 1;		/* flag: menu specified?	    */
Xint prompt_after_pager = 1;	/* flag: prompt after pager exits   */
Xint folder_type = 0;		/* flag: type of folder		    */
Xint auto_copy = 0;		/* flag: automatically copy source? */
Xint filter = 1;			/* flag: weed out header lines?	    */
Xint resolve_mode = 1;		/* flag: delete saved mail?	    */
Xint auto_cc = 0;		/* flag: mail copy to user?	    */
Xint noheader = 1;		/* flag: copy + header to file?     */
Xint title_messages = 1;		/* flag: title message display?     */
Xint forwarding = 0;		/* flag: are we forwarding the msg? */
Xint hp_terminal = 0;		/* flag: are we on HP term?	    */
Xint hp_softkeys = 0;		/* flag: are there softkeys?        */
Xint save_by_name = 1;		/* flag: save mail by login name?   */
Xint force_name = 0;		/* flag: save by name forced?	    */
Xint mail_only = 0;		/* flag: send mail then leave?      */
Xint check_only = 0;		/* flag: check aliases then leave?  */
Xint batch_only = 0;		/* flag: send without prompting?    */
Xint move_when_paged = 0;	/* flag: move when '+' or '-' used? */
Xint point_to_new = 1;		/* flag: start pointing at new msg? */
Xint bounceback = 0;		/* flag: bounce copy off remote?    */
Xint always_keep = 1;		/* flag: always keep unread msgs?   */
Xint always_store = 0;		/* flag: always store read msgs?    */
Xint always_del = 0;		/* flag: always delete marked msgs? */
Xint arrow_cursor = 0;		/* flag: use "->" cursor regardless?*/
Xint debug = 0; 			/* flag: default is no debug!       */
Xint warnings = 1;		/* flag: output connection warnings?*/
Xint user_level = 0;		/* flag: how good is the user?      */
Xint selected = 0;		/* flag: used for select stuff      */
Xint names_only = 1;		/* flag: display user names only?   */
Xint question_me = 1;		/* flag: ask questions as we leave? */
Xint keep_empty_files = 0;	/* flag: leave empty folder files? */
Xint clear_pages = 0;		/* flag: act like "page" (more -c)? */
Xint prompt_for_cc = 1;		/* flag: ask user for "cc:" value?  */
Xint sig_dashes = 1;		/* flag: include dashes above sigs? */
X
Xint sortby = REVERSE SENT_DATE;	/* how to sort incoming mail...     */
X
Xlong timeout = 600L;		/* timeout (secs) on main prompt    */
X
X/** set up some default values for a 'typical' terminal *snicker* **/
X
Xint LINES=23;			/** lines per screen      **/
Xint COLUMNS=80;			/** columns per page      **/
X
Xlong size_of_pathfd;		/** size of pathfile, 0 if none **/
X
XFILE *mailfile;			/* current folder	    */
XFILE *debugfile;		/* file for debug output    */
XFILE *pathfd;			/* path alias file          */
XFILE *domainfd;			/* domain file		    */
X
Xlong mailfile_size;		/* size of current mailfile */
X
Xint   max_headers;		/* number of headers allocated */
X
Xstruct header_rec **headers;    /* array of header structure pointers */
X
Xstruct alias_rec user_hash_table[MAX_UALIASES];
Xstruct alias_rec system_hash_table[MAX_SALIASES];
X
Xstruct lsys_rec *talk_to_sys = NULL; /* what machines do we talk to? */
X
Xstruct addr_rec *alternative_addresses;	/* how else do we get mail? */
X
Xint system_data = -1;		/* fileno of system data file */
Xint user_data = -1;		/* fileno of user data file   */
X
Xint userid;			/* uid for current user	      */
Xint groupid;			/* groupid for current user   */
X
X#ifdef	BSD
Xjmp_buf GetPromptBuf;		/* setjmp buffer */
Xint InGetPrompt;		/* set if in GetPrompt() in read() */
X#endif
SHAR_EOF
chmod 0444 hdrs/elm.h || echo "restore of hdrs/elm.h fails"
echo "x - extracting hdrs/filter.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/filter.h &&
X
X/* $Id: filter.h,v 4.1 90/04/28 22:42:09 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:	filter.h,v $
X * Revision 4.1  90/04/28  22:42:09  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/** Headers for the filter program.
X
X**/
X
X#ifdef   BSD
X# undef  tolower
X#endif
X
X/** define a few handy macros for later use... **/
X
X#define  the_same(a,b)	(strncmp(a,b,strlen(b)) == 0)
X
X#define relationname(x)  (x == 1?"<=":x==2?"<":x==3?">=":x==4?">":x==5?"!=":"=")
X
X#define quoteit(x)	 (x == LINES? "" : "\"")
X
X#define remove_return(s)	{ if (s[strlen(s)-1] == '\n') \
X				    s[strlen(s)-1] = '\0';    \
X			   	}
X
X/** some of the files we'll be using, where they are, and so on... **/
X
X#define  filter_temp	"/tmp/filter"
X#define  filterfile	".elm/filter-rules"
X#define  filterlog	".elm/filterlog"
X#define  filtersum	".elm/filtersum"
X
X#define  EMERGENCY_MAILBOX	"EMERGENCY_MBOX"
X#define  EMERG_MBOX		"MBOX.EMERGENCY"
X
X/** and now the hardwired constraint of the program.. **/
X
X#define  MAXRULES	25		/* can't have more den dis, boss! */
X
X/** some random defines for mnemonic stuff in the program... **/
X
X#ifdef SUBJECT
X# undef SUBJECT
X#endif
X
X#define  TO		1
X#define  FROM		2
X#define  LINES		3
X#define  SUBJECT	4
X#define  CONTAINS	5
X#define  ALWAYS		6
X
X#define  DELETE_MSG 	7
X#define  SAVE		8
X#define  SAVECC		9
X#define  FORWARD	10
X#define  LEAVE		11
X#define  EXEC		12
X
X#define  FAILED_SAVE	20
X
X/** Some conditionals... **/
X
X#define LE		1
X#define LT		2
X#define GE		3
X#define GT		4
X#define NE		5
X#define EQ		6
X
X/** A funky way to open a file using open() to avoid file locking hassles **/
X
X#define  FOLDERMODE	O_WRONLY | O_APPEND | O_CREAT | O_SYNCIO
X
X/** cheap but easy way to have two files share the same #include file **/
X
X#ifdef MAIN_ROUTINE
X
Xchar home[SLEN],				/* the users home directory */
X     hostname[SLEN],			/* the machine name...      */
X     username[SLEN];			/* the users login name...  */
X
Xchar to[VERY_LONG_STRING], 
X     from[LONG_STRING], 
X     subject[LONG_STRING];		/* from current message     */
X
XFILE *outfd;
Xchar outfname[SLEN];
X
Xint  total_rules = 0,				/* how many rules to check  */
X     show_only = FALSE,				/* just for show?           */
X     long_summary = FALSE,			/* what sorta summary??     */
X     verbose   = FALSE,				/* spit out lots of stuff   */
X     lines     = 0,				/* lines in message..       */
X     clear_logs = FALSE,			/* clear files after sum?   */
X     already_been_forwarded = FALSE,		/* has this been filtered?  */
X     log_actions_only = FALSE,			/* log actions | everything */
X     printing_rules = FALSE,			/* are we just using '-r'?  */
X     rule_choosen;				/* which one we choose      */
X
X#else
X
Xextern char home[SLEN],				/* the users home directory */
X            hostname[SLEN],			/* the machine name...      */
X            username[SLEN];			/* the users login name...  */
X
Xextern char to[VERY_LONG_STRING], 
X            from[LONG_STRING], 
X            subject[LONG_STRING];		/* from current message     */
X
Xextern FILE *outfd;
Xextern char outfname[SLEN];
X
Xextern int total_rules,				/* how many rules to check  */
X           show_only,				/* just for show?           */
X           long_summary,			/* what sorta summary??     */
X           verbose,				/* spit out lots of stuff   */
X           lines,				/* lines in message..       */
X           clear_logs,			        /* clear files after sum?   */
X	   already_been_forwarded,		/* has this been filtered?  */
X           log_actions_only,			/* log actions | everything */
X           printing_rules,			/* are we just using '-r'?  */
X           rule_choosen;			/* which one we choose      */
X#endif
X
X/** and our ruleset record structure... **/
X
Xstruct condition_rec {
X	int     matchwhat;			/* type of 'if' clause      */
X	int     relation;			/* type of match (eq, etc)  */
X	char    argument1[SLEN];		/* match against this       */
X	struct  condition_rec  *next;		/* next condition...	    */
X      };
X
Xstruct ruleset_record {
X	char  	printable[SLEN];		/* straight from file...    */
X	struct  condition_rec  *condition;
X	int     action;				/* what action to take      */
X	char    argument2[SLEN];		/* argument for action      */
X      };
X
X#ifdef MAIN_ROUTINE
X  struct ruleset_record rules[MAXRULES];
X#else
X  extern struct ruleset_record rules[MAXRULES];
X#endif
X
X/** finally let's keep LINT happy with the return values of all these pups! ***/
X
Xchar *itoa();
X
X#ifdef	_POSIX_SOURCE		/*{_POSIX_SOURCE*/
X#include <string.h>
X#include <unistd.h>
X#include <stdlib.h>
X#else				/*}_POSIX_SOURCE{*/
Xunsigned short getuid();
X
Xunsigned long sleep();
X
Xchar *malloc(), *strcpy(), *strcat();
X
Xvoid	exit();
X
X#ifdef BSD
X	
X  FILE *popen();
X
X#ifdef MAIN_ROUTINE
X  char  _vbuf[5*BUFSIZ];              /* space for file buffering */
X#else
X  extern char  _vbuf[5*BUFSIZ];		/* space for file buffering */
X#endif
X
X#ifndef _IOFBF
X# define _IOFBF		0		/* doesn't matter - ignored */
X#endif
X
X# define setvbuf(fd,a,b,c)	setbuffer(fd, _vbuf, 5*BUFSIZ)
X
X#endif
X#endif				/*}_POSIX_SOURCE*/
SHAR_EOF
chmod 0444 hdrs/filter.h || echo "restore of hdrs/filter.h fails"
echo "x - extracting hdrs/headers.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/headers.h &&
X
X/* $Id: headers.h,v 4.1 90/04/28 22:42:11 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:	headers.h,v $
X * Revision 4.1  90/04/28  22:42:11  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/**  This is the header file for ELM mail system.  **/
X
X
X#include <stdio.h>
X#include <fcntl.h>
X
X#include "curses.h"
X#include "defs.h"
X
X#ifdef	BSD
X#include <setjmp.h>
X#endif
X
X#ifndef       clearerr
X#define       clearerr(p)     (void)((p)->_flag &= ~(_IOERR|_IOEOF))
X#endif
X
X/******** global variables accessable by all pieces of the program *******/
X
Xextern int check_size;		/* don't start mailer if no mail */
Xextern int current;		/* current message number  */
Xextern int header_page;         /* current header page     */
Xextern int last_header_page;    /* last header page        */
Xextern int message_count;	/* max message number      */
Xextern int headers_per_page;	/* number of headers/page  */
Xextern int original_umask;	/* original umask, for restore before subshell */
Xextern int sendmail_verbose;    /* Allow extended debugging on sendmail */
Xextern char cur_folder[SLEN];	/* name of current folder */
Xextern char cur_tempfolder[SLEN]; /* name of temp folder open for a mailbox */
Xextern char defaultfile[SLEN];	/* name of default folder */
Xextern char temp_dir[SLEN];     /* name of temp directory */
Xextern char hostname[SLEN];	/* name of machine we're on*/
Xextern char hostdomain[SLEN];	/* name of domain we're in */
Xextern char hostfullname[SLEN]; /* name of FQDN we're in */
Xextern char username[SLEN];	/* return address name!    */
Xextern char full_username[SLEN];/* Full username - gecos   */
Xextern char home[SLEN];		/* home directory of user  */
Xextern char folders[SLEN];	/* folder home directory   */
Xextern char raw_folders[SLEN];	/* unexpanded folder home directory   */
Xextern char recvd_mail[SLEN];	/* folder for storing received mail	*/
Xextern char raw_recvdmail[SLEN];/* unexpanded recvd_mail name */
Xextern char editor[SLEN];	/* default editor for mail */
Xextern char raw_editor[SLEN];	/* unexpanded default editor for mail */
Xextern char alternative_editor[SLEN];/* the 'other' editor */
Xextern char printout[SLEN];	/* how to print messages   */
Xextern char raw_printout[SLEN];	/* unexpanded how to print messages   */
Xextern char sent_mail[SLEN];	/* name of file to save copies to */
Xextern char raw_sentmail[SLEN];	/* unexpanded name of file to save to */
Xextern char calendar_file[SLEN];/* name of file for clndr  */
Xextern char raw_calendar_file[SLEN];/* unexpanded name of file for clndr  */
Xextern char attribution[SLEN];  /* attribution string for replies     */
Xextern char prefixchars[SLEN];	/* prefix char(s) for msgs */
Xextern char shell[SLEN];	/* default system shell    */
Xextern char raw_shell[SLEN];	/* unexpanded default system shell    */
Xextern char pager[SLEN];	/* what pager to use...    */
Xextern char raw_pager[SLEN];	/* unexpanded what pager to use...    */
Xextern char batch_subject[SLEN];/* subject buffer for batchmail */
Xextern char local_signature[SLEN];/* local msg signature file   */
Xextern char raw_local_signature[SLEN];/* unexpanded local msg signature file */
Xextern char remote_signature[SLEN];/* remote msg signature file */
Xextern char raw_remote_signature[SLEN];/* unexpanded remote msg signature file*/
X
Xextern char backspace,		/* the current backspace char  */
X	    escape_char,	/* '~' or something else...    */
X	    kill_line;		/* the current kill_line char  */
X
Xextern char up[SHORT], 
X	    down[SHORT],
X	    left[SHORT],
X	    right[SHORT];	/* cursor control seq's    */
Xextern int  cursor_control;	/* cursor control avail?   */
X
Xextern char start_highlight[SHORT],
X	    end_highlight[SHORT];  /* standout mode... */
X
Xextern int  has_highlighting;	/* highlighting available? */
X
X/** the following two are for arbitrary weedout lists.. **/
X
Xextern char *weedlist[MAX_IN_WEEDLIST];
Xextern int  weedcount;		/* how many headers to check?        */
X
Xextern int  allow_forms;	/* flag: are AT&T Mail forms okay?    */
Xextern int  prompt_after_pager;	/* flag: prompt after pager exits     */
Xextern int  mini_menu;		/* flag: display menu?     	      */
Xextern int  folder_type;	/* flag: type of folder		      */
Xextern int  auto_copy;		/* flag: auto copy source into reply? */
Xextern int  filter;		/* flag: weed out header lines?	      */
Xextern int  resolve_mode;	/* flag: resolve before moving mode?  */
Xextern int  auto_cc;		/* flag: mail copy to yourself?       */
Xextern int  noheader;		/* flag: copy + header to file?       */
Xextern int  title_messages;	/* flag: title message display?       */
Xextern int  forwarding;		/* flag: are we forwarding the msg?   */
Xextern int  hp_terminal;	/* flag: are we on an hp terminal?    */
Xextern int  hp_softkeys;	/* flag: are there softkeys?          */
Xextern int  save_by_name;  	/* flag: save mail by login name?     */
Xextern int  force_name;		/* flag: save by name forced?	      */
Xextern int  mail_only;		/* flag: send mail then leave?        */
Xextern int  check_only;		/* flag: check aliases and leave?     */
Xextern int  batch_only;		/* flag: send without prompting?      */
Xextern int  move_when_paged;	/* flag: move when '+' or '-' used?   */
Xextern int  point_to_new;	/* flag: start pointing at new msgs?  */
Xextern int  bounceback;		/* flag: bounce copy off remote?      */
Xextern int  always_keep;	/* flag: always keep unread msgs?     */
Xextern int  always_store;	/* flag: always store read mail?      */
Xextern int  always_del;		/* flag: always delete marked msgs?   */
Xextern int  arrow_cursor;	/* flag: use "->" regardless?	      */
Xextern int  debug;		/* flag: debugging mode on?           */
Xextern int  warnings;		/* flag: output connection warnings?  */
Xextern int  user_level;		/* flag: how knowledgable is user?    */
Xextern int  selected;		/* flag: used for select stuff        */
Xextern int  names_only;		/* flag: display names but no addrs?  */
Xextern int  question_me;	/* flag: ask questions as we leave?   */
Xextern int  keep_empty_files;	/* flag: keep empty files??	      */
Xextern int  clear_pages;	/* flag: clear screen w/ builtin pgr? */
Xextern int  prompt_for_cc;	/* flag: prompt user for 'cc' value?  */
Xextern int  sig_dashes;		/* flag: put dashes above signature?  */
X
Xextern int  sortby;		/* how to sort folders	      */
X
Xextern long timeout;		/* seconds for main level timeout     */
X
Xextern int LINES;		/** lines per screen    **/
Xextern int COLUMNS;		/** columns per line    **/
X
Xextern long size_of_pathfd;	/** size of pathfile, 0 if none **/
X
Xextern FILE *mailfile;		/* current folder 	    */
Xextern FILE *debugfile;		/* file for debut output    */
Xextern FILE *pathfd;		/* path alias file          */
Xextern FILE *domainfd;		/* domains file 	    */
X
Xextern long mailfile_size;	/* size of current mailfile */
X
Xextern int  max_headers;	/* number of headers currently allocated */
X
Xextern struct header_rec **headers; /* array of header structure pointers */
X
Xextern struct alias_rec user_hash_table  [MAX_UALIASES];
Xextern struct alias_rec system_hash_table[MAX_SALIASES];
X
Xextern struct lsys_rec *talk_to_sys;	/* who do we talk to? */
X
Xextern struct addr_rec *alternative_addresses;	/* how else do we get mail? */
X
Xextern int system_data;		/* fileno of system data file */
Xextern int user_data;		/* fileno of user data file   */
X
Xextern int userid;		/* uid for current user	      */
Xextern int groupid;		/* groupid for current user   */
X
X#ifdef	BSD
Xextern jmp_buf GetPromptBuf;	/* setjmp buffer */
Xextern int InGetPrompt;		/* set if in GetPrompt() in read() */
X#endif
SHAR_EOF
chmod 0444 hdrs/headers.h || echo "restore of hdrs/headers.h fails"
echo "x - extracting hdrs/patchlevel.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/patchlevel.h &&
X#define PATCHLEVEL 0
SHAR_EOF
chmod 0666 hdrs/patchlevel.h || echo "restore of hdrs/patchlevel.h fails"
echo "x - extracting hdrs/save_opts.h (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/save_opts.h &&
X
X/* @(#)$Id: save_opts.h,v 4.1 90/04/28 22:42:12 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:	save_opts.h,v $
X * Revision 4.1  90/04/28  22:42:12  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/** Some crazy includes for the save-opts part of the Elm program!
X
X**/
X
X#define ALTERNATIVES		0
X#define ALWAYSDELETE		1
X#define ALWAYSKEEP		2
X#define ALWAYSSTORE		3
X#define ARROW			4
X#define ASK			5
X#define ASKCC			6
X#define ATTRIBUTION             7
X#define AUTOCOPY                8
X#define BOUNCEBACK              9
X#define CALENDAR                10
X#define COPY                    11
X#define EDITOR                  12
X#define ESCAPECHAR              13
X#define FORCENAME               14
X#define FORMS                   15
X#define FULLNAME                16
X#define KEEPEMPTY               17
X#define KEYPAD                  18
X#define LOCALSIGNATURE          19
X#define MAILDIR                 20
X#define MENU                    21
X#define MOVEPAGE                22
X#define NAMES                   23
X#define NOHEADER                24
X#define PAGER                   25
X#define POINTNEW                26
X#define PREFIX                  27
X#define PRINT                   28
X#define PROMPTAFTER             29
X#define RECEIVEDMAIL            30
X#define REMOTESIGNATURE         31
X#define RESOLVE                 32
X#define SAVENAME                33
X#define SENTMAIL                34
X#define SHELL                   35
X#define SIGDASHES               36
X#define SIGNATURE               37
X#define SOFTKEYS                38
X#define SORTBY                  39
X#define TIMEOUT                 40
X#define TITLES                  41
X#define TMPDIR                  42
X#define USERLEVEL               43
X#define WARNINGS                44
X#define WEED                    45
X#define WEEDOUT                 46
X
X#define NUMBER_OF_SAVEABLE_OPTIONS	WEEDOUT+1
X
Xstruct save_info_recs { 
X	char 	name[NLEN]; 	/* name of instruction */
X	long 	offset;		/* offset into elmrc-info file */
X	} save_info[NUMBER_OF_SAVEABLE_OPTIONS] = 
X{
X { "alternatives", -1L }, 
X { "alwaysdelete", -1L }, 	
X { "alwayskeep", -1L },
X { "alwaysstore", -1L },
X { "arrow", -1L},         
X { "ask", -1L },
X { "askcc", -1L },
X { "attribution", -1L },
X { "autocopy", -1L },      	
X { "bounceback", -1L },
X { "calendar", -1L }, 	  
X { "copy", -1L },          	
X { "editor", -1L },
X { "escape", -1L }, 	  
X { "forcename", -1L },         	
X { "forms", -1L },         	
X { "fullname", -1L },
X { "keepempty", -1L }, 	  
X { "keypad", -1L }, 	  
X { "localsignature", -1L },	
X { "maildir", -1L }, 	  
X { "menu", -1L }, 		
X { "movepage", -1L }, 
X { "names", -1L },        
X { "noheader", -1L }, 		
X { "pager", -1L }, 
X { "pointnew", -1L},      
X { "prefix", -1L },       	
X { "print", -1L }, 
X { "promptafter", -1L }, 
X { "receivedmail", -1L }, 
X { "remotesignature",-1L},
X { "resolve", -1L },       	
X { "savename", -1L },     
X { "sentmail", -1L }, 
X { "shell", -1L },         	
X { "sigdashes", -1L },
X { "signature", -1L },
X { "softkeys", -1L },	  
X { "sortby", -1L }, 		
X { "timeout", -1L },
X { "titles", -1L },       
X { "tmpdir", -1L }, 	  
X { "userlevel", -1L }, 	
X { "warnings", -1L },
X { "weed", -1L },         
X { "weedout", -1L },		
X};
SHAR_EOF
chmod 0444 hdrs/save_opts.h || echo "restore of hdrs/save_opts.h fails"
echo "x - extracting hdrs/sysdefs.SH (Text)"
sed 's/^X//' << 'SHAR_EOF' > hdrs/sysdefs.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	echo "Using config.sh from above..."
X    fi
X    . ./config.sh
X    ;;
Xesac
Xecho "Extracting hdrs/sysdefs.h (with variable substitutions)"
Xsed <<!GROK!THIS! >sysdefs.h -e 's!^#undef!/\*#undef!'
X/* $Id: sysdefs.SH,v 4.1 90/04/28 22:42:14 syd Exp $ */
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:	sysdefs.SH,v $
X * Revision 4.1  90/04/28  22:42:14  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/**  System level, configurable, defines for the ELM mail system.  **/
X
X
X#define FIND_DELTA	10		/* byte region where the binary search
X					   on the path alias file is fruitless 
X                                           (can't be within this boundary)    */
X
X#define MAX_IN_WEEDLIST 150	/* max headers to weed out               */
X
X#define MAX_HOPS	35	/* max hops in return addr to E)veryone  */
X
X#define DEFAULT_BATCH_SUBJECT  "$defbatsub"
X
X#define DEFAULT_DOMAIN  "$mydomain"  /* if mydomain file is missing */
X
X/** If you want to implement 'site hiding' in the mail, then you'll need to
X    uncomment the following lines and set them to reasonable values.  See 
X    the configuration guide for more details....(actually these are undoc-
X    umented because they're fairly dangerous to use.  Just ignore 'em and
X    perhaps one day you'll find out what they do, ok?)
X**/
X
X/****************************************************************************
X
X#define   SITE_HIDING
X#define   HIDDEN_SITE_NAME	"fake-machine-name"
X#define   HIDDEN_SITE_USERS	"/usr/mail/lists/hidden_site_users"
X
X****************************************************************************/
X
X#define system_text_file        "$lib/aliases.text"
X#define system_hash_file        "$lib/aliases.hash"
X#define system_data_file        "$lib/aliases.data"
X
X#define ALIAS_TEXT		".elm/aliases.text"
X#define ALIAS_HASH		".elm/aliases.hash"
X#define ALIAS_DATA		".elm/aliases.data"
X
X#define pathfile		"$pathalias"
X#define domains			"$domains"
X#define hostdomfile             "$lib/domain"
X
X/** where to put the output of the elm -d command... (in home dir) **/
X#define DEBUGFILE	"ELM:debug.info"
X#define OLDEBUG		"ELM:debug.last"
X
X#define	default_temp   	"$tmpdir/"
X#define temp_file	"snd."
X#define temp_form_file	"form."
X#define temp_mbox	"mbox."
X#define temp_print      "print."
X#define temp_edit	"elm-edit"
X#define temp_uuname	"uuname."
X#define readmsg_file	".elm/readmsg"
X
X#define emacs_editor	"$emacs"
X
X#define default_editor	"$defeditor"
X#define mailhome	"$maildir/"
X
X#define default_shell	"$prefshell"
X#define default_pager	"$pager"
X#define default_printout	"$cat %s | $linepr"
X
X#define sendmail	"$sendmail"
X#define smflags		"-oi -oem"	/* ignore dots and mail back errors */
X#define smflagsv      "-oi -oem -v"   /* Verbose voyuer mode */
X#define mailer		"$mailer"
X
X#define mailx		"$mailx"
X
X#define helphome	"$lib"
X#define helpfile	"elm-help"
X
X#define ELMRC_INFO	"$lib/elmrc-info"
X
X#define elmrcfile	".elm/elmrc"
X#define old_elmrcfile	".elm/elmrc.old"
X#define mailheaders	".elm/elmheaders"
X#define dead_letter	"Cancelled.mail"
X
X#define unedited_mail	"emergency.mbox"
X
X#define newalias	"newalias 1>&2 > /dev/null"
X#define readmsg		"readmsg"
X
X#define remove_cmd	"$rm -f"	/* how to remove a file */
X#define cat		"$cat"		/* how to display files */
X#define sed_cmd		"$sed"		/* how to access sed */
X#define move_cmd	"$mv"		/* how to access sed */
X#define uuname		"$uuname"	/* how to get a uuname  */
X
X#define MSG_SEPERATOR	"\001\001\001\001\n"	/* mmdf message seperator */
X!GROK!THIS!
SHAR_EOF
chmod 0444 hdrs/sysdefs.SH || echo "restore of hdrs/sysdefs.SH fails"
echo "x - extracting src/Makefile.SH (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/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 src/Makefile (with variable substitutions)"
Xcat >Makefile <<!GROK!THIS!
X# $Id: Makefile.SH,v 4.1 90/04/28 22:42:16 syd Exp $
X#
X#  Makefile for the ELM mail program.
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:42:16  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
XCHGRP		=	$chgrp
XCHMOD		=	$chmod
XCP		=	$cp
XDEST		=	$bin
XECHO		=	$echo
XLFLAGS		=	$ldflags $xenlf
XLIB		=	$lib
XLIB2		= 	$libs
XLIBS		=	$cryptlib $termlib $dbm
XLINT		=	$lint
XMAILGRP		=	$mailgrp
XMAILERMODE	=	$mailermode
XMV		=	$mv
XOPTIMIZE	=	$optimize
XRM		= 	$rm -f
XTOUCH		=	$touch
X
X!GROK!THIS!
X
Xcat >>Makefile <<'!NO!SUBS!'
X
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#		If you're on an ACSnet system (Australia) then
X#		you'll want to uncomment the following.
X# DACSNET	=	-DACSNET
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
XELM_SRC		=	addr_util.c	\
X			alias.c		\
X			aliasdb.c	\
X			aliaslib.c	\
X			args.c		\
X			bouncebk.c	\
X			builtin.c	\
X			calendar.c	\
X			conn_to.c	\
X			curses.c	\
X			date.c		\
X			delete.c	\
X			domains.c	\
X			edit.c		\
X			editmsg.c	\
X			elm.c		\
X			encode.c	\
X			errno.c		\
X			exitprog.c	\
X			expires.c	\
X			file.c		\
X			file_util.c	\
X			fileio.c	\
X			forms.c		\
X			hdrconfg.c	\
X			help.c		\
X			init.c		\
X			in_utils.c	\
X			leavembox.c	\
X			limit.c		\
X			mailmsg1.c	\
X			mailmsg2.c	\
X			mailtime.c	\
X			mkhdrs.c	\
X			newmbox.c	\
X			opt_utils.c	\
X			options.c	\
X			out_utils.c	\
X			pattern.c	\
X			pmalloc.c	\
X			quit.c		\
X			read_rc.c	\
X			remail.c	\
X			reply.c		\
X			returnadd.c	\
X			save_opts.c	\
X			savecopy.c	\
X			screen.c	\
X			showmsg.c	\
X			showmsg_c.c	\
X			signals.c	\
X			softkeys.c	\
X			sort.c		\
X			string2.c	\
X			strings.c	\
X			syscall.c	\
X			utils.c		\
X			validname.c
X
XELM_OBJ		=	addr_util.o	\
X			alias.o		\
X			aliasdb.o	\
X			aliaslib.o	\
X			args.o		\
X			bouncebk.o	\
X			builtin.o	\
X			calendar.o	\
X			conn_to.o	\
X			curses.o	\
X			date.o		\
X			delete.o	\
X			domains.o	\
X			edit.o		\
X			editmsg.o	\
X			elm.o		\
X			encode.o	\
X			errno.o		\
X			exitprog.o	\
X			expires.o	\
X			file.o		\
X			file_util.o	\
X			fileio.o	\
X			forms.o		\
X			hdrconfg.o	\
X			help.o		\
X			init.o		\
X			in_utils.o	\
X			leavembox.o	\
X			limit.o		\
X			mailmsg1.o	\
X			mailmsg2.o	\
X			mailtime.o	\
X			mkhdrs.o	\
X			newmbox.o	\
X			opt_utils.o	\
X			options.o	\
X			out_utils.o	\
X			pattern.o	\
X			pmalloc.o	\
X			quit.o		\
X			read_rc.o	\
X			remail.o	\
X			reply.o		\
X			returnadd.o	\
X			save_opts.o	\
X			savecopy.o	\
X			screen.o	\
X			showmsg.o	\
X			showmsg_c.o	\
X			signals.o	\
X			softkeys.o	\
X			sort.o		\
X			string2.o	\
X			strings.o	\
X			syscall.o	\
X			utils.o		\
X			validname.o
X
X# Standard targets
Xall:		$(BIN)/elm
X
Xinstall:	$(DEST)/elm
X
Xuninstall:	
X		$(RM) $(DEST)/elm
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)/elm $(DEST)/elm.old
X		-$(RM) $(DEST)/elm.old
X		$(CP) $(REMOTE)$(DEST)/elm $(DEST)/elm
X		$(CHGRP) $(MAILGRP) $(DEST)/elm
X		$(CHMOD) $(MAILERMODE) $(DEST)/elm
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
Xlint:		
X		$(LINT) $(LINTFLAGS) $(ELM_SRC) > LINT.OUT
X
Xclean:		
X		$(RM) $(ELM_OBJ) $(BIN)/elm
X
X# Dependencies and rules
X#	Dependencies of header files upon other header files they include
X.PRECIOUS:		$(INCLDIR)/defs.h $(INCLDIR)/elm.h $(INCLDIR)/headers.h
X
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#	Dependencies of C object files
Xaddr_util.o:	$(INCLDIR)/headers.h
Xalias.o:	$(INCLDIR)/headers.h
Xaliasdb.o:	$(INCLDIR)/headers.h
Xaliaslib.o:	$(INCLDIR)/headers.h
Xargs.o:		$(INCLDIR)/headers.h $(INCLDIR)/patchlevel.h
Xbouncebk.o:	$(INCLDIR)/headers.h
Xbuiltin.o:	$(INCLDIR)/headers.h
Xcalendar.o:	$(INCLDIR)/headers.h
Xconn_to.o:	$(INCLDIR)/headers.h
Xcurses.o:	$(INCLDIR)/headers.h
Xdate.o:		$(INCLDIR)/headers.h
Xdelete.o:	$(INCLDIR)/headers.h
Xdomains.o:	$(INCLDIR)/headers.h
Xedit.o:		$(INCLDIR)/headers.h
Xeditmsg.o:	$(INCLDIR)/headers.h
Xelm.o:		$(INCLDIR)/elm.h
Xencode.o:	$(INCLDIR)/headers.h
Xerrno.o:	$(INCLDIR)/headers.h
Xexitprog.o:	$(INCLDIR)/headers.h
Xexpires.o:	$(INCLDIR)/headers.h
Xfile.o:		$(INCLDIR)/headers.h
Xfile_util.o:	$(INCLDIR)/headers.h
Xfileio.o:	$(INCLDIR)/headers.h
Xforms.o:	$(INCLDIR)/headers.h
Xhdrconfg.o:	$(INCLDIR)/headers.h
Xhelp.o:		$(INCLDIR)/headers.h
Xin_utils.o:	$(INCLDIR)/headers.h
Xinit.o:		$(INCLDIR)/headers.h $(INCLDIR)/patchlevel.h
Xleavembox.o:	$(INCLDIR)/headers.h
Xlimit.o:	$(INCLDIR)/headers.h
Xmailmsg1.o:	$(INCLDIR)/headers.h
Xmailmsg2.o:	$(INCLDIR)/headers.h
Xmailtime.o:	$(INCLDIR)/headers.h
Xmkhdrs.o:	$(INCLDIR)/headers.h
Xnewmbox.o:	$(INCLDIR)/headers.h
Xopt_utils.o:	$(INCLDIR)/headers.h
Xoptions.o:	$(INCLDIR)/headers.h
Xout_utils.o:	$(INCLDIR)/headers.h
Xpattern.o:	$(INCLDIR)/headers.h
Xpmalloc.o:	$(INCLDIR)/defs.h
Xquit.o:		$(INCLDIR)/headers.h
Xread_rc.o:	$(INCLDIR)/headers.h
Xremail.o:	$(INCLDIR)/headers.h
Xreply.o:	$(INCLDIR)/headers.h
Xreturnadd.o:	$(INCLDIR)/headers.h
Xsave_opts.o:	$(INCLDIR)/save_opts.h $(INCLDIR)/headers.h
Xsavecopy.o:	$(INCLDIR)/headers.h
Xscreen.o:	$(INCLDIR)/headers.h
Xshowmsg.o:	$(INCLDIR)/headers.h
Xshowmsg_c.o:	$(INCLDIR)/headers.h
Xsignals.o:	$(INCLDIR)/headers.h
Xsoftkeys.o:	$(INCLDIR)/headers.h
Xsort.o:		$(INCLDIR)/headers.h
Xstring2.o:	$(INCLDIR)/headers.h
Xstrings.o:	$(INCLDIR)/headers.h
Xsyscall.o:	$(INCLDIR)/headers.h
Xutils.o:	$(INCLDIR)/headers.h
Xvalidname.o:	$(INCLDIR)/defs.h
X
X#	Dependencies and rules for compiling C programs
X$(BIN)/elm:	$& $(ELM_OBJ)
X		$(CC) $(LFLAGS) -o $@ $(ELM_OBJ) $(LIBS) $(LIB2)
X
X#	Dependencies and rules for installing C programs
X$(DEST)/elm:	$(BIN)/elm
X		-$(MV) $@ $@.old
X		-$(RM) $@.old
X		$(CP) $(BIN)/elm $@
X		$(CHGRP) $(MAILGRP) $@
X		$(CHMOD) $(MAILERMODE) $@
X
X!NO!SUBS!
SHAR_EOF
chmod 0444 src/Makefile.SH || echo "restore of src/Makefile.SH fails"
echo "x - extracting src/addr_util.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/addr_util.c &&
X
Xstatic char rcsid[] = "@(#)$Id: addr_util.c,v 4.1 90/04/28 22:42: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:	addr_util.c,v $
X * Revision 4.1  90/04/28  22:42:21  syd
X * checkin of Elm 2.3 as of Release PL0
X * 
X *
X ******************************************************************************/
X
X/** This file contains addressing utilities 
X
X**/
X
X#include "headers.h"
X
X#include <sys/types.h>
X#include <sys/stat.h>
X#ifdef PWDINSYS
X#  include <sys/pwd.h>
X#else
X#  include <pwd.h>
X#endif
X
X#include <ctype.h>
X
X#ifdef BSD 
X#undef tolower
X#undef toupper
X#endif
X
Xchar *get_alias_address(), *get_token();
Xchar *strtok(), *strcpy(), *strcat(), *strncpy(), *index(), *rindex();
X
X
X#define SKIP_WS(p) while (isspace(*p)) p++
X#define SKIP_ALPHA(p) while (isalpha(*p)) p++
X#define SKIP_DIGITS(p) while (isdigit(*p)) p++
X
Xstatic char *day_name[8] = {
X    "sun", "mon", "tue", "wed", "thu", "fri", "sat", 0
X};
X
Xstatic char *month_name[13] = {
X    "jan", "feb", "mar", "apr",
X    "may", "jun", "jul", "aug",
X    "sep", "oct", "nov", "dec", 0
X};
X
Xstatic int month_len[12] = {
X    31, 28, 31, 30, 31, 30, 31,
X    31, 30, 31, 30, 31 };
X
X/* The following time zones are taken from a variety of sources.  They
X * are by no means exhaustive, but seem to include most of those
X * in common usage.  A comprehensive list is impossible, since the same
X * abbreviation is sometimes used to mean different things in different
X * parts of the world.
X */
Xstatic struct tzone {
X    char *str;
X    int offset; /* offset, in minutes, EAST of GMT */
X} tzone_info[] = {
X    /* the following are from rfc822 */
X    "ut", 0, "gmt", 0,
X    "est", -5*60, "edt", -4*60,
X    "cst", -6*60, "cdt", -5*60,
X    "mst", -7*60, "mdt", -6*60,
X    "pst", -8*60, "pdt", -7*60,
X    "z", 0, /* zulu time (the rest of the military codes are bogus) */
X
X    /* these are also popular in Europe */
X    "wet", 0*60, "wet dst", 1*60, /* western european */
X    "met", 1*60, "met dst", 2*60, /* middle european */
X    "eet", 2*60, "eet dst", 3*60, /* eastern european */
X    "bst", 1*60, /* ??? british summer time (=+0100) */
X
X    /* ... and Canada */
X    "ast", -4*60, "adt", -3*60, /* atlantic */
X    "nst", -3*60-30, "ndt", -2*60-30, /* newfoundland */
X    "yst", -9*60, "ydt", -8*60, /* yukon */
X    "hst", -10*60, /* hawaii (not really canada) */
X
X    /* ... and Asia */
X    "jst", 9*60, /* japan */
X    "sst", 8*60, /* singapore */
X
X    /* ... and the South Pacific */
X    "nzst", 12*60, "nzdt", 13*60, /* new zealand */
X    "wst", 8*60, "wdt", 9*60, /* western australia */
X    /* there's also central and eastern australia, but they insist on using
X     * cst, est, etc., which would be indistinguishable for the us zones */
X     (char *) 0, 0
X};
X
Xchar *
Xgcos_name(gcos_field, logname)
Xchar *logname, *gcos_field;
X{
X    /** Return the full name found in a passwd file gcos field **/
X
X#ifdef BERKNAMES
X
X    static char fullname[SLEN];
X    register char *fncp, *gcoscp, *lncp, *end;
X
X
X    /* full name is all chars up to first ',' (or whole gcos, if no ',') */
X    /* replace any & with logname in upper case */
X
X    for(fncp = fullname, gcoscp= gcos_field, end = fullname + SLEN - 1;
X        (*gcoscp != ',' && *gcoscp != '\0' && fncp != end);
X	gcoscp++) {
X
X	if(*gcoscp == '&') {
X	    for(lncp = logname; *lncp; fncp++, lncp++)
X		*fncp = toupper(*lncp);
X	} else {
X	    *fncp++ = *gcoscp;
X	}
X    }
X    
X    *fncp = '\0';
X    return(fullname);
X#else
X#ifdef USGNAMES
X
X    char *firstcp, *lastcp;
X
X    /* The last character of the full name is the one preceding the first
X     * '('. If there is no '(', then the full name ends at the end of the
X     * gcos field.
X     */
X    if(lastcp = index(gcos_field, '('))
X	*lastcp = '\0';
X
X    /* The first character of the full name is the one following the 
X     * last '-' before that ending character. NOTE: that's why we
X     * establish the ending character first!
X     * If there is no '-' before the ending character, then the fullname
X     * begins at the beginning of the gcos field.
X     */
X    if(firstcp = rindex(gcos_field, '-'))
X	firstcp++;
X    else
X	firstcp = gcos_field;
X
X    return(firstcp);
X
X#else
X    /* use full gcos field */
X    return(gcos_field);
X#endif
X#endif
X}
X	    
Xchar *
Xget_full_name(logname)
Xchar *logname;
X{
X	/* return a pointer to the full user name for the passed logname
X	 * or NULL if cannot be found
X	 * If PASSNAMES get it from the gcos field, otherwise get it
X	 * from ~/.fullname.
X	 */
X
X#ifndef PASSNAMES
X	FILE *fp;
X	char fullnamefile[SLEN];
X#endif
X	static char fullname[SLEN];
X	struct passwd *getpwnam(), *pass;
X
X	if((pass = getpwnam(logname)) == NULL)
X	  return(NULL);
X#ifdef PASSNAMES	/* get full_username from gcos field */
X	strcpy(fullname, gcos_name(pass->pw_gecos, logname));
X#else			/* get full_username from ~/.fullname file */
X	sprintf(fullnamefile, "%s/.fullname", pass->pw_dir);
SHAR_EOF
echo "End of part 10"
echo "File src/addr_util.c is continued in part 11"
echo "11" > 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.