[net.sources] XMODEM program for VAXes

brown@nicmad.UUCP (06/20/85)

The following is in response to the request for a XMODEM program for the VAX.
We have written one for our 11/750 using 4.2BSD.  We use it to transfer files
between the Vax and our PCs.  Because of that, the program has been designed
the add/remove the CRs.  The Vax doesn't really want them and the PC needs
them.  It also will remove the ^Z that is at the end of PC text files and will
also remove the extra characters that may be after the ^Z.

Be sure to remove the .signature stuff at the end of this posting.

If you have any questions or problems let me know.

Mike Brown
---------- cut here --------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	Makefile
#	README
#	add.c
#	addcr.c
#	addlf.c
#	cr.c
#	cr2lf.c
#	del.c
#	delcr.c
#	lf.c
#	lf2cr.c
#	receive.c
#	transmit.c
#	xmodrec.1
#	xmodtran.1
# This archive created: Thu Jun 20 13:46:20 1985
# By:	Mr. Video ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'Makefile'" '(1312 characters)'
if test -f 'Makefile'
then
	echo shar: will not over-write existing file "'Makefile'"
else
sed 's/^	X//' << \SHAR_EOF > 'Makefile'
	XFILES	= receive.c transmit.c addcr.c delcr.c add.c del.c\
	X          lf2cr.c cr.c lf.c cr2lf.c
	XOBJS	= receive.o transmit.o addcr.o delcr.o add.o del.o\
	X          lf2cr.o cr.o lf.o cr2lf.o
	XLIBS 	= -lcurses -ltermlib
	XFLAGS	= -O -c -I/sys/h
	XDIR	= /usr/local
	Xmake:		receive transmit addcr delcr cr2lf lf2cr
	Xclean:
	X		rm $(OBJS)
	Xpr:
	X		lpr -Plp $(FILES)
	Xreceive.o:	receive.c
	X		cc $(FLAGS) receive.c
	Xreceive:	receive.o del.o lf.o
	X		cc -O -o receive del.o lf.o receive.o $(LIBS)
	X		strip receive
	X		mv receive $(DIR)/xmodrec
	Xtransmit.o:	transmit.c
	X		cc $(FLAGS) transmit.c
	Xtransmit:	transmit.o add.o cr.o
	X		cc -O -o transmit add.o cr.o transmit.o $(LIBS)
	X		strip transmit
	X		mv transmit $(DIR)/xmodtran
	Xaddcr.o:	addcr.c
	X		cc $(FLAGS) addcr.c
	Xaddcr:		addcr.o add.o
	X		cc -O -o addcr add.o addcr.o
	X		strip addcr
	X		mv addcr $(DIR)
	Xdelcr.o:	delcr.c
	X		cc $(FLAGS) delcr.c
	Xdelcr:		delcr.o del.o
	X		cc -O -o delcr del.o delcr.o
	X		strip delcr
	X		mv delcr $(DIR)
	Xadd.o:		add.c
	X		cc $(FLAGS) add.c
	Xdel.o:		del.c
	X		cc $(FLAGS) del.c
	Xcr.o:		cr.c
	X		cc $(FLAGS) cr.c
	Xlf2cr.o:	lf2cr.c
	X		cc $(FLAGS) lf2cr.c
	Xlf2cr:		lf2cr.o cr.o
	X		cc -O -o lf2cr lf2cr.o cr.o
	X		strip lf2cr
	X		mv lf2cr $(DIR)
	Xlf.o:		lf.c
	X		cc $(FLAGS) lf.c
	Xcr2lf.o:	cr2lf.c
	X		cc $(FLAGS) cr2lf.c
	Xcr2lf:		cr2lf.o lf.o
	X		cc -O -o cr2lf cr2lf.o lf.o
	X		strip cr2lf
	X		mv cr2lf $(DIR)
SHAR_EOF
if test 1312 -ne "`wc -c < 'Makefile'`"
then
	echo shar: error transmitting "'Makefile'" '(should have been 1312 characters)'
