#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# Contents:  INSTALL LEGALSTUFF MAILINGLIST depend schedule startdaemon
#   table tpage.l
# Wrapped by kent@sparky on Mon May 17 22:12:19 1993
PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
echo If this archive is complete, you will see the following message:
echo '          "shar: End of archive 2 (of 2)."'
if test -f 'INSTALL' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'INSTALL'\"
else
  echo shar: Extracting \"'INSTALL'\" \(5454 characters\)
  sed "s/^X//" >'INSTALL' <<'END_OF_FILE'
XINSTALL -- How to install the Tom Page set of programs.
X  by Tom Limoncelli, tal@warren.mentorg.com 
X  Copyright (c) 1992, Tom Limoncelli 
X  The sources can be freely copied for non-commercial use only
X  and only if the source is unmodified.
X
XFor program history, read HISTORY.
XFor general program information, read README. 
X
X
XTHEORY OF OPERATION: (this assumes you've read README already)
X--------------------
X
Xtpage.pl (which is often renamed to "beep" or "page") takes a number of
Xoptions, figures out who and how to send to a person, figures
Xout the message, and stuffs the info into a file for the daemon
Xto read.
X
Xtpage.pl refers to /home/adm/lib/tpage/table to find out the phone
Xnumber and other information that must be given to the daemon.  You
Xcan also specify a different file name with the "-T" option.
X
Xtpaged.pl wakes up every couple minutes to see if there
Xis anything new in the queue.  If there is, it takes the information,
Xdials out to your paging company, and transmits the message.
X
XRather than page a particular person, tpage.pl can be given a schedule
Xand be told, "page whoever is on duty right now".  This is done
Xby giving it "-" as the "who" parameter.  The schedule is stored
Xin /home/adm/lib/tpage/schedule, or by specifying a file name with
Xthe "-S" option.
X
Xtpage can take the message from the command line, or from stdin.  If
Xit is coming from stdin, it can parse it as email and do various
Xthings with it (see the man page).
X
X
XINSTALLATION:
X-------------
X
X1.  Install the Perl programming language.  The front-end to tpaged
Xis written in Perl.  Any version should do, but it was developed with
Xversion 4.019.  Hopefully, this program already exists on your system.
XIf not, I highly recommend that you get it from ftp.uu.net:/pub/gnu
Xand install it.
X
XFor the rest of this document, $TPAGE will refer to the directory
Xthat you wish to keep the files associated with the tpage system.
X
XALL FILES SHOULD BE COPIED to $TPAGE except tpage (belongs in
X/usr/local/bin/tpage).  The queue directory should be $TPAGE/pqueue but
Xnothing will break if you put it someplace else.
X"chmod 1777 $TPAGE/pqueue" so that people can write to it but only
Xdelete their own files.
X
X2.  Edit tpage.pl and copy it to "/usr/local/bin/tpage".  The first
Xsection explains what variables need to be edited and why.  You might
Xwant to call it "page" or "beep" instead.
X
XEdit tpaged.pl and copy it to "$TPAGE/tpage".  The first
Xsection of each file explains what variables need to be edited and why.
X
XEdit tpage.l and copy it to "/usr/local/man/manl" or wherever local
Xmanpages are kept.  The first section of each file explains what
Xvariables need to be edited and why.
X
XIf you run SunOS you won't have to edit ixocico.c.  If you don't run SunOS
Xyou're going to have the fun of porting this program.  I put in a couple
Xof #defines to get you started.  Anyway, compile it with a simple
X"make ixocico" and you're done with it.  ixocico doesn't require many
Xedits because tpaged gives it everything it needs to know.  ixocico
Xalso belongs in $TPAGE/ixocico
X
XCopy the sample "table" file and copy it to $DEFAULT_T (which should
Xbe $TPAGE/table if you're smart).  Read it.  Then edit it to your
Xrequirements.
X
XCopy the sample "schedule" file and copy it to $DEFAULT_S (which should
Xbe $TPAGE/schedule if you're smart).  Read it.  Then edit it to your
Xrequirements.  You can edit this later or even skip this step if you
Xdon't care about the schedule feature.
X
X3.  Read the man page ("nroff -man tpage.l | more").
X
X4.  Create the $QUEUE_DIR directory (as defined in $TPAGE/tpage.pl and
X$TPAGE/tpaged.pl) and do a chmod 0777 on it.  Make sure that users on any
Xmachine that should be able to run "tpage" can create files there and
Xdelete at least their own files.  If you use NFS you'll have to export
Xthat directory.  If you don't use NFS, you're smart.
X
X5.  Set up a cron job that runs "startdaemon" every 20 minutes on the
Xmachine with the modems.  You might want to run it as root, you might
Xwant to run it as any user that can access those modems.
X
X6.  Read the man page ("nroff -man tpage.l | more").
X
XTest it and you're done.  Try:
X
Xtpage -d 1xxxyyyzzzz -p 123456 "this is a test"
X(substitute your phone number and pin)
X
Xtpage alias "this is a second test"
X(replace "alias" with a name from the "table" file)
X
Xtpage - -
Xthis is a test using the schedule and stdin.
X^D
X
X(this should page the "person on duty")
X
XBUGS:
X
X-------------------------- INSTALL PROBLEM --------------------------
XSome people have reported that in ixocico.c in the "main()" function
Xneeds "sleep(2); send(modem, "\r"); sleep(2); send(modem, "\r");" added
Xor their paging service doesn't respond.  Here's where to add it:
X
X-------------
Xthis code segment is from main()
X   need to send a few \r's to wake-up some paging terminals
X------------   
X
Xprintf("Waiting for ID=\n");
X
X        /* send a CR every second until "ID=" comes back */
X        failcnt = 10;
X
X/*  CRs needed by PacTel Paging   DJ  */
X
X----->  sleep(2);
X----->  send(modem, "\r");
X----->  sleep(2);
X----->  send(modem, "\r");
X
X        while (failcnt--) {
X                if (match(modem, "ID=", 5)){
X
XSpecial thanks to  Daryl Jones <daryl@tcomeng.com> for reporting this.
X
X-------------------------- INSTALL PROBLEM --------------------------
XDo you run SCO Unix?  Have you gotten ixocico to compile?  Nobody
Xelse has!  Please join the ixo mailing list (ixo-request@warren.mentorg.com)
Xand tell us what you did!
X
END_OF_FILE
  if test 5454 -ne `wc -c <'INSTALL'`; then
    echo shar: \"'INSTALL'\" unpacked with wrong size!
  fi
  # end of 'INSTALL'
fi
if test -f 'LEGALSTUFF' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'LEGALSTUFF'\"
else
  echo shar: Extracting \"'LEGALSTUFF'\" \(1756 characters\)
  sed "s/^X//" >'LEGALSTUFF' <<'END_OF_FILE'
X
XCopyright (c) 1992 Thomas A. Limoncelli, tom_limoncelli@warren.mentorg.com
X
XPermission to use, copy, modify, distribute, and sell this software and
Xits documentation for any purpose is hereby granted without fee,
Xprovided that (i) the above copyright notices and this permission
Xnotice appear in all copies of the software and related documentation,
Xand (ii) the name of Mentor Graphics Corp or any company or
Xorganization that I am associated with may not be used in any
Xadvertising or publicity relating to the software without the specific,
Xprior written permission of that company or orgaization
X
XTHE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
XEXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
XWARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
X
XIN NO EVENT SHALL THOMAS A. LIMONCELLI OR MENTOR GRAPHICS CORP BE
XLIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES
XOF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
XOR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON
XANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
XOR PERFORMANCE OF THIS SOFTWARE.
X
XUse this software at your own risk.  Think before using.  Do not use
Xthis software for mission-critical applications without careful backup
Xprocedures.  Though every effort has been made to make the software bug
Xfree, some bugs are sure to still exist.  More importantly, many paging
Xservices are known to drop some pages when under heavy load, when
Xupgrading their equipment, or at other times.  The author and the
Xauthor's employer are not responsible for problems with the software,
Xthe paging service, or malfunctions of your pager.  Dead batteries are
Xyour problem.
X
END_OF_FILE
  if test 1756 -ne `wc -c <'LEGALSTUFF'`; then
    echo shar: \"'LEGALSTUFF'\" unpacked with wrong size!
  fi
  # end of 'LEGALSTUFF'
fi
if test -f 'MAILINGLIST' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'MAILINGLIST'\"
else
  echo shar: Extracting \"'MAILINGLIST'\" \(539 characters\)
  sed "s/^X//" >'MAILINGLIST' <<'END_OF_FILE'
XUPDATES:  If you have source code changes please send them into the
Xauthor at "tal@warren.mentorg.com".  He does make an effort to
Xintegrate them into the source code, or at least make them available to
Xothers.  He is currently compiling a list of modifications required to
Xuse this software with the various paging services that aren't 100%
Xcompliant.
X
XMAILING LIST:  There is a mailng list for talking about this software
X(and other ixo topics) called ixo@warren.mentorg.com.  To subscribe,
Xsend email to ixo-request@warren.mentorg.com.
END_OF_FILE
  if test 539 -ne `wc -c <'MAILINGLIST'`; then
    echo shar: \"'MAILINGLIST'\" unpacked with wrong size!
  fi
  # end of 'MAILINGLIST'
fi
if test -f 'depend' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'depend'\"
else
  echo shar: Extracting \"'depend'\" \(390 characters\)
  sed "s/^X//" >'depend' <<'END_OF_FILE'
XWhat routines use on what routines
X----------------------------------
X
Xsafeprint: 
X
Xchecksum: safeprint
X
Xgrabmodem:
X
Xsend: safeprint
X
Xmatch: safeprint
X
Xhangup_modem: send
X
Xunlockmodem:
X
Xbail_out: hangup_modem unlockmodem
X
Xlockmodem: bail_out
X
Xgetline: bailout safe_print
X
Xgetpacket: bail_out safeprint
X
Xmain: lockmodem grabmodem bail_out send match hangup_modem getpacket getline checksum
X
END_OF_FILE
  if test 390 -ne `wc -c <'depend'`; then
    echo shar: \"'depend'\" unpacked with wrong size!
  fi
  # end of 'depend'
fi
if test -f 'schedule' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'schedule'\"
else
  echo shar: Extracting \"'schedule'\" \(2140 characters\)
  sed "s/^X//" >'schedule' <<'END_OF_FILE'
X# beepersched -- the schedule of who's on-call at what times.
X# [For use with tpage.pl -- By Tom Limoncelli (tal@warren.mentorg.com)]
X#
X# This file is only used if "who" is "-"
X#
X# The lines that begin with 0-6 refer to the days Sun-Sat.  The 48
X# bytes after refer to who's on duty each half-hour.
X#
X# This schedule shows tal, ingo, and greg as
X# having different hours.  On Monday night, all three are paged.
X# 
X# A "-" in this list (not to be confused with "-" on the command
X# line) means "no body is on duty".  If the "-U" (urgent) is used,
X# beep2.pl keeps looking for another schedule to see if maybe it
X# can find someone else scheduled for that time.  The way I manage
X# things is to have lower-case letters mean individual people and
X# capitol letters meaning the fall-back "urgent" people (usually a list
X# of the person and their fallback).  For example, "g" is for greg,
X# and "G" is for greg and the person that backs him up.
X# Of course, you can use any system you wish.
X#
X#                        N
X#                        O
X#                    1 1 O                   1 1
X#0 1 2 3 4 5 6 7 8 9 0 1 N 1 2 3 4 5 6 7 8 9 0 1
X0--------------------ttttttttttttttttAAAAAAAAAAAA
X1------------ttttgggttttttggggiiiiiiitt----------
X2------------ttttgggttttttggggiiiiiiitttttttttttt
X3------------ttttgggttttttggggiiiiiiitt----------
X4------------ttttgggttttttggggiiiiiiitttttttttttt
X5------------ttttgggttttttggggiiiiiiitt----------
X6-------------------tttttttttttttttttttttttttt---
X#
X# these will only be accessed if -U is used.
X# A "-" in this list means "don't call anyone"
X#
X#                    1 1 O                   1 1
X#0 1 2 3 4 5 6 7 8 9 0 1 N 1 2 3 4 5 6 7 8 9 0 1
X0TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT
X1TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT
X2TTTTTTTTTTTTTTTTTTT--------------TTTTT----------
X3TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
X4TTTTTTTTTTTTTTTTTTT--------------TTTTT----------
X5TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT
X6TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT
X#
X#
Xg=greg
Xi=ingo
Xt=tal
X#
X# a person and their backup
XG=greg,tal
XI=ingo,greg
XT=tal,greg
X#
XA=greg,tal,ingo
END_OF_FILE
  if test 2140 -ne `wc -c <'schedule'`; then
    echo shar: \"'schedule'\" unpacked with wrong size!
  fi
  # end of 'schedule'
fi
if test -f 'startdaemon' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'startdaemon'\"
else
  echo shar: Extracting \"'startdaemon'\" \(595 characters\)
  sed "s/^X//" >'startdaemon' <<'END_OF_FILE'
X#! /usr/local/bin/perl4.019
X
X# "start daemon" -- Start the tpaged daemon if it isn't running.
X#   by Tom Limoncelli, tal@warren.mentorg.com
X#   Copyright (c) 1992, Tom Limoncelli
X
X
X$BSD = -f '/vmunix';
X$pscmd = $BSD ? "ps -auxww" : "ps -ef";
X
Xopen(PS, "$pscmd|") || die "Can't run ps: !$";
X$title = <PS>;
X$found = 0;
Xwhile (<PS>) {
X	chop;
X	$found = 1 if /tpaged/;
X}
X
Xif (!$found) {
X	unless (fork) {	#	this is the child
X		unless (fork) {	#	this is the child's child
X			sleep 1 until getppid == 1;
X			system "/home/adm/lib/tpage/tpaged &";
X			exit 0;
X		}
X		exit 0;
X	}
X	print "Started tpaged\n";
X}
END_OF_FILE
  if test 595 -ne `wc -c <'startdaemon'`; then
    echo shar: \"'startdaemon'\" unpacked with wrong size!
  fi
  chmod +x 'startdaemon'
  # end of 'startdaemon'
fi
if test -f 'table' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'table'\"
else
  echo shar: Extracting \"'table'\" \(623 characters\)
  sed "s/^X//" >'table' <<'END_OF_FILE'
X# beepertab -- table of information about people's beepers.
X# [ For use with tpage.pl by Tom Limoncelli (tal@warren.mentorg.com)]
X#
X# Comment lines begin with "#".
X#
X# The columns are name, numeric pager phone # (currently unused), IXO
X# protocol number to dial, and the person's pagerid.
X#
X# Aliases are implemented by repeating data.  (ooo, fancy!)
X#
Xgreg     5551212    18006789012     1234567
Xgregt    5551212    18006789012     1234567
X#
Xingo     5551213    18006789012     7654321
Xidean    5551213    18006789012     7654321
X#
Xtom      5551214    18006789012     1122334 
Xtal      5551214    18006789012     1122334 
END_OF_FILE
  if test 623 -ne `wc -c <'table'`; then
    echo shar: \"'table'\" unpacked with wrong size!
  fi
  # end of 'table'
fi
if test -f 'tpage.l' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'tpage.l'\"
else
  echo shar: Extracting \"'tpage.l'\" \(6781 characters\)
  sed "s/^X//" >'tpage.l' <<'END_OF_FILE'
X.ds l local
X.TH TPAGE N "05 May 1992"
X.BY "Tom Limoncelli, tal@warren.mentorg.com"
X.SH NAME
Xtpage \- front-end to Tom's Pager System
X.br
Xtpaged \- daemon that manages paging queue
X.br
Xixocico \- program that executes the IXO protocol
X.SH SYNOPSIS
X.B /usr/local/bin/tpage
X[
X.B \-T
Xtable file
X] [
X.B \-S
Xschedule file
X] [
X.B \-U
X] [
X.B \-d
Xphone num
X] [
X.B \-p
Xpin
X] [
X.B \-t
X] [
X.B \-v
X] [
X.B \-m
X] [
X.B \-M
X] [
X.B \-e
X]
X.B who
X[
X.B message
Xor
X.B \-
X]
X.br
X.B /home/adm/lib/tpage/tpaged
X.br
X.B /home/adm/lib/tpage/ixocico
Xdev phonenum
X.br
X.SH DESCRIPTION
X.I tpage
Xis the front-end to the system.  A user can run this program to
Xsubmit a message to someone's pager.
X.PP
XThe program wants 4
Xthings:  (1) the phone number to dial, (2) the person's PIN
Xpin (Personal Identification Number), (3) who to email if the
Xpage isn't accepted, and (4) the message.
X.PP
XOnce it has all that information, it dumps it into a file
Xwhich is read by 
X.B tpaged
Xwhich delivers the message to the paging service using
Xthe appropriate protocol.  tpaged selects the correct
Xprogram for you.  Each protocol is implemented as
Xa separate program.  Currently \fBixocico\fR
Xis the only program to choose from, and it implements 
Xthe IXO protocol.
X.PP
XThe phone 
Xnumber (1) and PIN (2) can be specified with the 
X.B \-d
Xand
X.B \-p
Xoptions, OR by specifying a name (which instructs tpage
Xto look up the information in the pager table file), OR by 
Xspecifying the name ``\-'' which
Xmeans ``whoever is on duty'' (which instructs tpage to find
Xout who is on duty from the schedule file, and then look up
Xtheir phone number and PIN in the pager table file).
X.PP
XSpecifying a phone number without a PIN (or vice-versa) results
Xin the missing data being looked up in the pager table file.
X.PP
XA comma-separated list of names may be given.  It is much more
Xefficient to use a list of names than to do single pages.
X.PP
XNOTE: A name must always be specified, so if you use the
X.B \-d
Xand
X.B \-p
Xoptions you must also specify a name (such as ``foo'') which will
Xbe ignored.  Combining a list of names with the
X.B \-d
Xand/or
X.B \-p
Xoptions works in a logical but undefined manner.
X.PP
XTo specify who to email if there is a problem (3) use the
X.B \-e
Xoption.  The default for this is to not send email to anyone.
X.PP
XThe message (4) can be specified on the command line or if ``-'' is
Xgiven, stdin is read for the message.  No matter how many
Xbytes you give it, the high-bit is stripped, RETURNs and TABs are
Xturned into spaces, and groups of spaces are turned into single
Xspaces.  The first 160 bytes (configurable in the program) is
Xall that's sent, since that's all that the pager will display.
X.PP
XCommand-line options are:
X.TP 10
X.BR \-T " table file"
X\fItable file\fR is the file that has the
Xtable of people and the info needed to communicate
Xwith their pager.  The default is /home/adm/lib/tpage/table.
X.TP
X.BR \-S " schedule file"
X\fIschedule file\fR is the file that has the
Xis the file that is used
Xto find out who's on duty at this moment.  This file is only
Xconsulted if ``who'' is ``\-''.  The default is
X/home/adm/lib/tpage/schedule.
X.TP
X.B \-U
XThis option marks the message as \fIurgent\fR.  If the schedule
Xlists that no one is on duty at that time but the message is
Xmarked \fIurgent\fR, a secondary schedule is consulted.
X.TP
X.BR \-d " phone num"
XIgnore what the table file says, use this phone number when
Xdialing.  If a list of people is specified, this phone number
Xis used for the first person, the others will be looked
Xup in the \-T file.
X.TP
X.BR \-p " pin"
XIgnore what the table file says, use this PIN when transmitting
Xthe message.
XIf a list of people is specified, this phone number
Xis used for the first person, the others will be looked
Xup in the \-T file.
X.TP
X.B \-t
XAct as a ``tee''.  Copy stdin to stdout.  If you give this
Xoption and the message is not coming from 
X.TP
X.B \-v
XVerbose mode.  Currently useless since there isn't anything
Xextra worth printing.
X.TP
X.B \-m
XParse the input as mail.  Skip all the headers but extract the ``From'',
X``Subject'', and ``Priority'' lines.  If they exist, append to the
Xbeginning of the message ``F: frominfo'', ``S: subject line'',
X``P: priority''.  ``F:'' and ``P:'' are clipped to be one screenful
Xin length.  They are all padded out to the end of the screen.
X.TP
X.B \-M
XSkip ``mail quoted'' lines.  Netnews and Mail often have other messages
Xquoted by prefixing each line with greater than symbol.  This option
Xskips any input line that begins with zero or more whitespace charactors,
Xfollowed by zero or more letters or numbers, followed by zero or more
Xof \<, \>, {, or }.  This should catch the normal quoting methods
Xas well as anything the perverse superquote.el package 
Xfor GNU Emacs
Xmight come up with.
X.TP
X.B \-e
XOn error, send email to this person.  If any errors happen when
Xthe tpage command is beign run, the user is notified.  This
Xis for sending email when the page is being processed.  In
Xother words, if the PIN is incorrect.  If the phone number is
Xincorrect the tpaged daemon will keep redialing and redialing it
Xtrying to figure out why it can't get through.
X.PP
X.IR tpaged
Xtpage is a program that you don't need to know about.  Your
Xsysadmin should have installed it for you.  It wakes up about
Xevery 20 seconds, sees if there are any new messages to send
Xout and tries to send them.  It can understand multiple paging
Xprotocols (tpage picks the best one for you) though it
Xcurrently only knows about the IXO protocol.  tpage can run
Xas ``root'' but is often just run as ``daemon''.
X.PP
X.IR ixocico
Xis the message transport program for the tpage system.  It is called
Xby
X.B tpaged
Xand told what device to use and what phone number to dial on
Xthe command line.  It
Xgets the PINs and messages to send from stdin.
X.PP
XIt co-exists with the uucp programs fine as it uses the
Xsame methods to lock the modems.  It notices stale locks
Xand blows them away.  Not all locking features have been
Xproven to work on HPUX, only SunOS.
XIt will not wait for a modem to be unlocked.
X.PP
X.B tpaged
Xwatches the output of
X.B ixocico
Xfor lines beginning with # to know success
Xor failure of particular messages and of the entire batch.
X.PP
X.SH FILES
X.ta 6c
X.nf
X/home/adm/lib/tpage/schedule	schedule of who's on duty
X/home/adm/lib/tpage/table	table of people and their pager info
X.SH SEE ALSO
Xuucico(1), xkill(l)
X.SH HISTORY
XWritten by Tom Limoncelli (tal@Warren.MENTORG.COM)
Xat Mentor Graphics Corporation, Silicon Design Division,
XWarren, New Jersey.  May be re-distributed only in it's unmodified
Xform.
X.SH BUGS
XIf
X.B \-d
Xand
X.B \-p
Xare specified, a name still must be specified.
X.PP
XIt currently only compiles under SunOS even though some
Xdefines are inserted so that it doesn't fail all over the
Xplace on silly operating systems like HPUX.
END_OF_FILE
  if test 6781 -ne `wc -c <'tpage.l'`; then
    echo shar: \"'tpage.l'\" unpacked with wrong size!
  fi
  chmod +x 'tpage.l'
  # end of 'tpage.l'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still must unpack the following archives:
    echo "        " ${MISSING}
fi
exit 0
exit 0 # Just in case...

