[comp.sources.unix] v11i089: Transfer data

rsalz@uunet.UU.NET (Rich Salz) (10/04/87)

Submitted-by: Gary Mills <mills@cc.uofm.cdn>
Posting-number: Volume 11, Issue 89
Archive-name: diskdump

[  These programs are used to transfer files (and files containing mail
   messages) between Unix (System V, but porting to BSD should be easy
   enough) and CMS, which I am led to believe is an operating system
   from the people responsible for the promulgation of MS-DOS.  --r$  ]

==================
#! /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:
#
#		README
#		diskdump.mk
#		netdata.mk
#		diskdump.man
#		netdata.man
#		sendfile.man
#		diskdump.c
#		netdata.c
#		sendfile
#
if test -f 'README'
then
	echo shar: will not over-write existing file "'README'"
else
echo extracting "'README'"
sed 's/^X//' >README <<'SHAR_EOF'
XDiskdump.c and netdata.c are written in C for System V.  I use them
Xas part of a mail gateway between CDNnet and Bitnet.  They are
Xuseful here because we run UTS unix under VM.  The programs also
Xcompile and run on our MVS system and are useful as a way to get
Xfiles with lines longer than 80 characters out on Bitnet.
X
X-Gary Mills- 		<mills@cc.uofm.cdn>
SHAR_EOF
if test     355 -ne "`wc -c < 'README'`"
then
	echo shar: error transmitting "'README'" '(should have been     355 characters)'
fi
fi
if test -f 'diskdump.mk'
then
	echo shar: will not over-write existing file "'diskdump.mk'"
else
echo extracting "'diskdump.mk'"
sed 's/^X//' >diskdump.mk <<'SHAR_EOF'
X# %W% %G% %U% - Uofmcc/UTS
XSHELL = /bin/sh
XI = /usr/include
X
Xdiskdump: diskdump.c	$I/stdio.h 
X	$(CC) $(CFLAGS) -o diskdump diskdump.c -la
X
Xinstall: diskdump
X	/etc/install diskdump
Xclean:
Xclobber: clean
X	-rm -f diskdump
SHAR_EOF
if test     219 -ne "`wc -c < 'diskdump.mk'`"
then
	echo shar: error transmitting "'diskdump.mk'" '(should have been     219 characters)'
fi
fi
if test -f 'netdata.mk'
then
	echo shar: will not over-write existing file "'netdata.mk'"
else
echo extracting "'netdata.mk'"
sed 's/^X//' >netdata.mk <<'SHAR_EOF'
X# %W% %G% %U% - Uofmcc/UTS
XSHELL = /bin/sh
XI = /usr/include
X
Xnetdata: netdata.c	$I/stdio.h 
X	$(CC) $(CFLAGS) -o netdata netdata.c -la
X
Xinstall: netdata
X	/etc/install netdata
Xclean:
Xclobber: clean
X	-rm -f netdata
SHAR_EOF
if test     212 -ne "`wc -c < 'netdata.mk'`"
then
	echo shar: error transmitting "'netdata.mk'" '(should have been     212 characters)'
fi
fi
if test -f 'diskdump.man'
then
	echo shar: will not over-write existing file "'diskdump.man'"
else
echo extracting "'diskdump.man'"
sed 's/^X//' >diskdump.man <<'SHAR_EOF'
X.TH DISKDUMP 1 "LOCAL"
X.SH NAME
Xdiskdump \- produce CMS disk dump file
X.SH SYNOPSIS
Xdiskdump [-n <name> -t <type> <file>]
X.SH DESCRIPTION
XDiskdump converts a standard text file into CMS disk dump format
Xand writes it to standard output as a
Xstream of 80-byte binary and EBCDIC card images.
XThis allows a text file with lines longer than 80 characters to be
X"punched" to a CMS user.
XIf <file> is not specified, standard input is used.
XThe command line options are:
X.TP 12
X-n <name>
XSpecifies an internal filename for the CMS file.
XThe default is "MAILER".
X.TP 12
X-t <type>
XSpecifies an internal filetype for the CMS file.
XThe default is "MAIL".
X.SH EXAMPLES
XSend a file to user MAILER on node UOFMCC:
X.ti+8n
Xdiskdump hello.c | lp -db -o"-r -v uofmcc.mailer"
X.SH SEE ALSO
Xlp(1), netdata(1x)
X.SH BUGS
XDiskdump will fold input lines longer than 254 characters.
XIt will not handle binary files.
XThe CMS file produced is always format V.
XThe ASCII to EBCDIC translation may not conform to what is expected
Xon the receiving system.
SHAR_EOF
if test    1025 -ne "`wc -c < 'diskdump.man'`"
then
	echo shar: error transmitting "'diskdump.man'" '(should have been    1025 characters)'