fi
chmod +x 'Makefile'
fi # end of overwriting check
echo shar: extracting "'README'" '(431 characters)'
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
sed 's/^	X//' << \SHAR_EOF > 'README'
	X
	X
	XThe two compiled programs, xmodrec and xmodtran, will be moved to the
	X/usr/local directory.  If this is not where you want them, change the
	XMakefile DIR variable to what you want for your system.
	X
	XThe programs are being used on a VAX 750 with BSD 4.2.  They are used
	Xto transfer data between IBM PCs and the VAX.
	X
	XIf you have any questions or comments, send UUCP mail to:
	X
	X	{ihnp4,seismo}!uwvax!astroatc!nicmad!brown
	X
	XMike Brown
SHAR_EOF
if test 431 -ne "`wc -c < 'README'`"
then
	echo shar: error transmitting "'README'" '(should have been 431 characters)'
fi
chmod +x 'README'
fi # end of overwriting check
echo shar: extracting "'add.c'" '(985 characters)'
if test -f 'add.c'
then
	echo shar: will not over-write existing file "'add.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'add.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X#
	X# include <file.h>
	X
	X# define CR	13
	X# define NL	10
	X# define CTRL_Z 26
	X
	Xchar *
	XADDCR(file)
	Xchar *file; {
	X	int id, oid;
	X	char buf[512], *index();
	X	static char temp[11];
	X	char *end = "\r\n";
	X	int ln, cnt;
	X	register char *ptr = buf, *od;
	X	register i, count;
	X
	X	strcpy(temp,"tempXXXXXX");
	X	mktemp(temp);
	X	if ((oid = open(temp,O_CREAT | O_WRONLY,0644)) < 0) {
	X		perror(temp);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X	if ((id = open(file,O_RDONLY,0644)) < 0) {
	X		perror(file);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X			
	X	while (ln = read(id,ptr,512)) {
	X		count = 0;
	X		while ( od = index(ptr,NL) ) {
	X			if (od > &buf[ln]) break;
	X			*od = '\0';
	X			cnt = strlen(ptr);
	X			count += cnt;
	X			write(oid, ptr, cnt);
	X			write(oid, end, 2);
	X			ptr = ++od;
	X			count++;
	X		}
	X		if (count = ln - count)
	X			write(oid,ptr,count);
	X		ptr = buf;
	X	}
	X	*ptr = CTRL_Z;
	X	write(oid,ptr,1);
	X
	X	close(oid); close(id);
	X	return(temp);
	X}
SHAR_EOF
if test 985 -ne "`wc -c < 'add.c'`"
then
	echo shar: error transmitting "'add.c'" '(should have been 985 characters)'
fi
chmod +x 'add.c'
fi # end of overwriting check
echo shar: extracting "'addcr.c'" '(323 characters)'
if test -f 'addcr.c'
then
	echo shar: will not over-write existing file "'addcr.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'addcr.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X	char buf[512];
	X	register int i;
	X
	X	for (i = 1; i < argc; i++) {
	X		strcpy(buf,"mv ");
	X		strcat(buf,ADDCR(argv[i]));
	X		strcat(buf," ");
	X		strcat(buf,argv[i]);
	X		system(buf);
	X	}
	X}
SHAR_EOF
if test 323 -ne "`wc -c < 'addcr.c'`"
then
	echo shar: error transmitting "'addcr.c'" '(should have been 323 characters)'
fi
chmod +x 'addcr.c'
fi # end of overwriting check
echo shar: extracting "'addlf.c'" '(1039 characters)'
if test -f 'addlf.c'
then
	echo shar: will not over-write existing file "'addlf.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'addlf.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X#
	X# define CR	13
	X# define NL	10
	X
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X	int id, oid;
	X	char buf[512];
	X	char *temp, *index();
	X	char *end = "\r\n";
	X	int ln, cnt;
	X	register char *ptr, *od;
	X	register i, count;
	X
	X	for (i = 1; i < argc; i++) {
	X		if ((id = open(argv[i],0)) < 0) {
	X			printf("CAN NOT OPEN FILE `%s'. . . . .\n",argv[i]);
	X			break;
	X		} else {
	X			temp = "tempXXXXXX";
	X			mktemp(temp);
	X			oid = creat(temp,0644);
	X			
	X			ptr = buf;
	X			while (ln = read(id,ptr,512)) {
	X				count = 0;
	X				while ( od = index(ptr,CR) ) {
	X					if (od > &buf[ln]) break;
	X					*od = '\0';
	X					cnt = strlen(ptr);
	X					count += cnt;
	X					write(oid, ptr, cnt);
	X					write(oid, end, 2);
	X					ptr = ++od;
	X					count++;
	X				}
	X				if (count = ln - count)
	X					write(oid,ptr,count);
	X				ptr = buf;
	X			}
	X
	X			close(oid); close(id);
	X			strcpy(buf,"mv ");
	X			strcat(buf,temp);
	X			strcat(buf," ");
	X			strcat(buf,argv[i]);
	X			system(buf);
	X			unlink(temp);
	X		}
	X	}
	X}
