syd@dsinc.UUCP (Syd Weinstein) (12/14/88)
---- Cut Here and unpack ----
#!/bin/sh
# this is part 19 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file src/sort.c continued
#
CurArch=19
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/sort.c"
sed 's/^X//' << 'SHAR_EOF' >> src/sort.c
X "re:" prefix. specifically, it looks for, and will
X remove, any of the pattern:
X
X ( [Rr][Ee][^:]:[ ] ) *
X
X If it doesn't find a ':' in the line it will return it
X intact, just in case!
X **/
X
X static char buffer[SLEN];
X register int i=0;
X
X while (whitespace(string[i])) i++;
X
X do {
X if (string[i] == '\0') return( (char *) string); /* forget it */
X
X if (string[i] != 'r' || string[i+1] != 'e')
X return( (char *) string); /* ditto */
X
X i += 2; /* skip the "re" */
X
X while (string[i] != ':')
X if (string[i] == '\0')
X return( (char *) string); /* no colon in string! */
X else
X i++;
X
X /* now we've gotten to the colon, skip to the next non-whitespace */
X
X i++; /* past the colon */
X
X while (whitespace(string[i])) i++;
X
X } while (string[i] == 'r' && string[i+1] == 'e');
X
X /* and now copy it into the buffer and sent it along... */
X
X strcpy(buffer, (char *) string + i);
X
X return( (char *) buffer);
X}
SHAR_EOF
echo "File src/sort.c is complete"
chmod 0444 src/sort.c || echo "restore of src/sort.c fails"
echo "x - extracting src/string2.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/string2.c &&
X
Xstatic char rcsid[] = "@(#)$Id: string2.c,v 2.1 88/07/21 09:59:43 edc Exp $";
X
X/*******************************************************************************
X * The Elm Mail System - $Revision: 2.1 $ $State: Exp $
X *
X * Copyright (c) 1986 Dave Taylor
X *******************************************************************************
X * Bug reports, patches, comments, suggetions should be sent to:
X *
X * Syd Weinstein, Elm Corrdinator
X * syd@dsinc.UUCP dsinc!syd
X *
X *******************************************************************************
X * $Log: string2.c,v $
X * Revision 2.1 88/07/21 09:59:43 edc
X * checked in with -k by syd at 88.09.15.20.29.55.
X *
X * Revision 2.1 88/07/21 09:59:43 edc
X * Final hacks and cleanup to the 2.1 alpha test release.
X *
X * Revision 2.0 88/06/27 17:25:42 edc
X * The original 2.0 gamma sources as leaked from HP
X *
X *
X *
X ******************************************************************************/
X
X/** This file contains string functions that are shared throughout the
X various ELM utilities...
X
X**/
X
X#ifndef TRUE
X#define TRUE 1
X#define FALSE 0
X#endif
X
X#define whitespace(c) (c == ' ' || c == '\t')
X
Xint
Xin_string(buffer, pattern)
Xchar *buffer, *pattern;
X{
X /** Returns TRUE iff pattern occurs IN IT'S ENTIRETY in buffer. **/
X
X register int i = 0, j = 0;
X
X while (buffer[i] != '\0') {
X while (buffer[i++] == pattern[j++])
X if (pattern[j] == '\0')
X return(TRUE);
X i = i - j + 1;
X j = 0;
X }
X return(FALSE);
X}
X
Xint
Xchloc(string, ch)
Xchar *string, ch;
X{
X /** returns the index of ch in string, or -1 if not in string **/
X register int i;
X
X for (i=0; i<strlen(string); i++)
X if (string[i] == ch) return(i);
X return(-1);
X}
X
Xint
Xoccurances_of(ch, string)
Xchar ch, *string;
X{
X /** returns the number of occurances of 'ch' in string 'string' **/
X
X register int count = 0, i;
X
X for (i=0; i<strlen(string); i++)
X if (string[i] == ch) count++;
X
X return(count);
X}
X
Xremove_possible_trailing_spaces(string)
Xchar *string;
X{
X /** an incredibly simple routine that will read backwards through
X a string and remove all trailing whitespace.
X **/
X
X register int i;
X
X for (i=strlen(string)-1; whitespace(string[i]); i--)
X /** spin backwards **/
X
X string[i+1] = '\0'; /* note that even in the worst case when there
X are no trailing spaces at all, we'll simply
X end up replacing the existing '\0' with
X another one! No worries, as M.G. would say
X */
X}
SHAR_EOF
chmod 0444 src/string2.c || echo "restore of src/string2.c fails"
echo "x - extracting src/strings.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/strings.c &&
X
Xstatic char rcsid[] = "@(#)$Id: strings.c,v 2.1 88/09/15 20:29:57 syd Exp $";
X
X/*******************************************************************************
X * The Elm Mail System - $Revision: 2.1 $ $State: Exp $
X *
X * Copyright (c) 1985 Dave Taylor
X *******************************************************************************
X * Bug reports, patches, comments, suggetions should be sent to:
X *
X * Syd Weinstein, Elm Corrdinator
X * syd@dsinc.UUCP dsinc!syd
X *
X *******************************************************************************
X * $Log: strings.c,v $
X * Revision 2.1 88/09/15 20:29:57 syd
X * checked in with -k by syd at 88.09.15.20.29.57.
X *
X * Revision 2.1 88/07/21 09:59:48 edc
X * 88/09/12 Chip Rosenthal <chip@vector>
X * couple of additional toupper()/tolower() side effect instances.
X *
X * Final hacks and cleanup to the 2.1 alpha test release.
X *
X * Revision 2.0 88/06/27 17:25:42 edc
X * The original 2.0 gamma sources as leaked from HP
X *
X *
X *
X ******************************************************************************/
X
X/** This file contains all the string oriented functions for the
X ELM Mailer, and lots of other generally useful string functions!
X
X For BSD systems, this file also includes the function "tolower"
X to translate the given character from upper case to lower case.
X
X**/
X
X#include <stdio.h>
X#include "headers.h"
X#include <ctype.h>
X
X#ifdef BSD
X#undef tolower
X#undef toupper
X#endif
X
X/** forward declarations **/
X
Xchar *format_long(), *strip_commas(), *tail_of_string(), *shift_lower(),
X *get_token(), *strip_parens(), *argv_zero(), *strcpy(), *strncpy();
X
X#ifdef BSD
X
Xint
Xtolower(ch)
Xchar ch;
X{
X /** This should be a macro call, but if you use this as a macro
X calls to 'tolower' where the argument is a function call will
X cause the function to be called TWICE which is obviously the
X wrong behaviour. On the other hand, to just blindly translate
X assuming the character is always uppercase can cause BIG
X problems, so...
X **/
X
X return ( isupper(ch) ? ch - 'A' + 'a' : ch );
X}
X
Xint
Xtoupper(ch)
Xchar ch;
X{
X /** see comment for above routine - tolower() **/
X
X return ( islower(ch) ? ch - 'a' + 'A' : ch );
X}
X
X#endif
X
Xint
Xprintable_chars(string)
Xchar *string;
X{
X /** Returns the number of "printable" (ie non-control) characters
X in the given string... Modified 4/86 to know about TAB
X characters being every eight characters... **/
X
X register int count = 0;
X char c, *pend, *p;
X
X for (pend = string + strlen(string), p=string; p < pend ;) {
X if ((c = *p++) >= ' ')
X if (c == '\t')
X count += (7-(count % 8));
X else
X count++;
X }
X
X return(count);
X}
X
Xcopy_sans_escape(dest, source, len)
Xchar *dest, *source;
Xint len;
X{
X /** this performs the same function that strncpy() does, but
X also will translate any escape character to a printable
X format (e.g. ^(char value + 32))
X **/
X
X register int i = 0, j = 0;
X
X while (i < len && source[i] != '\0') {
X if (source[i] < ' ' && source[i] != '\t') {
X dest[j++] = '^';
X dest[j++] = source[i++] + 'A' - 1;
X }
X else
X dest[j++] = source[i++];
X }
X
X dest[j] = '\0';
X}
X
Xtail_of(from, buffer, header_line)
Xchar *from, *buffer;
Xint header_line;
X{
X /** Return last two words of 'from'. This is to allow
X painless display of long return addresses as simply the
X machine!username. Alternatively, if the first three
X characters of the 'from' address are 'To:' and 'header_line'
X is TRUE, then return the buffer value prepended with 'To '.
X
X Mangled to know about the PREFER_UUCP hack. 6/86
X
X Also modified to know about X.400 addresses (sigh) and
X that when we ask for the tail of an address similar to
X a%b@c we want to get back a@b ...
X **/
X
X /** Note: '!' delimits Usenet nodes, '@' delimits ARPA nodes,
X ':' delimits CSNet & Bitnet nodes, '%' delimits multi-
X stage ARPA hops, and '/' delimits X.400 addresses...
X (it is fortunate that the ASCII character set only has
X so many metacharacters, as I think we're probably using
X them all!!) **/
X
X register int loc, i = 0, cnt = 0;
X char tempbuffer[SLEN];
X
X#ifdef PREFER_UUCP
X
X /** let's see if we have an address appropriate for hacking:
X what this actually does is remove the spuriously added
X local BOGUS_INTERNET header if we have one and the message
X has some sort of UUCP component too...
X **/
X
X if (chloc(from,'!') != -1 && in_string(from, BOGUS_INTERNET))
X from[strlen(from)-strlen(BOGUS_INTERNET)] = '\0';
X
X#endif
X
X for (loc = strlen(from)-1; loc >= 0 && cnt < 2; loc--) {
X if (from[loc] == BANG || from[loc] == AT_SIGN ||
X from[loc] == COLON) cnt++;
X if (cnt < 2) buffer[i++] = from[loc];
X }
X
X buffer[i] = '\0';
X
X reverse(buffer);
X
X if ((strncmp(from, "To:", 3) == 0) && header_line) {
X if (strncmp(buffer, "To: ", 3) == 0)
X sprintf(tempbuffer,"To %s", (char *) buffer + 3);
X else
X sprintf(tempbuffer,"To %s", buffer);
X strcpy(buffer, tempbuffer);
X }
X else if (strncmp(buffer, "To:", 3) == 0) {
X for (i=3; i < strlen(buffer); i++)
X tempbuffer[i-3] = buffer[i];
X tempbuffer[i-3] = '\0';
X strcpy(buffer, tempbuffer);
X }
X else { /* user%host@host? */
X
X /** The logic here is that we're going to use 'loc' as a handy
X flag to indicate if we've hit a '%' or not. If we have,
X we'll rewrite it as an '@' sign and then when we hit the
X REAL at sign (we must have one) we'll simply replace it
X with a NULL character, thereby ending the string there.
X **/
X
X loc = 0;
X
X for (i=0; buffer[i] != '\0'; i++)
X if (buffer[i] == '%') {
X buffer[i] = AT_SIGN;
X loc++;
X }
X else if (buffer[i] == AT_SIGN && loc)
X buffer[i] = '\0';
X }
X
X}
X
Xchar *format_long(inbuff, init_len)
Xchar *inbuff;
Xint init_len;
X{
X /** Return buffer with \n\t sequences added at each point where it
X would be more than 80 chars long. It only allows the breaks at
X legal points (ie commas followed by white spaces). init-len is
X the characters already on the first line... Changed so that if
X this is called while mailing without the overhead of "elm", it'll
X include "\r\n\t" instead.
X Changed to use ',' as a separator and to REPLACE it after it's
X found in the output stream...
X **/
X
X static char ret_buffer[VERY_LONG_STRING];
X register int index = 0, current_length = 0, depth=15, i;
X char buffer[VERY_LONG_STRING];
X char *word, *bufptr;
X
X strcpy(buffer, inbuff);
X
X bufptr = (char *) buffer;
X
X current_length = init_len + 2; /* for luck */
X
X while ((word = get_token(bufptr,",", depth)) != NULL) {
X
X /* first, decide what sort of separator we need, if any... */
X
X if (strlen(word) + current_length > 80) {
X if (index > 0) {
X ret_buffer[index++] = ','; /* close 'er up, doctor! */
X ret_buffer[index++] = '\n';
X ret_buffer[index++] = '\t';
X }
X
X /* now add this pup! */
X
X for (i=(word[0] == ' '? 1:0); i<strlen(word); i++)
X ret_buffer[index++] = word[i];
X current_length = strlen(word) + 8; /* 8 = TAB */
X }
X
X else { /* just add this address to the list.. */
X
X if (index > 0) {
X ret_buffer[index++] = ','; /* comma added! */
X ret_buffer[index++] = ' ';
X current_length += 2;
X }
X for (i=(word[0] == ' '? 1:0); i<strlen(word); i++)
X ret_buffer[index++] = word[i];
X current_length += strlen(word);
X }
X
X bufptr = NULL;
X }
X
X ret_buffer[index] = '\0';
X
X return( (char *) ret_buffer);
X}
X
Xchar *strip_commas(string)
Xchar *string;
X{
X /** return string with all commas changed to spaces. This IS
X destructive and will permanently change the input string.. **/
X
X register int i;
X
X for (i=0; i < strlen(string); i++)
X if (string[i] == COMMA)
X string[i] = SPACE;
X
X return( (char *) string);
X}
X
Xchar *strip_parens(string)
Xchar *string;
X{
X /** Return string with all parenthesized information removed.
X This is a non-destructive algorithm... **/
X
X static char buffer[VERY_LONG_STRING];
X register int i, depth = 0, buffer_index = 0;
X
X for (i=0; i < strlen(string); i++) {
X if (string[i] == '(')
X depth++;
X else if (string[i] == ')')
X depth--;
X else if (depth == 0)
X buffer[buffer_index++] = string[i];
X }
X
X buffer[buffer_index] = '\0';
X
X return( (char *) buffer);
X}
X
Xmove_left(string, chars)
Xchar string[];
Xint chars;
X{
X /** moves string chars characters to the left DESTRUCTIVELY **/
X
X register int i;
X
X /* chars--; /* index starting at zero! */
X
X for (i=chars; string[i] != '\0' && string[i] != '\n'; i++)
X string[i-chars] = string[i];
X
X string[i-chars] = '\0';
X}
X
Xremove_first_word(string)
Xchar *string;
X{ /** removes first word of string, ie up to first non-white space
X following a white space! **/
X
X register int loc;
X
X for (loc = 0; string[loc] != ' ' && string[loc] != '\0'; loc++)
X ;
X
X while (string[loc] == ' ' || string[loc] == '\t')
X loc++;
X
X move_left(string, loc);
X}
X
Xsplit_word(buffer, first, rest)
Xchar *buffer, *first, *rest;
X{
X /** Rip the buffer into first word and rest of word, translating it
X all to lower case as we go along..
X **/
X
X register int i, j = 0;
X
X /** skip leading white space, just in case.. **/
X
X for (i=0; whitespace(buffer[i]); i++) ;
X
X /** now copy into 'first' until we hit white space or EOLN **/
X
X for (j=0; i < strlen(buffer) && ! whitespace(buffer[i]); ++i)
X first[j++] = tolower(buffer[i]);
X
X first[j] = '\0';
X
X while (whitespace(buffer[i])) i++;
X
X for (j=0; i < strlen(buffer); i++)
X rest[j++] = tolower(buffer[i]);
X
X rest[j] = '\0';
X
X return;
X}
X
Xchar *tail_of_string(string, maxchars)
Xchar *string;
Xint maxchars;
X{
X /** Return a string that is the last 'maxchars' characters of the
X given string. This is only used if the first word of the string
X is longer than maxchars, else it will return what is given to
X it...
X **/
X
X static char buffer[SLEN];
X register int index, i;
X
X for (index=0;! whitespace(string[index]) && index < strlen(string);
X index++)
X ;
X
X if (index < maxchars) {
X strncpy(buffer, string, maxchars-2); /* word too short */
X buffer[maxchars-2] = '.';
X buffer[maxchars-1] = '.';
X buffer[maxchars] = '.';
X buffer[maxchars+1] = '\0';
X }
X else {
X i = maxchars;
X buffer[i--] = '\0';
X while (i > 1)
X buffer[i--] = string[index--];
X buffer[2] = '.';
X buffer[1] = '.';
X buffer[0] = '.';
X }
X
X return( (char *) buffer);
X}
X
Xreverse(string)
Xchar *string;
X{
X /** reverse string... pretty trivial routine, actually! **/
X
X char buffer[SLEN];
X register int i, j = 0;
X
X for (i = strlen(string)-1; i >= 0; i--)
X buffer[j++] = string[i];
X
X buffer[j] = '\0';
X
X strcpy(string, buffer);
X}
X
Xint
Xget_word(buffer, start, word)
Xchar *buffer, *word;
Xint start;
X{
X /** return next word in buffer, starting at 'start'.
X delimiter is space or end-of-line. Returns the
X location of the next word, or -1 if returning
X the last word in the buffer. -2 indicates empty
X buffer! **/
X
X register int loc = 0;
X
X while (buffer[start] == ' ' && buffer[start] != '\0')
X start++;
X
X if (buffer[start] == '\0') return(-2); /* nothing IN buffer! */
X
X while (buffer[start] != ' ' && buffer[start] != '\0')
X word[loc++] = buffer[start++];
X
X word[loc] = '\0';
X return(start);
X}
X
Xchar *shift_lower(string)
Xchar *string;
X{
X /** return 'string' shifted to lower case. Do NOT touch the
X actual string handed to us! **/
X
X static char buffer[LONG_SLEN];
X register int i;
X
X for (i=0; i < strlen(string); i++)
X if (isupper(string[i]))
X buffer[i] = tolower(string[i]);
X else
X buffer[i] = string[i];
X
X buffer[strlen(string)] = 0;
X
X return( (char *) buffer);
X}
X
XCenterline(line, string)
Xint line;
Xchar *string;
X{
X /** Output 'string' on the given line, centered. **/
X
X register int length, col;
X
X length = strlen(string);
X
X if (length > COLUMNS)
X col = 0;
X else
X col = (COLUMNS - length) / 2;
X
X PutLine0(line, col, string);
X}
X
Xchar *argv_zero(string)
Xchar *string;
X{
X /** given a string of the form "/something/name" return a
X string of the form "name"... **/
X
X static char buffer[NLEN];
X register int i, j=0;
X
X for (i=strlen(string)-1; string[i] != '/'; i--)
X buffer[j++] = string[i];
X buffer[j] = '\0';
X
X reverse(buffer);
X
X return( (char *) buffer);
X}
X
X#define MAX_RECURSION 20 /* up to 20 deep recursion */
X
Xchar *get_token(source, keys, depth)
Xchar *source, *keys;
Xint depth;
X{
X /** This function is similar to strtok() (see "opt_utils")
X but allows nesting of calls via pointers...
X **/
X
X register int last_ch;
X static char *buffers[MAX_RECURSION];
X char *return_value, *sourceptr;
X
X if (depth > MAX_RECURSION) {
X error1("get_token calls nested greater than %d deep!",
X MAX_RECURSION);
X emergency_exit();
X }
X
X if (source != NULL)
X buffers[depth] = source;
X
X sourceptr = buffers[depth];
X
X if (*sourceptr == '\0')
X return(NULL); /* we hit end-of-string last time!? */
X
X sourceptr += strspn(sourceptr, keys); /* skip the bad.. */
X
X if (*sourceptr == '\0') {
X buffers[depth] = sourceptr;
X return(NULL); /* we've hit end-of-string */
X }
X
X last_ch = strcspn(sourceptr, keys); /* end of good stuff */
X
X return_value = sourceptr; /* and get the ret */
X
X sourceptr += last_ch; /* ...value */
X
X if (*sourceptr != '\0') /** don't forget if we're at end! **/
X sourceptr++;
X
X return_value[last_ch] = '\0'; /* ..ending right */
X
X buffers[depth] = sourceptr; /* save this, mate! */
X
X return((char *) return_value); /* and we're outta here! */
X}
SHAR_EOF
chmod 0444 src/strings.c || echo "restore of src/strings.c fails"
echo "x - extracting src/syscall.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/syscall.c &&
X
Xstatic char rcsid[] = "@(#)$Id: syscall.c,v 2.1 88/09/15 20:30:00 syd Exp $";
X
X/*******************************************************************************
X * The Elm Mail System - $Revision: 2.1 $ $State: Exp $
X *
X * Copyright (c) 1986 Dave Taylor
X *******************************************************************************
X * Bug reports, patches, comments, suggetions should be sent to:
X *
X * Syd Weinstein, Elm Corrdinator
X * syd@dsinc.UUCP dsinc!syd
X *
X *******************************************************************************
X * $Log: syscall.c,v $
X * Revision 2.1 88/09/15 20:30:00 syd
X * checked in with -k by syd at 88.09.15.20.30.01.
X *
X * 88/09/05 killer!tness7!mechjgh (Greg Hackney)
X * Fix interrupt on shell escapes
X *
X * 88/08/27 ssw
X * add deluth patches
X *
X * Revision 2.1 88/07/21 09:59:52 edc
X * Final hacks and cleanup to the 2.1 alpha test release.
X *
X * Revision 2.0 88/06/27 17:25:44 edc
X * The original 2.0 gamma sources as leaked from HP
X *
X *
X *
X ******************************************************************************/
X
X/** These routines are used for user-level system calls, including the
X '!' command and the '|' commands...
X
X**/
X
X#include "headers.h"
X
X#include <signal.h>
X
X#ifdef BSD
X# include <sys/wait.h>
X#endif
X
Xchar *argv_zero();
Xvoid _exit();
X
Xint
Xsubshell()
X{
X /** spawn a subshell with either the specified command
X returns non-zero if screen rewrite needed
X **/
X
X char command[SLEN];
X int ret;
X int old_raw;
X
X register int (*istat)();
X
X PutLine0(LINES-3,COLUMNS-40,"(use the shell name for a shell)");
X PutLine0(LINES-2,0,"Shell Command: ");
X command[0] = '\0';
X (void) optionally_enter(command, LINES-2, 15, 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 if (cursor_control) transmit_functions(OFF);
X
X istat = signal(SIGINT,SIG_DFL);
X
X ret = system_call(command, USER_SHELL);
X
X istat = signal(SIGINT,istat);
X
X PutLine0(LINES, 0, "\n\nPress <return> to return to ELM: ");
X
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
Xsystem_call(string, shell_type)
Xchar *string;
Xint shell_type;
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
X int stat = 0, pid, w;
X#ifdef BSD
X union wait status;
X#else
X int status;
X#endif
X register int (*istat)(), (*qstat)();
X
X dprint(2, (debugfile,
X "System Call: %s\n\t%s\n", shell_type == SH? "/bin/sh" : shell,
X string));
X
X#ifdef NO_VM /* machine without virtual memory! */
X if ((pid = fork()) == 0) {
X#else
X if ((pid = vfork()) == 0) {
X#endif
X setgid(groupid); /* and group id */
X setuid(userid); /* back to the normal user! */
X
X (void) signal(SIGHUP, SIG_IGN); /* kids should ignore this */
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
X while ((w = wait(&status)) != pid && w != -1)
X ;
X
X#ifdef BSD
X if (status.w_retcode != 0) stat = status.w_retcode;
X#else
X if (w == -1) stat = status;
X#endif
X
X signal(SIGINT, istat);
X signal(SIGQUIT, qstat);
X
X return(stat);
X}
X
Xint
Xdo_pipe()
X{
X /** pipe the tagged messages to the specified sequence.. **/
X
X char command[SLEN], buffer[LONG_SLEN], message_list[SLEN];
X register int ret, tagged = 0, i;
X int old_raw;
X
X message_list[0] = '\0'; /* NULL string to start... */
X
X for (i=0; i < message_count; i++)
X if (ison(header_table[i].status, TAGGED)) {
X sprintf(message_list,"%s %d", message_list,
X header_table[i].index_number);
X tagged++;
X }
X
X if (tagged > 1)
X PutLine0(LINES-2,0,"Pipe tagged msgs to: ");
X else if (tagged)
X PutLine0(LINES-2,0,"Pipe tagged msg to : ");
X else {
X PutLine0(LINES-2,0,"Pipe current msg to: ");
X sprintf(message_list,"%d", header_table[current-1].index_number);
X }
X
X command[0] = '\0';
X
X (void) optionally_enter(command, LINES-2, 21, 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 infile,
X message_list,
X command);
X
X ret = system_call(buffer, USER_SHELL);
X
X PutLine0(LINES, 0, "\n\nPress <return> 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[LONG_SLEN], filename[SLEN], printbuffer[LONG_SLEN];
X char message_list[SLEN];
X register int retcode, tagged = 0, i;
X
X if (strlen(printout) == 0) {
X error("Don't know how to print - option \"printmail\" undefined!");
X return;
X }
X
X message_list[0] = '\0'; /* reset to null... */
X
X for (i=0; i < message_count; i++)
X if (header_table[i].status & TAGGED) {
X sprintf(message_list, "%s %d", message_list,
X header_table[i].index_number);
X tagged++;
X }
X
X if (! tagged)
X sprintf(message_list," %d", header_table[current-1].index_number);
X
X sprintf(filename,"%s%d", 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, infile, message_list,
X filename,
X printbuffer);
X
X dprint(2, (debugfile, "Printing system call...\n"));
X
X Centerline(LINES, "queueing...");
X
X if ((retcode = system_call(buffer, SH)) == 0) {
X sprintf(buffer, "Message%s queued up to print", plural(tagged));
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
Xlist_folders()
X{
X /** list the folders in the users FOLDERHOME directory. This is
X simply a call to "ls -C"
X **/
X
X char buffer[SLEN];
X
X CleartoEOS(); /* don't leave any junk on the bottom of the screen */
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);
X printf("\n\r");
X}
X
SHAR_EOF
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 2.2 88/09/15 20:30:04 syd Exp $";
X
X/*******************************************************************************
X * The Elm Mail System - $Revision: 2.2 $ $State: Exp $
X *
X * Copyright (c) 1985 Dave Taylor
X *******************************************************************************
X * Bug reports, patches, comments, suggetions should be sent to:
X *
X * Syd Weinstein, Elm Corrdinator
X * syd@dsinc.UUCP dsinc!syd
X *
X *******************************************************************************
X * $Log: utils.c,v $
X * Revision 2.2 88/09/15 20:30:04 syd
X * checked in with -k by syd at 88.09.15.20.30.04.
X *
X * 14 Sep 88 Chip Rosenthal <chip@vector>
X * This file contains the patches for Elm 2.1b to run on XENIX System V.
X * The general issues with running Elm on such a machine are:
X *
X * 88/08/27 ssw
X * add deluth patches
X *
X * Revision 2.2 88/07/21 09:59:54 edc
X * Final hacks and cleanup to the 2.1 alpha test release.
X *
X * Revision 2.1 88/06/28 12:48:51 edc
X * Added code for systems without mkdir() call, and NOMKDIR define from
X * sysconf.h. This is sort of a kludge, since it just executes mkdir to
X * create the directory. This may not be portable to non-System V machines.
X * ---Eric Christensen---
X *
X * Revision 2.0 88/06/27 17:25:44 edc
X * The original 2.0 gamma sources as leaked from HP
X *
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
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 /** first off, let's make the directory we need... **/
X
X /** Some systems don't have a mkdir call - how inconvienient! **/
X
X#ifdef NOMKDIR
X sprintf(com, "mkdir %s/.elm", home);
X system_call(com, SH);
X sprintf(com, "chmod 700 %s/.elm", home);
X system_call(com, SH);
X#else
X sprintf(source, "%s/.elm", home);
X (void) mkdir(source, 0700);
X#endif NOMKDIR
X
X chown( source, userid, groupid);
X
X /** and 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\r%s --> %s \t[':' changed to '=']\n", source, dest);
X
X sprintf(temp, "/tmp/%d", getpid());
X sprintf(com, "/bin/sed -e 's/:/=/g' %s > %s\n", source, temp);
X (void) system_call(com, SH);
X sprintf(com, "/bin/mv %s %s\n", temp, dest);
X (void) system_call(com, SH);
X }
X
X sprintf(source, "%s/.alias_data", home);
X if (access(source, ACCESS_EXISTS) != -1) {
X sprintf(dest, "%s/%s", home, ALIAS_DATA);
X printf("%s --> %s\n", source, dest);
X
X move(source, dest);
X }
X
X sprintf(source, "%s/.alias_hash", home);
X if (access(source, ACCESS_EXISTS) != -1) {
X sprintf(dest, "%s/%s", home, ALIAS_HASH);
X printf("%s --> %s\n", source, dest);
X
X move(source, dest);
X }
X
X sprintf(source, "%s/.elmheaders", home);
X if (access(source, ACCESS_EXISTS) != -1) {
X sprintf(dest, "%s/%s", home, mailheaders);
X printf("%s --> %s\n", source, dest);
X
X move(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("%s --> %s\n", source, dest);
X
X move(source, dest);
X }
X
X sprintf(source, "%s/.last_read_mail", home);
X if (access(source, ACCESS_EXISTS) != -1) {
X sprintf(dest, "%s/%s", home, mailtime_file);
X printf("%s --> %s\n", source, dest);
X
X move(source, dest);
X }
X
X printf("\n\rWelcome to the New Elm system...\n\n\r");
X sleep(3);
X}
X
Xshow_mailfile_stats()
X{
X /** when we're about to die, let's try to dump lots of good stuff
X to the debug file... **/
X
X struct stat buffer;
X
X if (debug == 0) return; /* Damn! Can't do it! */
X
X if (fstat(fileno(mailfile), &buffer) == 0) {
X dprint(1, (debugfile, "\nDump of stats for mailfile %s;\n", infile));
X
X dprint(1, (debugfile, "\tinode: %d, mode: %o, uid: %d, ",
X buffer.st_ino, buffer.st_mode, buffer.st_uid));
X
X dprint(1, (debugfile,
X "gid: %d, size: %d\n\n", buffer.st_gid, buffer.st_size));
X
X dprint(1, (debugfile, "\toffset into file = %l\n", ftell(mailfile)));
X }
X else
X dprint(1, (debugfile,
X "\nfstat on mailfile '%s' failed with error %s!!\n\n",
X infile, error_name(errno)));
X}
X
Xemergency_exit()
X{
X /** used in dramatic cases when we must leave without altering
X ANYTHING about the system... **/
X char buffer[SLEN];
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%s\n", temp_mbox, username));
X sys_lock_file(buffer, username);
X dprint(1, (debugfile,
X " The mailbox lock file: %s\n", buffer));
X dprint(1, (debugfile,
X " The composition file : %s%d\n", temp_file, getpid()));
X dprint(1, (debugfile,
X " The header comp file : %s%d\n", temp_file, getpid()+1));
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}
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%d",temp_file, getpid()); /* editor buffer */
X (void) unlink(buffer);
X
X sprintf(buffer,"%s%d",temp_file, getpid()+1); /* editor buffer */
X (void) unlink(buffer);
X
X if (mbox_specified == 0) {
X sprintf(buffer,"%s%s",temp_mbox, username); /* temp mailbox */
X (void) unlink(buffer);
X }
X
X sprintf(buffer,"%s/%s", home, readmsg_file); /* readmsg temp */
X (void) unlink(buffer);
X
X sys_lock_file(buffer, username); /* lock file */
X (void) unlink(buffer);
X
X if (! mail_only) {
X MoveCursor(LINES,0);
X Writechar('\n');
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%d",temp_file, getpid()); /* editor buffer */
X (void) unlink(buffer);
X
X sprintf(buffer,"%s%d",temp_file, getpid()+1); /* editor buffer */
X (void) unlink(buffer);
X
X if (! mail_only) {
X MoveCursor(LINES,0);
X Writechar('\n');
X }
X
X exit(0);
X}
X
X/*ARGSUSED0*/
X
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%d",temp_file, getpid()); /* editor buffer */
X (void) unlink(buffer);
X
X sprintf(buffer,"%s%d",temp_file, getpid()+1); /* editor buffer */
X (void) unlink(buffer);
X
X sprintf(buffer,"%s%s",temp_mbox, username); /* temp mailbox */
X (void) unlink(buffer);
X
X MoveCursor(LINES,0);
X Writechar('\n');
X
X exit(0);
X}
X
Xint
Xget_page(msg_pointer)
Xint msg_pointer;
X{
X /** Ensure that 'current' is on the displayed page,
X returning non-zero 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-1);
X
X if (selected && msg_pointer > selected)
X return(FALSE); /* too far - page can't change! */
X
X if (msg_pointer > last_on_page) {
X header_page = (int) (msg_pointer-(selected? 0:1)) / headers_per_page;
X return(1);
X }
X else if (msg_pointer < first_on_page) {
X header_page = (int) (msg_pointer-1) / headers_per_page;
X return(1);
X }
X else
X return(0);
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, index = 0;
X
X if (strncmp(filename, folders, strlen(folders)) == 0) {
X if (strlen(folders) > 0) {
X buffer[i++] = '=';
X index = strlen(folders);
X }
X }
X else if (strncmp(filename, home, strlen(home)) == 0) {
X if (strlen(home) > 0) {
X buffer[i++] = '~';
X index = strlen(home);
X }
X }
X else index = 0;
X
X while (filename[index] != '\0')
X buffer[i++] = filename[index++];
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 2.1 88/07/21 09:59:57 edc Exp $";
X
X/*******************************************************************************
X * The Elm Mail System - $Revision: 2.1 $ $State: Exp $
X *
X * Copyright (c) 1986 Dave Taylor
X *******************************************************************************
X * Bug reports, patches, comments, suggetions should be sent to:
X *
X * Syd Weinstein, Elm Corrdinator
X * syd@dsinc.UUCP dsinc!syd
X *
X *******************************************************************************
X * $Log: validname.c,v $
X * Revision 2.1 88/07/21 09:59:57 edc
X * checked in with -k by syd at 88.09.15.20.30.06.
X *
X * Revision 2.1 88/07/21 09:59:57 edc
X * Final hacks and cleanup to the 2.1 alpha test release.
X *
X * Revision 2.0 88/06/27 17:25:45 edc
X * The original 2.0 gamma sources as leaked from HP
X *
X *
X *
X ******************************************************************************/
X
X/** This routine takes a single address, no machine hops or
X anything, and returns 1 if it's valid and 0 if not. The
X algorithm it uses is the same one that uux uses, namely:
X
X 1. Is there a file '/usr/mail/%s'?
X 2. Is there a password entry for %s?
X
X**/
X
X#include "defs.h"
X
X#include <stdio.h>
X
X#ifndef NOCHECK_VALIDNAME
X# ifdef BSD4_1
X# include <sys/pwd.h>
X# else
X# include <pwd.h>
X# endif
X#endif
X
Xint
Xvalid_name(name)
Xchar *name;
X{
X /** does what it says above, boss! **/
X
X#ifdef NOCHECK_VALIDNAME
X
X return(1); /* always say it's okay! */
X
X#else
X struct passwd *getpwnam();
X char filebuf[SLEN];
X
X sprintf(filebuf,"%s/%s", mailhome, name);
X
X if (access(filebuf, ACCESS_EXISTS) == 0)
X return(1);
X
X if (getpwnam(name) != NULL)
X return(1);
X
X return(0);
X
X#endif
X
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.mt (Text)"
sed 's/^X//' << 'SHAR_EOF' > utils/Makefile.mt &&
X# @(#)$Id: Makefile.mt,v 2.1 88/09/15 21:08:39 syd Exp $
X#
X# Makefile for the Elm system utilities
X#
X# (C) Copyright 1986, 1987 Dave Taylor
X#
X# $Log: Makefile.mt,v $
X# Revision 2.1 88/09/15 21:08:39 syd
X# Initial 2.1 Release
X#
X# 14 Sep 88 Chip Rosenthal <chip@vector>
X# This file contains the patches for Elm 2.1b to run on XENIX System V.
X# The general issues with running Elm on such a machine are:
X#
X# 88/09/05 Walt
X# added getopt to two utils for sequent
X#
X# 8/27/88 ssw
X# moved from to frm to avoid BSD conflict
X#
XSHELL=/bin/sh
X
XDEFINE= >os-define<
XLIB2 = >lib2<
X
XCFLAGS= >cflags< -O -I../hdrs
XCC= >cc<
XRM= >rm<
XECHO= /bin/echo
X
XOBJS= ../bin/newalias ../bin/frm ../bin/newmail ../bin/answer \
X ../bin/printmail ../bin/fastmail ../bin/readmsg \
X ../bin/checkalias ../bin/arepdaemon ../bin/autoreply \
X ../bin/messages ../bin/listalias
X
Xall: ${OBJS}
X
X../bin/newalias: ../hdrs/defs.h newalias.c ../src/validname.o \
X ../src/opt_utils.o
X ${CC} ${CFLAGS} ${DEFINE} newalias.c ../src/validname.o \
X ../src/opt_utils.o -o ../bin/newalias
X
X../bin/frm: from.c ../src/opt_utils.o ../src/string2.o\
X expand.o >getopt<
X ${CC} ${CFLAGS} ${DEFINE} from.c ../src/opt_utils.o \
X ../src/string2.o >getopt< expand.o -o ../bin/frm
X
X../bin/newmail: ../src/opt_utils.c newmail.c ../src/string2.o expand.o
X ${CC} ${CFLAGS} ${DEFINE} newmail.c expand.o \
X ../src/string2.o -o ../bin/newmail
X
X../bin/listalias: listalias.c
X ${CC} ${CFLAGS} ${DEFINE} listalias.c -o ../bin/listalias
X
X../bin/answer: answer.c ../src/opt_utils.o
X ${CC} ${CFLAGS} ${DEFINE} answer.c ../src/opt_utils.o -o ../bin/answer
X
X../bin/fastmail: fastmail.c
X ${CC} ${CFLAGS} ${DEFINE} fastmail.c ../src/opt_utils.o \
SHAR_EOF
echo "End of part 19"
echo "File utils/Makefile.mt is continued in part 20"
echo "20" > s2_seq_.tmp
exit 0
--
=====================================================================
Sydney S. Weinstein, CDP, CCP Elm Coordinator
Datacomp Systems, Inc. Voice: (215) 947-9900
{allegra,bellcore,bpa,vu-vlsi}!dsinc!syd FAX: (215) 938-0235