fi
fi
if test -f 'netdata.man'
then
	echo shar: will not over-write existing file "'netdata.man'"
else
echo extracting "'netdata.man'"
sed 's/^X//' >netdata.man <<'SHAR_EOF'
X.TH NETDATA 1 "LOCAL"
X.SH NAME
Xnetdata \- produce CMS netdata file
X.SH SYNOPSIS
Xnetdata [-n <name> -t <type> -s <size> -u <orig_user> -d <dest_node> -v <dest_user> <file>]
X.SH DESCRIPTION
XNetdata converts a standard text file into CMS netdata format
Xand writes it to standard output
Xas a stream of 80-byte binary and EBCDIC card images.
XThis allows a text file with lines longer than 80 characters to be
X"punched" to a CMS or TSO/E user.
XIf <file> is not specified, standard input is used.
XThe command line options are:
X.TP 12
X-n <name>
XSpecifies an internal file name for the CMS file.
XThe default is "MAILER".
X.TP 12
X-t <type>
XSpecifies an internal file type for the CMS file.
XThe default is "MAIL".
X.TP 12
X-s <size>
XSpecifies the approximate size of the file, for space allocation
Xpurposes on the receiving system.
XThis option is only needed when the input is standard input.
XThe default is 2048 bytes.
X.TP 12
X-u <orig_user>
XSpecifies the origin user name.
XThe default is "MAILER".
X.TP 12
X-d <dest_node>
XSpecifies the destination node name.
XThe default is the local node.
X.TP 12
X-v <dest_user>
XSpecifies the destination user name.
XThe default is "MAILER".
X.SH EXAMPLES
XSend a file to user MAILER on node UOFMCC:
X.ti+2n
Xnetdata -d uofmcc hello.c | lp -db -o"-r -v uofmcc.mailer"
X.SH SEE ALSO
Xlp(1), diskdump(1x)
X.SH BUGS
XNetdata will fold input lines longer than 253 characters.
XIt will not handle binary files.
XThe CMS file produced is always sequental and format V.
XSpecifying wrong destination node or user names may confuse the
Xreceiving system.
XThe ASCII to EBCDIC translation may not conform to what is expected
Xon the receiving system.
SHAR_EOF
if test    1645 -ne "`wc -c < 'netdata.man'`"
then
	echo shar: error transmitting "'netdata.man'" '(should have been    1645 characters)'
fi
fi
if test -f 'sendfile.man'
then
	echo shar: will not over-write existing file "'sendfile.man'"
else
echo extracting "'sendfile.man'"
sed 's/^X//' >sendfile.man <<'SHAR_EOF'
X.TH SENDFILE 1 "LOCAL"
X.SH NAME
Xsendfile \- send a file to VM or to another node via RSCS
X.SH SYNOPSIS
Xsendfile [-v <user> -d <node> -o -p] <file>
X.SH DESCRIPTION
XSendfile reads a text file, converts it to EBCDIC, and sends it
Xto a VM user or, via RSCS, to a user at another NJE node.
XThe default file format is CMS NETDATA.
XThe command line options are:
X.TP 12
X-d <node>
XSpecifies the destination node name.
XThe default is the local node.
X.TP 12
X-v <user>
XSpecifies the destination user name.
XThe default is taken from the environment variable $VMID.
X.TP 12
X-o
XThe file will be sent in CMS DISK DUMP format.
X.TP 12
X-p
XThe file will be sent in CMS PUNCH format.
X.SH EXAMPLES
XSend a file to user MILLS on node UOFMCC:
X.ti+2n
Xsendfile -d uofmcc -v mills hello.c
X.SH SEE ALSO
Xlp(1), diskdump(1x), netdata(1x)
X.SH BUGS
XSendfile will not handle binary files.
XThe CMS file produced is always sequental and format V.
XThe ASCII to EBCDIC translation may not conform to what is expected
Xon the receiving system.
SHAR_EOF
if test    1003 -ne "`wc -c < 'sendfile.man'`"
then
	echo shar: error transmitting "'sendfile.man'" '(should have been    1003 characters)'
