[comp.sys.handhelds] pf-bootstrap-v1.1a part 6 of 9

dan@i10s7.ira.uka.de (Dan Mosedale) (05/17/91)

#! /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 6 (of 9)."
# Contents:  pf-bootstrap-v1.1a/tipx-p1/tip.1
#   pf-bootstrap-v1.1a/xmodem-3.9/getput.c
#   pf-bootstrap-v1.1a/xmodem-3.9/update.doc
# Wrapped by dan@nostromo on Fri May 17 02:31:42 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'pf-bootstrap-v1.1a/tipx-p1/tip.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/tipx-p1/tip.1'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/tipx-p1/tip.1'\" \(13086 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/tipx-p1/tip.1' <<'END_OF_FILE'
X.\" Copyright (c) 1980 The Regents of the University of California.
X.\" All rights reserved.
X.\"
X.\" Redistribution and use in source and binary forms are permitted
X.\" provided that the above copyright notice and this paragraph are
X.\" duplicated in all such forms and that any documentation,
X.\" advertising materials, and other materials related to such
X.\" distribution and use acknowledge that the software was developed
X.\" by the University of California, Berkeley.  The name of the
X.\" University may not be used to endorse or promote products derived
X.\" from this software without specific prior written permission.
X.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
X.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
X.\" WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X.\"
X.\"	@(#)tip.1	6.4 (Berkeley) 9/28/88
X.\"
X.TH TIP 1 "September 28, 1988"
X.UC 4
X.SH NAME
Xtip, cu \- connect to a remote system
X.SH SYNOPSIS
X.B tip
X[
X.B \-p
X] [
X.B \-s
X] [
X.B \-v
X] [
X.BI \- speed
X] system-name
X[
X.I page-data
X]
X.br
X.B tip
X[
X.B \-p
X] [
X.B \-s
X] [
X.B \-v
X] [
X.BI \- speed
X] phone-number
X[
X.I page-data
X]
X.br
X.B cu
Xphone-number
X[
X.B \-t
X] [
X.B \-s
X.I speed
X] [
X.B \ -a
X.I acu
X] [
X.B \-l
X.I line
X] [
X.B \-#
X]
X.SH DESCRIPTION
X.I Tip
Xand
X.I cu
Xestablish a full-duplex connection to another machine,
Xgiving the appearance of being logged in directly on the
Xremote cpu.  It goes without saying that you must have a login
Xon the machine (or equivalent) to which you wish to connect.
XThe preferred interface is
X.IR tip .
XThe
X.I cu
Xinterface is included for those people attached to the
X``call UNIX'' command of version 7.  This manual page
Xdescribes only 
X.IR tip .
X.PP
XThe \fB\-p\fR and \fB\-s\fR options enable specialized code
Xin the tip program to process sending pager messages or to
Xenable SLIP style dialup network connections.
XThese options are discussed later.
X.PP
XTyped characters are normally transmitted directly to the remote
Xmachine (which does the echoing as well).  A tilde (`~') appearing
Xas the first character of a line is an escape signal; the following
Xare recognized:
X.TP 10
X.B ~^D ~.
XDrop the connection and exit
X(you may still be logged in on the
Xremote machine).
X.TP 10
X\fB~c \fP [\fIname\fP]
XChange directory to name (no argument
Ximplies change to your home directory).
X.TP 10
X.B ~!
XEscape to a shell (exiting the shell will
Xreturn you to tip).
X.TP 10
X.B ~>
XCopy file from local to remote.
X.I Tip
Xprompts for the name of a local file to transmit.
X.TP 10
X.B ~<
XCopy file from remote to local.
X.I Tip
Xprompts first for the name of the file to be sent, then for
Xa command to be executed on the remote machine.
X.TP 10
X\fB~p\fP \fIfrom\fP [ \fIto\fP ]
XSend a file to a remote UNIX host.  The put command causes the remote UNIX
Xsystem to run the command string ``cat > 'to''', while
X.I tip
Xsends it the ``from''
Xfile.  If the ``to'' file isn't specified the ``from'' file name is used.
XThis command is actually a UNIX specific version of the ``~>'' command.
X.TP 10
X\fB~t\fP \fIfrom\fP [ \fIto\fP ]
XTake a file from a remote UNIX host. 
XAs in the put command the ``to'' file
Xdefaults to the ``from'' file name if it isn't specified. 
XThe remote host
Xexecutes the command string ``cat 'from';echo ^A'' to send the file to
X.IR tip .
X.TP 10
X.B ~|
XPipe the output from a remote command to a local UNIX process.
XThe command string sent to the local UNIX system is processed by the shell.
X.TP 10
X.B ~$
XPipe the output from a local UNIX process to the remote host.
XThe command string sent to the local UNIX system is processed by the shell.
X.TP 10
X.B ~#
XSend a BREAK to the remote system. 
XFor systems which don't support the
Xnecessary
X.I ioctl
Xcall the break is simulated by a sequence of line speed changes
Xand DEL characters.
X.TP 10
X.B ~s
XSet a variable (see the discussion below).
X.TP 10
X.B ~^Z
XStop
X.I tip
X(only available with job control).
X.TP 10
X.B ~^Y
XStop only the ``local side'' of
X.I tip
X(only available with job control);
Xthe ``remote side'' of
X.IR tip ,
Xthe side that displays output from the remote host, is left running.
X.TP 10
X.B ~?
XGet a summary of the tilde escapes
X.sp
X.PP
X.I Tip
Xuses the file /etc/remote to find how to reach a particular
Xsystem and to find out how it should operate while talking
Xto the system;
Xrefer to
X.IR remote (5)
Xfor a full description.
XEach system has a default baud rate with which to
Xestablish a connection.  If this value is not suitable, the baud rate
Xto be used may be specified on the command line, e.g. ``tip -300 mds''.
X.PP
XWhen
X.I tip
Xestablishes a connection it sends out a
Xconnection message to the remote system; the default value, if any,
Xis defined in /etc/remote.
X.PP
XWhen
X.I tip
Xprompts for an argument (e.g. during setup of
Xa file transfer) the line typed may be edited with the standard
Xerase and kill characters.  A null line in response to a prompt,
Xor an interrupt, will abort the dialogue and return you to the
Xremote machine.
X.PP
X.I Tip
Xguards against multiple users connecting to a remote system
Xby opening modems and terminal lines with exclusive access,
Xand by honoring the locking protocol used by
X.IR uucp (1C).
X.PP
XDuring file transfers 
X.I tip
Xprovides a running count of the number of lines transferred.
XWhen using the ~> and ~< commands, the ``eofread'' and ``eofwrite''
Xvariables are used to recognize end-of-file when reading, and
Xspecify end-of-file when writing (see below).  File transfers
Xnormally depend on tandem mode for flow control.  If the remote
Xsystem does not support tandem mode, ``echocheck'' may be set
Xto indicate
X.I tip
Xshould synchronize with the remote system on the echo of each
Xtransmitted character.
X.PP
XWhen
X.I tip
Xmust dial a phone number to connect to a system it will print
Xvarious messages indicating its actions.
X.I Tip
Xsupports the DEC DN-11 and Racal-Vadic 831 auto-call-units;
Xthe DEC DF02 and DF03, Ventel 212+, Racal-Vadic 3451, and
XBizcomp 1031 and 1032 integral call unit/modems.
X.PP
XThe
X.B \-p
Xoption causes
X.I tip
Xto dial the \fIsystem\fR or \fInumber\fR specified and then enter code
Xdesigned to interact with the remote system in a standard
Xprotocol for sending messages to
Xdialup alphanumeric pagers.  The
X.I page-data
Xargument specifies the service login code, pager id(s), and
Xthe message text.
XEach field is separated by a tab and the entire string must
Xappear to tip as a single argument.
XThe text should not contain any control characters.
XTip will convert any non printable characters to `?'.
XThe pager id field may be further separated with commas into a list
Xof pager ids to receive the same message.  In such a case, all the
Xmessages will be sent in a single phone call.
XFor example the command:
X.br
X.ti 1i
Xtip -p metro "12345678\ \ \ 20001,20002\ \ \ Phone the office."
X.br
Xwould cause the system called ``metro'' in /etc/remote to be called.  Tip
Xwould ``login'' as 12345678 to the ID prompt and then send the message
X``Phone the office.'' to pagers 20001 and 20002.
X.PP
XThe
X.B \-s
Xoption causes
X.I tip
Xto enable SLIP or a similar network protocol on the line after a
Xsuccessful connection and potentially a successful login
Xif a login script is given in /etc/remote (``ls=login_script'').
XThe entry in /etc/remote must specify
Xthe local address (``sa=''), the destination address (``da=''),
Xand the netmask (``sm='') for the connection.  The type of protocol
Xto be enabled can optionally be specified with the ``st=''
Xparameter.  Currently only ``slip'' is supported.
XIf the boolean flage ``rt'' is present, then a default route
Xwill be established on the SLIP interface if the system currently
Xlack a default route for IP.  This is useful for end-point systems
Xwhich use SLIP to connect to a larger gateway system which servers
Xas their only IP path to other systems.
X.PP
X.SM
X.B VARIABLES
X.PP
X.I Tip
Xmaintains a set of
X.I variables
Xwhich control its operation.
XSome of these variable are read-only to normal users (root is allowed
Xto change anything of interest).  Variables may be displayed
Xand set through the ``s'' escape.  The syntax for variables is patterned
Xafter
X.IR vi (1)
Xand
X.IR Mail (1).
XSupplying ``all''
Xas an argument to the set command displays all variables readable by
Xthe user.  Alternatively, the user may request display of a particular
Xvariable by attaching a `?' to the end.  For example ``escape?''
Xdisplays the current escape character.
X.PP
XVariables are numeric, string, character, or boolean values.  Boolean
Xvariables are set merely by specifying their name; they may be reset
Xby prepending a `!' to the name.  Other variable types are set by
Xconcatenating an `=' and the value.  The entire assignment must not
Xhave any blanks in it.  A single set command may be used to interrogate
Xas well as set a number of variables.
XVariables may be initialized at run time by placing set commands
X(without the ``~s'' prefix in a file
X.I .tiprc
Xin one's home directory).  The
X.B \-v
Xoption causes
X.I tip
Xto display the sets as they are made.
XCertain common variables have abbreviations. 
XThe following is a list of common variables,
Xtheir abbreviations, and their default values.
X.TP
X.B beautify
X.br
X(bool) Discard unprintable characters when a session is being scripted;
Xabbreviated 
X.IR be .
X.TP
X.B baudrate
X.br
X(num) The baud rate at which the connection was established;
Xabbreviated
X.IR ba .
X.TP
X.B dialtimeout
X.br
X(num) When dialing a phone number, the time (in seconds)
Xto wait for a connection to be established; abbreviated
X.IR dial .
X.TP
X.B echocheck
X.br
X(bool) Synchronize with the remote host during file transfer by
Xwaiting for the echo of the last character transmitted; default is
X.IR off .
X.TP
X.B eofread
X.br
X(str) The set of characters which signify and end-of-transmission
Xduring a ~< file transfer command; abbreviated
X.IR eofr .
X.TP
X.B eofwrite
X.br
X(str) The string sent to indicate end-of-transmission during
Xa ~> file transfer command; abbreviated
X.IR eofw .
X.TP
X.B eol
X.br
X(str) The set of characters which indicate an end-of-line.
X.I Tip
Xwill recognize escape characters only after an end-of-line.
X.TP
X.B escape
X.br
X(char) The command prefix (escape) character; abbreviated
X.IR es ;
Xdefault value is `~'.
X.TP
X.B exceptions
X.br
X(str) The set of characters which should not be discarded
Xdue to the beautification switch; abbreviated
X.IR ex ;
Xdefault value is ``\et\en\ef\eb''.
X.TP
X.B force
X.br
X(char) The character used to force literal data transmission;
Xabbreviated
X.IR fo ;
Xdefault value is `^P'.
X.TP
X.B framesize
X.br
X(num) The amount of data (in bytes) to buffer between file system
Xwrites when receiving files; abbreviated
X.IR fr .
X.TP
X.B host
X.br
X(str) The name of the host to which you are connected; abbreviated
X.IR ho .
X.TP
X.B prompt
X.br
X(char) The character which indicates and end-of-line on the remote
Xhost; abbreviated
X.IR pr ;
Xdefault value is `\en'.  This value is used to synchronize during
Xdata transfers.  The count of lines transferred during a file transfer
Xcommand is based on receipt of this character.
X.TP
X.B raise
X.br
X(bool) Upper case mapping mode; abbreviated 
X.IR ra ;
Xdefault value is 
X.IR off .
XWhen this mode is enabled, all lower case letters will be mapped to
Xupper case by
X.I tip
Xfor transmission to the remote machine.
X.TP
X.B raisechar
X.br
X(char) The input character used to toggle upper case mapping mode;
Xabbreviated
X.IR rc ;
Xdefault value is `^A'.
X.TP
X.B record
X.br
X(str) The name of the file in which a session script is recorded;
Xabbreviated
X.IR rec ;
Xdefault value is ``tip.record''.
X.TP
X.B script
X.br
X(bool) Session scripting mode; abbreviated
X.IR sc ;
Xdefault is 
X.IR off .
XWhen
X.I script
Xis 
X.IR true ,
X.I tip
Xwill record everything transmitted by the remote machine in
Xthe script record file specified in
X.IR record .
XIf the
X.I beautify
Xswitch is on, only printable ASCII characters will be included in
Xthe script file (those characters between 040 and 0177).  The
Xvariable
X.I exceptions
Xis used to indicate characters which are an exception to the normal
Xbeautification rules.
X.TP
X.B tabexpand
X.br
X(bool) Expand tabs to spaces during file transfers; abbreviated
X.IR tab ;
Xdefault value is
X.IR false .
XEach tab is expanded to 8 spaces.
X.TP
X.B verbose
X.br
X(bool) Verbose mode; abbreviated
X.IR verb ;
Xdefault is 
X.IR true .
XWhen verbose mode is enabled, 
X.I tip
Xprints messages while dialing, shows the current number
Xof lines transferred during a file transfer operations,
Xand more.
X.TP
X.B SHELL
X.br
X(str) The name of the shell to use for the ~! command; default
Xvalue is ``/bin/sh'', or taken from the environment.
X.TP
X.B HOME
X.br
X(str) The home directory to use for the ~c command; default
Xvalue is taken from the environment.
X.PP
X.SH FILES
X.ta \w'/usr/spool/uucp/LCK..*   'u
X.nf
X/etc/remote	global system descriptions
X/etc/phones	global phone number data base
X${REMOTE}	private system descriptions
X${PHONES}	private phone numbers
X~/.tiprc	initialization file.
X/usr/spool/uucp/LCK..*	lock file to avoid conflicts with \fIuucp\fP
X.fi
X.SH DIAGNOSTICS
XDiagnostics are, hopefully, self explanatory.
X.SH "SEE ALSO"
Xremote(5), phones(5)
X.SH BUGS
XThe full set of variables is undocumented and should, probably, be
Xpaired down.
END_OF_FILE
if test 13086 -ne `wc -c <'pf-bootstrap-v1.1a/tipx-p1/tip.1'`; then
    echo shar: \"'pf-bootstrap-v1.1a/tipx-p1/tip.1'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/tipx-p1/tip.1'
fi
if test -f 'pf-bootstrap-v1.1a/xmodem-3.9/getput.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/xmodem-3.9/getput.c'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/xmodem-3.9/getput.c'\" \(12356 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/xmodem-3.9/getput.c' <<'END_OF_FILE'
X/*
X * Contains system routines to get and put bytes, change tty modes, etc
X * Most of the routines are VERY 4.2BSD Specific!!!
X */
X
X#include "xmodem.h"
X
X/*
X *
X *	Get a byte from the specified file.  Buffer the read so we don't
X *	have to use a system call for each character.
X *
X */
Xgetbyte(fildes, ch)				/* Buffered disk read */
Xint fildes;
Xchar *ch;
X
X	{
X	static char buf[BUFSIZ];	/* Remember buffer */
X	static char *bufp = buf;	/* Remember where we are in buffer */
X	
X	if (nbchr == 0)			/* Buffer exausted; read some more */
X		{
X		if ((nbchr = read(fildes, buf, BUFSIZ)) < 0)
X			error("File Read Error", TRUE);
X		bufp = buf;		/* Set pointer to start of array */
X		}
X	if (--nbchr >= 0)
X		{
X		*ch = *bufp++;
X		return(0);
X		}
X	else
X		{
X		return(EOF);
X		}
X	}
X
X/* Count the number of newlines in a file so we know the REAL file size */
X
Xlong
Xcountnl(fd)
Xint fd;
X{
X	char buf[BUFSIZ];
X	char *bufp;
X	long nltot = 0;
X	int numchar;
X	long lseek();
X
X	while (numchar = read(fd, buf, BUFSIZ))		/* cycle through file */
X		for (bufp=buf; numchar--; bufp++)
X			if (*bufp == '\n')
X				nltot++;
X
X	(void) lseek (fd, 0l, 0);			/* rewind file */
X	if (DEBUG)
X		fprintf(LOGFP, "DEBUG: countnl--%ld newlines counted\n", nltot);
X	return (nltot);
X}
X
X/*   CRC-16 constant array...
X     from Usenet contribution by Mark G. Mendel, Network Systems Corp.
X     (ihnp4!umn-cs!hyper!mark)
X*/
X
X/* crctab as calculated by initcrctab() */
Xunsigned short crctab[1<<B] = { 
X    0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
X    0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
X    0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
X    0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
X    0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
X    0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
X    0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
X    0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
X    0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
X    0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
X    0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
X    0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
X    0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
X    0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
X    0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
X    0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
X    0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
X    0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
X    0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
X    0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
X    0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
X    0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
X    0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
X    0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
X    0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
X    0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
X    0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
X    0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
X    0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
X    0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
X    0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
X    0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
X    };
X
X/* get a byte from data stream -- timeout if "seconds" elapses */
X/* This routine is VERY 4.2 specific */
X
Xint
Xreadbyte(seconds)
Xint seconds;
X	{
X	int readfd;
X	char c;
X	struct timeval tmout;
X
X	tmout.tv_sec = seconds;
X	tmout.tv_usec = 0;
X
X	readfd = 1<<0;
X
X	if ((select(1, &readfd, (int *)0, (int *)0, &tmout)) == 0)
X		{
X		if (DEBUG)
X			fprintf(LOGFP, "DEBUG: readbyte TIMEOUT\n");
X		return(TIMEOUT);
X		}
X
X	read(0, &c, 1);
X
X	if (DEBUG)
X		fprintf(LOGFP, "DEBUG: readbyte %02xh\n", c & 0xff);
X
X	return(c & 0xff);  /* return the char */
X	}
X
X/* flush input stream by reading pending characters */
X
Xflushin()
X	{
X	int readfd;
X	char inbuf[BBUFSIZ];
X	struct timeval tmout;
X
X	/* set up a usec timeout on stdin */
X	tmout.tv_sec = 0;
X	tmout.tv_usec = 1;
X	readfd = 1<<0;
X
X	/* any characters pending?; return if none */
X	if ((select(1, &readfd, (int *)0, (int *)0, &tmout)) == 0)
X		return;
X
X	/* read the characters to flush them (assume there are fewer than BBUFSIZ */
X	(void) read(0, inbuf, BBUFSIZ);
X	}
X
X/* 
X get a buffer (length bufsize) from data stream -- timeout if "seconds" elapses.
X Read bunches of characters to save system overhead;
X Further process data while kernel is reading stream (calculating "checksum").
X Try to nap long enough so kernel collects 100 characters or so until we wake up
X unless TOOBUSY is set.
X*/
X
X/* This routine is VERY 4.2 specific */
X
Xint
Xreadbuf(bufsize, seconds, tmode, amode, recvsectcnt, checksum, bufctr)
X
Xint bufsize,	/* number of chars to be read */
Xseconds, 	/* timeout period for each read */
Xtmode, 		/* transmission mode: TRUE if text */
Xamode, 		/* transmission mode: TRUE if apple macintosh */
X*checksum, 	/* pointer to checksum value */
X*bufctr;	/* length of actual data string in buffer */
Xlong recvsectcnt;	/* running sector count (128 byte sectors) */
X
X{
X	int readfd;		/* mask for select call */
X	struct timeval tmout;	/* timeout structure for select */
X	int numread;		/* number of chars read */
X	int left;		/* number of chars left to read */
X	int recfin = FALSE;		/* flag that EOF read */
X	char inbuf[BBUFSIZ];	/* buffer for incoming packet */
X	register unsigned char c;	/* character being processed */
X	register unsigned short chksm;	/* working copy of checksum */
X	register int bfctr;	/* working copy of bufctr */
X	int j;			/* loop index */
X	char *sectdisp();
X
X	tmout.tv_sec = seconds;
X	tmout.tv_usec = 0;
X	readfd = 1<<0;
X	chksm = 0;
X	bfctr = 0;
X
X	for (left = bufsize; left > 0;) {
X
X		/* read however many chars are waiting */
X
X		if ((select(1, &readfd, (int *)0, (int *)0, &tmout)) == 0)
X			return(TIMEOUT);
X
X		numread = read(0, inbuf, left);
X		left -= numread;
X
X		if (DEBUG)
X			fprintf(LOGFP, "DEBUG: readbuf--read %d characters\n", numread);
X
X		/* now process part of packet we just read */
X
X		for (j =  0; j < numread; j++) 
X			{  
X				buff[bfctr] = c = inbuf[j] & 0xff;
X				fileread++;
X
X				if (CRCMODE)  /* CRC */
X					chksm = (chksm<<B) ^ crctab[(chksm>>(W-B)) ^ c];
X
X				else        /* checksum */
X		       			chksm = ((chksm+c) & 0xff);
X
X				if (CHECKLENGTH && fileread > filelength)	/* past EOF ? */
X					continue;
X
X				if (tmode) 		/* text mode processing */
X					{
X					buff[bfctr] &= 0x7f;	/* nuke bit 8 */
X					if (c == CR || c == 0)	/* skip CRs and nulls */
X						continue;
X					else if (c == CTRLZ)	/* CP/M EOF char */
X						{  
X						recfin = TRUE;
X		       				continue;
X		       				}
X		       			else if (!recfin)	/* don't increment if past EOF */
X						bfctr++;
X					}
X				else if (amode) 	/* Apple macintosh text mode processing */
X					{
X					buff[bfctr] &= 0x7f;	/* nuke bit 8 */
X					if (c == 0)		/* skip nulls */
X						continue;
X					else if (c == CR)	/* translate CR to LF */
X						buff[bfctr] = LF;
X					else if (c == CTRLZ)	/* CP/M EOF char */
X						{  
X						recfin = TRUE;
X		       				continue;
X		       				}
X		       			if (!recfin)		/* don't increment if past EOF */
X						bfctr++;
X					}
X				else			/* binary */
X					bfctr++;
X
X		     	}	
X
X		/* go to sleep to save uneeded system calls while kernel
X		   is reading data from serial line; 
X		   fudge constant from 10000 to 9000 to avoid sleeping too long.
X		*/
X		if (left && !TOOBUSY)
X		    napms( (left<SLEEPNUM ? left:SLEEPNUM) * 9000/ttyspeed);
X
X	}
X
X	if (CHECKLENGTH && fileread >= filelength)
X		logitarg("File end from YMODEM length found in sector %s\n",
X		  sectdisp(recvsectcnt,bufsize,1));
X	*checksum = chksm;
X	*bufctr = bfctr;
X	return(0);
X}
X
X/* send a byte to data stream */
X
Xsendbyte(data)
Xchar data;
X	{
X	if (DEBUG)
X		fprintf(LOGFP, "DEBUG: sendbyte %02xh\n", data & 0xff);
X
X	if (write(1, &data, 1) != 1)  	/* write the byte (assume it goes NOW; no flushing needed) */
X		error ("Write error on stream", TRUE);
X	return;
X	}
X
X/* send a buffer to data stream */
X
Xwritebuf(buffer, nbytes)
Xchar *buffer;
Xint  nbytes;
X	{
X	if (DEBUG)
X		fprintf(LOGFP, "DEBUG: writebuf (%d bytes)\n", nbytes);
X
X	if (write(1, buffer, nbytes) != nbytes)		/* write the buffer (assume no TIOCFLUSH needed) */
X		error ("Write error on stream", TRUE);
X	return;
X	}
X
X/*
X * "nap" for specified time -- VERY 4.2BSD specific
X */
X
Xnapms (milliseconds)
Xint	milliseconds;
X{
X	struct	timeval	timeout;
X	int readfd;
X
X	if (milliseconds == 0)
X		return;
X	if (DEBUG)
X		fprintf (LOGFP, "DEBUG: napping for %d ms\n", milliseconds);
X	timeout.tv_sec = 0;
X	timeout.tv_usec = milliseconds * 1000;
X	readfd = 0;
X
X	(void) select(1, &readfd, (int *)0, (int *)0, &timeout);
X}
X
X 
X/* set and restore tty modes for XMODEM transfers */
X/* These routines are 4.2/v7(?) specific */
X
Xstruct sgttyb ttys, ttysnew;	/* for stty terminal mode calls */
Xstruct stat statbuf;		/* for terminal message on/off control */
X
Xint wason;			/* holds status of tty read write/modes */
Xchar *tty;			/* current tty name */
X
X
Xsetmodes()
X	{
X	char *ttyname();
X
X	int n;
X
X	extern onintr();
X
X	sleep(2);			/* let the output appear */
X	if (ioctl(0,TIOCGETP,&ttys)<0)  /* get tty params [V7] */
X		error("Can't get TTY Parameters", TRUE);
X
X	tty = ttyname(0);  /* identify current tty */
X	
X	ttysnew.sg_ispeed = ttys.sg_ispeed;	/* copy input speed */
X	ttysnew.sg_ospeed = ttys.sg_ospeed;	/* copy input speed */
X	ttysnew.sg_flags |= RAW;	/* set for RAW Mode */
X	ttysnew.sg_flags &= ~ECHO;	/* set for no echoing */
X	ttysnew.sg_flags &= ~TANDEM;	/* turn off flow control */
X
X	/* set new paramters */
X	if (ioctl(0,TIOCSETP,&ttysnew) < 0)
X		error("Can't set new TTY Parameters", TRUE);
X
X	/* Flush characters waiting for read or write */
X	n = 0;
X	if (ioctl(0,TIOCFLUSH,&n) < 0)
X		error("Can't flush terminal queue", TRUE);
X
X	if (stat(tty, &statbuf) < 0)	/* get tty modes */ 
X		{
X		logit("Can't get your TTY Status\n");
X		tlogit("Can't get your TTY Status\n");
X		wason = FALSE;
X		}
X	else
X		{
X		if (statbuf.st_mode & 022)
X			{
X			if (chmod(tty, (int)statbuf.st_mode & ~022) < 0)
X				{
X				logit("Can't change TTY mode\n");
X				tlogit("Can't change TTY mode\n");
X				wason = FALSE;
X				}
X			else 
X				wason = TRUE;
X			}
X		else 
X			wason = FALSE;
X		}
X
X	/* set up signal catcher to restore tty state if we are KILLed */
X
X	if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
X		signal(SIGTERM, onintr);
X	}
X
X/* restore normal tty modes */
X
Xrestoremodes(errcall)
Xint errcall;
X	{
X	if (wason)
X		if (chmod(tty, (int)statbuf.st_mode | 022) < 0)
X			error("Can't change TTY mode", FALSE);
X	if (ioctl(0,TIOCSETP,&ttys) < 0)
X		{ if (!errcall)
X		   error("RESET - Can't restore normal TTY Params", FALSE);
X		else
X		     printf("RESET - Can't restore normal TTY Params\n");
X		}
X	if (signal(SIGTERM, SIG_IGN) != SIG_IGN)
X		signal(SIGTERM, SIG_DFL);
X	return;
X	}
X
X
X
X
X/* signal catcher */
Xonintr()
X	{
X	error("Kill signal; bailing out", TRUE);
X	}
X
X/* create string with a timestamp for log file */
X
Xchar *stamptime()
X{
X	char *asctime();		/* stuff to get timestamp */
X	struct tm *localtime(), *tp;
X	struct timeval tv;
X	struct timezone tz;
X
X	gettimeofday (&tv, &tz);		/* fill in timestamp */
X	tp = localtime ((time_t *)&tv.tv_sec);
X	return(asctime(tp));
X}
X
X
X
X/* get tty speed for time estimates */
X
Xgetspeed()
X	{
X	static int speedtbl[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, 
X	   1200, 1800, 2400, 4800, 9600, 19200, 0};
X	if (ioctl(0,TIOCGETP,&ttys) < 0)	/* get tty structure */
X		error("Can't get TTY parameters", FALSE);
X
X	if (ttys.sg_ispeed >= 0 && ttys.sg_ispeed <= 14)
X		{
X		ttyspeed = speedtbl[ttys.sg_ispeed];
X		logitarg ("Line speed = %d bits per second\n", ttyspeed);
X		}
X	else
X		{
X		ttyspeed = 1200;
X		logit ("Can't determine line speed; assuming 1200 bps\n");
X		}
X	}
X
X
X/* turn off keyboard stop signal so stray ^X don't put us in background */
X
Xstopsig()
X	{
X	signal(SIGTSTP, SIG_IGN);
X	}
END_OF_FILE
if test 12356 -ne `wc -c <'pf-bootstrap-v1.1a/xmodem-3.9/getput.c'`; then
    echo shar: \"'pf-bootstrap-v1.1a/xmodem-3.9/getput.c'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/xmodem-3.9/getput.c'
fi
if test -f 'pf-bootstrap-v1.1a/xmodem-3.9/update.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'pf-bootstrap-v1.1a/xmodem-3.9/update.doc'\"
else
echo shar: Extracting \"'pf-bootstrap-v1.1a/xmodem-3.9/update.doc'\" \(12797 characters\)
sed "s/^X//" >'pf-bootstrap-v1.1a/xmodem-3.9/update.doc' <<'END_OF_FILE'
XChanges leading to version 3.3
X
X1) "Better" handshaking for MODEM7 batch transfers (5/19/87).
X
X2) If reception of a file is aborted due to errors, delete incomplete file
X(5/19/87).
X
X3) If an "impossible" tty speed is detected, assume 1200 bps (5/19/87).
X
X4) Disallow CAN-CAN abort during file send or receive except at beginning of
Xfile transfer (during batch transfers, CAN-CAN abort is allowed at beginning
Xof each file transfer) (5/19/87).
X
X5) Uncouple total allowed errors during the reception of a single packet 
X(ERRORMAX, now made 10) and errors allowed when starting transfer (STERRORMAX, 
Xset to 10) (5/19/87).
X
X6) Fix some bugs when receiving an empty file and when a phase error occurs
Xduring a file reception (5/19/87).
X
X7) Portability fix in prtime and projtime; they also handle pathological
Xcases better (5/19/87).
X
X8) During file reception an EOT is not believed unless it is sent again in
Xresponse to a NAK (5/25/87).
X
X9) Modified cpm_unix and unixify so a filename without an extension will not
Xhave a trailing dot in its filename after being received in a MODEM7 or
XYMODEM batch transfer (5/25/87).
X
X10) Allowable errors during transmission of a single packet now set to
XERRORMAX (5/27/87).
X
X11) When transferring a binary file, the YMODEM file length field is filled
Xin on transmit and (if present) used to truncate the file on reception.
XA new truncate function (truncfile) added to getput.c to do the deed (5/28/87).
XThe file mode field is also set but is ignored on file reception.
X
X12) In a batch receive (xmodem -rt), program can be forced into checksum mode
Xby specifying the "M" flag indicating a MODEM7 transfer (5/30/87).
X
X13) Changed the "B" option to "M" to indicate MODEM7 batch.  Made all option
Xflags case insensitive.  Command line is now recorded in the log file
X(5/30/87).
X
X14) The "KND/IMP" convention of using "CK" to invoke 1K packets during YMODEM
Xbatch transfers was installed.  This code will be sent during a batch receive 
Xif "K" is included on the command line unless "M" is also present.  This code
Xwill be recognized when sending under all circumstances (5/30/87).
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.4
X
X1) Fix usage message (10/2/87).
X
X2) Sender will now try up to 10 times (EOTMAX) to send an EOT to terminate a
Xtransmission.  Used to be 5 times, but Chuck Forsberg's "official" minimum
Xrequirements for YMODEM mandate 10 (10/2/87).
X
X3) Handle YMODEM file modification times if present in header on reception of
Xboth binary and text files (10/2/87).  Retracted when can't seem to get
Xproper times when playing with dsz (10/3/87).  Found bug and reinstalled
Xfeature (10/16/87).  Found REAL bug (10/21/87).
X
X4) Null bytes are now stripped out of files when received as text files (MEX
Xdoesn't seem to want to put in the terminating control-Z) (10/3/87).
X
X5) Slightly modified terminal parameter setting to explicitly turn off CRMOD
Xand to flush read queue; ideas stolen from Kermit.  Will it fly on Pyramid?
X(10/3/87).
X
X6) Decreased time between "startup" characters sent when starting a file
Xreceive operation.  This should increase perceived response.  Now waits 
XWAITFIRST seconds (set to 1) instead of 6 (waits for 5 seconds for 
Xsubsequent packets.  STERRORMAX now 60, CRCSWMAX now 30.  
XTimeouts on 1st sector no longer reported in log (10/5/87).
X
X7) Once again played with kernel sleeps in readbuf() (packet reading
Xroutine).  On busy system could cause real problems.  Now supply flag (t)
Xto suppress sleeping on Too Busy systems.  No longer suppress sleep when
Xspeeds are over 4800 bps.  Sleep kludge DOES help: on an empty 750 running
X4.3BSD, a file reception at 2400 bps used 6% of the CPU with the sleep
Xkludge and 24% without it (data transfer rates were the the same)
X(10/5/87). 
X
X8) Actually count characters as they are being read for a file reception.
XWhen YMODEM file length is set, stop writing characters when reach length.
XThis will allow YMODEM file lengths to work for text files and the
Xelimination of truncfile() in getput.c (which was impossible for SYS V)
X(10/5/87).
X
X9) Another attempt at tty modes.  Now do nothing but set speeds, set mode to
Xraw, and turn off echoing and tandem (10/6/87).
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.5
X
X1) Following the suggestion of Bill Carpenter (ho5cad!wjc), I changed every
Xprintf("") to fprintf(stderr, "") so one can use xmodem on either end of unix
Xto unix link. (3/24/88).
X
X2) Again, thanks to Bill Carpenter, corrected typo in stamptime() in
Xgetput.sysv.c (3/24/88).
X
X3) Thanks to Steve Lebowitz (prcpto!pdvshl), fixed a && that should have been
Xa & in getput.sysv.c (3/25/88).
X
X4) Thanks to Leo Pilachowski, who managed to fool xmodem by "preplacing" ACKS
Xin the VAX's input queue (improves throughput by 20%, says Leo, but makes
Xerror recovery a tad dicey...!).  Implemented a flushin() function in
Xgetput.c to flush any pending characters.  flushin is called in send.c just
Xafter sending a packet to make sure a proper ACK or NAK is received (I hope 
Xfast machines don't beat me to it and get their ACKS flushed!).  In
Xreceive.c, flushin is called prior to the "startup" characters, prior to
Xsending the packet acknowledgment ACK and prior to the NAK prompting for
Xconfirming EOT.  Now how does one implement flushin() on Sys V? (3/25/88).
X
X5) Fixed pair of bugs in send.c:  YMODEM test enforcing CRC was testing
Xnumber of attempts against STERRORMAX instead of ERRORMAX (also shortened
Xtimeout interval on this read) and a "timeout" during packet send was not
Xnoticed (due to a > instead of a >=) thus program started sending EOTs which
Xfurther delayed abort (3/28/88).
X
X6) Modified send.c and cpmify function in batch.c to strip path names on file
Xnames transmitted as part of YMODEM batch (3/28/88).
X
X7) Hacked receive.c to make end of loop processing clearer and improve
Xgarbage flushing when errors are detected (3/28/88).
X
X8) Pulled out of decision restricting YMODEM batch send to use CRC only.  Will 
Xnow gladly use checksum if told to and will respond to NAK as well as the 
Xproper C when starting up data transfer (3/28/88).  Turns out this patch fixes 
Xproblem with Red Ryder (4/10/88).
X
X9) Tested MODEM7 batch against MEX-PC.  Confirmation of EOT during filename
Xtransmission was not working, so xmodem wasn't shutting down a MODEM7 batch
Xreceive.  Removed code to NAK first EOT and wait for second EOT in MODEM7
Xfilename transfers (3/28/88).
X
X10) Added code to count number of newlines in a text file to get an accurate
Xfile size.  I thought it would take too long; but seems to be quite nimble
X(see countnl in getput.c).  We now transmit YMODEM file length and mode
Xinformation for text as well as binary files (3/29/88).
X
X11) After a YMODEM file name packet was received, forgot to reset "wait" time
Xfor receiving first character of data packet which definitely slowed
Xperceived performance.  (See note 6 for v. 3.4).  Fixed (4/7/88).
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.6
X
X1) Added two new major commands (sa and ra) to send and receive text files
Xfor Apple Macintoshs which use CR as EOL character instead of the MS/DOS CR
XLF pair.  Thanks to Dave Nowak (djnowak@iseesun.DPL.SCG.HAC.COM) for the
Xinspiration (4/11/88).
X
X2) Experiences with Red Ryder 10.3.  Fixed botch in receive.c that led to an
Xinfinite loop when a checksum failed on YMODEM file name packet.  Now have
Xseperate variables for packet errors and "startup" errors.  Prevent CRC to
Xchecksum switch during receive startup if YMDMBAT flag is true.  This insures
Xthat no such transition will ever take place on second or subsequent file
Xtransfer; can be set on first file by including Y option on command line.  No
Xlonger print "0" expected sectors if both YMODEM file length and KMD file
Xlength are both 0 (4/12/88).
X
X3) Cleaned up ifs in readbuf.  Removed void declaration on flushin (will
Xbreak 4.2BSD compiler?).  Corrected "number of sent sectors" on YMODEM
Xtransfer (was counting filename packet) (4/12/88).
X
X4) More experiences with Red Ryder.  Removed line flush before every CRCCHR
Xor NAK trying to start a receive (RR YMODEM batch send to the VAX now seems
Xto work).  Fixed KMD "1K reception flag" to work properly on a receive. 
XAdded a flushin just before program exits in a futile effort to eliminate
XRR's nasty habit of sending a final EOT down the line.  Rearranged
Xvariables in send.c so longpackets requested by the KMD flag are not
X"sticky" from file to file in a batch.  RR is a real DOG: only gets about 133
Xcps when downloading to a Mac over a 9600 bps line! (4/14/88). 
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.7
X
X1) More strange and wonderful PC xmodem programs!  Dave Jaksha's program
Xwon't send send another EOT when first EOT is NAKed.  Raised timeout
Xthreshold from 3 to 5 seconds and fixed silly bug in receive.c that prevented
Xany more NAKs from being sent in this situation (5/10/88).
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.8
X
X1) Added some fields to YMODEM filename record as per Forsberg's revised
Xspec.  Correct some nits in the way the filename record is handled (11/1/88).
X
X------------------------------------------------------------------------------
X
XChanges leading to version 3.9
X
X1) Better debug message about "packet starting" (10/17/90).
X
X2) Added debug error message when readbyte times out (10/17/90).
X
X3) Now flush input before ACK of received YMODEM filename packet.
X(Will this break Red Ryder? Tough.) (10/17/90).
X
X4) Now explicitly, after receiving YMODEM filename packet, send NAK or
XCRCCHR.  Also, check that output file can be opened before ACKING receipt
Xof YMODEM file name packet.  Both these are required by "True" YMODEM spec.
XAlso, I think this may cure some of the problems seen with various programs
Xtrying YMODEM batch transfers. (10/17/90). 
X
X5) Added some status messages to be printed to stderr under control of the -P
Xflag so we can tell the progress of a transfer when invoked with the "~C"
Xcommand of SunOS tip.  Also added -W flag to slow startup handshake so 
Xfunny characters don't trash input while one is typing the "~C" command string
X(via TIPDELAY define, set to 15 seconds).  Utilizes new tlogit and tlogitarg 
Xmacros. (10/18/90).
X
X6) Made a failure to change the mode bits of the tty a non-fatal error
Xsince, in some systems, uucp owns the device.  Also allows someone who has
Xsu'd to run Xmodem (10/24/90). 
X
X7) Changed error messages about transmissions being canceled "at user's
Xrequest" to "by CAN-CAN" (10/26/90).
X
X8) Go hog-wild with options!  Added "e" option to suppress EOT verification
Xwhen receiving files (should make some brain-damaged PC programs work with
Xxmodem).  Added "n" option to allow CAN-CAN aborts any time during a file
Xtransfer and not just at the beginning.  (10/29/90). 
X
X9) Added a one-liner function (stopsig) to getput.c to ignore keyboard stop
Xsignals so stray ^X characters absorbed during an abort don't put xmodem
Xinto background!  (10/31/90). 
X
X10) Added support for YMODEM-G variant of YMODEM via the "g" flag.
X(11/1/90).
X
X11) Made the "cm" option combination on a receive command force checksum
X"handshaking" during file-name negotiations and CRC-16 use during file
Xtransfer.  Why am I still worried about MODEM7?  (11/1/90).
X
X12) Revised some status messages to indicate that the option (CRC, 1K
Xpackets, YMODEM-G) were invoked from the command line rather than through
X"protocol negotiation."  (11/1/90)
X
X13) Don't send "start-up handshake" character when you get a fatal error in a
Xdata block! (11/2/90)
X
X14) Try to REALLY flush input when die with fatal error in data block. 
XTrying YMODEM-G receptions on a very busy VAX 750 shows up some problems! 
X(11/2/90). 
X
X15) Include a date in the version banner: Version 3.9 (November 1990).
X(11/5/90).
X
X------------------------------------------------------------------------------
X
XThanks to Keith Peterson (w8sdz@simtel20.arpa), John Rupley
X(arizona!rupley!root), Emmet Gray (ihnp4!uiucuxc!fthood!egray), Bob
XBickford (lll-crg!well!rab), Doug Moore (moore@svax.cs.cornell.edu), David
XBrown (jdb@ncsc.arpa), Bill Carpenter (ho5cad!wjc), Steve Lebowitz
X(prcpto!pdvshl), Leo Pilachowski, Dave Nowak
X(djnowak@iseesun.DPL.SCG.HAC.COM), David Elliot (pyramid!boulder!stan!dce),
XBenson Margulis (benson@odi.com), Kit Bingham (kb@umnstat.stat.umn.edu),
XBob Bownes (beowulf!bownes), Bill Stubblebine (hplabs!hp-lsd!was), Chert
XPellett (spdyne!root) and Chuck Forsberg's documents and ZCOMM/DSZ/rz/sz
Xprograms for ideas, suggestions and comments.  Thanks to D'Anne Thompson
Xfor code. 
END_OF_FILE
if test 12797 -ne `wc -c <'pf-bootstrap-v1.1a/xmodem-3.9/update.doc'`; then
    echo shar: \"'pf-bootstrap-v1.1a/xmodem-3.9/update.doc'\" unpacked with wrong size!
fi
# end of 'pf-bootstrap-v1.1a/xmodem-3.9/update.doc'
fi
echo shar: End of archive 6 \(of 9\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 9 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0