wswietse@eutrc3.UUCP (Wietse Venema) (04/21/88)
comp.sources.misc: Volume 3, Issue 8 Submitted-By: "Wietse Venema" <wswietse@eutrc3.UUCP> Archive-Name: pcmail/Part7 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 7 (of 8)." # Contents: Implementation call.c clmap.h comm.c defs.h kp.h # mailfile.c mailsh.h makework.c newseqno.c pager.h params.h # protomsg.c rmtname.c scanwork.c screen.c smail.c status.h submit.c # sysdep.h termcap/termcap.h termcap/tgetent.c termcap/tgetflag.c # termcap/tgetnum.c termcap/tgetstr.c termcap/tgoto.c # termcap/tputs.c window.h work.h # Wrapped by wietse@eutwc1 on Wed Apr 20 16:45:49 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f Implementation -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"Implementation\" else echo shar: Extracting \"Implementation\" \(1415 characters\) sed "s/^X//" >Implementation <<'END_OF_Implementation' XMESSAGE DATA BASE X XThe message data base resides in the mail spool directory (de- Xfined with the MAILDIR environment variable). There are various Xclasses of message files: X X - mail received from the network X X - mail ready to send over the network X X - messages in preparation X XIn addition there are administrative files (LOGFILE, alias data Xbase and communications parameters). X XEach message takes two files: a data file (with the actual mes- Xsage) and a meta file (with originator or destination addresses, Xor a one-line summary in case of a message in preparation). X XData/meta file names are constructed by concatenating a single- Xcharacter prefix with a five-digit sequence number. Corresponding Xdata and meta files have the same sequence number. The prefix Xcharacters are: X X E message in preparation X C description of message X X N message received from the net X H originator address in case of an unread message X O originator address in case of already read message X X D message ready to be sent over the net X X destination of that message. X XAdministrative files are X X LOGFILE transaction log X s00000 communications parameters X a00000 alias data base X XAll files in the mail directory are ordinary text files, with a Xpossible exception for the message in preparation (this depends Xon the editor being used). X XFiles in the mail directory are normally write-protected to Xprevent accidents. X END_OF_Implementation if test 1415 -ne `wc -c <Implementation`; then echo shar: \"Implementation\" unpacked with wrong size! fi # end of overwriting check fi if test -f call.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"call.c\" else echo shar: Extracting \"call.c\" \(2303 characters\) sed "s/^X//" >call.c <<'END_OF_call.c' X/*++ X/* NAME X/* call 3 X/* SUMMARY X/* call remote unix system X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* int call() X/* DESCRIPTION X/* call() is invoked when the user wants to contact the unix host. X/* It asks for a uucp password. After the user has provided this X/* the password is erased from the screen and the mail server is called X/* by the cico file transfer program. Afterwards, the rmail program is X/* invoked to extract originator addresses from new mail messages. In X/* order to force a new mailbox display the current mail display is junked. X/* FUNCTIONS AND MACROS X/* kbdinp(), kbdrest(), invoke(), kbdinit(), errdisp(), junk_desk() X/* COMMANDS X/* cico remote login, file transfer X/* rmail extract originator from new mail X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sun Apr 5 18:27:18 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:35:12 MET 1988 X/* VERSION/RELEASE X/* 1.4 X/*--*/ X X#include "defs.h" X#include "path.h" X#include "screen.h" X#include "pager.h" X#include "mailsh.h" X Xhidden int do_call(); /* forward declarations */ X X/* call - set up dialogue for password */ X Xpublic int call() X{ X static Screen screen[] = { X STRING, 0, do_call,int_error, X 0, 0, 0, X "Press ESC to cancel. Enter password:", X }; X X kbdinp(screen); /* ask password */ X return(S_REDRAW); /* say screen has changed */ X} X X/* do_call - make the call to a unix host */ X Xstatic int do_call(pwd) Xchar *pwd; X{ X register int stat; X X clrtoeol(); /* erase password kludge */ X patience(); /* this may take some time */ X kbdrest(); /* reset user tty modes */ X ((stat = invokelp(CICO,"-p",pwd,(char *)0)) /* try to call host */ X || (stat = invokelp(RMAIL,(char *)0))); /* try to extract originators */ X kbdinit(); /* set user tty modes */ X junk_desk(); /* force new mailbox display */ X if (stat) { /* check error status */ X errdisp(stat); /* notify user of problem */ X return(S_BREAK|S_REDRAW); /* redisplay, stop caller */ X } else { X return(S_BREAK); /* just stop caller */ X } X} END_OF_call.c if test 2303 -ne `wc -c <call.c`; then echo shar: \"call.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f clmap.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"clmap.h\" else echo shar: Extracting \"clmap.h\" \(972 characters\) sed "s/^X//" >clmap.h <<'END_OF_clmap.h' X/* Map names to lower case for the MicroSoft 3.0 CL compiler/linker command */ X X#define set_tty SET_TTY /* find current settings, and initialize */ X#define reset_tty RESET_TTY /* reset to settings that set_tty() found */ X#define get_msr GET_MSR /* get MSR byte from port. */ X#define init_comm INIT_COMM /* initialize the comm port interupts, */ X#define uninit_comm UNINIT_COMM /* remove initialization, */ X#define set_xoff SET_XOFF /* enable/disable XON/XOFF, */ X#define get_xoff GET_XOFF /* read XON/XOFF state, */ X#define rcvd_xoff RCVD_XOFF /* returns true if XOFF rcvd, */ X#define sent_xoff SENT_XOFF /* true if XOFF sent, */ X#define inp_cnt INP_CNT /* returns count of rcv chars, */ X#define inp_char INP_CHAR /* get one char from buffer, */ X#define inp_flush INP_FLUSH /* flush input buffer, */ X#define outp_char OUTP_CHAR /* output a character, */ END_OF_clmap.h if test 972 -ne `wc -c <clmap.h`; then echo shar: \"clmap.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f comm.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"comm.c\" else echo shar: Extracting \"comm.c\" \(1184 characters\) sed "s/^X//" >comm.c <<'END_OF_comm.c' X/*++ X/* NAME X/* comm 3 X/* SUMMARY X/* cico communications parameters retrieval X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* #include "params.h" X/* #include "comm.h" X/* DESCRIPTION X/* Implementation module for communications parameters and other X/* global stuff that has not yet found its place. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sun Apr 12 13:37:12 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:36:16 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ X X#include "defs.h" X#include "params.h" X#include "comm.h" X Xpublic int ttfd = -1; /* comm. port */ Xpublic Info *comm = 0; /* comm. info */ Xpublic char *password = 0; /* uucp password */ Xpublic char rmthost[BUFSIZ] = "Unknown"; /* remote host name */ X Xpublic int (*Read)() = 0; /* protocol read function */ Xpublic int (*Write)() = 0; /* protocol write function */ Xpublic int (*Close)() = 0; /* protocol close function */ X Xpublic char msgin[MSGBUF]; /* message receive buffer */ Xpublic char msgout[MSGBUF]; /* message send buffer */ END_OF_comm.c if test 1184 -ne `wc -c <comm.c`; then echo shar: \"comm.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f defs.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"defs.h\" else echo shar: Extracting \"defs.h\" \(2112 characters\) sed "s/^X//" >defs.h <<'END_OF_defs.h' X/*++ X/* NAME X/* defs 5 X/* SUMMARY X/* program-independent definitions X/* PROJECT X/* pc-mail X/* PACKAGE X/* all X/* SYNOPSIS X/* #include "defs.h" X/* DESCRIPTION X/* .nf X X/* /* this file is for program-independent definitions */ X X#include <stdio.h> X Xextern int errno; Xextern char *sys_errlist[]; X X#define hidden static /* for functions local to a module */ X#define public /* for globally visible functions/data */ X X/* /* X* Take care of differences between various flavours of C library X* function names. Define macros where functions are missing. X*/ X X#if (SIII|SYSV|MSDOS) X# define index strchr X# define rindex strrchr X#endif X X#ifdef unix X# define rename(from,to) (link(from,to) || unlink(from)) X#endif X X/* /* X* The delay macro is used during the dial-out sequence, e.g. when we X* are sending commands to a modem. It is supposed to produce a short X* delay of a few milliseconds so that the modem can see a small gap X* between successive characters. X*/ X X#define delay() chdir(".") X X/* /* X* Standard macros. X*/ X X#define MIN(a,b) ((a) < (b) ? (a) : (b)) X#define MAX(x,y) ((x) > (y) ? (x) : (y)) X#define CALL(p) (*(p)) X X/* /* library functions with non-default return types */ X Xextern char *strtok(); Xextern char *fgets(); Xextern char *strcpy(); Xextern char *strncpy(); Xextern char *strcat(); Xextern char *strncat(); Xextern char *malloc(); Xextern void free(); Xextern char *getenv(); Xextern char *asctime(); Xextern long time(); Xextern char *index(); Xextern char *rindex(); Xextern char *memcpy(); Xextern void exit(); X X/* /* local utility functions with non-default return types */ X Xextern char *myalloc(); Xextern char *strcons(); Xextern char **strvec(); Xextern char *vecstr(); X/* SEE ALSO X/* path(5) system-dependent path names X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Mon Apr 6 16:58:42 GMT+1:00 1987 X/* LAST MODIFICATION X/* Wed Apr 6 00:19:43 MET 1988 X/* VERSION/RELEASE X/* 1.4 X/*--*/ X END_OF_defs.h if test 2112 -ne `wc -c <defs.h`; then echo shar: \"defs.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f kp.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"kp.h\" else echo shar: Extracting \"kp.h\" \(2264 characters\) sed "s/^X//" >kp.h <<'END_OF_kp.h' X/*++ X/* NAME X/* kp 5 X/* SUMMARY X/* definitions file for k protocol X/* PACKAGE X/* uucp across the thenet X/* SYNOPSIS X/* #include "kp.h" X/* DESCRIPTION X/* The following definitions are made in the file kp.h: X/* .nf X X/* /* Need stderr definition from stdio.h */ X X#include "stdio.h" X X/* /* Symbol Definitions */ X X#define PACKSIZ 256 /* Packet size sent by this uucico */ X#define MAXPACKSIZ 1024 /* Maximum packet size I can receive */ X#define SOH 16 /* Start of header */ X#define CR 13 /* ASCII Carriage Return */ X#define SP 32 /* ASCII Blank */ X X#define MAXTRY 10 /* Times to retry a packet */ X X/* /* 5 secs timeout interval turns out to be too short, when THEnet is busy */ X X#define TIMEOUT 10 /* Seconds after which I should be timed out */ X X#define TRUE 1 /* Boolean constants */ X#define FALSE 0 X X#define NULLP (char*)0 /* NULL pointer */ X#define FAIL -1 /* Read/write return value in case of error */ X#define TIME -2 /* Receive packet return status if timed out */ X X#define OUT 6 /* Nr. of data bits per char in packet */ X#define IN 8 /* Nr. of data bits per byte */ X#define STEP 2 /* Difference between previous two */ X#define MASK 077 /* Mask for number of data bits in packet */ X X/* /* Macro Definitions */ X X#define tosix(ch) (((ch) & MASK) + SP) X#define unsix(ch) (((ch) - SP) & MASK) X X#define tochar(ch) ((ch) + SP) X#define unchar(ch) ((ch) - SP) X X/* /* intercept system calls in case of non-unix operating systems */ X X#ifndef unix X X#define read xread X#define write xwrite X#define alarm(x) /* nothing */ X#define signal(x,y) /* nothing */ X#define DEBUG(x,y,z) if (dflag >= x) printf(y,z) X Xextern int dflag; X X#else X X#define DEBUG(l,f,s) if (Debug >= l) fprintf(stderr,f,s) X X/* /* Declarations */ X Xextern int Debug; /* Debugging level */ X X#endif X/* AUTHOR(S) X/* Wietse Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Mon Feb 3 22:14:23 MET 1986 X/* LAST MODIFICATION X/* Mon Apr 4 23:43:00 MET 1988 X/* VERSION/RELEASE X/* 2.4 X/*--*/ END_OF_kp.h if test 2264 -ne `wc -c <kp.h`; then echo shar: \"kp.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f mailfile.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mailfile.c\" else echo shar: Extracting \"mailfile.c\" \(1911 characters\) sed "s/^X//" >mailfile.c <<'END_OF_mailfile.c' X/*++ X/* NAME X/* mailfile 3 X/* SUMMARY X/* mail the file currently being displayed X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "mailsh.h" X/* X/* int mailfile() X/* DESCRIPTION X/* mailfile() is invoked when the user wants to mail a copy of a X/* file or message to some person. The name of the file is taken X/* from the global string variable message[]. X/* X/* The user is asked for a destination, the necessary spool files X/* are created and the main menu display is junked. X/* FUNCTIONS AND MACROS X/* kbdinp(), junk_desk() X/* FILES X/* message and meta file in the spool directory. X/* SEE ALSO X/* pager(3), pager(5), kbdinp(3) X/* DIAGNOSTICS X/* An error message is displayed in case of problems. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Mon Apr 4 13:03:44 MET 1988 X/* LAST MODIFICATION X/* Mon Apr 4 23:44:29 MET 1988 X/* VERSION/RELEASE X/* 1.1 X/*--*/ X X#include "defs.h" X#include "path.h" X#include "screen.h" X#include "mailsh.h" X Xhidden int queue_mailfile(); X X/* mailfile - ask mail address to send file to */ X Xpublic int mailfile() X{ X static Screen screen[] = { X STRING, 0, queue_mailfile, int_error, X 0, 0, when, X "Press ESC to cancel. Send message to:", X }; X X kbdinp(screen); /* ask message destination */ X return(S_REDRAW); /* say screen has changed */ X} X X/* queue_mailfile - queue a copy to another person */ X Xhidden int queue_mailfile(to) Xchar *to; X{ X register int stat; X X if (stat = submit(message,to)) { X errdisp(stat); /* notify user */ X return(S_BREAK|S_REDRAW); /* say screen has changed */ X } else { X junk_desk(); /* say mail box has changed */ X return(S_BREAK); /* terminate caller */ X } X} END_OF_mailfile.c if test 1911 -ne `wc -c <mailfile.c`; then echo shar: \"mailfile.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f mailsh.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"mailsh.h\" else echo shar: Extracting \"mailsh.h\" \(1484 characters\) sed "s/^X//" >mailsh.h <<'END_OF_mailsh.h' X/*++ X/* NAME X/* mailsh 5 X/* SUMMARY X/* global declarations for mail shell X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "mailsh.h" X/* DESCRIPTION X/* .nf X X/* /* Global declarations for the mail shell */ X Xextern int alias(); /* alias.c */ Xextern int call(); /* call.c */ Xextern void desk(); /* desk.c */ Xextern int junk_desk(); /* desk.c */ Xextern char message[]; /* desk.c */ Xextern char comment[]; /* desk.c */ Xextern void patience(); /* deskutil.c */ Xextern int when(); /* deskutil.c */ Xextern int unspool(); /* deskutil.c */ Xextern int save(); /* deskutil.c */ Xextern int print(); /* deskutil.c */ Xextern int delete(); /* deskutil.c */ Xextern char *tstamp(); /* deskutil.c */ Xextern int edit(); /* edit.c */ Xextern int file(); /* file.c */ Xextern int junk_file(); /* file.c */ Xextern int kbdinp(); /* kbdinp.c */ Xextern void kbdinit(); /* kbdinp.c */ Xextern void kbdrest(); /* kbdinp.c */ Xextern int mail(); /* mail.c */ Xextern int mailfile(); /* mailfile.c */ Xextern int makework(); /* makework.c */ Xextern int mbox(); /* mbox.c */ Xextern int setup(); /* setup.c */ X/* SEE ALSO X/* alias(3), call(3), edit(3) and so on. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sat Apr 16 16:42:07 MET 1988 X/* LAST MODIFICATION X/* Sat Apr 16 16:42:07 MET 1988 X/* VERSION/RELEASE X/* 1.0 X/*--*/ END_OF_mailsh.h if test 1484 -ne `wc -c <mailsh.h`; then echo shar: \"mailsh.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f makework.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"makework.c\" else echo shar: Extracting \"makework.c\" \(1893 characters\) sed "s/^X//" >makework.c <<'END_OF_makework.c' X/*++ X/* NAME X/* makework 3 X/* SUMMARY X/* save the file currently being displayed as a work file X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "mailsh.h" X/* X/* int makework() X/* DESCRIPTION X/* makework() is invoked when the user wants to capture something X/* in a work file (i.e. something that will probably be sent X/* as mail lateron). It asks for a one-line summary (to X/* identify the work file in the main menu) and creates the X/* the necessary files in the spool directory. X/* X/* The name of the source file is taken from the global string X/* message[]. X/* FUNCTIONS AND MACROS X/* kbdinp(), junk_desk() X/* FILES X/* A work file and meta file in the spool directory. X/* SEE ALSO X/* pager(3), pager(5), kbdinp(3) X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Mon Apr 4 12:29:18 MET 1988 X/* LAST MODIFICATION X/* Mon Apr 4 23:44:58 MET 1988 X/* VERSION/RELEASE X/* 1.1 X/*--*/ X X#include "defs.h" X#include "path.h" X#include "screen.h" X#include "mailsh.h" X Xhidden int install_work(); X X/* makework - ask for an summary for message to work on */ X Xpublic int makework() X{ X static Screen screen[] = { X STRING, 0, install_work,int_error, X 0, 0, 0, X getsummary, X }; X kbdinp(screen); /* ask for destination */ X return(S_REDRAW); /* say screen has changed */ X} X X/* install_work - install meta file and work copy */ X Xhidden int install_work(summary) Xchar *summary; X{ X register int stat; X X if (stat = workon(message,summary)) { X errdisp(stat); /* cannot create work file */ X return(S_BREAK|S_REDRAW); /* redisplay, stop caller */ X } else { X junk_desk(); /* junk message display */ X return(S_BREAK); /* terminate caller */ X } X} END_OF_makework.c if test 1893 -ne `wc -c <makework.c`; then echo shar: \"makework.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f newseqno.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"newseqno.c\" else echo shar: Extracting \"newseqno.c\" \(1244 characters\) sed "s/^X//" >newseqno.c <<'END_OF_newseqno.c' X/*++ X/* NAME X/* newseqno 3 X/* SUMMARY X/* generate sequence number for spool file X/* PROJECT X/* pc-mail X/* PACKAGE X/* general X/* SYNOPSIS X/* newseqno() X/* DESCRIPTION X/* newseqno() deduces a new spool file sequence number by looking X/* at the names of files in the spool directory. X/* BUGS X/* A sequence file would be better; both for performance, and X/* for collision detection. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sat Mar 28 18:10:53 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:45:54 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ X X#include "defs.h" X#include "path.h" X#include "dir.h" X X/* newseqno - extract sequence number from existing spool file names */ X Xpublic int newseqno() X{ X register int seqno = 0; X register char *p; X register int dd = opendir(maildir); X int tmp = 0; X X /* needs locking mechanism on multi-tasking operating systems */ X X while (p = readdir(dd)) { X if (sscanf(p+sizeof(HDRPFX)-1,"%d",&tmp) == 1 && tmp > seqno) X seqno = tmp; X } X closedir(dd); X return(seqno+1); X} END_OF_newseqno.c if test 1244 -ne `wc -c <newseqno.c`; then echo shar: \"newseqno.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f pager.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"pager.h\" else echo shar: Extracting \"pager.h\" \(2718 characters\) sed "s/^X//" >pager.h <<'END_OF_pager.h' X/*++ X/* NAME X/* pager 5 X/* SUMMARY X/* pager for display files, definitions X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "pager.h" X/* DESCRIPTION X/* The display pager manipulates various lists of line structures. X/* Each line is linked to its predecessor and to its successor. X/* X/* Besides the familiar list ops for insert/delete the pager also X/* provides "read" and "write" operations on lines, and a X/* sort utility. X/* .nf X X/* /* externally visible parts of the pager */ X X#define FORW_SORT 1 /* sort in ascending order */ X#define BACK_SORT 2 /* sort in reverse order */ X X#define PG_NOEND 1 /* suppress '-- end of display --' */ X Xtypedef struct File { X struct Line *head; /* ptr to first line in file */ X struct Line *last; /* ditto to the last line */ X struct Line *top; /* first one visible on screen */ X struct Line *curr; /* where the cursor sits */ X int opts; /* option flags */ X} File; X Xtypedef struct Line { X struct Line *prev; /* link to predecessor */ X struct Line *next; /* link to successor */ X short lineno; /* where it is on the screen */ X short llen; /* nbr of lines on the screen */ X char line[1]; /* actually, a lot of characters */ X} Line; X Xextern File *open_pager(); /* create a new display file */ Xextern void close_pager(); /* destroys an display file */ Xextern int scan_pager(); /* reads from current line */ Xextern void appd_pager(); /* appends after current line */ Xextern void del_pager(); /* delete current line */ Xextern void ins_pager(); /* inserts before current line */ Xextern void sort_pager(); /* sorts a file */ Xextern void set_pager(); /* select display file */ Xextern char *gets_pager(); /* returns current line */ Xextern void puts_pager(); /* replaces current line */ X Xextern int cp_pager(); /* copy display file to disk */ Xextern int pr_pager(); /* copy display file to printer */ Xextern int rd_pager(); /* permanent file to display file */ Xextern int ds_pager(); /* current page of current file */ Xextern int up_pager(); /* handle cursor up request */ Xextern int dn_pager(); /* handle cursor down request */ Xextern int pu_pager(); /* handle page up request */ Xextern int pd_pager(); /* handle page down request */ Xextern void mesg_pager(); /* copy message array to display file */ X/* SEE ALSO X/* path(3), window(3), window(5) X/* BUGS X/* It looks a lot like an editor, but it isn't. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Fri Apr 3 22:06:00 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:46:39 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ END_OF_pager.h if test 2718 -ne `wc -c <pager.h`; then echo shar: \"pager.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f params.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"params.h\" else echo shar: Extracting \"params.h\" \(1418 characters\) sed "s/^X//" >params.h <<'END_OF_params.h' X/*++ X/* NAME X/* params 5 X/* SUMMARY X/* communication parameter definitions X/* PROJECT X/* pc-mail X/* PACKAGE X/* library X/* SYNOPSIS X/* #include "params.h" X/* DESCRIPTION X/* .nf X X/* /* X* Identification strings for the external representation of the setup. X* The parameter setup is stored as a file, with one identification string X* and parameter value per line. The identification strings are the same X* ones as used by the mail shell (the Setup option in the initial screen). X*/ X X#define PORT "communications_port:" X#define BAUD "baud_rate:" X#define HOST "remote_host_name:" X#define LOGIN "login_name:" X#define DIAL "dialup_sequence:" X#define DISC "disconnect_sequence:" X X/* /* Table offsets for the internal representation */ X X#define P_PORT 0 X#define P_BAUD 1 X#define P_HOST 2 X#define P_LOGIN 3 X#define P_DIAL 4 X#define P_DISC 5 X X/* /* Structure of the in-core setup table. */ X Xtypedef struct { X char *ident; /* identification string */ X int length; /* length of id string */ X char *strval; /* string value of parameter */ X} Info; X Xextern Info *getparams(); /* read setup file */ X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Apr 8 15:39:23 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:47:08 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ END_OF_params.h if test 1418 -ne `wc -c <params.h`; then echo shar: \"params.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f protomsg.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"protomsg.c\" else echo shar: Extracting \"protomsg.c\" \(2344 characters\) sed "s/^X//" >protomsg.c <<'END_OF_protomsg.c' X/*++ X/* NAME X/* protomsg 3 X/* SUMMARY X/* high-level protocol message exchange X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* int isok(str) X/* char *str; X/* X/* char *talk(str) X/* char *str; X/* X/* char *hear() X/* DESCRIPTION X/* All routines in this module exchange messages via the line X/* protocol agreed upon during communications startup. X/* X/* All messages are sent including a null-byte terminator. X/* X/* isok() send a request to the remote system and X/* returns YES or NO according to the Y or N response. X/* X/* talk() send a message to the remote system and returns a X/* pointer to that message. X/* X/* hear() reads the next message from the remote system and X/* returns a pointer to the result. X/* FUNCTIONS AND MACROS X/* trap(), debug() X/* DIAGNOSTICS X/* isok() and hear() return via longjmp(systrap,E_LOST) in case X/* of timeout or protocol errors. X/* BUGS X/* Message storage is in static buffers whose contents are overwritten X/* with each call. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Thu Mar 26 16:14:57 GMT+1:00 1987 X/* LAST MODIFICATION X/* Wed Apr 6 00:21:41 MET 1988 X/* VERSION/RELEASE X/* 1.4 X/*--*/ X X#include "defs.h" X#include "params.h" X#include "comm.h" X#include "logs.h" X#include "status.h" X X/* isok - send message and get yes/no response */ X Xpublic int isok(msg) Xchar *msg; X{ X register char *s = talk(msg); X register char *r = hear(); X X if (s[0] == r[0]) { X if (r[1] == 'Y') X return(YES); X if (r[1] == 'N') X return(NO); X } X trap(E_LOST,"PROTOCOL ERROR (expected %cY or %cN, got %s)",s[0],s[0],r); X /* NOTREACHED */ X} X X/* talk - send message to other side */ X Xpublic char *talk(str) Xchar *str; X{ X debug(4)("sent \"%s\"\n",str); X if (CALL(Write)(ttfd,str,strlen(str)+1) == -1) X trap(E_LOST,"FAILED (link lost)"); X return(str); X} X X/* listen - get message from other side */ X Xpublic char *hear() X{ X register int nread; X X if ((nread = CALL(Read)(ttfd,msgin,MSGBUF)) < 0) X trap(E_LOST,"FAILED (link lost)"); X msgin[nread] = '\0'; X debug(4)("got \"%s\"\n",msgin); X return(msgin); X} END_OF_protomsg.c if test 2344 -ne `wc -c <protomsg.c`; then echo shar: \"protomsg.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f rmtname.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"rmtname.c\" else echo shar: Extracting \"rmtname.c\" \(2625 characters\) sed "s/^X//" >rmtname.c <<'END_OF_rmtname.c' X/*++ X/* NAME X/* rmtname 3 X/* SUMMARY X/* mapping between local and remote spool-file names X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* #include "params.h" X/* #include "comm.h" X/* X/* char *rmtname(head,tail) X/* int head; X/* char *tail; X/* X/* char *locname(rname) X/* char *rname; X/* DESCRIPTION X/* locname() translates a remote spool-file name to one suitable X/* for the local file system. Remote X.* file names are converted X/* to the name of the local null device. All other remote file X/* names are mapped to names of the form n<seqno> in the local X/* spool directory. X/* X/* rmtname() constructs a remote spool file name from its arguments, X/* which are a sort of broken-down local spool file name. X/* "head" specifies the type of file (Data or eXecute file). X/* "tail" is a character string holding a sequence number. X/* X/* The output for D files is: D.<rmtsys>S<xseq> X/* X/* The output for X files is: X.<thissys>X<xseq> X/* X/* xseq is the four-digit hexadecimal representation of X/* the sequence number in tail. X/* SEE ALSO X/* getwork() X/* DIAGNOSTICS X/* rmtname() returns via longjmp(systrap,E_CONFUSED) if its X/* arguments are incorrect. X/* BUGS X/* locname() and rmtname() store their result in a static area which X/* is overwritten upon each call. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Thu Mar 26 14:08:07 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:48:20 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ X X#include "defs.h" X#include "params.h" X#include "comm.h" X#include "logs.h" X#include "status.h" X#include "path.h" X Xhidden char buf[BUFSIZ]; /* storage for the result */ X X/* rmtname - map local spool file name to remote spool file name */ X Xpublic char *rmtname(head,tail) Xregister int head; Xregister char *tail; X{ X int seqno; X X sscanf(tail,"%d",&seqno); /* get sequence number */ X seqno &= 0xffff; /* truncate to four hex digs */ X X switch(head) { X case 'D': /* data file */ X sprintf(buf,"D.%sS%04x",rmthost,seqno); X return(buf); X case 'X': /* execute file */ X sprintf(buf,"X.%sX%04x",LOGIN_NAME,seqno); X return(buf); X default: /* oops */ X trap(E_CONFUSED,"INTERNAL ERROR (unexpected file type: %c)",head); X /* NOTREACHED */ X } X} X X/* locname - map remote spool-file name to local name */ X Xchar *locname(rname) Xchar *rname; X{ X if (strncmp(rname,"X.",2) == 0) { /* X. files are ignored */ X return(NULLDEV); X } else { /* everything else is kept */ X return(new_mesg(newseqno())); X } X} END_OF_rmtname.c if test 2625 -ne `wc -c <rmtname.c`; then echo shar: \"rmtname.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f scanwork.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"scanwork.c\" else echo shar: Extracting \"scanwork.c\" \(2464 characters\) sed "s/^X//" >scanwork.c <<'END_OF_scanwork.c' X/*++ X/* NAME X/* scanwork 3 X/* SUMMARY X/* search spool directory for outbound messages X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* #include "work.h" X/* X/* work *scanwork() X/* DESCRIPTION X/* scanwork() searches the spool directory for files to be sent to X/* the remote system. If a file is found, scanwork() attempts to X/* open that file. A null pointer is returned if no work was found. X/* X/* The result is normally used by sendwork(). X/* FUNCTIONS AND MACROS X/* scandir(), newseqno(), fspool() X/* SEE ALSO X/* sendwork() send spool file to remote host X/* getwork() receive remote spool file X/* rmtname() spool-file to remote-file name mapping X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sat Mar 28 17:28:09 GMT+1:00 1987 X/* LAST MODIFICATION X/* Wed Apr 6 00:22:10 MET 1988 X/* VERSION/RELEASE X/* 1.4 X/*--*/ X X#include <ctype.h> X#include "defs.h" X#include "params.h" X#include "comm.h" X#include "work.h" X#include "path.h" X#include "dir.h" X#include "logs.h" X X/* X* The present implementation assumes that work for the remote system X* is in the form of pairs of spool files with names D<seqno> and X<seqno>. X* The D files contain an electronic mail message, and the X files X* contain the destination. Both have the same <seqno> suffix which X* is just a five-digit sequence number. X* The task of scanwork() thus is trivial: just locate a file of which the X* name begins with a D or X and do some file name parsing. X* The major work is done by rmtname() and sendwork(): depending on the X* type of file, generate an appropriate remote file name and send the X* appropriate messages to the remote system. X*/ X X/* scanwork - search spool directory for work */ X Xpublic work *scanwork() X{ X register int dd; X register char *p; X static work wrk; X X dd = opendir(maildir); X while (p = readdir(dd)) { X debug(5)("scanwork: file %s\n",p); X if (index("dxDX",*p)) { X wrk.type = (islower(*p) ? toupper(*p) : *p); X wrk.tail = p+1; X sprintf(wrk.rqst,"S %c%s %s %s - %c%s 0660", X wrk.type,wrk.tail,rmtname(wrk.type,wrk.tail), X "uucp",wrk.type,wrk.tail); X strcpy(wrk.path,fspool(p)); X wrk.fp = fopen(wrk.path,"r"); X break; X } X } X closedir(dd); X return(*p ? &wrk : NULL); X} END_OF_scanwork.c if test 2464 -ne `wc -c <scanwork.c`; then echo shar: \"scanwork.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f screen.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"screen.c\" else echo shar: Extracting \"screen.c\" \(1475 characters\) sed "s/^X//" >screen.c <<'END_OF_screen.c' X/*++ X/* NAME X/* screen 3 X/* SUMMARY X/* often-used message strings X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "screen.h" X/* DESCRIPTION X/* Messages and strings used in more than one Screen structure X/* are kept here. X/* SEE ALSO X/* screen(5) screen table structure X/* kbdinp(3) screen table interpreter X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Apr 1 21:14:53 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:48:45 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ X X#include "defs.h" X#include "screen.h" X X/* general strings used in more than one Screen structure */ X Xpublic char initscreen[]= "Return to initial screen"; Xpublic char int_error[] = "The program is confused"; Xpublic char pageup[] = "Move screen one page upwards"; Xpublic char pagedn[] = "Move screen one page downwards"; Xpublic char csrup[] = "Move cursor upwards"; Xpublic char csrdn[] = "Move cursor downwards"; Xpublic char getsummary[]= "Press ESC to cancel. Enter a one-line summary for identification:"; Xpublic char printcurr[] = "Print this message"; Xpublic char delcurr[] = "Delete this message"; X X/* we have a problem reading a mail message */ X Xpublic char *m_msgread[] = { X "", X "Sorry, I have a problem reading that message", X 0, X}; END_OF_screen.c if test 1475 -ne `wc -c <screen.c`; then echo shar: \"screen.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f smail.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"smail.c\" else echo shar: Extracting \"smail.c\" \(2560 characters\) sed "s/^X//" >smail.c <<'END_OF_smail.c' X/*++ X/* NAME X/* smail 1 X/* SUMMARY X/* mail spooler X/* PROJECT X/* pc-mail X/* PACKAGE X/* smail X/* SYNOPSIS X/* smail file destinations X/* DESCRIPTION X/* smail makes preparations to send a copy of a text file X/* across the network. X/* X/* The contents of the original file are filtered in order to X/* get rid of control characters, high most-significant bits, X/* or non-standard carriage-control conventions. The filter X/* has no effect on ordinary flat text files, such as program X/* sources. X/* X/* Aliases in the list of destinations are expanded, and multiple X/* occurrances of the same recipient are eliminated. The algorithms X/* that manipulate the list of destinations are case-insensitive. X/* FILES X/* In the spool directory. Files that belong together have the X/* same sequence number in their name. X/* D<seqno> message body (data file) X/* X<seqno> destinations (meta file) X/* SEE ALSO X/* ascf(3) ASCII filter X/* spoolfile(3) create data-file/meta-file pair X/* path(5) system-dependent path names X/* unalias(3) alias expansion and cleanup X/* DIAGNOSTICS X/* Error messages if invoked with insufficient arguments. X/* The program terminates with a nonzero exit status if X/* problems were detected (out of memory, file access problems, X/* loops in the alias data base). The exit status indicates the X/* nature of the problem. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Mon Apr 6 16:58:42 GMT+1:00 1987 X/* LAST MODIFICATION X/* Wed Apr 6 00:22:39 MET 1988 X/* VERSION/RELEASE X/* 1.4 X/*--*/ X X#include "defs.h" X#include "path.h" X#include "status.h" X Xextern char **unalias(); X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X int stat = 0; /* pathinit() status code */ X char **vec; /* final destinations vector */ X char *str; /* final destinations string */ X X if (argc <= 2) { X fprintf(stderr,"usage: smail filename destination(s)\n"); X exit(1); X } else if (stat = pathinit()) { /* check environment vars */ X exit(stat); X } else if ((vec = unalias(argv+2)) == 0) { /* process destinations list */ X exit(E_SYSFAIL); X } else if (vec[BUFSIZ-1]) { /* destination list overflow */ X exit(E_OVALIAS); X } else if ((str = vecstr(vec," ")) == 0) { /* list -> string conversion */ X exit(E_SYSFAIL); X } else { X exit(sendmail(argv[1],str)); /* make spool files */ X } X /* NOTREACHED */ X} END_OF_smail.c if test 2560 -ne `wc -c <smail.c`; then echo shar: \"smail.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f status.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"status.h\" else echo shar: Extracting \"status.h\" \(1641 characters\) sed "s/^X//" >status.h <<'END_OF_status.h' X/*++ X/* NAME X/* status 5 X/* SUMMARY X/* process termination status X/* PROJECT X/* pc-mail X/* PACKAGE X/* library X/* SYNOPSIS X/* #include "status.h" X/* DESCRIPTION X/* .nf X X/* /* process termination status codes */ X X#define E_SUCCESS 0 /* successfull completion */ X X#define E_SYSFAIL 41 /* operating system failure */ X#define E_NOPROG 42 /* program not found */ X#define E_NOSPOOL 43 /* no spool directory */ X#define E_READERR 44 /* data file read error */ X#define E_WRITERR 45 /* data file write error */ X#define E_CONFUSED 46 /* internal error */ X#define E_UNKNOWN 47 /* unknown error */ X#define E_FILENO 48 /* cannot open enough files */ X#define E_BADSETUP 49 /* bad setup parameter */ X#define E_UNLINK 50 /* cannot remove file */ X#define E_PRINTERR 51 /* printer error */ X#define E_NOUSER 52 /* unknown user */ X#define E_OVALIAS 53 /* alias expansion overflow */ X X/* /* cico specific codes */ X X#define E_NOLINE 61 /* cannot reach host */ X#define E_NORESP 62 /* no ititial response */ X#define E_REJECT 63 /* rejected by host (unknown,... ) */ X#define E_LOST 64 /* link lost (timeout,...) */ X/* SEE ALSO X/* status(3) error message implementation X/* BUGS X/* The usual error message problem: there is hardly any context X/* information. A read error is a read error, no info about the X/* state of processing when it ocurred. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sat Apr 11 15:45:37 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:50:40 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ END_OF_status.h if test 1641 -ne `wc -c <status.h`; then echo shar: \"status.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f submit.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"submit.c\" else echo shar: Extracting \"submit.c\" \(1563 characters\) sed "s/^X//" >submit.c <<'END_OF_submit.c' X/*++ X/* NAME X/* submit 3 X/* SUMMARY X/* queue a message for transfer over the network X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* int submit(file,to) X/* char *file; X/* char *to; X/* DESCRIPTION X/* submit() invokes the smail command to prepare a message for X/* transmission across the network. file is the name of a file X/* with a message; to is a string with one or more destinations, X/* separated by blanks. The to string is modified. X/* FUNCTIONS AND MACROS X/* invokevp() X/* COMMANDS X/* smail, alias processing and queueing X/* FILES X/* d<seqno> message file X/* x<seqno> destination X/* SEE ALSO X/* path(5) spool file names X/* status(5) error status codes X/* DIAGNOSTICS X/* A nonzero error status is returned in case of problems. X/* BUGS X/* On some non-Unix systems the limit on the command-line length X/* may cause problems. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sat Apr 9 17:48:03 MET 1988 X/* LAST MODIFICATION X/* Sat Apr 9 17:48:03 MET 1988 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "defs.h" X#include "path.h" X Xpublic int submit(file,to) Xchar *file; Xchar *to; X{ X char *arglist[BUFSIZ]; X register char **cpp = arglist; X static char sep[] = ", \t"; X X /* Build the argment vector for the smail command */ X X *cpp++ = SMAIL; X *cpp++ = file; X X for (*cpp = strtok(to,sep); *cpp; *++cpp = strtok((char *)0,sep)) X /* void */; X X return(invokevp(arglist)); X} END_OF_submit.c if test 1563 -ne `wc -c <submit.c`; then echo shar: \"submit.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f sysdep.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"sysdep.h\" else echo shar: Extracting \"sysdep.h\" \(1097 characters\) sed "s/^X//" >sysdep.h <<'END_OF_sysdep.h' X/*++ X/* NAME X/* sysdep 5 X/* SUMMARY X/* system dependencies for comm. port i/o X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* #include "sysdep.h" X/* DESCRIPTION X/* .nf X X/* /* here they are */ X X#ifdef unix X#define xwrite write X#define xread read Xextern int xopen(),xclose(),xgetc(); X#endif X X#ifdef MSDOS X#include <fcntl.h> X#include <signal.h> X#include <dos.h> X#include "comport.h" X#include "clmap.h" X Xtypedef struct timetype { X unsigned hour; X unsigned minute; X unsigned sec; X unsigned hsec; X} TIME, *TIME_PTR; X Xextern int xread(),xwrite(),xopen(),xclose(),xgetc(); X#endif X X/* time-out interval serial-port i/o */ X X#define BYTE_TIMEOUT 20 X/* AUTHOR(S) X/* MS-DOS parts derived from uuslave sources (John Gilmore) X/* published on usenet early 1987. X/* X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sun Apr 12 17:48:08 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:51:18 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ END_OF_sysdep.h if test 1097 -ne `wc -c <sysdep.h`; then echo shar: \"sysdep.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/termcap.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/termcap.h\" else echo shar: Extracting \"termcap/termcap.h\" \(1086 characters\) sed "s/^X//" >termcap/termcap.h <<'END_OF_termcap/termcap.h' X/*++ X/* NAME X/* termcap.h 5 X/* SUMMARY X/* internal type declarations for termcap functions X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* #include "termcap.h" X/* DESCRIPTION X/* termcap.h contains declarations for internal use of the MS-DOS X/* implementation of the termcap(3) functions, assuming the X/* presence of the ANSI.SYS console driver. X/* .nf X X/* /* function types */ X Xextern tgetent(); Xextern tgetnum(); Xextern tgetflag(); Xextern char *tgetstr(); Xextern char *tgoto(); Xextern tputs(); X X/* /* static storage for pc console capabilities */ X Xtypedef struct { X char *name; X char *cap; X} Cap; X Xextern Cap _console[]; X/* SEE ALSO X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ END_OF_termcap/termcap.h if test 1086 -ne `wc -c <termcap/termcap.h`; then echo shar: \"termcap/termcap.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tgetent.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tgetent.c\" else echo shar: Extracting \"termcap/tgetent.c\" \(1235 characters\) sed "s/^X//" >termcap/tgetent.c <<'END_OF_termcap/tgetent.c' X/*++ X/* NAME X/* tgetent 3 X/* SUMMARY X/* extract terminal entry from capability database X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* tgetent(bp,name) X/* char *bp,*name; X/* DESCRIPTION X/* tgetent simulates its UNIX counterpart. X/* Its purpose is to extract from the capability database all X/* information for a specific terminal. X/* X/* name should point to a string with the terminal name (usually X/* taken from the environment with getenv(3)). X/* bp should point to a 1024-character buffer for storage of X/* terminal information extracted from the capability database. X/* X/* Since the capabilities of the ms-dos console are described by a X/* static data structure, tgetent(3) is a dummy function. X/* SEE ALSO X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X Xtgetent(bp,name) Xchar *bp,*name; X{ X return(1); X} X END_OF_termcap/tgetent.c if test 1235 -ne `wc -c <termcap/tgetent.c`; then echo shar: \"termcap/tgetent.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tgetflag.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tgetflag.c\" else echo shar: Extracting \"termcap/tgetflag.c\" \(1035 characters\) sed "s/^X//" >termcap/tgetflag.c <<'END_OF_termcap/tgetflag.c' X/*++ X/* NAME X/* tgetflag 3 X/* SUMMARY X/* check for existence of capability X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* tgetflag(name) X/* char *name; X/* DESCRIPTION X/* tgetflag is a predicate function that evaluates to "true" when X/* the capablity in "name" is present in the terminal info extracted X/* earlier with tgetent(3). X/* SEE ALSO X/* tgetent(3), extracts terminal info from database. X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X Xtgetflag(id) Xregister char *id; X{ X register Cap *p; X X for (p = _console; *p->name; p++) X if (strcmp(id,p->name) == 0) X return 1; X return 0; X} END_OF_termcap/tgetflag.c if test 1035 -ne `wc -c <termcap/tgetflag.c`; then echo shar: \"termcap/tgetflag.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tgetnum.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tgetnum.c\" else echo shar: Extracting \"termcap/tgetnum.c\" \(1055 characters\) sed "s/^X//" >termcap/tgetnum.c <<'END_OF_termcap/tgetnum.c' X/*++ X/* NAME X/* tgetnum 3 X/* SUMMARY X/* extract numerical capability from terminal database X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* tgetnum(name) X/* char *name; X/* DESCRIPTION X/* tgetnum extracts the numerical value associated with the X/* capability in "name", for the terminal info extracted with X/* a previous call of tgetent(3). X/* SEE ALSO X/* tgetent(3), extract terminal entry from database. X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X Xtgetnum(id) Xregister char *id; X{ X register Cap *p; X X for (p = _console; *p->name; p++) X if (strcmp(id,p->name) == 0) X return atoi(p->cap); X return -1; X} END_OF_termcap/tgetnum.c if test 1055 -ne `wc -c <termcap/tgetnum.c`; then echo shar: \"termcap/tgetnum.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tgetstr.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tgetstr.c\" else echo shar: Extracting \"termcap/tgetstr.c\" \(1333 characters\) sed "s/^X//" >termcap/tgetstr.c <<'END_OF_termcap/tgetstr.c' X/*++ X/* NAME X/* tgetstr 3 X/* SUMMARY X/* extract string-valued capability from terminal database X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* char *tgetstr(name,area) X/* char *name,**area; X/* DESCRIPTION X/* tgetstr extracts the string value associated with the capability X/* in "name", from the info obtained earlier through a call of X/* tgetent(3). area is a pointer to a 1024-character buffer and is X/* updated with each call of tgetstr(3). X/* X/* Since the capabilities of the ms-dos console are stored in a static X/* data structure, X/* the area pointer is not used in the MS-DOS implementation. X/* SEE ALSO X/* tgetent(3), extract terminal entry from database. X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X Xchar *tgetstr(id,area) Xregister char *id; Xchar **area; X{ X register Cap *p; X X for (p = _console; *p->name; p++) X if (strcmp(id,p->name) == 0) X return (p->cap); X return 0; X} END_OF_termcap/tgetstr.c if test 1333 -ne `wc -c <termcap/tgetstr.c`; then echo shar: \"termcap/tgetstr.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tgoto.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tgoto.c\" else echo shar: Extracting \"termcap/tgoto.c\" \(1357 characters\) sed "s/^X//" >termcap/tgoto.c <<'END_OF_termcap/tgoto.c' X/*++ X/* NAME X/* tgoto 3 X/* SUMMARY X/* absolute cursor addressing X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* char *tgoto(cm,destcol,destline) X/* char *cm; X/* int destcol,destline; X/* DESCRIPTION X/* tgoto(3) returns a character string for absolute cursor addressing. X/* Usually, the string is constructed on the basis of the "cm" capability X/* extracted from the terminal capability database. X/* X/* In the ms-dos implementation cursor addressing is hardwired into X/* the tgoto(3) algorithm. X/* SEE ALSO X/* tgetstr(3) Extracts string capability from data base X/* termcap(3) Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X X/* version with wired-in cursor movement */ X Xchar *tgoto(cm,destcol,destline) Xchar *cm; Xint destcol,destline; X{ X static char buf[100]; X X sprintf(buf,"\033[%d;%dH",destline+1,destcol); X return buf; X} END_OF_termcap/tgoto.c if test 1357 -ne `wc -c <termcap/tgoto.c`; then echo shar: \"termcap/tgoto.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f termcap/tputs.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"termcap/tputs.c\" else echo shar: Extracting \"termcap/tputs.c\" \(1053 characters\) sed "s/^X//" >termcap/tputs.c <<'END_OF_termcap/tputs.c' X/*++ X/* NAME X/* tputs 3 X/* SUMMARY X/* output string with padding X/* PROJECT X/* ms-dos/unix compatibility X/* PACKAGE X/* termcap X/* SYNOPSIS X/* tputs(cp,affcnt,outc) X/* char *p; X/* int affcnt; X/* int (*outc)(); X/* DESCRIPTION X/* tputs interprets leading padding information in the string X/* pointed to by cp, and outputs through the function pointed X/* to by outc. X/* X/* In the MS-DOS implementation, padding information is not X/* needed. X/* SEE ALSO X/* termcap(3), Berkeley extensions to UNIX. X/* FILES X/* ANSI.SYS, ibm pc console driver. X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* LAST MODIFICATION X/* Wed Jan 1 19:01:13 GMT+1:00 1986 X/* VERSION/RELEASE X/* 1.0 X/*--*/ X X#include "termcap.h" X X/* version does not check for padding */ X Xtputs(cp,affcnt,outc) Xregister char *cp; Xint affcnt; Xregister int (*outc)(); X{ X while (*cp) X (*outc)(*cp++); X} END_OF_termcap/tputs.c if test 1053 -ne `wc -c <termcap/tputs.c`; then echo shar: \"termcap/tputs.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f window.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"window.h\" else echo shar: Extracting \"window.h\" \(1506 characters\) sed "s/^X//" >window.h <<'END_OF_window.h' X/*++ X/* NAME X/* window 5 X/* SUMMARY X/* window manager definitions X/* PROJECT X/* pc-mail X/* PACKAGE X/* mailsh X/* SYNOPSIS X/* #include "window.h" X/* DESCRIPTION X/* The macros and variables defined here are used for window X/* manipulation. X/* .nf X X/* /* window selection macros */ X X#define TOP 0 /* top window */ X#define MID 1 /* middle window */ X#define BOT 2 /* bottom window */ X Xextern int wsize[BOT+1]; /* nbr of lines in windows */ Xextern int CO,LI; /* size of whole screen */ X X/* /* function-key codes */ X Xextern char *KU,*KD,*KL,*KR,*PU,*PD; X X/* /* codes to turn on/off keypad, if you have one */ X Xextern char *KS,*KE; X X/* /* functions that write to windows */ X Xextern void wininit(); /* init the window manager */ Xextern int printcl(); /* erase line, then print */ Xextern int printat(); /* print line */ Xextern int putw(); /* print character on window */ Xextern int printw(); /* formatted print on window */ Xextern void clrtoeol(); /* erase to end of line */ Xextern void clrtobot(); /* clear to screen bottom */ Xextern void beep(); /* ring the bell */ X#ifdef unix Xextern int fputchar(); /* put a character on stdout */ X#endif X/* SEE ALSO X/* window(3) window manager X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Wed Apr 1 21:14:53 GMT+1:00 1987 X/* LAST MODIFICATION X/* Mon Apr 4 23:51:44 MET 1988 X/* VERSION/RELEASE X/* 1.3 X/*--*/ END_OF_window.h if test 1506 -ne `wc -c <window.h`; then echo shar: \"window.h\" unpacked with wrong size! fi # end of overwriting check fi if test -f work.h -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"work.h\" else echo shar: Extracting \"work.h\" \(1108 characters\) sed "s/^X//" >work.h <<'END_OF_work.h' X/*++ X/* NAME X/* scanwork,rmtwork 5 X/* SUMMARY X/* spool directory access for cico X/* PROJECT X/* pc-mail X/* PACKAGE X/* cico X/* SYNOPSIS X/* #include "work.h" X/* DESCRIPTION X/* .nf X X/* /* globally visible elements of scanwork.c */ X Xtypedef struct { X char path[BUFSIZ]; /* full path name */ X char type; /* Data, eXecute */ X char *tail; /* file sequence nr part */ X char rqst[BUFSIZ]; /* uucp request message */ X FILE *fp; /* associated file pointer */ X} work; X Xextern work *scanwork(); /* searches work files */ Xextern work *rmtwork(); /* assigns spool files */ Xextern void getwork(); /* receives remote work */ X/* AUTHOR(S) X/* W.Z. Venema X/* Eindhoven University of Technology X/* Department of Mathematics and Computer Science X/* Den Dolech 2, P.O. Box 513, 5600 MB Eindhoven, The Netherlands X/* CREATION DATE X/* Sun Apr 12 14:30:28 GMT+1:00 1987 X/* LAST MODIFICATION X/* Sun Apr 3 23:53:42 MET 1988 X/* VERSION/RELEASE X/* 1.2 X/*--*/ END_OF_work.h if test 1108 -ne `wc -c <work.h`; then echo shar: \"work.h\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 7 \(of 8\). cp /dev/null ark7isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- uucp: mcvax!eutrc3!wswietse | Eindhoven University of Technology bitnet: wswietse@heithe5 | Dept. of Mathematics and Computer Science surf: tuerc5::wswietse | Eindhoven, The Netherlands.