fi
fi
if test -f 'diskdump.c'
then
	echo shar: will not over-write existing file "'diskdump.c'"
else
echo extracting "'diskdump.c'"
sed 's/^X//' >diskdump.c <<'SHAR_EOF'
X/* diskdump.c:	convert	text file to CMS disk dump format */
X/*		output is a stream of 80-byte card images */
X
X/* Author:   Gary Mills	<mills@cc.uofm.cdn>		  */
X/*			<mills@uofmcc.bitnet>		  */
X
X/* Compilation Switches:				  */
X/*	MVS:	Waterloo C v1.3	for MVS			  */
X/*	default:  Amdahl UTS Unix System V		  */
X
X/* #define MVS	   1 */
X#include <stdio.h>
X#ifdef	MVS
X#define	ATE(c)	(c)
X#else
Xextern char atetab[128];	/* ASCII to EBCDIC translation table */
X
X#define	ATE(c)	atetab[c]
X#endif
X#define	NUL	'\0'
X#define	SIZBUF	256
X#define	CMSV	struct cmsrec
XCMSV
X    {
X    char dd_id[1];	/* 0x02	*/
X    char dd_cms[3];	/* "CMS" */
X    char dd_fmt[1];	/* record format */
X    char dd_data[50];	/* text	*/
X    char dd_blk[2];	/* block count */
X    char dd_fn[8];	/* file	name */
X    char dd_ft[8];	/* file	type */
X    char dd_fm[3];	/* file	mode */
X    char dd_seq[4];	/* sequence */
X    };
X
Xstatic char	inbuf[SIZBUF];
Xstatic CMSV	rec;
Xstatic int	recn, blkn;
Xstatic int	datax;
Xstatic FILE	*ofile;
X
Xmain(argc, argv) int argc; char	**argv;
X    {
X    int	n, num,	max;
X    char *inpt;
X    FILE *ifile;
X    char c;
X    char *fname, *ftype, *pgm;
X
X    ifile = stdin;
X    ofile = stdout;
X    fname = "mailer";
X    ftype = "mail";
X    pgm	= *argv++;
X    --argc;
X    while ( argc )
X	{
X	if ( **argv == '-' )
X	    {
X	    c =	tolower( (*argv)[1] );
X	    ++argv;
X	    --argc;
X	    if ( argc )
X		{
X		--argc;
X		if ( c == 'n' )
X		    fname = *argv++;
X		else if	( c == 't' )
X		    ftype = *argv++;
X		else
X		    {
X		    ++argc;
X		    break;
X		    }
X		}
X	    else
X		{
X		++argc;
X		break;
X		}
X	    }
X	else
X	    {
X	    if ( ( ifile = fopen(*argv,	"r") ) == NULL )
X		{
X		fprintf(stderr,	"%s: cannot open %s\n",	pgm, *argv);
X		return(1);
X		}
X	    --argc;
X	    break;
X	    }
X	}
X    if ( argc )
X	{
X	fprintf(stderr,	"usage:	%s [-n name -t type file]\n", pgm);
X	return(1);
X	}
X#ifdef	MVS
X    ofile = fopen("SYSUT2 ( bin", "w");
X#endif
X    num	= max =	0;
X    iniout(fname, ftype);
X    while ( n =	igets(ifile) )
X	{
X	++num;
X	while (	n > 1 && inbuf[n-1] == ' ' )
X	    --n;
X	inbuf[n] = NUL;
X	if ( n > max )
X	    max	= n;
X	inpt = inbuf;
X	oput(n/256);
X	oput(n&255);
X	while (	n = *inpt++ )
X	    {
X	    oput( ATE(n) );
X	    }
X	}
X    finout(num,	max);
X    if ( ifile != stdin	)
X	fclose(ifile);
X    return 0;
X    }
X
X/* get input line, expanding tabs and padding null lines */
Xigets(fp) FILE *fp;
X    {
X    int	c, col;
X    col	= 0;
X    while ( ( c	= getc(fp) ) !=	EOF )
X	{
X	if ( c == '\t' )
X	    do
X		inbuf[col++] = ' ';
X	    while ( col	< SIZBUF-1 && col % 8 );
X	else if	( c == '\n' )
X	    {
X	    if ( col ==	0 )
X		inbuf[col++] = ' ';
X	    break;
X	    }
X	else
X	    {
X	    inbuf[col++] = c;
X	    }
X	if ( !(	col < SIZBUF-1 ) )
X	    break;
X	}
X    inbuf[col] = NUL;
X    return col;
X    }
X
X/* initialize output */
Xiniout(sn, st) char *sn, *st;
X    {
X    recn = blkn	= 1;
X    datax = 0;
X    rec.dd_id[0] = 0x02;
X    mncopy(rec.dd_cms, "CMS", 3);
X    rec.dd_fmt[0] = ATE('V');
X    memset(rec.dd_data,	0, 50);
X    mhalf(rec.dd_blk, blkn);
X    memset(rec.dd_fn, ATE(' '),	19);
X    mncopy(rec.dd_seq, "0001", 4);
X    mncopy(rec.dd_fn, sn, 8);
X    mncopy(rec.dd_ft, st, 8);
X    mncopy(rec.dd_fm, "A1", 3);
X    }
X
X/* finalize output */
Xfinout(n, m) int n, m;
X    {
X    oflush();
X    oflush();
X    rec.dd_fmt[0] = ATE('N');
X    mhalf(&rec.dd_data[0], n+1);	/* write pointer (number) */
X    mhalf(&rec.dd_data[2], 1);		/* read	pointer	(number) */
X    mncopy(&rec.dd_data[4], "A1", 2);	/* file	mode */
X    mhalf(&rec.dd_data[6], n);		/* item	count (number) */
X    rec.dd_data[10] = ATE('V');		/* variable flag */
X    mhalf(&rec.dd_data[14], m);		/* max item length */
X    mhalf(&rec.dd_data[16], blkn);	/* number of blocks */
X    mhalf(&rec.dd_data[26], blkn);	/* alternate number of blocks */
X    mhalf(&rec.dd_data[30], n);		/* alternate item count	*/
X    oflush();
X    }
X
X/* add a byte to output	*/
Xoput(c)	char c;
X    {
X    rec.dd_data[datax++] = c;
X    if ( datax >= 50 )
X	{
X	oflush();
X	datax =	0;
X	}
X    }
X
X/* write and re-initialize record */
Xoflush()
X    {
X    int	n, r;
X    for	( n = 0; n < 80; ++n )
X	putc(rec.dd_id[n], ofile);
X    memset(rec.dd_data,	0, 50);
X    if ( recn %	16 == 0	)
X	++blkn;
X    ++recn;
X    mhalf(rec.dd_blk, blkn);
X    r =	recn;
X    for	( n = 3; n >= 0; --n )
X	{
X	rec.dd_seq[n] =	ATE(r %	10 + '0');
X	r = r /	10;
X	}
X    }
X
X/* copy	string to memory in upper case,	not including NUL */
Xmncopy(s1, s2, n) char *s1, *s2; int n;
X    {
X    while ( --n	>= 0 &&	*s2 )
X	*s1++ =	ATE( toupper(*s2++) );
X    }
X
X/* copy	two-byte integer to memory */
Xmhalf(s, n) char *s; int n;
X    {
X    s[0] = n/256;
X    s[1] = n&255;
X    }
X
X/**/
SHAR_EOF
if test    4585 -ne "`wc -c < 'diskdump.c'`"
then
	echo shar: error transmitting "'diskdump.c'" '(should have been    4585 characters)'
