mirror of
https://github.com/fdiskyou/Zines.git
synced 2025-03-09 00:00:00 +01:00
131 lines
5.4 KiB
Text
131 lines
5.4 KiB
Text
![]() |
==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
|
||
|
_______________________________________________________________________________
|