# define some functions to access network devices.
# ${cs addr}
# translate tcp!somewhere.net!23 into /net/tcp/clone 123.45.67.8!23
# dial address {command}
# dial address and run command with stdin connected
# to the remote end, and $net set to the net directory.
# announce address {command}
# announce an address; run command as in dial above.
# (actually, it's probably not worth opening the data file in
# this case, as it doesn't go anywhere)
# listen address {command}
# listen on a previously announced port; assumes $net
# is set to previously announce directory; runs command
# when an incoming connection arrives, as for dial, above.
# server, client: sample uses of the above.
#{
# id := "{read}
# net := /net/udp/$id
# (if {echo -n connect 255.255.255.255!1442 >[1=0]}
# {echo -n 'tx data' > $net/data}
# {echo connection failed}
# )
#} <> /net/udp/clone
#
#{
# id := "{read}
# net := /net/udp/$id
# echo -n announce 1442 >[1=0]
# echo -n headers >[1=0]
# while {} {s := "{read | bytes 6 end}; echo got rq $s} < $net/data
#} <> /net/udp/clone
#
load string std file2chan
subfn cs {
args := $*
or {
{
(if {echo -n ${hd $args} >[1=0]}
{result=`{read 8192 0}}
{echo 'addr translate failed:' $status; status failed}
)
} <> /net/cs
} {raise 'cs failed'}
}
fn dial {
args := $*
if {or {! ~ $#args 2} {! ~ ${tl $args} '{*'}} {echo 'usage: dial address {cmd}' >[1=2]; raise failed}
cs := ${cs ${hd $args}}
{
id := "{read 20 0}
or {echo -n connect ${tl $cs} >[1=0]} {echo 'dial failed:' $status; raise failed}
net := ${hd ${splitr ${hd $cs} /}}^$id
${tl $args} <> $net/data
} <> ${hd $cs}
}
fn announce {
args := $*
if {or {! ~ $#args 2} {! ~ ${tl $args} '{*'}} {echo 'usage: announce address {cmd}' >[1=2]; raise failed}
cs := ${cs ${hd $args}}
{
id := "{read 20 0}
or {echo -n announce ${tl $cs} >[1=0]} {echo 'announce failed:' $status; raise failed}
net := ${hd ${splitr ${hd $cs} /}}^$id
${tl $args} <> $net/data
} <> ${hd $cs}
}
fn listen {
args := $*
if {or {! ~ $#args 1} {! ~ $args '{*'}} {echo 'usage: listen {cmd}' >[1=2]; raise failed}
if {! ~ $#net 1} {echo 'listen: no $net set' >[1=2]; raise 'bad context'}
{
id := "{read 20 0}
net := ${hd ${splitr ${hd $net} /}}^$id
$args <> $net/data
} <> $net/listen
}
#fn server {
# file2chan /chan/xxx {} {echo got write request ${quote ${rget data}}}
# announce 'tcp!*!62454' {
# echo done announce
# while {} {
# listen {
# echo got incoming connection
# export /chan &
# }
# }
# }
#}
#
#fn client {
# dial 'tcp!presto!62454' {
# echo 'made connection; dir:' $net
# imount $net/data /n/remote
# }
# echo look in /n/remote
#}
|