fi
fi
if test -f 'netdata.c'
then
	echo shar: will not over-write existing file "'netdata.c'"
else
echo extracting "'netdata.c'"
sed 's/^X//' >netdata.c <<'SHAR_EOF'
X/* netdata.c:  convert text file to CMS	netdata	format	  */
X/*	       output is a stream of 80-byte card images  */
X
X/* Author:   Gary Mills	<mills@cc.uofm.cdn>		  */
X/*			<mills@uofmcc.bitnet>		  */
X
X/* Compilation Switches:				  */
X/*	MVS:	Waterloo C v1.3	for MVS			  */
X/*	default:  Amdahl UTS Unix System V		  */
X
X/* #define MVS	   1 */
X#include <stdio.h>
X#include <time.h>
X#ifdef	MVS
X#define	ATE(c)	(c)
X#else
X#include <sys/types.h>
X#include <sys/stat.h>
Xextern long time();
Xextern struct tm *gmtime();
Xextern char atetab[128];	/* ASCII to EBCDIC translation table */
X
X#define	ATE(c)	atetab[c]
X#endif
X#define	NUL	'\0'
X#define	TCAST	(long *)
X#define	SIZBUF	254
X#define	SIZREC	255
X#ifdef	MVS
X#define	ONODE	"UOFMCC"
X#else
X#define	ONODE	"UOFMCCX"
X#endif
X
X/* control record identifiers */
X#define	INMR01	"INMR01"
X#define	INMR02	"INMR02"
X#define	INMR03	"INMR03"
X#define	INMR06	"INMR06"
X
X/* text	unit keys */
X#define	INMLRECL 0x0042
X#define	INMFNODE 0x1011
X#define	INMFUID	 0x1012
X#define	INMTNODE 0x1001
X#define	INMTUID	 0x1002
X#define	INMFTIME 0x1024
X#define	INMNUMF	 0x102f
X#define	INMSIZE	 0x102c
X#define	INMDSORG 0x003c
X#define	INMUTILN 0x1028
X#define	INMRECFM 0x0049
X#define	INMTERM	 0x0028
X#define	INMDSNAM 0x0002
X#define	INMFFM	 0x102d
X#define	INMLCHG	 0x1021
X
Xstatic char	inbuf[SIZBUF];
Xstatic char	rec[SIZREC];
Xstatic char	tvalue[21];
X#ifndef	MVS
Xstatic struct	stat sbuf;
X#endif
Xstatic int	count;	/* output char count */
Xstatic FILE	*ofile;	/* output file */
X
Xchar *acunit(),	*abunit(), *acfield(), *inirec(), *membin();
X
Xmain(argc, argv) int argc; char	**argv;
X    {
X    int	n;
X    char *pend,	*pstar;
X    FILE *ifile;
X    char c;
X    char *ouser, *dnode, *duser;
X    char *tcurr, *tlast;
X    char *fname, *ftype, *pgm;
X    int	fsize, maxl;
X    long tbuf;
X    struct tm *tpt;
X
X#ifdef MVS
X    tpt	= localtime();
X#else
X    tbuf = time( TCAST 0 );
X    tpt	= gmtime(&tbuf);
X#endif
X    sprintf(tvalue, "%04d%02d%02d%02d%02d%02d%06d",
X	tpt->tm_year+1900, tpt->tm_mon+1, tpt->tm_mday,
X	tpt->tm_hour, tpt->tm_min, tpt->tm_sec,	0);
X    tcurr = tlast = tvalue;
X    ifile = stdin;
X    ofile = stdout;
X    ouser = duser = fname = "MAILER";
X    dnode = ONODE;
X    ftype = "MAIL";
X    fsize = 0x0800;
X    maxl = SIZBUF-1;
X
X    pgm	= *argv++;
X    --argc;
X    while ( argc )
X	{
X	if ( **argv == '-' )
X	    {
X	    c =	tolower( (*argv)[1] );
X	    ++argv;
X	    --argc;
X	    if ( argc )
X		{
X		--argc;
X		if ( c == 'n' )
X		    fname = *argv++;
X		else if	( c == 't' )
X		    ftype = *argv++;
X		else if	( c == 'u' )
X		    ouser = *argv++;
X		else if	( c == 'd' )
X		    dnode = *argv++;
X		else if	( c == 'v' )
X		    duser = *argv++;
X		else if	( c == 's' )
X		    fsize = atoi(*argv++);
X		else
X		    {
X		    ++argc;
X		    break;
X		    }
X		}
X	    else
X		{
X		++argc;
X		break;
X		}
X	    }
X	else
X	    {
X	    if ( ( ifile = fopen(*argv,	"r") ) != NULL )
X		{
X#ifndef	MVS
X		if ( 0 == fstat( fileno(ifile),	&sbuf) )
X		    fsize = sbuf.st_size;
X#endif
X		}
X	    else
X		{
X		fprintf(stderr,	"%s: cannot open %s\n",	pgm, *argv);
X		return(1);
X		}
X	    --argc;
X	    break;
X	    }
X	}
X    if ( argc )
X	{
X	fprintf(stderr,	"usage:	%s [-n name -t type -u orig_user\n", pgm);
X	fprintf(stderr,	"	-d dest_node -v	dest_user -s size file]\n");
X	return(1);
X	}
X#ifdef MVS
X    ofile = fopen("SYSUT2 ( bin", "w");
X    if ( ofile == NULL )
X	return 1;
X#endif
X
X    pend = inirec(rec, INMR01, -1);	/* header */
X    pend = abunit(pend,	INMLRECL, 80, 2);
X    pend = acunit(pend,	INMFNODE, ONODE);
X    pend = acunit(pend,	INMFUID, ouser);
X    pend = acunit(pend,	INMTNODE, dnode);
X    pend = acunit(pend,	INMTUID, duser);
X    pend = acunit(pend,	INMFTIME, tcurr);
X    pend = abunit(pend,	INMNUMF, 1, 4);
X    finrec(rec,	pend);
X
X    pend = inirec(rec, INMR02, 1);	/* output utility */
X    pend = abunit(pend,	INMSIZE, fsize,	8);
X    pend = abunit(pend,	INMDSORG, 0x4000, 2);
X    pend = abunit(pend,	INMLRECL, maxl,	4);
X    pend = acunit(pend,	INMUTILN, "INMCOPY");
X    pend = abunit(pend,	INMRECFM, 0x0002, 2);
X    pstar = pend;
X    pend = acunit(pend,	INMDSNAM, "A");
X    pend = acfield(pend, fname);
X    pend = acfield(pend, ftype);
X    pstar[3] = 3;
X    pend = acunit(pend,	INMFFM,	"1");
X    pend = acunit(pend,	INMLCHG, tlast);
X    finrec(rec,	pend);
X
X    pend = inirec(rec, INMR03, -1);	/* input data */
X    pend = abunit(pend,	INMSIZE, fsize,	8);
X    pend = abunit(pend,	INMDSORG, 0x4000, 2);
X    pend = abunit(pend,	INMLRECL, 80, 2);
X    pend = abunit(pend,	INMRECFM, 0x0001, 2);
X    finrec(rec,	pend);
X
X    while ( n =	igets(ifile) )		/* data	records	*/
X	{
X	while (	n > 1 && inbuf[n-1] == ' ' )
X	    --n;
X	inbuf[n] = NUL;
X	odata(n, inbuf);
X	}
X
X    pend = inirec(rec, INMR06, -1);	/* trailer */
X    finrec(rec,	pend);
X
X    finout();
X    return 0;
X    }
X
X/* get input line, expanding tabs and padding null lines */
Xigets(fp) FILE *fp;
X    {
X    int	c, col;
X    col	= 0;
X    while ( ( c	= getc(fp) ) !=	EOF )
X	{
X	if ( c == '\t' )
X	    do
X		inbuf[col++] = ' ';
X	    while ( col	< SIZBUF-1 && col % 8 );
X	else if	( c == '\n' )
X	    {
X	    if ( col ==	0 )
X		inbuf[col++] = ' ';
X	    break;
X	    }
X	else
X	    {
X	    inbuf[col++] = c;
X	    }
X	if ( !(	col < SIZBUF-1 ) )
X	    break;
X	}
X    inbuf[col] = NUL;
X    return col;
X    }
X
X/* initialize control record */
Xchar *inirec(pt, s, n) char *pt, *s; int n;
X    {
X    *pt++ = 0;		/* length bythe	*/
X    *pt++ = 0xe0;	/* flag	byte */
X    while ( *s )	/* identifier */
X	*pt++ =	ATE( toupper(*s++) );
X    if ( n > 0 )	/* number of files */
X	pt = membin(pt,	n, 4);
X    return pt;
X    }
X
X/* finalize control record */
Xfinrec(pt, pe) char *pt, *pe;
X    {
X    *pt	= pe - pt;	/* length byte */
X    while ( pt < pe )	/* record */
X	{
X	putc(*pt, ofile);
X	++pt;
X	++count;
X	}
X    }
X
X/* add a binary	text unit */
Xchar *abunit(pt, k, v, n) char *pt; int	k, v, n;
X    {
X    pt = membin(pt, k, 2);	/* key */
X    pt = membin(pt, 1, 2);	/* count */
X    pt = membin(pt, n, 2);	/* length */
X    pt = membin(pt, v, n);	/* value */
X    return pt;
X    }
X
X/* add a character text	unit */
Xchar *acunit(pt, k, s) char *pt; int k;	char *s;
X    {
X    pt = membin(pt, k, 2);	/* key */
X    pt = membin(pt, 1, 2);	/* count */
X    pt = membin(pt, strlen(s), 2);	/* length */
X    while ( *s )		/* value */
X	*pt++ =	ATE( toupper(*s++) );
X    return pt;
X    }
X
X/* add a character field */
Xchar *acfield(pt, s) char *pt, *s;
X    {
X    pt = membin(pt, strlen(s), 2);	/* length */
X    while ( *s )		/* value */
X	*pt++ =	ATE( toupper(*s++) );
X    return pt;
X    }
X
X/* add a binary	item */
Xchar *membin(pt, v, n) char *pt; int v,	n;
X    {
X    char *pe;
X    pe = pt + n;
X    while ( --pe >= pt )
X	{
X	*pe = v;
X	v = v /	256;
X	}
X    return pt +	n;
X    }
X
X/* write a data	record */
Xodata(n, pt) int n; char *pt;
X    {
X    char *pe;
X    pe = pt + n;
X    putc(n+2, ofile);  /* length byte */
X    putc(0xc0, ofile); /* flag byte */
X    count = count + 2;
X    while ( pt < pe )	/* data	*/
X	{
X	putc(ATE(*pt), ofile);
X	++pt;
X	++count;
X	}
X    }
X
X/* pad last record */
Xfinout()
X    {
X    while ( count % 80 )
X	{
X	putc(0,	ofile);
X	++count;
X	}
X    }
X
X/**/
SHAR_EOF
if test    6988 -ne "`wc -c < 'netdata.c'`"
then
	echo shar: error transmitting "'netdata.c'" '(should have been    6988 characters)'
