home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / misc / volume07 / rna < prev    next >
Encoding:
Internet Message Format  |  1991-08-27  |  19.2 KB

  1. From decwrl!ucbvax!tut.cis.ohio-state.edu!gem.mps.ohio-state.edu!ginosko!uunet!allbery Thu Aug  3 08:50:38 PDT 1989
  2. Article 984 of comp.sources.misc:
  3. Path: decwrl!ucbvax!tut.cis.ohio-state.edu!gem.mps.ohio-state.edu!ginosko!uunet!allbery
  4. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5. Newsgroups: comp.sources.misc
  6. Subject: v07i092: RNA
  7. Message-ID: <61155@uunet.UU.NET>
  8. Date: 22 Jul 89 01:00:38 GMT
  9. Sender: allbery@uunet.UU.NET
  10. Reply-To: venta@i2ack.UUCP (Paolo Ventafridda)
  11. Lines: 629
  12. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  13.  
  14. Posting-number: Volume 7, Issue 92
  15. Submitted-by: venta@i2ack.UUCP (Paolo Ventafridda)
  16. Archive-name: rna
  17.  
  18. :
  19. # This is a shell archive, meaning:
  20. # 1. Remove everything above the : line.
  21. # 2. Save the resulting text in a file.
  22. # 3. Execute the file with /bin/sh (not csh) to create:
  23. #    README
  24. #    version
  25. #    RNA
  26. # This archive created: Wed Jul 12 14:21:18 1989
  27. export PATH; PATH=/bin:/usr/bin:$PATH
  28. if test -f 'README'
  29. then
  30.     echo shar: "will not over-write existing file 'README'"
  31. else
  32. cat << \SHAR_EOF > 'README'
  33.  
  34.                             Remote Network Archive
  35.                             ----------------------
  36.  
  37.  
  38.          Hey,  don't  do  it,  don't go installing  RNA  without  first
  39.          reading these few lines!  Lemme explain what RNA was made for,
  40.          and  what  rna won't do.  It won't take long, so forget  about
  41.          the keyboard for a while and read this tiny manual.
  42.          GIVE ME A CHANCE!  Thank you.
  43.  
  44.                                Paolo Ventafridda
  45.  
  46.  
  47.          WHAT IS RNA
  48.          -----------
  49.          Suppose  that  your system has some software (any  kind)  that
  50.          other  people  on the network sometimes request, and  you  are
  51.          becoming  crazy on uucp transfers, and mail such "please could
  52.          you send me file xxx thx" etc.  Rna will allow your neighbours
  53.          to help themselves using simple mail commands such as "send me
  54.          file  xxx " just like if they were asking YOU.  All files will
  55.          travel  through  ANY network like mail, not like  UUCP;   this
  56.          means  that also BITNET, DECNET, FIDOnet users will be able to
  57.          help themselves without bothering you anymore!
  58.  
  59.          There's  a  program  around called NETLIB, developed  by  AT&T
  60.          research centers, which already does this thing, and also very
  61.          well;   it's  powerful, but also complicated to  install,  and
  62.          anyway has bigger docs than rna ;-)
  63.  
  64.          If  you  don't need all of that power, and you want  something
  65.          really  easy  to install and to mantain,and eventually  remove
  66.          ;-(  than have a look at rna.  There are two good reasons  for
  67.          trying it:
  68.          1- it works fine
  69.          2- it's free.
  70.  
  71.          FEATURES
  72.          --------
  73.          -  Handles  commands  such  as  "  please  send  tetris.Z   to
  74.          bob@usixth  "  , it doesn't care of where these  commands  are
  75.          placed  inside  your mail, even the Subject will do.  You  can
  76.          put multiple commands inside the same message.
  77.        
  78.          -  If  file  does not exist, or is not readable,  it  gives  a
  79.          response about it.
  80.  
  81.          -  If requested file is not ascii, it will uuencode it  before
  82.          shipping.
  83.         
  84.          -  Index is available with " send index to ..  " :  index is a
  85.          ls of your public directory, automatically done on request, so
  86.          you  don't  need to spend time on your archive.  If you  want,
  87.          create  a "index" file in pubdir, containing full descriptions
  88.          of your (some) files.  This list will be appended to the "ls".
  89.         
  90.          - Help is available with "send help to ...".  This is a trick:
  91.          help is a common file like others.  But don't tell it around.
  92.          
  93.          -  Attention  please:  rna does not recognize in this  version
  94.          the  address  of the sender, in fact you have to specify  "to:
  95.          ..".   This might cause some problems to someone.  Trust  your
  96.          neighbours,  or  install  netlib!  Anyway, if  someone  enjoys
  97.          sending big files to enemies through your rna, a copy of their
  98.          letters will still be in your log.
  99.  
  100.          WHAT? A SHELL SCRIPT?
  101.          ---------------------
  102.          What's  wrong, John, never seen a shell script?  Well, rna  IS
  103.          written  in standard Bourne Shell.  People thinks that only  C
  104.          programs  can  do  useful  things;  well, i  think  that  Real
  105.          Programmers don't use C, if they can do it in Shell.
  106.          Now,  RNA  is NOT meant to run full time, but only once  every
  107.          while,  launched by cron, just to see if there's something  to
  108.          do.  So speed is not important, not at all!
  109.  
  110.          INSTALLATION  
  111.          ------------
  112.          You  need a dedicated directory for the rna package.  In  this
  113.          directory  rna  will keep its logs and its files.   rna  takes
  114.          only  a  couple  of  temporary files, the rest  is  done  with
  115.          variables.
  116.  
  117.          You need a directory which will contain your "public" software
  118.          (PUBDIR).   RNA  in  this  version   only  allows  ONE  public
  119.          directory, and all files are taken there.
  120.  
  121.          You  may  put inside PUBDIR a file named "help";   that's  the
  122.          file  that  will be sent to your guests whenever they ask  for
  123.          it.  If there's no help, RNA will say "no help available" (you
  124.          bet it).
  125.  
  126.          You  may put inside PUBDIR a file named "index";  when someone
  127.          asks  for  an index, RNA does an ls -log , greps out  eventual
  128.          "index" and "help" files, and appends -if existing- this file.
  129.          Usually   it  should  contain   full  descriptions  of  files,
  130.          warnings, greetings or whatever.
  131.  
  132.          You  need a dummy login entry for the mail, say "rnalib",  and
  133.          put an alias like " netlib rnalib " ;-) _
  134.          Guests  should send mail to this login, whose mailbox will  be
  135.          checked by RNA.  Don't use root or other system accounts.
  136.  
  137.          Last  but  not least, go in /usr/lib/cron/crontabs and put  an
  138.          entry  for executing RNA, say once every hour, or once a  day.
  139.          RNA  starts,  check  if there's mail for it,  and  if  there's
  140.          nothing waiting it exits.  No CPU load.
  141.  
  142.          For  permissions:   RNA  wants  to be  owner  of  its  working
  143.          directory  (of course), owner of it's own mail (of course) and
  144.          able  to  go in usr/mail (/usr/spool/mail..) to cp and  remove
  145.          pending messages .  RNA needs also PUBDIR to be readable.
  146.  
  147.          To  configure  RNA edit the program itself:  at the  beginning
  148.          there's everything you need, and a comment for every variable,
  149.          so it's really easy and would make this doc useless.
  150.  
  151.      Addendum: have a look at getmail() procedure: it set permissions
  152.      as on my system, you may need to fit your own mail setup.
  153.  
  154.          ACCOUNTING
  155.          ----------
  156.          RNA  keeps a log of its actions ( file "xxx" sent to "yyy"  ),
  157.          and  also  keep a copy of all mails, so that you'll always  be
  158.          able to go and see what happened.
  159.  
  160.          If  you want a "debug" view of what RNA does, set DEBUG inside
  161.          configuration:   debug  occurs  as stdout,  and  won't  affect
  162.          default log file.
  163.  
  164.          SYNTAX
  165.          ------ 
  166.          RNA  detects  command  lines  by grepping  out  "@@"  headers.
  167.          Allowed syntax is in the form of:
  168.  
  169.                 @@ [please] action argument [to] address
  170.  
  171.          where  [please]  and  [to] (also To, to:, etc.)  don't  count;
  172.          action  is  only  "send"  (or   SEND  etc.),  and  address  is
  173.          recognized in three forms:
  174.  
  175.                 - UUCP address, containing a "!"
  176.                 - ARPA address, containing a "@"
  177.                 - local address
  178.  
  179.          UUCP  and  ARPA are checked to be made of at least  two  words
  180.          (host  and  user..).   In this case address is  validated  and
  181.          passed to your mailer (its business then).
  182.          Wildcards  are  not  allowed.   Security  is  accomplished  by
  183.          looking for "/" and similar chars.
  184.          
  185.          ARCHIVING
  186.          ---------
  187.          RNA  recognizes non-ascii files by looking at file names.   By
  188.          default any file whose name contains:
  189.  
  190.                 *.Z*
  191.                 *.z*
  192.                 *.tar*
  193.                 *.cpio*
  194.                 or NO "." at all
  195.  
  196.          will  be  considered  non-ascii, and though  uuencoded  before
  197.          mailing.   Any  file with other suffixes, such as .src,  .any,
  198.          .doc  etc.  will be left as-it-is.  Remember that a file  like
  199.          "tetris",  with  no dots, will be uuencoded.  If you  want  to
  200.          change this behaviour, change the source, it's easy.
  201.  
  202.          COPYRIGHTS, AUTHOR'S NOTES ETC.ETC.
  203.          -----------------------------------
  204.          
  205.          This  is  of course freeware, so i don't ask money for it  and
  206.          you can't ask money TO me for any trouble it may cause you.
  207.  
  208.          This  software  may be freely distributed provided  you  don't
  209.          make  money  out of it.  This means that EUNET sites  are  not
  210.          allowed to use it without explicit request to myself.
  211.  
  212.          For a free EUropean CONnection
  213.  
  214.                 Paolo Ventafridda, July 1989
  215.  
  216.          venta@altger.UUCP  ({..}!altos86!altger!venta)
  217.          venta@i2ack.UUCP   (sublink/subnet/s.u.n.: EUcon networks only)
  218.      {...}!ddsw1!deejay!i2ack!venta   (USENET)
  219.      desperation: pyramid!tmpmbx!deejay!i2ack!venta
  220.  
  221.          Don't send through mcvax/unido/i2unix since i am blacklisted,
  222.          like all of the rest of EUcon.
  223.  
  224.  
  225. SHAR_EOF
  226. fi
  227. if test -f 'version'
  228. then
  229.     echo shar: "will not over-write existing file 'version'"
  230. else
  231. cat << \SHAR_EOF > 'version'
  232. Version 1.0 july 1989
  233.  
  234. If there's some feedback, i can easily add multiple public directories
  235. ( send file from dir to user@host )
  236. directory password protection
  237. ( send file from dir to user@host password= abcdefg )
  238. and finally sender address.
  239.  
  240. SHAR_EOF
  241. fi
  242. if test -f 'RNA'
  243. then
  244.     echo shar: "will not over-write existing file 'RNA'"
  245. else
  246. cat << \SHAR_EOF > 'RNA'
  247. :
  248. # Remote Network Archive  version 1.0
  249. # by venta@i2ack.UUCP (EUcon)
  250. #
  251. # Before doing anything, Read the manual!
  252. # ---------------------------------------------
  253. # setup these DEFines , and you are ready to go
  254. # ---------------------------------------------
  255. # Archive directory: this is were your archived files are stored.
  256. # All the stuff in/out going is merely taken here. Don't choose
  257. # other system dirs such as uucppublic.
  258. PUBDIR=/usr/spool/uucppublic/rna
  259. # System directory: this is a dedicated directory for rna. System
  260. # files, log, and garbage will be put here. This directory will not
  261. # be public, and should be closed to others but root.
  262. WORKDIR=/usr/local/src/sendnews
  263. #
  264. # The login used as rna entry: tipically a dummy login, just to allow
  265. # mail spooling. Usually stuff like 'fserver', 'netserv', 'netlib' etc.
  266. LOGNAME=rnalib
  267. #
  268. # The local postmaster, i.e. the person which will eventually solve
  269. # remote users problems. 
  270. # If you don't know what a Postmaster is, you are probably in the
  271. # wrong place. Put 'root' and go on, this is only a reference.
  272. POSTMASTER=root
  273. #
  274. # The mail file for LOGNAME, complete path. Usually:
  275. # /usr/spool/mail/$LOGNAME  on Xenix systems
  276. # /usr/mail/$LOGNAME  on Unix System V and BSD .
  277. MAIL=/usr/spool/mail/$LOGNAME
  278. #
  279. # The name of your machine, as of 'uname -n' or similar.. Hey, dont put
  280. # another one, use the correct local machine name. Don't cheat.
  281. UNAME=i2ack
  282. #
  283. # Name of the file containing all of rna logs, status etc. 
  284. # also called "accounting"..
  285. LOGFILE=$WORKDIR/log
  286. #
  287. # Name of the file which is going to keep record of ALL incoming mails.
  288. # Sort of archive, needs to be cleaned up sometimes.
  289. MAILFILE=$WORKDIR/mail
  290. #
  291. # Debugging would occur on stdout, NOT on logfile
  292. # 1=debug (try it for fun once), nodebug= leave a SPACE, dont put a 0
  293. DEBUG=
  294. #
  295. # some progs never in the same place... please tell where they are
  296. MAILER=/bin/mail
  297. ENCODE=/usr/local/bin/uuencode
  298. #
  299. # --- internal variables ---
  300. TMP=$WORKDIR/tmp
  301. CMDS=$WORKDIR/tmpcmds
  302. CMDLOG=$WORKDIR/commlog
  303.  
  304. # -------------------- some procedures... ----
  305. quit() {
  306.     acc "shutdown requested"
  307.     exit
  308. }
  309.  
  310. acc() {
  311.     echo "`date '+%d.%m.%y - %H:%M:%S` : $@" >>$LOGFILE
  312.     test $DEBUG && echo "$@"
  313. }
  314.  
  315. getmail() {
  316.    rm $TMP 2>/dev/null
  317.    mv $MAIL $TMP
  318.    touch $MAIL; chown $LOGNAME $MAIL; chgrp mail $MAIL; chmod 620 $MAIL
  319.    touch $MAILFILE; echo "`cat $TMP`\n===\n" >>$MAILFILE 
  320.     }
  321.  
  322. clrfiles() {
  323.     rm -f $CMDLOG 2>/dev/null; touch $CMDLOG
  324.     rm -f $CMDS 2>/dev/null
  325. }    
  326.  
  327.  
  328.  
  329. parse() {
  330.  
  331. # some pre-parsing for naughty characters..
  332. grep @@ $TMP | sed 's/\*/ERR/g' >$CMDS
  333.  
  334. if test -s $CMDS; then
  335.     set `wc -l $CMDS`; cmds=$1
  336.     acc "mail contains $cmds command line(s)"
  337.  
  338. test $DEBUG && echo "start parsing"
  339.     strings="`cat $CMDS`"
  340.     set -f $strings
  341. test $DEBUG && echo "$# words"
  342. #
  343. # main parse loop
  344. #
  345. error=0; position=0; action=""; argument=""; destination=""
  346. #
  347. while [ "$1" != "" ]
  348. do
  349. test $DEBUG && echo "parsing: $1"
  350.     case $1 in
  351.         @@) 
  352.         test $DEBUG &&    echo restart found
  353.             action=""; argument=""; position=0; destination=""
  354.             shift;;
  355.  
  356.         ERR)    
  357.             ( acc "parser: wildcards error" )
  358.             error=1;;
  359.  
  360.         [sS][eE][nN][dD]|[sS][eE][nN][Dd]:)
  361.             test $DEBUG && echo send detected
  362.             if test $position -eq 0 
  363.             then
  364.                 action=send; position=1;
  365.                 shift
  366.                 if test -z "$1" 
  367.                 then
  368.                     error=1;
  369.  test $DEBUG && echo "eof while arg in send"
  370.                 else
  371.                     argument=$1; position=2
  372.                     shift
  373.                 fi
  374.             else
  375.             error=1; 
  376. test $DEBUG && echo send is in wrong position
  377.             fi;;
  378.             
  379.  
  380.         [tT][Oo]|[tT][oO]:)    
  381.     test $DEBUG && echo to detected
  382.             if test $position -eq 2 
  383.             then
  384.                 shift
  385.             else
  386. test $DEBUG && echo to is in wrong position
  387.                 error=1
  388.             fi;;
  389.  
  390.         *[Pp]lease*)
  391.     test $DEBUG &&    echo please detected
  392.                 if test $position -eq 0 -o $position -eq 2
  393.             then
  394.                 shift
  395.         test $DEBUG &&    echo please shifted
  396.             else
  397.             test $DEBUG && echo error please
  398.                 error=1
  399.             fi;;
  400.                 
  401.  
  402.         *)
  403.             if test $position -eq 2
  404.             then
  405.                 destination=$1; position=3
  406.                 shift
  407.             else
  408.             test $DEBUG &&    echo unknown
  409.                 error=1
  410.             fi;;
  411.     esac            
  412.  
  413. if test $error -gt 0
  414. then
  415. test $DEBUG && echo recovering error
  416.     while [ "$1" != "@@" ]
  417.     do
  418.     test -z "$1" && test $DEBUG && echo eof detected while recovering error
  419.         test -z "$1" && break
  420.         shift
  421.     done
  422.     error=0
  423. test $DEBUG &&    echo end rewind
  424. fi
  425.     test $DEBUG && echo action=$action argument=$argument dest=$destination
  426.  
  427. if test $position -eq 3
  428. then
  429.     ( acc "parser: $action ($argument) to: ($destination)" )
  430.     echo $action $argument $destination >>$CMDLOG
  431.     
  432.     position=0; argument=""; destination="";
  433. fi
  434.         
  435.  
  436. # end while
  437. done
  438. test $DEBUG && echo EOF
  439. else
  440. acc "parser: no command lines found"
  441. fi
  442.  
  443. }    
  444.  
  445. interp() {
  446.  
  447. if test -s $CMDLOG; then
  448.     set `wc -l $CMDLOG`; cmds=$1
  449.     ( acc "interpreter: found $cmds command line(s)" )
  450.  
  451.  
  452. strings="`cat $CMDLOG`"
  453. set -f $strings
  454. test $DEBUG && echo "$# words"
  455. #
  456. # main loop
  457. #
  458. while [ "$1" != "" ]
  459. do
  460. test $DEBUG && echo "parsing: $1"
  461. #
  462. action=""; argument=""; destination=""
  463. case $1 in
  464.  
  465.     help)
  466.         action=send
  467.         shift; shift
  468.         argument=help
  469.         destination=$1;;
  470.  
  471.     send)    
  472.         action=send
  473.         shift; argument=$1
  474.         shift; destination=$1;;
  475.  
  476.      *)
  477.         ( acc "interpreter error: token $1" )
  478.         shift; shift;;
  479.  
  480. esac
  481.  
  482. test $DEBUG && echo "ACTION=$action, ARG=$argument, DEST=$destination"
  483.  
  484. # first we parse destination: if it's illegal, we dont waste
  485. # time parsing the argument
  486. if test `echo $destination | grep @` 
  487. then
  488. test $DEBUG && echo arpa address
  489.     if [ `echo $destination | sed 's/@/ /g' | wc -w` -eq 2 ]; then 
  490.         destype=ARPA
  491.         test $DEBUG && echo valid arpa address 
  492.     else
  493.         ( acc "interpreter: wrong arpa address \"$destination\" " )
  494.         destination=UNKNOWN
  495.     fi 
  496. elif test `echo $destination | grep !`
  497. then
  498. echo UUCP address
  499.     if [ `echo $destination | sed 's/!/ /g' | wc -w` -ge 2 ]; then
  500.         test $DEBUG && echo valid uucp address 
  501.         destype=UUCP
  502.     else
  503.         ( acc "interpreter: wrong uucp address \"$destination\" " )
  504.         destination=UNKNOWN
  505.     fi
  506. else
  507.     test $DEBUG && echo local delivery
  508.     destype=LOCAL
  509. fi
  510.  
  511. test $DEBUG && echo "status: dest=$destination , arg=$argument , destype=$destype"
  512.  
  513. if test $destination != "UNKNOWN"; then
  514. # now we check if argument is valid
  515.     test $DEBUG && echo destination OK
  516.         if test "$argument" = "ERR"; then
  517.         test $DEBUG && echo ERR detected in argument
  518.     errarg="argument field contains wild characters"
  519.         argument=ERROR
  520.     elif test `echo $argument | grep /`; then
  521.         test $DEBUG && echo ILLEGAL ARG
  522.         errarg="\"$argument\" is not a valid argument"
  523.         ( acc "interpreter: $errarg denied to $destination" )
  524.         argument=ERROR
  525.     elif test -r $PUBDIR/$argument; then
  526.         test $DEBUG && echo FILE $argument is ok
  527.         ( acc "mailer: sending $argument to $destination" )
  528.         errarg=NONE
  529.     elif test "$argument" = "index"; then
  530.    test $DEBUG && echo this is an index request but no verbose index available
  531.         argument=index
  532.     else
  533. test $DEBUG && echo nonexistent $argument
  534.         errarg="\"$argument\" is not available"
  535.         ( acc "interpreter: $errarg for $destination" )
  536.         argument=ERROR
  537.     fi
  538.  
  539. # now we ship the stuff . 
  540.  
  541. ( echo "Subject: RNA mail from $UNAME"; echo
  542.   echo ""
  543.   echo "This is the RNA output for a request destinated to you."
  544.   echo "Binary files have been uuencoded to an ASCII format."
  545.   echo 
  546.   if test "$errarg" != "NONE"; then
  547.     echo "Error: $errarg"
  548.  
  549.   echo
  550.   echo "For more details on this RNA delivery please mail ${POSTMASTER}@${UNAME}."
  551.   echo "If you need help on the RNA remote commands and usage, send mail"
  552.   echo "to ${LOGNAME}@$UNAME containing: @@ send help to yourname@yourhost"
  553.   echo 
  554.  
  555.   else
  556.  
  557.   echo "RNA request:  $action \"$argument\" to: \"$destination\" ($destype)"
  558.   echo
  559.   if test "$argument" = "index"; then
  560.     echo; echo "List of available files at $UNAME :"; echo
  561.     ( set `ls -l $PUBDIR | wc -l`; 
  562.     ls -log $PUBDIR | tail -`expr $1 - 1` | grep -v help | grep -v index )
  563.     
  564.     if test -r $PUBDIR/$argument; then
  565.         echo; cat $PUBDIR/$argument
  566.     fi
  567.   elif test "$argument" = "help"; then
  568.     echo; 
  569.     if test -r $PUBDIR/$argument; then
  570.         echo; cat $PUBDIR/$argument
  571.     else
  572.         echo "Sorry no help available"
  573.         ( acc "no help file in public directory" )
  574.     fi
  575.  else    
  576.     # some rules for detecting non-ascii data. 
  577.     ready=""
  578.     if test `echo $argument | grep '\.Z'` ; then
  579.         noready="compressed file"
  580.     elif test `echo $argument | grep '\.z'`; then
  581.         noready="crypted file"
  582.     elif test `echo $argument | grep '\.tar'`; then
  583.         noready="tar file"
  584.     elif test `echo $argument | grep '\.cpio'`; then
  585.         noready="cpio file"
  586.     elif test ! "`echo $argument | grep '\.'`"; then
  587.         noready="program file"
  588.     else
  589.     noready="ascii file"
  590.     ready=OK
  591.     fi 
  592.  
  593. echo "( $noready )"
  594. echo
  595.   echo "+------ cut start of $argument ----------------------------------+"
  596.   if test $ready ; then
  597.       cat $PUBDIR/$argument
  598.   else
  599.     $ENCODE $PUBDIR/$argument $argument
  600.     ( acc "encoding $noready" )
  601.   fi
  602.   echo "+------  cut end of $argument  ----------------------------------+"
  603.   echo;
  604.   fi
  605.   fi
  606.  ) | $MAILER $destination
  607.  # 
  608.  
  609. fi    
  610.             
  611. shift
  612.  
  613. # end while
  614. done
  615. #echo EOF
  616. else
  617. ( acc "interpreter: no valid commands found" )
  618. fi
  619.  
  620.  
  621. }
  622.  
  623. # -----------------------------------
  624. #            main program
  625. # -----------------------------------
  626. touch $LOGFILE
  627.     test -r $WORKDIR/shutdown && quit
  628.     test -s $MAIL && ( acc "found mail";
  629.          clrfiles; getmail; 
  630.          parse; interp )
  631.  
  632. # end of RNA
  633. SHAR_EOF
  634. fi
  635. exit 0
  636. #    End of shell archive
  637. --
  638. Paolo Ventafridda, Milano -Italy _ Sublink (EUcon): venta@i2ack.UUCP  ****
  639. ****  The SUBLINK Foundation     _ +39-2-4035289 (300-2400 MNP4, 9600 PEP)
  640. .                  For a free EUropean CONnection                        .
  641.  
  642.  
  643.