mirror of
git://git.9front.org/plan9front/plan9front
synced 2025-01-12 11:10:06 +00:00
e92e9cf193
When a user isn't allowed to log into a file server, we used to silently dump the user back to the console, reporting that the command succeeded. We should give the user an error when they fail to log in, and we should exit unsuccessfully. This status is communicated by setting up a sentinel env var, and clearning it just before we execute the user command.
96 lines
2 KiB
Bash
Executable file
96 lines
2 KiB
Bash
Executable file
#!/bin/rc
|
|
rfork e
|
|
|
|
argv0=$0
|
|
fn usage {
|
|
echo 'usage:' $argv0 '[-u user] [-k keypattern] [-P patternfile] [-p] [-t timeout] [-h host] [-c cmd arg ...]' >[1=2]
|
|
exit 'usage'
|
|
}
|
|
|
|
fn server {
|
|
mount -nc /fd/0 /mnt/term || exit
|
|
bind -q /mnt/term/dev/cons /dev/cons
|
|
</mnt/term/fd/10 >/mnt/term/fd/11 >[2]/mnt/term/fd/12 {
|
|
~ $#dir 0 || cd $"dir || echo 'can''t change directory: '^$"dir >[1=2]
|
|
switch($#cmd){
|
|
case 0; cmd=(rc -li)
|
|
case 1; cmd=(rc -lc $cmd)
|
|
case *; cmd=(rc -lc '$*' $cmd)
|
|
}
|
|
rm -f /env/^(cmd dir 'fn#server')
|
|
service=cpu exec $cmd
|
|
} &
|
|
if(test -d /mnt/term/mnt/cpunote) {
|
|
rfork e
|
|
mainproc=$apid
|
|
rm -f /mnt/term/env/rfailed
|
|
{cat; echo -n hangup} </mnt/term/mnt/cpunote/data >/proc/$mainproc/notepg &
|
|
noteproc=$apid
|
|
wait $mainproc
|
|
echo -n $status >/mnt/term/env/rstatus >[2]/dev/null
|
|
echo -n hangup >/proc/$noteproc/notepg
|
|
}
|
|
}
|
|
|
|
fn client {
|
|
echo -n >/env/rstatus
|
|
echo -n 'lost connection' > /env/rfailed
|
|
rfork n
|
|
bind '#|' /mnt/cpunote || exit
|
|
</fd/0 exec $exportfs -r / &
|
|
</dev/null >/mnt/cpunote/data1 {
|
|
fn sigkill { echo -n kill >/mnt/cpunote/data1 }
|
|
fn sighup { echo -n hangup >/mnt/cpunote/data1 }
|
|
fn sigint { status=interrupted }
|
|
wait
|
|
while(~ $status interrupted) {
|
|
echo -n interrupt
|
|
wait
|
|
}
|
|
if(test -e /env/rfailed){
|
|
>[1=2] echo lost connection
|
|
exit 'disconnected'
|
|
}
|
|
status=`{cat /env/rstatus}
|
|
exit $"status
|
|
}
|
|
}
|
|
|
|
cmd=()
|
|
host='$cpu'
|
|
if(~ $#cpu 1) host=$cpu
|
|
exportfs=/bin/exportfs
|
|
connect=/bin/rconnect
|
|
|
|
while(~ $1 -*){
|
|
switch($1){
|
|
case -p; connect=($connect $1)
|
|
case *
|
|
~ $#* 1 && usage
|
|
switch($1){
|
|
case -P; exportfs=($exportfs $1 $2)
|
|
case -[ukt]; connect=($connect $1 $2)
|
|
case -h; host=$2
|
|
case -c; cmd=$*(2-); *=()
|
|
case *; usage
|
|
}
|
|
shift
|
|
}
|
|
shift
|
|
}
|
|
~ $#* 0 || usage
|
|
|
|
fn pvar {
|
|
while(! ~ $#* 0){
|
|
~ $#$1 0 && echo $1'=()' ||
|
|
path=/dev/null builtin whatis $1
|
|
shift
|
|
}
|
|
}
|
|
|
|
>/env/rscript {
|
|
dir=`{pwd} pvar dir cmd
|
|
builtin whatis server
|
|
echo server
|
|
}
|
|
exec $connect $host /env/rscript client <[10=0] >[11=1] >[12=2]
|