syd@dsinc.UUCP (Syd Weinstein) (12/13/88)
---- Cut Here and unpack ---- #!/bin/sh # this is part 13 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file src/forms.c continued # CurArch=13 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/forms.c" sed 's/^X//' << 'SHAR_EOF' >> src/forms.c X X dprint(7, (debugfile, "prompt-for-sized-entry \"%s\" %d chars\n", X prompt, field_size)); X X printf("%s : ", prompt); X X for (i=0;i<field_size; i++) X putchar('_'); X for (i=0;i<field_size; i++) X putchar(BACKSPACE); X fflush(stdout); X X gets(buffer); X X if (strlen(buffer) > field_size) buffer[field_size-1] = '\0'; X} SHAR_EOF echo "File src/forms.c is complete" chmod 0444 src/forms.c || echo "restore of src/forms.c fails" echo "x - extracting src/getopt.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/getopt.c && X Xstatic char rcsid[] = "@(#)$Id: getopt.c,v 2.1 88/07/21 09:58:34 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: getopt.c,v $ X * Revision 2.1 88/07/21 09:58:34 edc X * checked in with -k by syd at 88.09.15.20.28.31. X * X * Revision 2.1 88/07/21 09:58:34 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:06 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/** starting argument parsing routine... X X**/ X X#include "defs.h" X X#ifndef NULL X# define NULL 0 X#endif X X#define DONE 0 X#define ERROR -1 X Xchar *optional_arg; /* optional argument as we go */ Xint opt_index = 0; /* argnum + 1 when we leave */ X X/*********************** X X Typical usage of this routine is exemplified by; X X register int c; X X while ((c = get_options(argc, argv, "ad:f:")) > 0) { X switch (c) { X case 'a' : arrow_cursor++; break; X case 'd' : debug = atoi(optional_arg); break; X case 'f' : strcpy(infile, optional_arg); X mbox_specified = 2; break; X } X } X X if (c == ERROR) { X printf("Usage: %s [a] [-d level] [-f file] <names>\n\n", argv[0]); X exit(1); X } X X***********************/ X Xint _indx = 1, _argnum = 1; X Xint Xget_options(argc, argv, options) Xint argc; Xchar *argv[], *options; X{ X /** Returns the character argument next, and optionally instantiates X "argument" to the argument associated with the particular option X **/ X X char *word, *strchr(); X X if (_argnum >= argc) { /* quick check first - no arguments! */ X opt_index = argc; X return(DONE); X } X X if (_indx >= strlen(argv[_argnum]) && _indx > 1) { X _argnum++; X _indx = 1; /* zeroeth char is '-' */ X } X X if (_argnum >= argc) { X opt_index = _argnum; /* no more args */ X return(DONE); X } X X if (argv[_argnum][0] != '-') { X opt_index = _argnum; X return(DONE); X } X X word = strchr(options, argv[_argnum][_indx++]); X X if (word == NULL) X return(ERROR); /* Sun compatibility */ X X if (word == NULL || strlen(word) == 0) X return(ERROR); X X if (word[1] == ':') { X X /** Two possibilities - either tailing end of this argument or the X next argument in the list **/ X X if (_indx < strlen(argv[_argnum])) { /* first possibility */ X optional_arg = (char *) (argv[_argnum] + _indx); X _argnum++; X _indx = 1; X } X else { /* second choice */ X if (++_argnum >= argc) X return(ERROR); /* no argument!! */ X X optional_arg = (char *) argv[_argnum++]; X _indx = 1; X } X } X X return((int) word[0]); X} SHAR_EOF chmod 0444 src/getopt.c || echo "restore of src/getopt.c fails" echo "x - extracting src/hdrcfg_b.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/hdrcfg_b.c && X Xstatic char rcsid[] = "@(#)$Id: hdrcfg_b.c,v 2.1 88/09/15 20:28:33 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: hdrcfg_b.c,v $ X * Revision 2.1 88/09/15 20:28:33 syd X * checked in with -k by syd at 88.09.15.20.28.33. X * X * 88/08/27 ssw X * add deluth patches X * X * Revision 2.1 88/07/21 09:58:38 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:09 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/** This file contains the routines necessary to be able to modify X the mail headers of messages on the way off the machine for X users that are in 'batch' mode (e.g. the system has no knowledge X of the termtype or anything, so needs to use dump printf calls) X X Headers currently supported for modification are: X X To: X Cc: X Bcc: (depending on #ifdef BCC_ALLOWED) X Subject: X Reply-To: X Expires: X Priority: X In-Reply-To: X Action: X <user defined> X X**/ X X#include <stdio.h> X#include "headers.h" X X#include <ctype.h> X X#ifdef BSD X#undef toupper X#endif X X/* these are all defined in the mailmsg file! */ X Xextern char subject[SLEN], in_reply_to[SLEN], expires[SLEN], X action[SLEN], priority[SLEN], reply_to[SLEN], to[VERY_LONG_STRING], X cc[VERY_LONG_STRING], expanded_to[VERY_LONG_STRING], X expanded_cc[VERY_LONG_STRING], user_defined_header[SLEN]; X X#ifdef ALLOW_BCC Xextern char bcc[VERY_LONG_STRING], expanded_bcc[VERY_LONG_STRING]; X#endif X Xchar *strip_commas(), *strcpy(); X Xbatch_header_editor() X{ X /** Edit headers. **/ X X char ch; X int first_time_through = 0; X X printf("\n\rElm Header Editor. Please choose from the following:\n\n\r"); X Xreprompt: X if (first_time_through++ == 0) { X#ifdef ALLOW_BCC X printf(" V)iew headers T)o: C)c: B)cc: S)ubject: R)eply-To: E)xpires:\n\r"); X#else X printf(" V)iew headers T)o: C)c: S)ubject: R)eply-To: E)xpires:\n\r"); X#endif X printf( X " P)riority: I)n-reply-to: A)ction: or Q)uit editing\n\n\r"); X printf("Choice? q%c", BACKSPACE); X } X else X printf("\n\rHeader to edit ('?' for choices) : q%c", BACKSPACE); X X fflush(stdout); X X ch = ReadCh(); X if (isupper(ch)) X ch = tolower(ch); X X switch (ch) { X case 'v' : printf("View Headers:\n\n\r"); X X printf("To: "); X if (strlen(expanded_to) > 0) X printf("%s\n\r", format_long(expanded_to, 4)); X else if (strlen(to) > 0) X printf("%s\n\r", format_long(to, 4)); X else printf("\n\r"); X X printf("Cc: "); X if (strlen(expanded_cc) > 0) X printf("%s\n\r", format_long(expanded_cc, 4)); X else if (strlen(cc) > 0) X printf("%s\n\r", format_long(cc, 4)); X else printf("\n\r"); X X#ifdef ALLOW_BCC X if (strlen(bcc) > 0) { X printf("Bcc: "); X if (strlen(expanded_bcc) > 0) X printf("%s\n\r", format_long(expanded_bcc, 4)); X else if (strlen(bcc) > 0) X printf("%s\n\r", format_long(bcc, 4)); X else printf("\n\r"); X } X#endif X if (strlen(subject) > 0) X printf("Subject: %s\n\r", subject); X if (strlen(reply_to) > 0) X printf("Reply-To: %s\n\r", reply_to); X if (strlen(expires) > 0) X printf("Expires: %s\n\r", expires); X if (strlen(priority) > 0) X printf("Priority: %s\n\r", priority); X if (strlen(in_reply_to) > 0) X printf("In-Reply-To: %s\n\r", in_reply_to); X if (strlen(action) > 0) X printf("Action: %s\n\r", action); X printf("\n"); X break; X X case 't' : printf("To\n\n\rTo: "); X if (optionally_enter(to, -1, -1, TRUE) == -1) X return; X if (build_address(strip_commas(to), expanded_to)) X printf("\rTo: %s\n\r", format_long(expanded_to, 4)); X break; X case 'c' : printf("Cc\n\n\rCc: "); X if (optionally_enter(cc, -1, -1, TRUE) == -1) X return; X if (build_address(strip_commas(cc), expanded_cc)); X printf("\rCc: %s\n\r", format_long(expanded_cc, 4)); X break; X#ifdef ALLOW_BCC X case 'b' : printf("Bcc\n\n\rBcc: "); X if (optionally_enter(bcc, -1, -1, TRUE) == -1) X return; X if (build_address(strip_commas(bcc), expanded_bcc)) X printf("\rBcc: %s\n\r", format_long(expanded_bcc, 5)); X break; X#endif X case 's' : printf("Subject\n\n\rSubject: "); X if (optionally_enter(subject, -1, -1, TRUE) == -1) X return; X break; X case 'r' : printf("Reply-To\n\n\rReply-To: "); X if (optionally_enter(reply_to, -1, -1, TRUE) == -1) X return; X break; X X case 'e' : printf("Expires\n\n\rExpires: "); X batch_enter_date(expires); X break; X case 'p' : printf("Priority\n\n\rPriority: "); X if (optionally_enter(priority, -1, -1, TRUE) == -1) X return; X break; X case 'i' : printf("In-Reply-To\n\n\rIn-Reply-To: "); X if (optionally_enter(in_reply_to, -1, -1, TRUE) == -1) X return; X break; X case 'a' : printf("Action\n\n\rAction: "); X if (optionally_enter(action, -1, -1, TRUE) == -1) X return; X break; X case '\n': X case '\r': X case 'q' : printf("Quit Header Editor\n\r"); return; X X case '?': X printf("Help\n\n\r"); X first_time_through = 0; X break; X X default : printf("%c\r\nI don't understand that choice!\n\r", ch); X first_time_through == 0; X } X X goto reprompt; X} X Xbatch_enter_date(buffer) Xchar *buffer; X{ X /** Enter the number of days this message is valid for, then X display the actual date of expiration. This routine relies X heavily on the routine 'days_ahead()' in the file date.c X **/ X X int days; X int old_raw; X X printf( X "How many days in the future should this message expire? "); X fflush(stdout); X if (( old_raw = RawState()) == ON) X Raw(OFF); X gets(buffer); X if ( old_raw == ON) X Raw(ON); X sscanf(buffer, "%d", &days); X if (days < 1) X printf("You can't send messages that have already expired!\n"); X else if (days > 56) X printf( X "The expiration date must be within eight weeks of today\n"); X else { X days_ahead(days, buffer); X printf("Expires on: %s\n", buffer); X } X} SHAR_EOF chmod 0444 src/hdrcfg_b.c || echo "restore of src/hdrcfg_b.c fails" echo "x - extracting src/hdrconfg.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/hdrconfg.c && X Xstatic char rcsid[] = "@(#)$Id: hdrconfg.c,v 2.1 88/09/15 20:28:35 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: hdrconfg.c,v $ X * Revision 2.1 88/09/15 20:28:35 syd X * checked in with -k by syd at 88.09.15.20.28.35. X * X * 88/09/12 Chip Rosenthal <chip@vector> X * couple of additional toupper()/tolower() side effect instances. X * X * 88/08/27 ssw X * add deluth patches X * X * 88/08/27 Rob Bernardo <gatech!pbhyf.PacBell.COM!rob> X * fix header edit code X * X * Revision 2.1 88/07/21 09:58:36 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:08 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/** This file contains the routines necessary to be able to modify X the mail headers of messages on the way off the machine. The X headers currently supported for modification are: X X Subject: X To: X Cc: X Bcc: X Reply-To: X Expires: X Priority: X In-Reply-To: X Action: X X <user defined> X**/ X X#include <stdio.h> X#include "headers.h" X X#include <ctype.h> X X#ifdef BSD X#undef toupper X#endif X X/* these are all defined in the mailmsg file! */ X Xextern char subject[SLEN], in_reply_to[SLEN], expires[SLEN], X action[SLEN], priority[SLEN], reply_to[SLEN], to[VERY_LONG_STRING], X cc[VERY_LONG_STRING], expanded_to[VERY_LONG_STRING], X expanded_cc[VERY_LONG_STRING], user_defined_header[SLEN], X bcc[VERY_LONG_STRING], expanded_bcc[VERY_LONG_STRING]; X Xchar *strip_commas(), *strcpy(); X Xedit_headers() X{ X /** Edit headers. **/ X X int unexpanded_to = TRUE, unexpanded_cc = TRUE, unexpanded_bcc = TRUE; X int c; X X if (mail_only) goto outta_here; /* how did we get HERE??? */ X X display_headers(); X X clearerr(stdin); X X clearerr(stdin); X X while (TRUE) { /* forever */ X PutLine0(LINES-2,0,"Choice: "); X CleartoEOLN(); X c = getchar(); X c = toupper(c); X MoveCursor(LINES-1,0); CleartoEOLN(); X clear_error(); X if (c == EOF) X break; X switch (c) { X case RETURN: X case LINE_FEED: X case 'Q' : goto outta_here; X case ctrl('L') : display_headers(); X break; X case 'T' : if (optionally_enter(to, 2, 4, TRUE) == -1) X goto outta_here; X (void) build_address(strip_commas(to), expanded_to); X unexpanded_to = FALSE; X break; X case 'S' : if (optionally_enter(subject, 7, 9, FALSE) == -1) X goto outta_here; X break; X case 'B' : if (optionally_enter(bcc, 4, 5, TRUE) == -1) X goto outta_here; X (void) build_address(strip_commas(bcc), expanded_bcc); X unexpanded_bcc = FALSE; X break; X case 'C' : if (optionally_enter(cc, 3, 4, TRUE) == -1) X goto outta_here; X (void) build_address(strip_commas(cc), expanded_cc); X unexpanded_cc = FALSE; X break; X case 'R' : if (optionally_enter(reply_to, 5, 10, FALSE) == -1) X goto outta_here; X break; X X case 'A' : if (optionally_enter(action, 9, 8, FALSE) == -1) X goto outta_here; X break; X X case 'P' : if (optionally_enter(priority, 11, 10, FALSE) == -1) X goto outta_here; X break; X X case 'E' : enter_date(10, 9, expires); X break; X X case 'U' : if (optionally_enter(user_defined_header,14,0,FALSE)==-1) X goto outta_here; X else X check_user_header(user_defined_header); X break; X X case 'I' : if (strlen(in_reply_to) > 0) { X if (optionally_enter(in_reply_to, 12,13, FALSE) == -1) X goto outta_here; X break; X } X /** else fall through as an error **/ X default : Centerline(LINES-1, "Unknown header being specified!"); X } X } X Xoutta_here: /* this section re-expands aliases before we leave... */ X X if (unexpanded_to) X (void) build_address(strip_commas(to), expanded_to); X if (unexpanded_cc) X (void) build_address(strip_commas(cc), expanded_cc); X if (unexpanded_bcc) X (void) build_address(strip_commas(bcc), expanded_bcc); X} X Xdisplay_headers() X{ X ClearScreen(); X X Centerline(0,"Message Header Edit Screen"); X X PutLine1(2,0,"To: %s", to); X PutLine1(3,0,"Cc: %s", cc); CleartoEOLN(); X PutLine1(4,0,"Bcc: %s", bcc); CleartoEOLN(); X PutLine1(5,0,"Reply-To: %s", reply_to); CleartoEOS(); X X PutLine1(7,0,"Subject: %s", subject); X PutLine1(9,0,"Action: %s", action); X PutLine1(10,0,"Expires: %s", expires); X PutLine1(11,0,"Priority: %s", priority); X if (strlen(in_reply_to) > 0) X PutLine1(12,0,"In-Reply-To: %s", in_reply_to); X X if (strlen(user_defined_header) > 0) X PutLine1(14,0, "%s", user_defined_header); X X Centerline(LINES-5, X "Choose first letter of existing header, U)ser defined header, or <return>"); X} X Xenter_date(x, y, buffer) Xint x, y; Xchar *buffer; X{ X /** Enter the number of days this message is valid for, then X display at (x,y) the actual date of expiration. This X routine relies heavily on the routine 'days_ahead()' in X the file date.c X **/ X X int days; X int old_raw; X X PutLine0(LINES-2,0, X "How many days in the future should this message expire? "); X CleartoEOLN(); X if (( old_raw = RawState()) == ON) X Raw(OFF); X gets(buffer); X if (old_raw == ON) X Raw(ON); X sscanf(buffer, "%d", &days); X if (days < 1) X Centerline(LINES-1, "That doesn't make sense!"); X else if (days > 56) X Centerline(LINES-1, X "Expiration date must be within eight weeks of today"); X else { X days_ahead(days, buffer); X PutLine0(x, y, buffer); X } X} X X Xcheck_user_header(header) Xchar *header; X{ X /** check the header format...if bad print error and erase! **/ X X register int i = -1; X X if (strlen(header) == 0) X return; X X if (whitespace(header[0])) { X error ("you can't have leading white space in a header!"); X header[0] = '\0'; X ClearLine(14); X return; X } X X if (header[0] == ':') { X error ("you can't have a colon as the first character!"); X header[0] = '\0'; X ClearLine(14); X return; X } X X while (header[++i] != ':') { X if (header[i] == '\0') { X Centerline(LINES-1, "You need to have a colon ending the field name!"); X header[0] = '\0'; X ClearLine(14); X return; X } X else if (whitespace(header[i])) { X Centerline(LINES-1, "You can't have white space imbedded in the header name!"); X header[0] = '\0'; X ClearLine(14); X return; X } X } X X return; X} SHAR_EOF chmod 0444 src/hdrconfg.c || echo "restore of src/hdrconfg.c fails" echo "x - extracting src/help.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/help.c && X Xstatic char rcsid[] = "@(#)$Id: help.c,v 2.1 88/09/15 20:28:37 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: help.c,v $ X * Revision 2.1 88/09/15 20:28:37 syd X * checked in with -k by syd at 88.09.15.20.28.37. X * X * 88/08/27 ssw X * split tolower and ReadCh due to macro calls X * X * Revision 2.1 88/07/21 09:58:40 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:10 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/*** help routine for ELM program X X***/ X X#include <ctype.h> X X#ifdef BSD X# undef tolower X#endif X X#include "headers.h" X Xhelp() X{ X /** Process the request for help [section] from the user **/ X X char ch; /* character buffer for input */ X char *s; /* string pointer... */ X X MoveCursor(LINES-7,0); X CleartoEOS(); X X Centerline(LINES-7, "ELM Help System"); X Centerline(LINES-5, X "Press keys you want help for, '?' for a list, or '.' to end"); X X PutLine0(LINES-3, 0, "Help on key: "); X X do { X MoveCursor(LINES-3, strlen("Help on key: ")); X ch = ReadCh(); X ch = tolower(ch); X X if (ch == '.') return(0); /* zero means footer rewrite only */ X X s = "Unknown command. Use '?' for a list of commands..."; X X switch (ch) { X X case '?': display_helpfile(MAIN_HELP); return(1); X X case '$': s = X "$ = Force a resync of the current mailbox. This will 'purge' deleted mail"; X break; X X case '!': s = X "! = Escape to the Unix shell of your choice, or just to enter commands"; X break; X case '@': s = X "@ = Debug - display a summary of the messages on the header page"; X break; X case '|': s = X "| = Pipe the current message or tagged messages to the command specified"; X break; X case '#': s = X "# = Debug - display all information known about current message"; X break; X case '%': s = X "% = Debug - display the computed return address of the current message"; X break; X case '*': s = "* = Go to the last message in the current mailbox"; X break; X case '-': s = X "- = Go to the previous page of messages in the current mailbox"; X break; X case '=': s = X "'=' = Go to the first message in the current mailbox"; X break; X case ' ': X case '+': s = X "+ = Go to the next page of messages in the current mailbox"; X break; X case '/': s = "/ = Search for specified pattern in mailbox"; X break; X case '<': s = X "< = Scan current message for calendar entries (if enabled)"; X break; X case '>': s = X "> = Save current message or tagged messages to specified file"; X break; X case '^': s = X "^ = Toggle the Delete/Undelete status of the current message"; X break; X case 'a': s = X "a = Enter the alias sub-menu section. Create and display aliases"; X break; X case 'b': s = X "b = Bounce (remail) a message to someone as if you have never seen it"; X break; X case 'c': s = X "c = Change mailboxes, leaving the current mailbox as if 'quitting'"; X break; X case 'd': s = "d = Mark the current message for future deletion"; X break; X case ctrl('D') : X s = "^D = Mark for deletion all messages with the specified pattern"; X break; X case 'e': s = X "e = Invoke the editor on the entire mailbox, resync'ing when done"; X break; X case 'f': s = X "f = Forward the current message to someone, return address is yours"; X break; X case 'g': s = X "g = Group reply not only to the sender, but to everyone who received msg"; X break; X case 'h': s = X "h = Display message with all Headers (ignore weedout list)"; X break; X case 'j': s = X "j = Go to the next message. This is the same as the DOWN arrow"; X break; X case 'k': s = X "k = Go to the previous message. This is the same as the UP arrow"; X break; X case 'l': s = X "l = Limit displayed messages based on the specified criteria"; X break; X case 'm': s = X "m = Create and send mail to the specified person or persons"; X break; X case 'n': s = X "n = Read the current message, then move current to next messge"; X break; X case 'o': s = "o = Go to the options submenu"; X break; X case 'p': s = X "p = Print the current message or the tagged messages"; X break; X case 'q': s = X "q = Quit the mailer, asking about deletion, saving, etc"; X break; X case 'r': s = X "r = Reply to the message. This only sends to the originator of the message"; X break; X case 's': s = X "s = Save current message or tagged messages to specified file"; X break; X case 't': s = X "t = Tag a message for further operations (or untag if tagged)"; X break; X case ctrl('T') : X s = "^T = tag all messages with the specified pattern"; X break; X case 'u': X s = "u = Undelete - remove the deletion mark on the message"; X break; X case 'x': s = "x = Exit the mail system quickly"; X break; X X case '\n': X case '\r': s = "<return> = Read the current message"; X break; X X case ctrl('L'): s = "^L = Rewrite the screen"; X break; X case ctrl('?'): /* DEL */ X case ctrl('Q'): s = "Exit the mail system quickly"; X break; X default : if (isdigit(ch)) X s = "<number> = Make specified number the current message"; X } X X ClearLine(LINES-1); X Centerline(LINES-1, s); X X } while (ch != '.'); X X /** we'll never actually get here, but that's okay... **/ X X return(0); X} X Xdisplay_helpfile(section) Xint section; X{ X /*** Help me! Read file 'helpfile.<section>' and echo to screen ***/ X X FILE *hfile; X char buffer[SLEN]; X int lines=0; X X sprintf(buffer, "%s/%s.%d", helphome, helpfile, section); X X if ((hfile = fopen(buffer,"r")) == NULL) { X dprint(1, (debugfile, X "Error: Couldn't open helpfile %s (help)\n", buffer)); X error1("couldn't open helpfile %s",buffer); X return(FALSE); X } X X ClearScreen(); X X while (fgets(buffer, SLEN, hfile) != NULL) { X if (lines > LINES-3) { X PutLine0(LINES,0,"Press any key to continue: "); X (void) ReadCh(); X lines = 0; X ClearScreen(); X Write_to_screen("%s\r", 1, buffer); X } X else X Write_to_screen("%s\r", 1, buffer); X X lines++; X } X X PutLine0(LINES,0,"Press any key to return: "); X X (void) ReadCh(); X clear_error(); X X return(TRUE); X} SHAR_EOF chmod 0444 src/help.c || echo "restore of src/help.c fails" echo "x - extracting src/in_utils.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/in_utils.c && X Xstatic char rcsid[] = "@(#)$Id: in_utils.c,v 2.1 88/09/15 20:28:40 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: in_utils.c,v $ X * Revision 2.1 88/09/15 20:28:40 syd X * checked in with -k by syd at 88.09.15.20.28.40. X * X * 88/09/12 Chip Rosenthal <chip@vector> X * couple of additional toupper()/tolower() side effect instances. X * X * 88/08/27 ssw X * add deluth patches X * X * 88/08/27 ssw X * split tolower and ReadCh due to macro calls X * X * Revision 2.1 88/07/21 09:58:42 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:11 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/** Mindless I/O routines for ELM X X**/ X X#include "headers.h" X#include <errno.h> X#include <ctype.h> X X#ifdef BSD X# undef tolower X#endif X Xextern int errno; /* system error number */ X Xunsigned alarm(); X X#define isstopchar(c) (c == ' ' || c == '\t' || c == '/') X#define isslash(c) (c == '/') X#define erase_a_char() { Writechar(BACKSPACE); Writechar(' '); \ X Writechar(BACKSPACE); fflush(stdout); } X Xint Xwant_to(question, dflt, echo_answer) Xchar *question, dflt; Xint echo_answer; X{ X /** Ask 'question' at LINES-2, COLUMNS-40, returning the answer in X lower case. If 'echo_answer', then echo answer. 'dflt' is the X default answer if <return> is pressed. (Note: 'dflt' is also what X will be returned if <return> is pressed!) X **/ X register int ch, cols; X X cols = (strlen(question) < 30)? COLUMNS-40 : COLUMNS-50; X X PutLine3(LINES-3, cols,"%s%c%c", question, dflt, BACKSPACE); X fflush(stdout); X fflush(stdin); X X ch = ReadCh(); X ch = tolower(ch); X X if ( dflt == 'y' || dflt == 'n') X { X while (!( ch == 'y' || ch == 'n' || ch == '\n' || ch == '\r')) { X ch = ReadCh(); X ch = tolower(ch); X } X } X X if (echo_answer && ch > (char) ' ') { X Writechar(ch); X fflush(stdout); X } X X return(ch == '\n' || ch == '\r' ? dflt : ch); X} X Xint Xread_number(ch) Xchar ch; X{ X /** Read a number, where 'ch' is the leading digit! **/ X X char buff[SHORT_SLEN]; X int num; X X buff[0] = ch; X buff[1] = '\0'; X X PutLine0(LINES-3, COLUMNS-40,"Set current message to :"); X if (optionally_enter(buff, LINES-3, COLUMNS-15, TRUE) == -1) X return(current); X X sscanf(buff,"%d", &num); X return(num); X} X Xint Xoptionally_enter(string, x, y, append_current) Xchar *string; Xint x,y, append_current; X{ X /** This will display the string on the screen and allow the user to X either accept it (by pressing RETURN) or alter it according to X what the user types. The various flags are: X string is the buffer to use (with optional initial value) X x,y is the location we're at on the screen (-1,-1 means X that we can't use this info and need to explicitly X use backspace-space-backspace sequences) X append_current means that we have an initial string and that X the cursor should be placed at the END of the line, X not the beginning (the default). X X If we hit an interrupt or EOF we'll return non-zero. X **/ X X int ch; X register int ch_count = 0, index = 0, use_cursor_control; X X clearerr(stdin); X X if ((use_cursor_control = (! mail_only && x >= 0 && y >= 0))) X PutLine1(x, y, "%s", string); X else X printf("%s", string); X X CleartoEOLN(); X X if (! append_current) { X if (use_cursor_control) X MoveCursor(x,y); X else X non_destructive_back_up(strlen(string)); X } X else X index = strlen(string); X X if (cursor_control) X transmit_functions(OFF); X X /** now we have the screen as we want it and the cursor in the X right place, we can loop around on the input and return the X string as soon as the user presses <RETURN> X **/ X X do { X ch = getchar(); X X if (ch == ctrl('D') || ch == EOF) { /* we've hit EOF */ X if (cursor_control) X transmit_functions(ON); X return(1); X } X X if (ch_count++ == 0) { X if (ch == '\n' || ch == '\r') { X if (cursor_control) X transmit_functions(ON); X return(0); X } X else if (! append_current) { X CleartoEOLN(); X index = (append_current? strlen(string) : 0); X } X } X X /* the following is converted from a case statement to X allow the variable characters (backspace, kill_line X and break) to be processed. Case statements in X C require constants as labels, so it failed ... X */ X X if (ch == backspace) { X if (index > 0) { X Writechar(BACKSPACE); X index--; X } X Writechar(' '); X Writechar(BACKSPACE); X fflush(stdout); X } X else if (ch == EOF || ch == '\n' || ch == '\r') { X string[index] = '\0'; X if (cursor_control) X transmit_functions(ON); X return(0); X } X else if (ch == ctrl('W')) { /* back up a word! */ X if (index == 0) X continue; /* no point staying here.. */ X index--; X if (isslash(string[index])) { X erase_a_char(); X } X else { X while (index >= 0 && isspace(string[index])) { X index--; X erase_a_char(); X } X X while (index >= 0 && ! isstopchar(string[index])) { X index--; X erase_a_char(); X } X index++; /* and make sure we point at the first AVAILABLE slot */ X } X } X else if (ch == ctrl('R')) { X string[index] = '\0'; X if (use_cursor_control) { X PutLine1(x,y, "%s", string); X CleartoEOLN(); X } X else X printf("\n\r%s", string); X } X else if (ch == kill_line) { X if (use_cursor_control) X MoveCursor(x,y); X else X back_up(index+1); X CleartoEOLN(); X index = 0; X } X else if (ch == '\0') { X if (cursor_control) X transmit_functions(ON); X fflush(stdin); /* remove extraneous chars, if any */ X string[0] = '\0'; /* clean up string, and... */ X return(-1); X } X else { /* default case */ X X string[index++] = ch; X Writechar(ch); X } X } while (index < SLEN); X X string[index] = '\0'; X X if (cursor_control) X transmit_functions(ON); X X return(0); X} X Xint Xpattern_enter(string, alt_string, x, y, alternate_prompt) Xchar *string, *alt_string, *alternate_prompt; Xint x,y; X{ X /** This function is functionally similar to the routine X optionally-enter, but if the first character pressed X is a '/' character, then the alternate prompt and string X are used rather than the normal one. This routine X returns 1 if alternate was used, 0 if not X **/ X X int ch; X register index = 0; X X PutLine1(x, y, "%s", string); X CleartoEOLN(); X MoveCursor(x,y); X X if (cursor_control) X transmit_functions(OFF); X X ch = getchar(); X X if (ch == '\n' || ch == '\r') { X if (cursor_control) X transmit_functions(ON); X return(0); /* we're done. No change needed */ X } X X if (ch == '/') { X PutLine1(x, 0, "%s", alternate_prompt); X CleartoEOLN(); X (void) optionally_enter(alt_string, x, strlen(alternate_prompt)+1, X FALSE); X return(1); X } X X CleartoEOLN(); X X index = 0; X X if (ch == kill_line) { X MoveCursor(x,y); X CleartoEOLN(); X index = 0; X } X else if (ch != backspace) { X Writechar(ch); X string[index++] = ch; X } X else if (index > 0) { X index--; X erase_a_char(); X } X else { X Writechar(' '); X Writechar(BACKSPACE); X } X X do { X fflush(stdout); X ch = getchar(); X X /* the following is converted from a case statement to X allow the variable characters (backspace, kill_line X and break) to be processed. Case statements in X C require constants as labels, so it failed ... X */ X X if (ch == backspace) { X if (index > 0) { X index--; X erase_a_char(); X } X else { X Writechar(' '); X Writechar(BACKSPACE); X } X } X else if (ch == '\n' || ch == '\r') { X string[index] = '\0'; X if (cursor_control) X transmit_functions(ON); X return(0); X } X else if (ch == ctrl('W')) { X if (index == 0) X continue; /* no point staying here.. */ X index--; X if (isslash(string[index])) { X erase_a_char(); X } X else { X while (index >= 0 && isspace(string[index])) { X index--; X erase_a_char(); X } X X while (index >= 0 && ! isstopchar(string[index])) { X index--; X erase_a_char(); X } X index++;/* and make sure we point at the first AVAILABLE slot */ X } X } X else if (ch == ctrl('R')) { X string[index] = '\0'; X if (!mail_only) { X PutLine1(x,y, "%s", string); X CleartoEOLN(); X } X else X printf("\n\r%s", string); X } X else if (ch == kill_line) { X MoveCursor(x,y); X CleartoEOLN(); X index = 0; X } X else if (ch == '\0') { X if (cursor_control) X transmit_functions(ON); X fflush(stdin); /* remove extraneous chars, if any */ X string[0] = '\0'; /* clean up string, and... */ X return(-1); X } X else { /* default case */ X X string[index++] = ch; X Writechar(ch); X } X } while (index < SLEN); X X string[index] = '\0'; X X if (cursor_control) X transmit_functions(ON); X return(0); X} X Xback_up(spaces) Xint spaces; X{ X /** this routine is to replace the goto x,y call for when sending X mail without starting the entire "elm" system up... **/ X X while (spaces--) { X erase_a_char(); X } X} X Xnon_destructive_back_up(spaces) Xint spaces; X{ X /** same as back_up() but doesn't ERASE the characters on the screen **/ X X while (spaces--) X Writechar(BACKSPACE); X fflush(stdout); X} X Xint XGetPrompt() X{ X /** This routine does a read/timeout for a single character. X The way that this is determined is that the routine to X read a character is called, then the "errno" is checked X against EINTR (interrupted call). If they match, this X returns NO_OP_COMMAND otherwise it returns the normal X command. X **/ X X int ch; X X if (timeout > 0) { X alarm((unsigned) timeout); X errno = 0; /* we actually have to do this. *sigh* */ X ch = ReadCh(); X if (errno == EINTR) ch = NO_OP_COMMAND; X alarm((unsigned) 0); X } X else X ch = ReadCh(); X X return(ch); X} SHAR_EOF chmod 0444 src/in_utils.c || echo "restore of src/in_utils.c fails" echo "x - extracting src/init.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/init.c && X Xstatic char rcsid[] = "@(#)$Id: init.c,v 2.1 88/09/15 20:28:42 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: init.c,v $ X * Revision 2.1 88/09/15 20:28:42 syd X * checked in with -k by syd at 88.09.15.20.28.42. X * X * 88/09/02 Syd Weinstein X * added version buffer init and expansion X * X * 88/09/01 Rob Bernardo <gatech!pbhyf.PacBell.COM!rob> X * 1. It allows the user to use the -z flags and -f [filename] flag X * 2. Puts elm in raw mode earlier on than before so that any commands X * X * 88/08/27 ssw X * add deluth patches X * X * Revision 2.1 88/07/21 09:58:45 edc X * Final hacks and cleanup to the 2.1 alpha test release. X * X * Revision 2.0 88/06/27 17:25:12 edc X * The original 2.0 gamma sources as leaked from HP X * X * X * X ******************************************************************************/ X X/***** Initialize - read in all the defaults etc etc X*****/ X X#include "headers.h" X#include "patchlevel.h" X X#ifdef BSD X# include <sgtty.h> X#else X# include <termio.h> X#endif X X#include <pwd.h> X X#ifdef BSD X# include <sys/time.h> X#else X# include <time.h> X#endif X X#include <signal.h> X#include <ctype.h> X#include <errno.h> X X#ifdef BSD X#undef toupper X#undef tolower X#endif X Xextern int errno; /* system error number on failure */ Xextern char version_buff[]; X Xchar *error_name(), *error_description(); X Xchar *expand_logname(), *getenv(), *getlogin(), *strcpy(), *strcat(); Xunsigned short getgid(), getuid(); Xvoid exit(); X Xchar *malloc(); X Xinitialize(initscreen_too) Xint initscreen_too; X{ X /** initialize the whole ball of wax. If "initscreen_too" then X call init_screen where appropriate.. X **/ X struct passwd *pass, *getpwnam(); X X register int i, j; X int quit_signal(), term_signal(), ill_signal(), X fpe_signal(), bus_signal(), segv_signal(), X alarm_signal(), pipe_signal(), hup_signal(); X#ifdef SIGTSTP X int sig_user_stop(), sig_return_from_user_stop(); X#endif X char buffer[SLEN], *cp; X X sprintf(version_buff, "%s PL%d", VERSION, PATCHLEVEL); X Raw(ON); X X userid = getuid(); X groupid = getgid(); X X (void)umask(077); /* make all newly created files private */ X X strcpy(home, ((cp = getenv("HOME")) == NULL)? "" : cp); X strcpy(shell,((cp = getenv("SHELL")) == NULL)? default_shell : cp); X strcpy(pager,((cp = getenv("PAGER")) == NULL)? default_pager : cp); X X#ifdef DEBUG X if (debug) { /* setup for dprint() statements! */ X char newfname[SLEN], filename[SLEN]; X X sprintf(filename, "%s/%s", home, DEBUGFILE); X if (access(filename, ACCESS_EXISTS) == 0) { /* already one! */ X sprintf(newfname,"%s/%s", home, OLDEBUG); X (void) unlink(newfname); X (void) link(filename, newfname); X (void) unlink(filename); X } X X /* Note what we just did up there: we always save the old X version of the debug file as OLDEBUG, so users can mail X copies of bug files without trashing 'em by starting up X the mailer. Dumb, subtle, but easy enough to do! X */ X X if ((debugfile = fopen(filename, "w")) == NULL) { X debug = 0; /* otherwise 'leave' will try to log! */ X leave(fprintf(stderr,"Could not open file %s for debug output!\n", X filename)); X } X chown(filename, userid, groupid); /* file owned by user */ X X fprintf(debugfile, X "Debug output of the ELM program (at debug level %d). Version %s\n\n", X debug, version_buff); X } X#endif X X if (initscreen_too) /* don't set up unless we need to! */ X if ((i = InitScreen()) < 0) { X if (i == -1) { X printf( X"Sorry, but you must specify what type of terminal you're on if you want to\n"); X printf( X"run the \"elm\" program...(you need your environment variable \"TERM\" set)\n" X ); X dprint(1,(debugfile,"No $TERM variable in environment!\n")); X } X else if (i == -2) { X printf( X"You need a cursor-addressable terminal to run \"elm\" and I can't find any\n"); X printf( X"kind of termcap entry for \"%s\" - check your \"TERM\" setting...\n", X getenv("TERM")); X dprint(1, X (debugfile,"$TERM variable is an unknown terminal type!\n")); X } X else { X printf("Failed trying to initialize your terminal entry: unknown return code %d\n", i); X dprint(1, (debugfile, "Initscreen returned unknown code: %d\n", X i)); X } X Raw(OFF); X exit(1); /* all the errors share this exit statement */ X } X X if (debug < 5) { /* otherwise let the system trap 'em! */ X signal(SIGINT, SIG_IGN); X signal(SIGQUIT, quit_signal); /* Quit signal */ X signal(SIGTERM, term_signal); /* Terminate signal */ X signal(SIGILL, ill_signal); /* Illegal instruction */ X signal(SIGFPE, fpe_signal); /* Floating point exception */ X signal(SIGBUS, bus_signal); /* Bus error */ X signal(SIGSEGV, segv_signal); /* Segmentation Violation */ X signal(SIGHUP, hup_signal); /* HangUp (line dropped) */ X } X else { X dprint(3,(debugfile, X "\n*** Elm-Internal Signal Handlers Disabled due to debug level %d ***\n\n", X debug)); X } X X signal(SIGALRM, alarm_signal); /* Process Timer Alarm */ X signal(SIGPIPE, pipe_signal); /* Illegal Pipe Operation */ X#ifdef SIGTSTP X signal(SIGTSTP, sig_user_stop); /* Suspend signal from tty */ X signal(SIGCONT, sig_return_from_user_stop); /* Continue Process */ X#endif X X get_term_chars(); X X gethostname(hostname, sizeof(hostname)); X X#ifdef BSD X if ((cp = getenv("USER")) == NULL) X#else X if ((cp = getenv("LOGNAME")) == NULL) X#endif X if ((cp = getlogin()) == NULL) X cuserid(username); X else X strcpy(username, cp); X else X strcpy(username, cp); X X /* now let's get the full username.. */ X X if ((pass = getpwnam(username)) == NULL) { X error("Couldn't read password entry??"); X strcpy(full_username, username); X } X else { X /* fix for this section from Don Joslyn of Nova University */ X for (i=0,j=0; pass->pw_gecos[i] != '\0' && pass->pw_gecos[i] != ','; X i++) X if (pass->pw_gecos[i] == '&') { X full_username[j] = '\0'; X strcat(full_username, expand_logname()); X j = strlen(full_username); X } X else X full_username[j++] = pass->pw_gecos[i]; X full_username[j] = '\0'; X } X X if ((cp = getenv("EDITOR")) == NULL) X strcpy(editor,default_editor); X else X strcpy(editor, cp); X strcpy(alternative_editor, editor); /* this one can't be changed! */ X X if (! mail_only) { X mailbox[0] = '\0'; X strcpy(prefixchars, "> "); /* default message prefix */ X sprintf(calendar_file, "%s/%s", home, dflt_calendar_file); X } X X local_signature[0] = remote_signature[0] = '\0'; /* NULL! */ X X read_rc_file(); /* reading the .elm/elmrc next... */ X X /** now try to expand the specified filename... **/ X X if (strlen(infile) > 0) { X (void) expand_filename(infile); X if (check_size) X if(check_mailfile_size() != 0) { X Raw(OFF); X exit(0); X } X if ((errno = can_access(infile, READ_ACCESS))) { X dprint(1, (debugfile, X "Error: given file %s as mailbox - unreadable (%s)!\n", X infile, error_name(errno))); X fprintf(stderr,"Can't open mailbox '%s' for reading!\n", infile); X Raw(OFF); X exit(1); X } X } else { X if (check_size) { X if(check_mailfile_size() != 0) { X Raw(OFF); X exit(0); X } X } X } X X /** check to see if the user has defined a LINES or COLUMNS X value different to that in the termcap entry (for X windowing systems, of course!) **/ X X ScreenSize(&LINES, &COLUMNS); X X if ((cp = getenv("LINES")) != NULL && isdigit(*cp)) { X sscanf(cp, "%d", &LINES); X LINES -= 1; /* kludge for HP Window system? ... */ X } X X if ((cp = getenv("COLUMNS")) != NULL && isdigit(*cp)) X sscanf(cp, "%d", &COLUMNS); X X /** fix the shell if needed **/ X X if (shell[0] != '/') { X sprintf(buffer, "/bin/%s", shell); X strcpy(shell, buffer); X } X X if (! mail_only) { X mailbox_defined = (mailbox[0] != '\0'); X X /* get the cursor control keys... */ X X cursor_control = FALSE; X X if ((cp = return_value_of("ku")) != NULL) X { X strcpy(up, cp); X if ((cp = return_value_of("kd")) == NULL) X cursor_control = FALSE; X else X { X strcpy(down, cp); X cursor_control = TRUE; X transmit_functions(ON); X } X } X X strcpy(start_highlight, "->"); X end_highlight[0] = '\0'; X X if (!arrow_cursor) { /* try to use inverse bar instead */ X if ((cp = return_value_of("so")) != NULL) { X strcpy(start_highlight, cp); X if ((cp = return_value_of("se")) == NULL) X strcpy(start_highlight, "->"); X else { X strcpy(end_highlight, cp); X has_highlighting = TRUE; X } X } X } X } X X /** allocate the first KLICK headers... **/ X X if ((header_table = (struct header_rec *) malloc(KLICK * X sizeof(struct header_rec))) == NULL) { X fprintf(stderr,"\n\r\n\rCouldn't allocate initial headers!\n\r\n"); X leave(); X } X max_headers = KLICK; /* we have those preallocated */ X X /** now cruise along... **/ X X if (! mail_only) { X if (mini_menu) X headers_per_page = LINES - 13; X else X headers_per_page = LINES - 8; /* 5 more headers! */ X X newmbox(1,FALSE, TRUE); /* read in the mailbox! */ X } X X#ifdef DEBUG X if (debug >= 2 && debug < 10) { X fprintf(debugfile, X"hostname = %-20s \tusername = %-20s \tfullname = %-20s\n", X hostname, username, full_username); X X fprintf(debugfile, X"home = %-20s \teditor = %-20s \tmailbox = %-20s\n", X home, editor, mailbox); X X fprintf(debugfile, X"infile = %-20s \tfolders = %-20s \tprintout = %-20s\n", X infile, folders, printout); X X fprintf(debugfile, X"savefile = %-20s \tprefix = %-20s \tshell = %-20s\n\n", X savefile, prefixchars, shell); X X if (signature) X fprintf(debugfile, X "local-signature = \"%s\" and \tremote-signature = \"%s\"\n\n", X local_signature, remote_signature); X } X#endif X} X Xget_term_chars() X{ X /** This routine sucks out the special terminal characters X ERASE and KILL for use in the input routine. The meaning X of the characters are (dare I say it?) fairly obvious... **/ X X#ifdef BSD X struct sgttyb term_buffer; X X# define TCGETA TIOCGETP X X#else X struct termio term_buffer; X#endif X X if (ioctl(STANDARD_INPUT, TCGETA, &term_buffer) == -1) { X dprint(1, (debugfile, X "Error: %s encountered on ioctl call (get_term_chars)\n", X error_name(errno))); X /* set to defaults for terminal driver */ X backspace = BACKSPACE; X kill_line = ctrl('U'); X } X else { X#ifdef BSD X backspace = term_buffer.sg_erase; X kill_line = term_buffer.sg_kill; X#else X backspace = term_buffer.c_cc[VERASE]; X kill_line = term_buffer.c_cc[VKILL]; X#endif X } X} X Xchar *expand_logname() X{ X /** Return logname in a nice format (for expanding "&" in the X /etc/passwd file) **/ X X static char buffer[SLEN]; X register int i; X X if (strlen(username) == 0) X buffer[0] = '\0'; X else { X buffer[0] = toupper(username[0]); X X for (i=1; username[i] != '\0'; i++) X buffer[i] = tolower(username[i]); X X buffer[i] = '\0'; X } X X return( (char *) buffer); X} SHAR_EOF chmod 0444 src/init.c || echo "restore of src/init.c fails" echo "x - extracting src/leavembox.c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/leavembox.c && X Xstatic char rcsid[] = "@(#)$Id: leavembox.c,v 2.2 88/09/15 20:28:45 syd Exp $"; X X/******************************************************************************* X * The Elm Mail System - $Revision: 2.2 $ $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: leavembox.c,v $ X * Revision 2.2 88/09/15 20:28:45 syd X * checked in with -k by syd at 88.09.15.20.28.45. 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/01 Rob Bernardo <gatech!pbhyf.PacBell.COM!rob> SHAR_EOF echo "End of part 13" echo "File src/leavembox.c is continued in part 14" echo "14" > 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