koreth@ssyx.ucsc.edu (Steven Grimm) (07/30/88)
Submitted-by: koreth@ssyx.ucsc.edu (Steven Grimm) Posting-number: Volume 1, Issue 66 Archive-name: uupc/part02 #!/bin/sh # this is part 2 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file dcpsys.c continued # CurArch=2 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 sed 's/^X//' << 'SHAR_EOF' >> dcpsys.c X } X sprintf(cname, XQTFILE, rmtname); /* sprintf(cname,"c%.4s",rmtname); */ X len = strlen(cname); X while ((dp = readdir(dirp)) != (struct direct *)NULL) { X printmsg( 4, "dscandir: file = %s cname = %s", dp->d_name, cname ); X if ( strncmp( cname, dp->d_name, len ) == SAME ) { X printmsg( 4, "dscandir: match!!" ); X strcpy(cfile, dp->d_name); X closedir( dirp ); X return( -1 ); X } X } X closedir( dirp ); X return( 0 ); X X} X X X X SHAR_EOF chmod 0600 dcpsys.c || echo "restore of dcpsys.c fails" sed 's/^X//' << 'SHAR_EOF' > dcpxfer.c && X/* dcpxfer.c X X Revised edition of dcp X X Stuart Lynne May/87 X X Copyright (c) Richard H. Lamb 1985, 1986, 1987 X Changes Copyright (c) Stuart Lynne 1987 X X*/ X/* "DCP" a uucp clone. Copyright Richard H. Lamb 1985,1986,1987 */ X/* file send routines */ X#include "dcp.h" X#include <ctype.h> X Xstatic unsigned char rpacket[MAXPACK]; Xstatic unsigned char spacket[MAXPACK]; X/**/ X/***************SEND PROTOCOL***************************/ X/* X * s d a t a X * X * Send File Data X */ Xsdata() X{ X X while( TRUE ) { X X if (( *sendpkt) ( spacket, size, 0 )) X return (0 ); /* send data */ X if (( size = bufill( spacket )) == 0 ) /* Get data from file */ X return( 'Z' ); /* If EOF set state to that */ X } X X return('D');/* Got data, stay in state D */ X X} X X X/* X * b u f i l l X * X * Get a bufferful of data from the file that's being sent. X * Only control-quoting is done; 8-bit & repeat count prefixes are X * not handled. X */ Xbufill(buffer) Xchar *buffer;/* Buffer */ X{ X return( read(fp, buffer, pktsize) );/* Handle partial buffer */ X} X X X/* X * s b r e a k X * X * Send Break (EOT) X */ Xsbreak() X{ X int len, i; X sprintf(spacket, "H"); X if ((*sendpkt)(spacket, 0, 1)) X return(0); X if ((*getpkt)(spacket, &len)) X return(0); X printmsg( 2, "Switch modes" ); X if (spacket[1] == 'N') X return('G'); X return('Y'); X} X X X/**/ X/* X * s e o f X * X * Send End-Of-File. X */ Xseof() X{ X int len, i; X if ((*sendpkt)(spacket, 0, 0)) X return(0); X if ((*getpkt)(spacket, &len)) X return(0); /* rec CY or CN */ X if (strncmp(spacket, "CY", 2)) X return(0); /* cant send file */ X close(fp); X fp = (-1); X importpath( hostfile, fromfile ); X unlink(hostfile); X printmsg( 0, "Transfer of %s (%s) completed. fp=%d", fromfile, hostfile, fp ); X X /* X fprintf( syslog, "%s!%s (%d/%d-%d:%d:%d) -> %ld / %ld secs", host, id, size, secs ); X */ X X return('F'); /* go get the next file to send */ X} X X X/**/ X/* X * s f i l e X * X * Send File Header. X */ Xsfile() X{ X int i, len; X char * cp; X if (fp == -1) {/* If not already open, */ X printmsg( 3, "looking for next file..." ); X if (getfile()) { /* get next file from current work*/ X fclose( fw ); X unlink( cfile );/* close and delete completed workfile */ X fw = (char *)NULL; X return('B'); /* end sending session */ X } X X importpath( hostfile, fromfile ); X X printmsg( 3, "Opening %s (%s) for sending.", fromfile, hostfile ); X fp = open(hostfile, 0);/* open the file to be sent */ X if (fp == -1) {/* If bad file pointer, give up */ X printmsg( 0, "Cannot open file %s (%s).", fromfile, hostfile ); X return('A'); X } X } else X return('A'); /* If somethings already open. were in trouble*/ X printmsg( 0, "Sending %s (%s) as %s", fromfile, hostfile, tofile ); X strcpy(spacket, tofile); X if ((*sendpkt)(spacket, 0, 1)) X return(0); /* send S fromfile tofile */ X if ((*getpkt)(spacket, &len)) X return(0); /* user - tofile 0666. */ X if (spacket[1] != 'Y') X return('A'); /* If otherside says no-quit*/ X size = bufill(spacket); X return('D'); X} X X X/**/ X/* X * s i n i t X * X * Send Initiate: send this host's parameters and get other side's back. X */ Xsinit() X{ X if ((*openpk)()) X return('A'); X return('B'); X} X X X/**/ X/* X * X * X * getfile X * X * getfile reads the next line from the presently open workfile X * (cfile) and determines from this the next file to be sent X * (file). If there are no more TRUE is returned. X * --A fix for "R from to 0666" should be done here to recieve files X * --in addition to sending them. The appropriate "state letter" X * --i.e. "R" should be returned to the send "master" or "slave" X * --state switching table in "dcp.c" X * --I did not implement this since the majority of uucp transactions X * --appear to be "S from to 0666" type. RHLamb 1/87 X * X */ Xgetfile() X{ X int i; X char line[132]; X register char * cp; X X if ( ! fgets( line, BUFSIZ, fw ) ) X return(TRUE); X X sscanf(&line[2], "%s ", fromfile); X for ( i = 0, cp = line; *cp!='\0'; i++, cp++ ) { X if ( strncmp( cp, "0666", 4 ) == 0) X break; X } X cp+=4; X *cp = '\0'; X strcpy(tofile, line); X printmsg(3, " getfile: fromfile=%s, tofile=%s.", fromfile, tofile); X return(FALSE); X} X X X/**/ X/*********************** MISC SUB SUB PROTOCOL *************************/ X/* X** X**schkdir X** scan the dir X*/ Xschkdir() X{ X char c; X c = scandir(); X if (c == 'Q') { X return('Y'); X } X if (c == 'S') { X sprintf(rpacket, "HN"); X if ((*sendpkt)(rpacket, 0, 1)) X return(0); X } X return('B'); X} X X X/**/ X/* X * X * endp() end protocol X * X*/ Xendp() X{ X sprintf(rpacket, "HY"); X (*sendpkt)(rpacket, 0, 2); /* dont wait for ACK */ X (*closepk)(); X return('P'); X} X X X/**/ X/***********************RECIEVE PROTOCOL**********************/ X/* X * r d a t a X * X * Receive Data X */ Xrdata() X{ X int len; X if ((*getpkt)(rpacket, &len)) X return(0); X if (len == 0) { X close(fp); X sprintf(rpacket, "CY"); X if ((*sendpkt)(rpacket, 0, 1)) X return(0); X printmsg( 0, "transfer complete" ); X return('F'); X } X write(fp, rpacket, len);/* Write the data to the file */ X return('D');/* Remain in data state */ X} X X X/**/ X/* X * r f i l e X * X * Receive File Header X */ Xrfile() X{ X X char buf[256]; X char * flds[10]; X int numflds; X X int len, i; X char tmpfilename[256]; /*Holds the converted file name */ X char *cp; X X printmsg( 3, "rfile entered" ); X X cp = buf; X X while ( TRUE ) { X if ((*getpkt)( rpacket, &len )) X return( 0 ); X strncpy( cp, rpacket, len ); X cp += len; X if ( *(cp - 1) == '\0' ) break; X } X if (( buf[0] & 0x7f ) == 'H' ) X return( 'C' ); X X printmsg( 3, "rfile: buf %d \"%s\"", len, buf ); X X /* Convert upper case to lower */ X for (cp = buf; *cp != '\0';cp++) X if (isupper(*cp)) tolower(*cp); X X numflds = getargs( buf, flds ); X X cp = flds[2]; X printmsg( 3, "rfile: receive file \"%s\"", cp ); X X /* check for ~/ destination -> /usr/spool/uucppublic */ X if ( strncmp( cp, "~/", 2 ) == SAME ) X sprintf( tmpfilename, "%s%s", pubdir, cp+1); X else X strcpy( tmpfilename, cp ); X printmsg( 3, "rfile: receive file \"%s\"", tmpfilename ); X X /* check for dirname only */ X cp = tmpfilename + strlen( tmpfilename ) - 1; X if ( *cp == '\n' ) X *cp-- = '\0'; X X if ( *cp == '/' ) { X X fprintf( stderr, "rfile: fromfile %s\n", flds[1] ); X cp = rindex( flds[1], '/' ); X if ( cp == (char *) NULL ) X cp = flds[1]; X else X cp++; X X fprintf( stderr, "rfile: dironly add %s\n", cp ); X X strcat( tmpfilename, cp ); X } X printmsg( 3, "rfile: receive file \"%s\"", tmpfilename ); X X X /* let host munge filename as appropriate */ X importpath( tofile, tmpfilename ); X printmsg( 3, "rfile: receive file \"%s\"", tofile ); X X if ((fp = CREAT( tofile, 0775, 'b' )) == -1) { /* Try to open a new file */ X printmsg( 0, "cannot create %s", tofile ); /* Give up if can't */ X return('A'); X } X X printmsg( 0, "Receiving %s as %s", flds[1], tofile ); X sprintf(rpacket, "SY"); X if ((*sendpkt)(rpacket, 0, 1)) X return(0); X return('D'); /* Switch to data state */ X} X X X/**/ X/* X * r i n i t X * X * Receive Initialization X */ Xrinit() X{ X if ((*openpk)()) X return(0); X return('F'); X} X X X X SHAR_EOF chmod 0600 dcpxfer.c || echo "restore of dcpxfer.c fails" sed 's/^X//' << 'SHAR_EOF' > dirsubs.c && X/* X * getcwd(), chdir() X */ X#include <osbind.h> X#define NULL 0 X Xextern char *malloc(); Xextern char errno; X Xchar *getcwd( pnbuf, maxlen ) Xchar *pnbuf; Xint maxlen; X{ X int drive; X X if ( pnbuf == (char *)NULL ) X { X if ( (pnbuf = malloc( 64 )) == (char *)NULL ) X { X printf( "getcwd: malloc failure\n" ); X exit(-1); X } X } X X drive = Dgetdrv(); /* get the current drive */ X pnbuf[0] = (char)('A'+drive); X pnbuf[1] = ':'; X X Dgetpath( &pnbuf[2], 0 ); /* get current directory for current drive */ X X return( pnbuf ); X} X Xint chdir( path ) Xchar *path; X{ X int status; X /* X * Change current drive if the path has a drive specified X */ X if ( path[1] == ':' ) X Dsetdrv( (int)(path[0]-'A') ); X X status = Dsetpath( path ); /* set current path */ X if ( status == 0 ) return(0); X printf("chdir: failed with error %d on %s\n", status, path); X errno = status; X return(-1); X} X X SHAR_EOF chmod 0600 dirsubs.c || echo "restore of dirsubs.c fails" sed 's/^X//' << 'SHAR_EOF' > dmymath.c && X/* X * ftoa, etoa, atof - Dummy routines so linker does not complain. X * Will report error and exit should they actually be called. X */ X Xdouble atof( nptr ) Xchar *nptr; X{ X printf(" atof: Not implemented\n" ); X exit(-1); X} X Xchar *etoa( fval, buf, prec ) Xdouble fval; Xchar *buf; Xint prec; X{ X printf(" etoa: Not implemented\n" ); X exit(-1); X} X Xchar *ftoa( fval, buf, prec ) Xdouble fval; Xchar *buf; Xint prec; X{ X printf(" ftoa: Not implemented\n" ); X exit(-1); X} X X SHAR_EOF chmod 0600 dmymath.c || echo "restore of dmymath.c fails" sed 's/^X//' << 'SHAR_EOF' > fgets.c && X#include <stdio.h> X#include <osbind.h> X#include <ctype.h> X X#define TRUE 1 X#define FALSE 0 X X#define CR '\015' X#define LF '\012' X#define BS '\010' X#define CD '\004' X#define CU '\025' X#define CX '\030' X#define CZ '\032' X Xstatic char backsp[] = "\010 \010"; Xstatic char newline[]= "\015\012"; X X/* X * Fgets() - A replacement for fgets() that does its own console I/O X * since the library version seems not to work. X * If the I/O is not to the console then we just call the X * real fgets(). X * X * To use you must define fgets as Fgets either at the top of your X * source file or in a common header file. X */ X Xchar *Fgets( buf, n, stream ) Xchar *buf; Xint n; XFILE *stream; X{ X static int eof = FALSE; X int fd,eol; X char *s = buf; X char c; X X eol = FALSE; X n -= 1; /* Leave room for the null character */ X X fd = fileno( stream ); X if ( isatty( fd ) ) X { X /* X * If the user typed ^Z last time then report EOF on this call. X * Clear EOF as well so that future calls to the console will X * work. X */ X if ( eof ) X { X eof = FALSE; X return( (char *)NULL ); X } X /* X * Not EOF so read up to n character and return the line. X */ X while ( ( s - buf ) < n ) X { X c = ( Crawcin() & 0xFF ); X /* X * If its a printing character then just echo it X */ X if (isprint( c )) X { X Cconout( c ); X *s++ = c; X continue; X } X /* X * It must be a control character, either process it or X * ignore it. X */ X switch (c) X { X case CD: X case CZ: X eof = eol = TRUE; X if ( s == buf ) break; X case CR: X case LF: X eol = TRUE; X *s++ = LF; X if ( ( s - buf ) < n ) *s++ = '\0'; X Cconws( newline ); X break; X case BS: X if ( s != buf ) X { X s--; X Cconws( backsp ); X } X break; X case CU: X case CX: X while ( s != buf ) X { X s--; X Cconws( backsp ); X } X default: X break; X } X if ( eol ) break; X } X if ( eof && s == buf ) X { X eof = FALSE; X return( (char *)NULL ); X } X return( buf ); X } X /* X * Was not console so call regular fgets() since it seems to X * work for everything else. X */ X return( fgets( buf, n, stream ) ); X} X X#ifdef DEB_Fgets X Xextern int errno; Xchar buf[200]; X X#define fgets Fgets /* Use our own fgets routine */ X Xmain ( argc, argv ) Xint argc; Xchar **argv; X{ X X char *s; X X while ( ( s = fgets( buf, 20, stdin ) ) != (char *)NULL ) X { X puts(">>"); X puts( s ); X puts("<<"); X } X return( errno ); X} X#endif X X SHAR_EOF chmod 0600 fgets.c || echo "restore of fgets.c fails" sed 's/^X//' << 'SHAR_EOF' > genv.c && X/* genv.c X X X X copyright (C) 1987 Stuart Lynne X X Copying and use of this program are controlled by the terms of the X Free Software Foundations GNU Emacs General Public License. X X X version 0.1 March 31/1987 X X X X*/ X X#include <stdio.h> X X#ifndef NULL X#define NULL 0 X#endif X X#include "genv.h" X/* X#define DMAILBOX "mailbox" X#define DNAME "noname" X#define DDOMAIN "pc.uucp" X#define DMAILDIR "\\usr\\spool\\mail" X#define DHOME "\\usr\\noname" X#define DCONFDIR "\\usr\\lib\\uucp" X#define DSPOOLDIR "\\usr\\spool\\uucp" X#define DLOGDIR "\\usr\\spool\\uucp" X#define DPUBDIR "\\usr\\spool\\uucppublic" X#define DNEWSSDIR "\\usr\\spool\\rnews" X#define DTEMPDIR "\\tmp" X#define DMAILSERVICE "host" X#define DNODENAME "noname" X#define DDEVICE "AUX:" X#define DSPEED "1200" X*/ X X#define TFILENAME "tmpfile" X#define FILENAME "%s\\%s" X Xchar *getenv(); Xchar *malloc(); Xvoid genv(); X Xextern int debuglevel; X X#ifdef NOMALLOC Xchar rmailbox[64]; Xchar rname[64]; Xchar rdomain[64]; Xchar rmaildir[64]; Xchar rhome[64]; Xchar rconfdir[64]; Xchar rlogdir[64]; Xchar rspooldir[64]; Xchar rpubdir[64]; Xchar rnewssdir[64]; Xchar rtempdir[64]; Xchar rmailserv[16]; Xchar rnodename[16]; Xchar rdevice[16]; Xchar rspeed[64]; X Xchar *mailbox = rmailbox; Xchar *name = rname; Xchar *domain = rdomain; Xchar *maildir = rmaildir; Xchar *home = rhome; Xchar *confdir = rconfdir; Xchar *spooldir = rspooldir; Xchar *pubdir = rpubdir; Xchar *logdir = rlogdir; Xchar *newssdir = rnewssdir; Xchar *tempdir = rtempdir; Xchar *mailserv = rmailserv; Xchar *nodename = rnodename; Xchar *device = rdevice; Xchar *speed = rspeed; X#else Xchar *mailbox; Xchar *name; Xchar *domain; Xchar *maildir; Xchar *home; Xchar *confdir; Xchar *spooldir; Xchar *logdir; Xchar *pubdir; Xchar *newssdir; Xchar *tempdir; Xchar *mailserv; Xchar *nodename; Xchar *device; Xchar *speed; X#endif X Xvoid genv(thename, envname, dflt) Xchar **thename; Xchar *envname; Xchar *dflt; X{ X char *temp; X X if ((temp = getenv( envname )) == (char *)NULL) { X if ( debuglevel > 0 ) X fprintf( stderr, "genv: %s not found, using %s\n", X envname, dflt ); X temp = dflt; X } X *thename = malloc( strlen( temp ) + 1 ); X strcpy( *thename, temp ); X if ( debuglevel > 0 ) X fprintf( stderr, "genv: %s = %s\n", envname, *thename ); X} X Xvoid loadenv() X{ X /* get environment var's */ X genv( &name, "NAME", DNAME ); X genv( &mailbox, "MAILBOX", DMAILBOX ); X genv( &domain, "DOMAIN", DDOMAIN ); X genv( &maildir, "MAILDIR", DMAILDIR ); X genv( &confdir, "CONFDIR", DCONFDIR ); X genv( &spooldir, "SPOOLDIR", DSPOOLDIR ); X genv( &logdir, "LOGDIR", DLOGDIR ); X genv( &home, "HOME", DHOME ); X genv( &pubdir, "PUBDIR", DPUBDIR ); X genv( &newssdir, "NEWSSDIR", DNEWSSDIR ); X genv( &tempdir, "TEMPDIR", DTEMPDIR ); X genv( &mailserv, "MAILSERVICE", DMAILSERVICE ); X genv( &nodename, "NODENAME", DNODENAME ); X genv( &device, "DEVICE", DDEVICE ); X genv( &speed, "SPEED", DSPEED ); X} X Xvoid mkfilename( filename, dirname, name ) Xchar *filename; Xchar *dirname; Xchar *name; X{ X sprintf( filename, FILENAME, dirname, name ); X if ( debuglevel > 5 ) X fprintf( stderr, "genv: New filename %s\n", filename ); X} X X X#ifdef TEST Xmain() X{ X loadenv(); X} X#endif X X SHAR_EOF chmod 0600 genv.c || echo "restore of genv.c fails" sed 's/^X//' << 'SHAR_EOF' > genv.h && X/* genv.c X X X X copyright (C) 1987 Stuart Lynne X X Copying and use of this program are controlled by the terms of the X Free Software Foundations GNU Emacs General Public License. X X X version 0.1 March 31/1987 X X X Xenvironment variables X X The following evironment variables are defined: X X MAILBOX current user's mailbox, "sl" X NAME current user's name, "Stuart Lynne" X DOMAIN domain of this machine, "mac.van-bc.can" X MAILDIR where mail is kept, "/usr/mail" X CONFDIR where config data is kept, "/usr/lib/uucp" X SPOOLDIR where spooled files are "/usr/spool/uucp" X LOGDIR where log file are placed "/usr/spool/uucp" X PUBDIR public spool directory "/usr/spool/uucppublic" X NEWSSDIR news spool directory "/usr/spool/rnews" X TEMPDIR where temp files are created "/tmp" X HOME where uses private files are "/usr/sl" X MAILSERVICE who do we send remote mail "van-bc" X NODENAME what is our local nodename "slmac" X DEVICE what is the default device ".a" X SPEED what is the default speed "1200" X X*/ X X X#define MAILBOX "koreth" X#define NAME "Steven Grimm" X#define DOMAIN "holodek.uucp" X#define MAILDIR "D:\\USR\\SPOOL\\MAIL" X#define HOME "D:\\USR\\KORETH" X X#define CONFDIR "D:\\UUPC" X#define SPOOLDIR "D:\\USR\\SPOOL\\UUPC" X#define LOGDIR "D:\\USR\\SPOOL\\UUPC" X#define PUBDIR "D:\\USR\\SPOOL\\UUPC" X#define NEWSSDIR "D:\\USR\\SPOOL\\NEWS" X#define TEMPDIR "D:\\TMP" X#define MAILSERVICE "ssyx" X X#define DMAILBOX "koreth" X#define DNAME "Steven Grimm" X#define DDOMAIN "holodek.uucp" X#define DMAILDIR "D:\\USR\\SPOOL\\MAIL" X#define DHOME "D:\\USR\\KORETH" X X#define DCONFDIR "D:\\UUPC" X#define DSPOOLDIR "D:\\USR\\SPOOL\\UUPC" X#define DLOGDIR "D:\\USR\\SPOOL\\UUPC" X#define DPUBDIR "D:\\USR\\SPOOL\\UUPC" X#define DNEWSSDIR "D:\\USR\\SPOOL\\NEWS" X#define DTEMPDIR "D:\\TMP" X#define DMAILSERVICE "ssyx" X X#define NODENAME "holodek" X#define DEVICE "AUX:" X#define SPEED "2400" X X#define DNODENAME "holodek" X#define DDEVICE "AUX:" X#define DSPEED "2400" X Xextern char *mailbox; Xextern char *name; Xextern char *domain; Xextern char *maildir; Xextern char *home; X Xextern char *confdir; Xextern char *spooldir; Xextern char *newssdir; Xextern char *pubdir; Xextern char *tempdir; Xextern char *mailserv; X Xextern char *nodename; Xextern char *device; Xextern char *speed; X Xvoid loadenv(); Xvoid genv(); Xvoid mkfilename(); X X SHAR_EOF chmod 0600 genv.h || echo "restore of genv.h fails" sed 's/^X//' << 'SHAR_EOF' > getargs.c && X#include <ctype.h> X Xint getargs( line, flds ) Xchar *line; Xchar **flds; X{ X int i = 0; X char *s; X X while ( (*line != '\0') && (*line != '\n') ) X { X if ( isspace(*line) ) X { X line++; X continue; X } X *flds++ = line; X i++; X while( (isspace(*line) == 0) && (*line != '\0') ) line++; X if (isspace(*line)) *line++ = '\0'; X } X return(i); X} X X#ifdef TEST X Xchar comline[64] = "this is a test\n"; X Xmain(argc, argv) Xint argc; Xchar *argv; X{ X char *flds[60]; X int i,j; X X i = getargs( comline, flds ); X X printf( "Num args = %d\n", i ); X X for (j=0; j<i; j++) X printf( "Arg[%d] = %d %s\n", j, strlen(flds[j]), flds[j] ); X} X#endif X X X SHAR_EOF chmod 0600 getargs.c || echo "restore of getargs.c fails" sed 's/^X//' << 'SHAR_EOF' > getenv.c && X/* X * char *getenv( s ) X * X */ X#include <string.h> X#define strchr index X#define strrchr rindex X Xextern char *_base; /* pointer to base page */ X X#ifndef NULL X#define NULL 0 X#endif X Xchar *getenv( s ) Xchar *s; X{ X char *envp; X int n; X X envp = *(char **)(_base + 44); /* pointer to enviroment strings */ X X/*printf( "Base address = %lx, Enviroment = %lx\n", _base, envp ); /* */ X X if ( *envp == '\0' ) return (char *)NULL; X X while ( *envp != '\0' ) X { X X/*printf( "Checking %s\n", envp ); /* */ X X n = strlen(s); X X if ( strncmp( envp, s, n ) != 0 ) X { X while ( *envp++ != '\0' ); X/*printf( "Failed match, next string at %lx\n", envp ); /* */ X continue; X } X/*printf( "Matched %s\n", envp ); /* */ X envp += n; /* skip over variable name */ X if ( *envp != '=' ) X { X envp = strchr( envp, '\0' ) + 1; /* skip this string */ X continue; X } X break; X } X return ( ( *envp != '=' ) ? (char *)NULL : ++envp ); X} X X#ifdef TEST X Xmain( argc, argv ) Xint argc; Xchar **argv; X{ X char *s; X X argc--; /* skip program name */ X argv++; X X while ( argc-- ) X { X s = *argv; X while ( *s != '\0' ) X { X if ( *s >= 'a' && *s <= 'z' ) *s = *s - 32; X *s++; X } X s = getenv( *argv ); X if (s == (char *)NULL) X printf( "%s is not defined\n", *argv ); X else X printf( "%s = %s\n", *argv, s ); X argv++; X } X} X#endif X X SHAR_EOF chmod 0600 getenv.c || echo "restore of getenv.c fails" sed 's/^X//' << 'SHAR_EOF' > getone.c && X#include <osbind.h> X Xint get_one() X{ X int c; X X c = Crawcin() & 0xFF; X if ( c == '\r' ) c = '\n'; X return( c ); X} X X SHAR_EOF chmod 0600 getone.c || echo "restore of getone.c fails" sed 's/^X//' << 'SHAR_EOF' > host.c && X#include <stdio.h> X#include "genv.h" X Xint chdir(); Xvoid loadenv(); Xvoid printmsg(); X Xextern int errno; X Xchar *curdir; Xchar *getcwd(); Xchar c_curdir[256]; X Xjmp_buf dcpexit; X X Xmain( argc, argv ) Xint argc; Xchar **argv; X{ X /* host specific prolog */ X loadenv(); X curdir = getcwd( c_curdir, 0 ); X if (chdir( spooldir ) != 0) X { X return(errno); X } X X /* setup longjmp for error exit's */ X if ( setjmp( dcpexit ) == 0 ) { X X MAIN(argc, argv ); X X } X X X /* host specific epilog */ X if (chdir( curdir ) != 0) X { X return(errno); X } X return(0); X} X X SHAR_EOF chmod 0600 host.c || echo "restore of host.c fails" sed 's/^X//' << 'SHAR_EOF' > host.h && X/* Atari ST, Alcyon C Version 4.14a */ X/* Host specific defines for uu and mail */ X X#include <ctype.h> X#include <strings.h> X#include <osbind.h> X#include "time.h" X#include "genv.h" X X#define XENIX /* don't send debugging info in startup message */ X#define fgets Fgets /* use our own fgets to fix problem in runtime */ X#define mkdir(x) Dcreate(x) /* create directory */ X X#define ATARIST X X#define strchr index X#define strrchr rindex X#define FILEMODE(f) X X#define SEPCHAR '\\' /* path separater character */ X#define XQTFILE "X_%.6s" /* prefix for execute files */ X#define CALLFILE "C_%.6s" /* prefix for call files */ X#define TFILENAME "TM.%03ld" /* template for temporary files */ X#define SFILENAME "SEQF" /* name of the sequence file */ X#define SIGFILE "SIGNATUR" /* file containing signature */ X#define COPYFILE "MAIL\\MAILSENT" /* copy of sent mail */ X#define NEWSDIR "\\usr\\spool\\rnews\\%02d%02d%02d%02d.%03d" /* format for news name */ X#define HOSTINIT /* name of function used to initialize */ X X/* Rsconf() defines */ X X#define RSR (-1) /* leave as is */ X#define TSR (-1) /* " " " " */ X#define SCR (-1) /* " " " " */ X#define UCR (0x88) /* 8-bits, no parity, 2 stops */ X#define NOFLOW (0) /* no flow control */ X X#define B19200 (0) /* 19200 baud */ X#define B9600 (1) /* 9600 baud */ X#define B4800 (2) /* 4800 baud */ X#define B2400 (4) /* 2400 baud */ X#define B1200 (7) /* 1200 baud */ X#define B300 (9) /* 300 baud */ X X/* misc. defines */ X X#ifndef TRUE X#define FALSE (0) X#define TRUE (-1) X#endif X X#ifndef SAME X#define SAME (0) X#endif X X#define AUX (1) /* rs232 port */ X#define CON (2) /* console */ X X#define CTRL(X) (X & 037) /* get a control character */ X X#define IBUFSIZ (0x1000) X#define OBUFSIZ (0x1000) X X/* typedef for Iorec() stuff (modified & improved by Martin Minow) */ X Xstruct iorec X { X char *ibuf; /* Pointer to input buffer */ X int ibufsize; /* Size of input buffer */ X int ibufhd; /* Head index */ X int ibuftl; /* Tail index */ X int ibuflow; /* Low water mark */ X int ibufhi; /* Hi water mark */ X }; X Xtypedef struct { X struct iorec in; /* 0 Input buffer */ X struct iorec out; /* 14 Output buffer */ X} IOREC; X X X/* X * Rsconf() returns the "old" parameters in a longword encoded as follows: X * bits value X * 31-24 UCR X * 23-16 RSR X * 15- 8 TSR X * 8- 0 SCR X * X * Note that we must redefine the Rsconf() macro. X */ X X X#define RS_UCR_SHIFT 24 X#define RS_RSR_SHIFT 16 X#define RS_TSR_SHIFT 8 X#define RS_SCR_SHIFT 0 X Xextern int errno; X X SHAR_EOF chmod 0600 host.h || echo "restore of host.h fails" sed 's/^X//' << 'SHAR_EOF' > inoutpth.c && X#include <strings.h> X#include <ctype.h> X X#define NULL 0 X#define strchr index X#define strrchr rindex X X#define min(x,y) (((x) < (y)) ? (x) : (y)) X/* X * Canonical name conversion routines X * X * These routines convert file name between canonical form which is defined X * as a 'unix' style pathname and whatever format the host system can X * handle. X */ X X/* X * importpath( host, canon ) X * X * Convert a canonical name to a format the host can handle X * X * Mung the canonical file name as follows: X * 1 - strip any path from the canonical name X * 2 - copy up to 8 character from the canonical name converting . to _ X * 3 - if the name was longer than 8 character copy a . to the host name X * and then copy the up to three characters from the tail of the X * canonical name to the host name. X */ Xchar *importpath( host, canon ) Xchar *host, *canon; X{ X char *s,*out,c; X int i,j,l; X X out = host; X X /* X * get a pointer to the last component of the path X */ X X if ( (s = strrchr( canon, '/' )) == (char *)NULL ) s = canon; X else s++; X X j = min(l = strlen(s),8); X X for (i=0; i<j; i++) X { X c = *s++; X *out++ = (c == '.') ? '_' : c; X } X *out = '\0'; X X while (*s != '\0') s++; X X if (l>8) X for (i=0; i<3; i++) X if (*--s == '.') { s++; break; } X X if (*s != '\0') X { X X strcat( out, "." ); X strcat( out, s ); X } X X return( host ); X} X X/* X * exportpath( canon, host ) X * X * Convert a host name into canonical name X * X * Copy file name from host to canon converting an underscore in the second X * character to a dot and any other dots into the letter B. X * X */ Xexportpath( canon, host ) Xchar *host, *canon; X{ X register char c; X register char *s = canon; X do X { X c = *s = tolower( *host ); X if ( c == '.' ) *s = 'B'; X s++; X } while ( *host++ != '\0' ); X X *canon = toupper( *canon ); X if ( canon[1] == '_' ) X canon[1] = '.'; X} X X SHAR_EOF chmod 0600 inoutpth.c || echo "restore of inoutpth.c fails" sed 's/^X//' << 'SHAR_EOF' > lib.c && X/* lib.c X X*/ X X#include <stdio.h> X#include <ctype.h> X#include "host.h" X X#ifndef NULL X#define NULL 0L X#endif X Xchar *index(); Xchar *rindex(); X XMKDIR( path ) Xchar * path; X{ X char * cp = path; X X if ( *cp == '\0' ) X return( 0 ); X X /* see if we need to make any intermediate directories */ X while ( ( cp = index( cp, '\\' ) ) != (char *) NULL ) { X *cp = '\0'; X mkdir( path ); X *cp = '\\'; X cp++; X } X X /* make last dir */ X return( mkdir( path ) ); X X} X XCHDIR( path ) Xchar * path; X{ X char * cp = path; X X if ( *cp == '\0' ) X return( 0 ); X X MKDIR( path ); X X /* change to last directory */ X return( chdir( path ) ); X X} X XFILE * FOPEN( name, mode, ftype ) Xchar * name; Xchar * mode; Xchar ftype; X{ X X char * last; X FILE * results; X X /* are we opening for write or append */ X X FILEMODE( ftype ); X results = fopen( name, mode ); X X if ( results != (FILE *) NULL || *mode == 'r' ) X return( results ); X X /* are we opening in sub-directory */ X last = rindex( name, '/' ); X X /* lets just verify that all sub-dir's exist */ X if ( last != (char *) NULL ) { X *last = '\0'; X MKDIR( name ); X *last = '/'; X } X X /* now try open again */ X return( fopen( name, mode )); X X} X Xint CREAT( name, mode, ftyp ) Xchar * name; Xint mode; Xchar ftyp; X{ X X char * last; X int results; X X /* are we opening for write or append */ X FILEMODE( ftyp ); X results = creat( name, mode ); X X if ( results != -1 ) X return( results ); X X /* are we opening in sub-directory */ X last = rindex( name, '/' ); X X /* lets just verify that all sub-dir's exist */ X if ( last != (char *) NULL ) { X *last = '\0'; X MKDIR( name ); X *last = '/'; X } X X /* now try open again */ X return( creat( name, mode ) ); X X} X Xextern FILE *logfile; Xextern int debuglevel; Xextern int remote; X X#define MASTER 1 X X Xint getargs( line, flds ) Xchar *line; Xchar **flds; X{ X int i = 0; X char *s; X X while ( (*line != '\0') && (*line != '\n') ) X { X if ( isspace(*line) ) X { X line++; X continue; X } X *flds++ = line; X i++; X while( (isspace(*line) == 0) && (*line != '\0') ) line++; X if (isspace(*line)) *line++ = '\0'; X } X return(i); X} X X X SHAR_EOF chmod 0600 lib.c || echo "restore of lib.c fails" sed 's/^X//' << 'SHAR_EOF' > lmail.c && X/* lmail.c X X*/ X X#define NOMAIN X/* #define RMAIL /* if defined we get rmail() else we get lmail() */ X X#include "pcmail.c" SHAR_EOF chmod 0600 lmail.c || echo "restore of lmail.c fails" sed 's/^X//' << 'SHAR_EOF' > mail.c && X/* X * mail.c X */ X X#define exit return X X#include <stdio.h> X#include "host.h" X XFILE *FOPEN(); XFILE *freopen(); X Xchar *index(), *rindex(); X Xint debuglevel = 0; X X#define LSIZE 256 X Xchar line[LSIZE]; Xchar resp[LSIZE]; X Xchar mfilename[132]; X Xstruct ldesc { X int delete; /* status of this message */ X long adr; /* address of From line */ X long date; /* address of Date: line */ X long subject; /* address of Subject: line */ X long from; /* address of From: line */ X long size; /* number of lines */ X}; X Xstruct ldesc letters[300]; X Xint letternum = 0; Xchar thefilename[50]; X Xchar tmailbox[64]; Xchar tmailbag[64]; X X XFILE *fmailbox; XFILE *rmailbox; XFILE *fmailbag; X Xint error = 0; Xint modified; X Xint printonly; X Xint PageCount = 0; X Xmailmain(argc, argv) Xchar **argv; X{ X X /* HOSTINIT; X loadenv(); */ X X mkfilename( tmailbox, tempdir, "mailbox"); X mkfilename( tmailbag, tempdir, "mailbag"); X X unlink( tmailbox ); X X if ( mailbox == (char *)NULL ) X mailbox = "???"; X X if ( argc == 1 || X ( argv[1][0] == '-' ) && ( argv[1][1] != 's' )) X showmail (argc, argv ); X else X lmail (argc, argv ); X X finis(); X X} X Xfinis() X{ X if ( fmailbag != (FILE *)NULL) fclose( fmailbag ); X unlink( tmailbox ); X unlink( tmailbag ); X exit( error ); X} X X/* sendmail X send message n to "line" X*/ Xsendmail( n, line ) Xchar *line; X{ X char *argv[50]; X int argc; X char buf[BUFSIZ]; X long bytes; X X /* open a temporary file */ X fmailbag = FOPEN( tmailbag, "w", 'b' ); X X /* copy nth message to mailbag file */ X fseek( fmailbox, letters[ n ].adr, 0 ); X bytes = letters[ n+1 ].adr - letters[ n ].adr; X X while( bytes > 0 && fgets( buf, BUFSIZ, fmailbox) ) { X fputs( buf, fmailbag ); X bytes -= strlen( buf ); X } X X fclose( fmailbag ); X X /* use mailbag as stdin to mail delivery */ X fclose( stdin ); X FILEMODE( 'b' ); X if ( freopen( tmailbag, "r", stdin ) != (FILE *)NULL ) { X argc = getargs( line, argv ); X X lmail( argc, argv ); X X fclose( stdin ); X } X X#ifdef MSDOS X FILEMODE( 't' ); X freopen( CONSOLE, "r", stdin ); X#else X freopen( device, "r", stdin ); X#endif X X /* get rid of mailbag */ X unlink( tmailbag ); X} X X Xinvert( i ) X{ X return( letternum - i - 1 ); X} X X/* X * Generate the return address for a letter by looking at the "From " X * line. X */ Xchar *returnaddress(let) Xint let; X{ X struct ldesc *lp; X static char from[256]; X char line[256], *i, *k; X X lp = &letters[let]; X X readaline( lp->adr, line ); X X i = index(line+5, ' '); X if (i == NULL) X i = &line[strlen(line)]; X strncpy( from, line+4, i-line-4 ); X from[i-line-4] = '\0'; X X return from; X} X X/* X * Turn a subject into a reply (if it isn't already). If there was no X * subject line, return NULL. X */ Xchar *re(let) Xint let; X{ X static char newsub[256]; X char subline[256]; X X subline[0] = '\0'; X X readaline(letters[let].subject, subline); X if (! subline[0]) X return NULL; X X if (subline[9] == 'R' && subline[10] == 'e' && subline[11] == ':') X strcpy(newsub, subline+9); X else X { X strcpy(newsub, "Re: "); X strcat(newsub, subline+9); X } X X return newsub; X} X Xshowmail(argc, argv) Xchar **argv; X{ X int flg, i, j, k, print; X char *p, *cp, *getnext(); X long nextadr; X struct ldesc *letter; X X /* get mailbox file name */ X mkfilename( mfilename, maildir, mailbox ); X X /* parse arg's */ X for (; argc > 1; argv++, argc--) { X if ( argv[1][0] == '-' ) { X if ( argv[1][1] == 'f' ) { X if ( argc >= 3) { X if ( argv[2][0] == '=' ) X mkfilename( mfilename, maildir, &argv[2][1] ); X else X strcpy( mfilename, argv[2] ); X argv++; X argc--; X } X X } else if ( argv[1][1 ]== 'p' ) printonly++; X else { X fprintf(stderr, "mail: unknown option %c\n", argv[1][1]); X finis(); X } X } else break; X } X X X X /* open real mailbox file */ X if (( rmailbox = FOPEN( mfilename, "r", 'b' )) == (FILE *)NULL) { X fprintf( stdout, "No mail in %s.\n", mfilename ); X return; X } X X /* open up tmp mailbox file */ X if (( fmailbox = FOPEN( tmailbox, "w", 'b' )) == (FILE *)NULL ) { X fprintf( stderr, "mail: cannot open %s for writing\n", tmailbox ); X finis(); X } X X X /* copy real mailbox file to tmp mailbox file */ X letternum = 0 ; X nextadr = 0; X while ( fgets(line, LSIZE, rmailbox ) ) { X fputs( line, fmailbox ); X X if ( strncmp( line, "From ", 5 ) == SAME ) { X letter = &letters[letternum++]; X letter->from = X letter->subject = X letter->date = -1L; X letter->adr = nextadr; X letter->delete = FALSE; X letter->size = 0L; X }else if ( strncmp( line, "Date: ", 6 ) == SAME ) X letter->date = nextadr; X else if ( strncmp( line, "From: ", 6 ) == SAME ) X letter->from = nextadr; X else if ( strncmp( line, "Subject: ", 9 ) == SAME ) X letter->subject = nextadr; X X letter->size += 1L; X nextadr += strlen( line )+1; /* +1 for \r\n */ X } X X letters[letternum].adr = nextadr; /* last plus 1 */ X X /* close mailbox files */ X fclose( rmailbox ); X fclose( fmailbox ); X X fmailbox = FOPEN( tmailbox, "r", 'b' ); X X modified = 0; X X if ( printonly ) { X j = letternum; X while ( j > 0 ) { X pager( j ); X j--; X } X X return; X } X X X printsub( -1 ); X X i = letternum - 1; X while ( TRUE ) { X X if ( i < 0 ) X i = 0; X if ( i >= letternum) X i = letternum - 1; X j = invert( i ); X X fprintf( stdout, "%d ? ", invert( i ) ); X fflush(stdout); X X if ( ! fgets( resp, LSIZE, stdin) ) X break; X X switch ( resp[0] ) { X default: X fprintf(stderr, "usage\n"); X case '?': X print = 0; X fprintf( stderr, "q\tquit\n" ); X fprintf( stderr, "x\texit\tmailbox restored\n" ); X fprintf( stderr, "p\tprint message\n" ); X fprintf( stderr, "s[file]\tsave message to a file (default =mbox)\n" ); X fprintf( stderr, "w[file]\ttsave message to a file (default =mbox) without header\n" ); X fprintf( stderr, "-\tprint last message\n" ); X fprintf( stderr, "d\tdelete current message\n" ); X fprintf( stderr, "+\tnext message (no delete)\n" ); X fprintf( stderr, "f user\tforward current message to user\n" ); X fprintf( stderr, "m user\tmail a message to user\n" ); X fprintf( stderr, "r\treply to current message\n" ); X fprintf( stderr, "g num\t set current message\n" ); X break; X case '+': X case 'n': X i-- ; X break; X case 'g': X i = invert( atoi( resp+2 ) ); X break; X case '0': X case '1': X case '2': X case '3': X case '4': X case '5': X case '6': X case '7': X case '8': X case '9': X i = invert( atoi( resp ) ); X break; X X case 'x': X modified = 0; X case 'q': X goto donep; X case '\n': X case 'p': X pager( j ); X break; X case '^': X case '-': X i++; X break; X case 'y': X case 'w': X case 's': X flg = 0; X if (resp[1] != '\n' && resp[1] != ' ') { X printf("illegal\n"); X flg++; X print = 0; X continue; X } X if (strlen( resp ) == 1) X strcat( resp, " =mbox" ); X for (p = resp+1; (p = getnext( &cp, p )) != (char *)NULL; ) { X if ( *cp == '=' ) X mkfilename( thefilename, maildir, ++cp ); X else X strcpy( thefilename, cp ); X fprintf( stderr, "%s to %s\n", X (resp[0] == 's') ? "Appending":"Writing", thefilename ); X if (( fmailbag=FOPEN( thefilename, "a", 't' )) == (FILE *)NULL ) { X fprintf( stdout, "mail: cannot append to %s\n", X thefilename ); X flg++; X continue; X } X copymsg( j, fmailbag, resp[0]=='w' ); X fclose( fmailbag ); X } X if (flg) X print = 0; X else { X letters[j].delete = TRUE; X modified++; X i--; X } X break; X case 'm': X mailto(resp+1, NULL); X break; X case 'r': X fprintf( stdout, "To: %s\n", returnaddress(j) ); X mailto(returnaddress(j), re(j)); X break; X case 'f': X flg = 0; X if (resp[1] == '\n' || resp[1] == '\0') { X i++; X continue; X } X if (resp[1] != ' ') { X printf( "invalid command\n" ); X flg++; X print = 0; X continue; X } X X sendmail( j, p ); X X if (flg) X print = 0; X else { X letters[j].delete = TRUE; X modified++; X i++; X } X break; X X case 'd': X letters[j].delete = TRUE; X modified++; X i--; X if (resp[1] == 'q') X goto donep; X break; X X case 'h': X printsub( -1 ); X break; X X case 'H': X printsub( i ); X break; X X } X X } X donep: X if ( modified ) X copyback(); X} X X/* X * Invoke lmail with a particular destination and, possibly, subject. X */ Xmailto(who, what) Xchar *who, *what; X{ X char sub[256]; X char *argv[5]; X int argc = 1; X X argv[0] = "lmail"; X printf("Subject: "); X fflush(stdout); X X if (what != NULL) X puts(what); X else X gets(what = sub); X X putchar('\n'); X X argv[argc++] = "-s"; X argv[argc++] = what; X X while (*who == ' ') X who++; X X argv[argc++] = who; X X lmail(argc, argv); X} X Xreadaline( adr, line ) Xlong adr; Xchar *line; X{ X char buf[132]; X char *cp; X X *line = '\0'; X if ( adr != -1L ) X if ( fseek( fmailbox, adr, 0 ) == 0 ) X if ( fgets( buf, 132, fmailbox ) ) X strcpy( line, buf ); X X if ( (cp = index( line, '\n' ) ) != (char *) NULL) X *cp = '\0'; X} X X Xprintsub( K ) X{ X struct ldesc *ld; X int j; X char from[132], subject[132], date[132], line[132]; X char *sp, *dp, *lp, *tp; X int k, mink, maxk; X X pagereset(); X X if ( K == -1 ) { X maxk = letternum -1; X mink = 0; X } X else X maxk = mink = K; X X for ( k = maxk ; k >= mink ; k-- ) { X X j = invert( k ); X ld = & letters[ j /*k*/]; X X (void)strcpy(from, "unknown"); /* default to "unknown" */ X readaline( ld->from, line ); X if ( strlen( line ) > 0 ) { X /* Assume From: mailbox@site.domain */ X /* get first usable stuff after From: */ X sp = index( line, ':' ) + 1; X X /* do we have From: mailbox@site.domain ( Proper Name ) */ X if ( ( ( tp = index( line, '(' )) != (char *) NULL && X ( lp = index( line, ')')) != (char *) NULL ) ) X sp = ++tp; X /* or we may have From: Proper Name < mailbox@site.domain > */ X else X lp = index( line, '<'); X X if (lp != NULL) X if ( *lp == '<' || *lp == ')' ) X --lp; X X /* if we didn't get either of the last two, just grab line */ X if ( lp < sp || lp == (char *) NULL ) X lp = line + strlen( line ) - 1; X X /*debugMsg("\PCheck isspace *sp");*/ X while ( isspace( *sp ) ) sp++; X X /*debugMsg("\PCheck isspace *lp");*/ X while ( isspace( *lp ) ) lp--; X X dp = from; X while ( sp <= lp ) *dp++ = *sp++; X *dp = '\0'; X } X X /* Date: Wed May 13 23:59:53 1987 */ X *date = '\0'; /* default date to null */ X readaline( ld->date, date ); X if ( strlen( date ) > 0 ) { X sscanf( date, "%*s %*s %s %s", line, subject ); X sprintf( date, "%s %s", line, subject ); X } X X strcpy( subject, "--- no subject ---" ); X readaline( ld->subject, line ); X if ( strlen( line ) > 0 ) { X sp = line; X while ( !isspace( *sp ) ) sp++; X while ( isspace( *sp ) ) sp++; X strcpy( subject, sp ); X } X X from[20] = '\0'; X date[6] = '\0'; X subject[35] = '\0'; X X sprintf( line, "%3d %6s %20s %35s (%6d)\n", X j, date, from, subject, ld->size ); X if ( pageline( line ) == TRUE ) X break; X } X} X X Xcopyback() X{ X register i, n, c; X int new = 0; X X if (( fmailbag = FOPEN( mfilename, "w", 'b' )) == (FILE *)NULL ) { X fprintf (stderr, "mail: can't rewrite %s\n", mfilename ); SHAR_EOF echo "End of part 2, continue with part 3" echo "3" > s2_seq_.tmp exit 0