==Phrack Inc.==
Volume Three, Issue 30, File #6 of 12
Decnet Hackola : Remote Turist TTY (RTT)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A Late-Night Creation Of
*Hobbit*
This VMS network frob is yet another "tell"-type thing. This one has an
uncommon feature though: recursion (i.e. you can be connected to some host and
open *another* connection to a third host and it will [attempt to!] "do the
right thing"). Also, you can ^Y out and if you run it again, it will return to
the open connection instead of starting a new one.
_H*
*************************************************************************
$! RTT -- Remote Turist TTY interface. Do @RTT hostname or @RTT area.node
$! to start; this file must exist in the remote machine's default area.
$! You can ^Y out and the network channel will stick around; invoking RTT
$! again will resume the extant process and ignore arguments.
$! If we are a network object, play server, if not, we must be the client.
$! If we are called while already playing server, recurse to the end host.
$! This recursion in theory can happen infinite times. Make damn sure
$! what you call this file and the "task=" spec jive, and that they are the
$! same file, or you will fall victim to very vicious timing screws.
$!
$! Another result of *Hobbit* abusing network file jobs until well past dawn.
$!
$! _H* $set noon $if f$mode().eqs."NETWORK".and.p1.eqs."" then $goto srv
$! Talking to a luser, go find the net job $magic=0
! assume top level $if f$trnlnm("nf",,,,,"table_name").nes."" then $goto lread
$sl=f$len(p1) $dot=f$locate(".",p1) ! area.node $if sl.eq.dot then
$goto nopen ! no dot, treat normally $q=f$loc("""",p1)
! access control?? $node=f$ext(0,dot,p1) ! area
$dot=dot+1 ! point past it now
$node=node*1024+f$ext(dot,q-dot,p1) ! and pull out the complete node
$rest=""""+f$ext(q,80,p1)+"""" ! superquotify the quotes [yeccchh!]
$p1="''node'''rest'" ! add remains in stringwise [ack barf]
$! We were called with an argument; but if we're network mode, we're *already*
$! a server, so do special things. $nopen: $if f$mode().eqs."NETWORK" then
$magic=1 $! Top-level user process or recursed here: client connect
$open/read/write/err=yuk nf 'p1'::"0=rtt" $read/time=5/err=yuk nf hprm
! let other end tell us where we got $prm==hprm ! global
prompt str so we resume correctly $write sys$output "Connection open" $if magic
then $goto m_setup $lread: $read/prompt="''prm'$ "/end=lclose sys$command line
$write nf line ! send the sucker and go get the stuff $ltype:
$read/time=8/err=tmo/end=lclose nf line $if line.eqs."%%eoc%%" then $goto lread
$if line.eqs."%%magic%%" then $goto newprm $write sys$output line $goto ltype
$newprm: $read nf hprm ! new prompt gets piped in from servers
$prm==hprm ! let us find it $read nf
line ! garbola %%eoc%% -- avoid timing fuckup $if
line.nes."%%eoc%%" then $goto hpe !! oops !! $goto lread $tmo: $write
sys$output "[Timed out]" ! supposed to bail out on a fuckup $goto
lread ! it doesn't always work, though. $! $! Do a
special dance when we're recursing $m_setup: $write nnn "%%magic%%" $write nnn
prm ! notify client end of new connection
$signal ! flush the inbetweens $goto
rread ! and drop to magic server $!
$srv: ! Normal remote task half $! This is an
unbelievable kludge. You can't just open sys$net: and then $! have program
output go there as well as the control thingies, but you $! *can* pipe
everything to your sys$net-opened-device: and it *works*!
$open/read/write/err=yuk nnn sys$net: $close sys$output !
netserver.log? $close sys$error $magic=0 ! not recursing
yet
$! Some handy symbols for the far end $rtt:==@sys$login:rtt ! make
further connects easier $ncp:==$ncp ! for hacking the
network $signal:==write nnn """%%eoc%%""" ! magic sync string $write nnn
f$trnl("sys$node","lnm$system_table") ! HELO... $def/pr sys$output
nnn: ! the awful kludge is invoked $def/pr sys$error nnn: !
for error handling too $! $! Server loop $rread: $read/end=rclose nnn line $if
magic then $goto passing $'line' $m_cmd_end: $signal ! signal for
all completions $goto rread $! If we're magically in the middle, handle
differently $passing: $write nf line $mtype: $read/time=5/err=mclose/end=mclose
nf line $if line.eqs."%%eoc%%" then $goto m_cmd_end $write nnn line $goto mtype
$!
$! Closure and error handlers $! General protocol error catch $yuk: $write
sys$output "Couldn't open network!" $exit $! Here if the luser typed ^Z
$lclose: $close nf ! should signal eof at far end $exit
$! Here if we got hung up on by the client $rclose: $if magic then $close nf
$close nnn $stop/id=0 $! Here if we're magic and our remote server exited: tell
client whats flying $mclose: $close nf $magic=0 $write nnn "%%magic%%" $write
nnn f$trnl("sys$node","lnm$system_table") $signal $goto rread
$! Here if we recursed down the line there and didn't see the right things
$hpe: $write sys$output "!!Hairy protocol error!!" $close nf $exit
_______________________________________________________________________________
TUCoPS is optimized to look best in Firefox® on a widescreen monitor (1440x900 or better).
Site design & layout copyright © 1986-2025 AOH