fi
fi
if test -f 'sendfile'
then
	echo shar: will not over-write existing file "'sendfile'"
else
echo extracting "'sendfile'"
sed 's/^X//' >sendfile <<'SHAR_EOF'
X:
X# Send a file to a user at another node
XV="$VMID"
XD=""
XF="NETDATA"
XCMD=$0
XL="/usr/cserv/mills/sendfile"
XSKIP=""
X
Xfor ARG do
X    if [ "$SKIP" ]; then
X	SKIP=""
X    else
X	case $ARG in
X	-v) shift; V="$1"; SKIP="Y"; shift;;
X	-d) shift; D="$1"; SKIP="Y"; shift;;
X	-o) shift; F="DISK DUMP";;
X	-p) shift; F="PUNCH";;
X	-*) echo $CMD: invalid option \'$ARG\'; exit 1;;
X    	esac
X    fi
Xdone
X
Xif test ! -r $1; then
X    echo $CMD: file $1 is not readable;
X    exit 1;
Xfi
X
Xif [ x"$D" = "x" ]; then
X    X="$V";D="UOMFCCX";echo Sending file $1 to $V in $F format.;
Xelse
X    X="$D"."$V";echo Sending file $1 to "$V"@"$D" in $F format.;
Xfi
X
Xcase $F in
X    D*) $L/diskdump -n $LOGNAME $1 |
X	lp -db -o"-r -v $X -f $LOGNAME";;
X    N*) $L/netdata -n $LOGNAME -v $V -d $D $1 |
X	lp -db -o"-r -v $X -f $LOGNAME";;
X    *) lp -db -o"-v $X -f $LOGNAME" < $1;;
Xesac
SHAR_EOF
if test     840 -ne "`wc -c < 'sendfile'`"
then
	echo shar: error transmitting "'sendfile'" '(should have been     840 characters)'
fi
fi
# end of shell archiikr* h* h*T