SHAR_EOF
if test 1039 -ne "`wc -c < 'addlf.c'`"
then
	echo shar: error transmitting "'addlf.c'" '(should have been 1039 characters)'
fi
chmod +x 'addlf.c'
fi # end of overwriting check
echo shar: extracting "'cr.c'" '(882 characters)'
if test -f 'cr.c'
then
	echo shar: will not over-write existing file "'cr.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'cr.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X#
	X#include <file.h>
	X
	X#define CR	13
	X#define NL	10
	X
	Xchar *
	XLF2CR(file)
	Xchar *file; {
	X	int id, oid;
	X	char buf[512], *index();
	X	static char temp[11];
	X	register char *ptr = buf;
	X	register ln, count;
	X
	X	strcpy(temp,"tempXXXXXX");
	X	mktemp(temp);
	X	if ((oid = open(temp,O_CREAT | O_WRONLY,0644)) < 0) {
	X		perror(temp);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X	if ((id = open(file,O_RDONLY,0644)) < 0) {
	X		perror(file);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X			
	X	count = 0;
	X	while (ln = read(id,ptr,512)) {
	X		while ( ptr = index(ptr,NL) ) {
	X			if (ptr > &buf[ln]) break;
	X			*ptr = CR;
	X		}
	X		write(oid,ptr = buf,ln);
	X		count += ln;
	X	}
	X	if (ln = count % 128) {
	X		count = 128 - ln;
	X		for (ln = 0, ptr = buf; ln < count ; ln++, *ptr++ = ' ');
	X		write(oid,buf,ln);
	X	}
	X
	X	close(oid); close(id);
	X	return(temp);
	X}
SHAR_EOF
if test 882 -ne "`wc -c < 'cr.c'`"
then
	echo shar: error transmitting "'cr.c'" '(should have been 882 characters)'
fi
chmod +x 'cr.c'
fi # end of overwriting check
echo shar: extracting "'cr2lf.c'" '(233 characters)'
if test -f 'cr2lf.c'
then
	echo shar: will not over-write existing file "'cr2lf.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'cr2lf.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X	char buf[512];
	X	register int i;
	X
	X	for (i = 1; i < argc; i++) {
	X		CR2LF(argv[i]);
	X	}
	X}
SHAR_EOF
if test 233 -ne "`wc -c < 'cr2lf.c'`"
then
	echo shar: error transmitting "'cr2lf.c'" '(should have been 233 characters)'
fi
chmod +x 'cr2lf.c'
fi # end of overwriting check
echo shar: extracting "'del.c'" '(1134 characters)'
if test -f 'del.c'
then
	echo shar: will not over-write existing file "'del.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'del.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X#
	X# include <file.h>
	X
	X# define CR	13
	X# define NL	10
	X# define CTRL_Z	26
	X# define BLOCK	512
	X
	XDELCR(file)
	Xchar *file; {
	X	int id, oid;
	X	char buf[BLOCK+10], *index();
	X	static char temp[11];
	X	register char *ptr = buf, *od, *cz;
	X	register int len;
	X
	X	strcpy(temp,"tempXXXXXX");
	X	mktemp(temp);
	X	if ((oid = open(temp,O_CREAT | O_WRONLY,0644)) < 0) {
	X		perror(temp);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X
	X	if ((id = open(file,O_RDONLY,0644)) < 0) {
	X		perror(file);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X
	X	while ((len = read(id,ptr,BLOCK)) > 0) {
	X		*(ptr + len) = 0;
	X		while ( od = index(ptr,CR) ) {
	X			*od = '\0';
	X			if (cz = index(ptr,CTRL_Z)) {
	X				*cz = '\0';
	X				write(oid, ptr, strlen(ptr));
	X			 	goto OUT;
	X			}
	X			write(oid, ptr, strlen(ptr));
	X			ptr = ++od;
	X		}
	X		if (cz = index(ptr,CTRL_Z)) {
	X			*cz = '\0';
	X			write(oid, ptr, strlen(ptr));
	X		 	goto OUT;
	X		}
	X		if (len = strlen(ptr))
	X		write(oid, ptr, len);
	X		ptr = buf;
	X	}
	X
	XOUT:
	X	close(oid); close(id);
	X	strcpy(buf,"mv ");
	X	strcat(buf,temp);
	X	strcat(buf," ");
	X	strcat(buf,file);
	X	system(buf);
	X}
SHAR_EOF
if test 1134 -ne "`wc -c < 'del.c'`"
then
	echo shar: error transmitting "'del.c'" '(should have been 1134 characters)'
fi
chmod +x 'del.c'
fi # end of overwriting check
echo shar: extracting "'delcr.c'" '(233 characters)'
if test -f 'delcr.c'
then
	echo shar: will not over-write existing file "'delcr.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'delcr.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X	char buf[512];
	X	register int i;
	X
	X	for (i = 1; i < argc; i++) {
	X		DELCR(argv[i]);
	X	}
	X}
SHAR_EOF
if test 233 -ne "`wc -c < 'delcr.c'`"
then
	echo shar: error transmitting "'delcr.c'" '(should have been 233 characters)'
fi
chmod +x 'delcr.c'
fi # end of overwriting check
echo shar: extracting "'lf.c'" '(1356 characters)'
if test -f 'lf.c'
then
	echo shar: will not over-write existing file "'lf.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'lf.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X#
	X#include <file.h>
	X
	X#define CR	13
	X#define NL	10
	X#define BLOCK	512
	X#define STOP	0xff
	X
	XCR2LF(file)
	Xchar *file; {
	X	int id, oid;
	X	char buf[BLOCK+1], *index();
	X	char temp[11], temp1[11];
	X	register char *ptr = buf;
	X	register int len;
	X
	X	strcpy(temp,"tempXXXXXX");
	X	mktemp(temp);
	X	if ((oid = open(temp,O_CREAT | O_RDWR,0644)) < 0) {
	X		perror(temp);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X
	X	if ((id = open(file,O_RDONLY,0644)) < 0) {
	X		perror(file);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X
	X	buf[BLOCK] = 0;
	X	while ((len = read(id,ptr,BLOCK)) > 0) {
	X		while ( ptr = index(ptr,CR) ) {
	X			*ptr = NL;
	X		}
	X		write(oid, ptr = buf, len);
	X	}
	X	
	X	close(id);
	X	lseek(oid,1,L_XTND);
	X	do {
	X		lseek(oid,-2,L_INCR);
	X		read(oid,ptr,1);
	X	} while ( *ptr != NL );
	X	*ptr = STOP;
	X	write(oid,ptr,1);
	X	lseek(oid,0,L_SET);
	X
	X	strcpy(temp1,"tempXXXXXX");
	X	mktemp(temp1);
	X	if ((id = open(temp1,O_CREAT | O_WRONLY,0644)) < 0) {
	X		perror(temp1);
	X		unlink(temp1);
	X		unlink(temp);
	X		exit(-1);
	X	}
	X
	X	ptr = buf;
	X	while ((len = read(oid,ptr,BLOCK)) > 0) {
	X		if (ptr = index(ptr,STOP))  {
	X			*ptr = 0;
	X			write(id, buf, strlen(buf));
	X			break;
	X		}
	X		write(id, ptr = buf, len);
	X	}
	X
	X	close(oid); close(id);
	X	strcpy(buf,"mv ");
	X	strcat(buf,temp1);
	X	strcat(buf," ");
	X	strcat(buf,file);
	X	system(buf);
	X	unlink(temp);
	X}
SHAR_EOF
if test 1356 -ne "`wc -c < 'lf.c'`"
then
	echo shar: error transmitting "'lf.c'" '(should have been 1356 characters)'
fi
chmod +x 'lf.c'
fi # end of overwriting check
echo shar: extracting "'lf2cr.c'" '(323 characters)'
if test -f 'lf2cr.c'
then
	echo shar: will not over-write existing file "'lf2cr.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'lf2cr.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X	char buf[512];
	X	register int i;
	X
	X	for (i = 1; i < argc; i++) {
	X		strcpy(buf,"mv ");
	X		strcat(buf,LF2CR(argv[i]));
	X		strcat(buf," ");
	X		strcat(buf,argv[i]);
	X		system(buf);
	X	}
	X}
SHAR_EOF
if test 323 -ne "`wc -c < 'lf2cr.c'`"
then
	echo shar: error transmitting "'lf2cr.c'" '(should have been 323 characters)'
fi
chmod +x 'lf2cr.c'
fi # end of overwriting check
echo shar: extracting "'receive.c'" '(4439 characters)'
if test -f 'receive.c'
then
	echo shar: will not over-write existing file "'receive.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'receive.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X/*
	X**	receive filename
	X*/
	X#
	X# include <file.h>
	X# include <curses.h>
	X# include <signal.h>
	X# include <time.h>
	X
	X# define	SOH	0x1
	X# define	NAK	0x15
	X# define	ACK	0x6
	X# define	EOT	0x4
	X# define	CANCEL	0x18
	X
	Xchar filename[64];
	Xint retries;
	Xint seq_num;
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X
	X	int fd;
	X	register i;
	X	char c;
	X	char block[131];
	X	int length, pid;
	X	struct sigvec vec;
	X	int caught();
	X
	X	if (!((argc == 2) || (argc == 3))) {
	X		printf("ILLEGAL NUMBER OF ARGUMENTS.\n");
	X		printf("SYNOPSIS: xmodrec [-t] filename\n");
	X		exit(-1);
	X	}
	X
	X	if (argc == 3) {
	X		if (strcmp(argv[1],"-t") && strcmp(argv[1],"-m")) {
	X			printf("bad argument `%s'\n",argv[1]);
	X			printf("SYNOPSIS: xmodrec [-t] filename\n");
	X			exit(-1);
	X		}
	X	}
	X
	X	strcpy(filename,argv[argc-1]);
	X	if ((fd = open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644)) < 0) {
	X		perror(filename);
	X		exit(-1);
	X	}
	X
	X	initscr();
	X	raw();			/* set terminal to 8-bit I/O */
	X	noecho();
	X
	X/*
	X**	Ignore interrupts from the user.
	X**	If the user could delete this program the terminal
	X**	would be left in a undiserable state of mind.
	X*/
	X
	X	vec.sv_handler = caught;
	X	vec.sv_mask = vec.sv_onstack = 0;
	X	sigvec(SIGALRM,&vec,(struct sigvec *)0);
	X
	X	sigsetmask(-1 ^ (1 << (SIGALRM-1)));
	X
	X	if ((pid = fork()) == 0) {   /* child sends ready prompt */
	X		c = NAK;
	X		for ( i = 0; i < 10; i++) {
	X			write(1,&c,1);
	X			sleep(10);
	X		}
	X		reset(); 	     /* restore terminal to normal state */
	X		kill(0,SIGKILL);     /* kill all processes */
	X	}
	X
	X	read(0,&c,1);
	X	kill(pid,SIGKILL);  /* received SOH response, so kill child */
	X	wait(0);
	X
	X	seq_num = 1; retries = 0;
	X	for(;;) {
	X
	X		if (retries == 10) {
	X			c = CANCEL;
	X			write(1,&c,1);
	X			RESET("Terminate after 10 retries",retries);
	X		}
	X
	X		switch( c & 0x7f ) {
	X			case SOH:
	X				BLOCK(fd);
	X				break;
	X			case CANCEL:
	X				RESET("main: CANCEL IN switch",0);
	X			case EOT:
	X				c = ACK;
	X				write(1,&c,1);
	X				noraw();
	X				echo();
	X				endwin();
	X				goto END;
	X			default:
	X				SET_TIMER();
	X				for ( i = 0; i < 131; i++) read(0,&c,1);
	X				DISABLE_TIMER();
	X				c = NAK;
	X				write(1,&c,1);
	X				retries++;
	X				break;
	X		}
	X		SET_TIMER();
	X		read(0,&c,1);
	X		DISABLE_TIMER();
	X	}
	XEND:
	X	DISABLE_TIMER();
	X	sigsetmask(0);
	X	vec.sv_handler = SIG_DFL;
	X	vec.sv_mask = vec.sv_onstack = 0;
	X	sigvec(SIGALRM,&vec,(struct sigvec *)0);
	X
	X	close(fd);
	X	if (argc == 3) {
	X		switch( argv[1][1] ) {
	X			case 't':
	X				printf("Deleting carriage returns\n");
	X				DELCR(filename);
	X				break;
	X			case 'm':
	X				printf("Changing cr's to lf's\n");
	X				CR2LF(filename);
	X		}
	X	}
	X}
	X
	XBLOCK(fd) 
	Xint fd; {
	X	
	X	register i;
	X	register char *p;
	X	char block[131];
	X	char c;
	X	int length, pid;
	X	int xsum;
	X
	X	SET_TIMER();
	X	length = 0;
	X	for( i = 0, p = block; i < 131; i++) length += read(0,p++,1);
	X	DISABLE_TIMER();
	X	
	X	if (length != 131) {
	X		c = NAK;
	X		write(1,&c,1);
	X		retries++;
	X		return;
	X	}
	X
	X	if ( (block[0] & 0xff) != seq_num ) {
	X		i = (seq_num ? seq_num - 1 : 255);
	X		if ((block[0] & 0xff) != i ) {
	X			if ( (block[1] & 0xff) != (255 - seq_num) ) {
	X				i = 255 - i;
	X				if ((block[1] & 0xff) == i ) {
	X					c = NAK;
	X					write(1,&c,1);
	X					retries++;
	X					return;
	X				}
	X				c = CANCEL; 	/* loss of synchronization */
	X				write(1,&c,1);
	X				RESET("loss of syn: block = %d, seq_num = %d",block[0]);
	X			}
	X		}
	X		retries++;
	X		goto leave;
	X	}
	X
	X	if ( (block[1] & 0xff) != (255 - seq_num) ) {
	X		c = NAK;
	X		write(1,&c,1);
	X		retries++;
	X		return;
	X	}
	X	
	X	xsum = 0;
	X	for (i = 2; i < 130; i++) xsum += block[i];
	X	xsum &= 0xff;
	X	if ( (block[130] & 0xff) != xsum ) {
	X		c = NAK;
	X		write(1,&c,1);
	X		retries++;
	X		return;
	X	}
	X
	X	write(fd,&block[2],128);
	X	retries = 0;
	X	seq_num = ++seq_num % 256;
	Xleave:
	X	c = ACK;
	X	write(1,&c,1);
	X}
	X
	Xreset() {
	X	
	X	noraw();
	X	endwin();
	X	unlink(filename);
	X}
	X	
	X
	XRESET(s,b) 
	Xchar *s; 
	Xint b;	{
	X
	X	FILE *debug;
	X
	X	reset();
	X	if ((debug = fopen("debug","w")) == NULL ) {
	X		perror("debug");
	X		exit(1);
	X	}
	X	fprintf(debug,s,b&0xff,seq_num);
	X	exit(-1);
	X}
	X
	X/*
	XDEBUG(b,bl,dat,s)
	Xchar *b;
	Xint bl, dat; 
	Xchar *s; {
	X
	X	char buf[128];
	X	write(debug,b,131);
	X	sprintf(buf,s,bl,dat);
	X	write(debug,buf,strlen(buf));
	X}
	X*/
	X
	Xcaught() {
	X	char c;
	X
	X	c = CANCEL;
	X	write(1,&c,1);
	X	reset();
	X	kill(0,SIGKILL);
	X}
	X
	XSET_TIMER() {
	X	struct itimerval val;
	X
	X	val.it_value.tv_sec = 60;
	X	val.it_value.tv_usec = 60 * 1000;
	X	timerclear(&val.it_interval);
	X	setitimer(ITIMER_REAL,&val,(struct itimerval *)0);
	X}
	X
	XDISABLE_TIMER() {
	X	struct itimerval val;
	X
	X	timerclear(&val.it_value);
	X}
SHAR_EOF
if test 4439 -ne "`wc -c < 'receive.c'`"
then
	echo shar: error transmitting "'receive.c'" '(should have been 4439 characters)'
fi
chmod +x 'receive.c'
fi # end of overwriting check
echo shar: extracting "'transmit.c'" '(2953 characters)'
if test -f 'transmit.c'
then
	echo shar: will not over-write existing file "'transmit.c'"
else
sed 's/^	X//' << \SHAR_EOF > 'transmit.c'
	X/*  Version 1.0		6/12/85
	X	Jim Hein
	X	Nicolet Instrument Corp
	X	5225 Verona Rd
	X	Madison, WI  53611-0288
	X*/
	X/*
	X**	transmit filename
	X*/
	X# include <curses.h>
	X# include <file.h>
	X# include <signal.h>
	X# include <time.h>
	X
	X# define	SOH	0x1
	X# define	NAK	0x15
	X# define	ACK	0x6
	X# define	EOT	0x4
	X# define	CANCEL	0x18
	X
	Xint flags;
	Xchar filename[64];
	X
	Xmain(argc,argv)
	Xint argc;
	Xchar *argv[]; {
	X
	X	int fd;
	X	register i;
	X	register char *p;
	X	char block[132];
	X	char c;
	X	int length, pid;
	X	int seq_num, xsum;
	X	int retries;
	X	struct sigvec vec;
	X	int caught();
	X
	X	flags = argc;
	X	if (!((argc == 2) || (argc == 3))) {
	X		printf("ILLEGAL NUMBER OF ARGUMENTS.\n");
	X		printf("SYNOPSIS: xmodtran [-t] filename\n");
	X		exit(-1);
	X	}
	X
	X	if (argc == 2) strcpy(filename,argv[1]);  /* don't put in CR's */
	X	else { 
	X		switch (argv[1][1]) {
	X			case 't':
	X				printf("Adding carriage returns, wait .......\n");
	X				strcpy(filename,ADDCR(argv[2]));
	X				printf("DONE\n");
	X				break;
	X			case 'm':
	X				printf("Changing lf's to cr's, wait .......\n");
	X				strcpy(filename,LF2CR(argv[2]));
	X				printf("DONE\n");
	X				break;
	X			default:
	X				printf("bad argument `%s'\n",argv[1]);
	X				printf("SYNOPSIS: xmodtran [-t] filename\n");
	X				exit(-1);
	X		}
	X	}
	X
	X	if ((fd = open(filename,O_RDONLY,0644)) < 0) {
	X		perror(filename);
	X		exit(-1);
	X	}
	X
	X	initscr();
	X	raw();			/* set terminal to 8-bit I/O */
	X	noecho();
	X
	X/*
	X**	Ignore interrupts from the user.
	X**	If the user could delete this program the terminal
	X**	would be left in a undiserable state of mind.
	X*/
	X	vec.sv_handler = caught;
	X	vec.sv_mask = vec.sv_onstack = 0;
	X	sigvec(SIGALRM,&vec,(struct sigvec *)0);
	X
	X	sigsetmask(-1 ^ (1 << (SIGALRM-1)));
	X
	X	SET_TIMER();
	X
	X	for(;;) {  		/* wait for NAK */
	X		read(0,&c,1);	/* if not received in 60 sec's, program terminates */
	X		if ((c&0x7f) == NAK) break;
	X	}
	X
	X	DISABLE_TIMER();
	X
	X	seq_num = 1;
	X	p = &block[3];
	X	while ( (length = read(fd,p,128)) > 0 ) {
	X
	X		p = block;
	X		*p++ = SOH;
	X		*p++ = seq_num;
	X		*p++ = 255 - seq_num;
	X
	X		p += length;
	X		for( i = length; i < 128; i++) *p++ = 0;
	X		xsum = 0;
	X		for (i = 3; i < 131; i++) xsum += block[i];
	X		*p = xsum & 0xff;
	X
	X		retries = 0;
	X		do {
	X			if (retries) sleep(10);
	X
	X			write(1,block,132);
	X			SET_TIMER();
	X			read(0,&c,1);
	X			DISABLE_TIMER();
	X
	X			if ( (c&0x7f) == CANCEL ) {RESET(); exit(-1);}
	X			if (++retries == 10 ) {
	X				c = CANCEL;
	X				write(1,&c,1);
	X				RESET(); exit(-1);
	X			}
	X		} while ( (c&0x7f) != ACK );
	X
	X		seq_num = ++seq_num % 256;
	X		p = &block[3];
	X			
	X	}
	X
	X	SET_TIMER();
	X	do {
	X		c = EOT;
	X		write(1,&c,1);
	X		read(0,&c,1);
	X	} while ( (c&0x7f) != ACK );
	X	DISABLE_TIMER();
	X
	X	RESET();
	X}
	X
	XRESET() {
	X
	X	noraw();
	X	echo();
	X	endwin();
	X	if (flags == 3) unlink(filename);
	X} /* END */
	X
	Xcaught() {
	X	RESET();
	X	kill(0,SIGKILL);
	X}
	X
	XSET_TIMER() {
	X	struct itimerval val;
	X
	X	val.it_value.tv_sec = 60;
	X	val.it_value.tv_usec = 60 * 1000;
	X	timerclear(&val.it_interval);
	X	setitimer(ITIMER_REAL,&val,(struct itimerval *)0);
	X}
	X
	XDISABLE_TIMER() {
	X	struct itimerval val;
	X
	X	timerclear(&val.it_value);
	X}
SHAR_EOF
if test 2953 -ne "`wc -c < 'transmit.c'`"
then
	echo shar: error transmitting "'transmit.c'" '(should have been 2953 characters)'
fi
chmod +x 'transmit.c'
fi # end of overwriting check
echo shar: extracting "'xmodrec.1'" '(579 characters)'
if test -f 'xmodrec.1'
then
	echo shar: will not over-write existing file "'xmodrec.1'"
else
sed 's/^	X//' << \SHAR_EOF > 'xmodrec.1'
	X.TH XMODREC 1
	X.SH NAME
	Xxmodrec \- receive file using XMODEM protocol
	X.SH SYNOPSIS
	X.B xmodrec
	X[
	X.B \-t
	X] filename
	X.SH DESCRIPTION
	X.I Xmodrec
	Xis used to receive a file from another computer, ie, IBM PC or look-alike.
	XThe computer from which the file is to be received must also have the
	XXMODEM protocol.
	X.PP
	XThis version of XMODEM uses the checksum method of error detection.
	X.PP
	XOptions:
	X.TP 6
	X.B  \-t
	XRemove the carriage returns from the incoming data.  Also removes the ^Z
	Xend-of-file marker and any data after it.
	X.SH AUTHOR
	XJim Hein {ihnp4,seismo}!uwvax!astroatc!nicmad!jhein
SHAR_EOF
if test 579 -ne "`wc -c < 'xmodrec.1'`"
then
	echo shar: error transmitting "'xmodrec.1'" '(should have been 579 characters)'
fi
chmod +x 'xmodrec.1'
fi # end of overwriting check
echo shar: extracting "'xmodtran.1'" '(614 characters)'
if test -f 'xmodtran.1'
then
	echo shar: will not over-write existing file "'xmodtran.1'"
else
sed 's/^	X//' << \SHAR_EOF > 'xmodtran.1'
	X.TH XMODTRAN 1
	X.SH NAME
	Xxmodtran \- transmit a file using XMODEM protocol
	X.SH SYNOPSIS
	X.B xmodtran
	X[
	X.B \-t
	X] filename
	X.SH DESCRIPTION
	X.I Xmodtran
	Xis used to transmit a file to another computer, ie, IBM PC or look-alike.
	XThe computer to which the file is to be transmitted must also have the
	XXMODEM protocol.
	X.PP
	XThis version of XMODEM uses the checksum method of error detection.
	X.PP
	XOptions:
	X.TP 6
	X.B  \-t
	XAdds carriage returns to each line of data being transmitted.  Some computers
	Xrequire that the text file have a CR/LF at the end of each line.
	X.SH AUTHOR
	XJim Hein {ihnp4,seismo}!uwvax!astroatc!nicmad!jhein
SHAR_EOF
if test 614 -ne "`wc -c < 'xmodtran.1'`"
then
	echo shar: error transmitting "'xmodtran.1'" '(should have been 614 characters)'
fi
chmod +x 'xmodtran.1'
fi # end of overwriting check
#	End of shell archive
exit 0
-------- cut here --------
-- 
              |------------|
              | |-------| o|    JVC HRD725U 
Mr. Video     | |       | o|  |--------------|
              | |       |  |  | |----| o o o |
              | |-------| O|  |--------------|
              |------------|     VHS Hi-Fi (the only way to go)
   {seismo,ihnp4}!uwvax!astroatc!nicmad!brown