updating cwfs and moving installer in /rc/bin

This commit is contained in:
cinap_lenrek 2011-04-12 15:53:55 +00:00
parent 7208d528bd
commit 67e93d6a0a
96 changed files with 549 additions and 1170 deletions

View file

View file

View file

View file

View file

View file

View file

View file

0
sys/lib/dist/pc/inst/configfs → rc/bin/inst/configfs Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/configip → rc/bin/inst/configip Normal file → Executable file
View file

View file

View file

0
sys/lib/dist/pc/inst/copydist → rc/bin/inst/copydist Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/defs → rc/bin/inst/defs Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/download → rc/bin/inst/download Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/finish → rc/bin/inst/finish Normal file → Executable file
View file

View file

0
sys/lib/dist/pc/inst/fmtventi → rc/bin/inst/fmtventi Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/gui → rc/bin/inst/gui Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/halt → rc/bin/inst/halt Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/hasmbr → rc/bin/inst/hasmbr Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/hdrs → rc/bin/inst/hdrs Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/is9660 → rc/bin/inst/is9660 Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/isext2 → rc/bin/inst/isext2 Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/isfat → rc/bin/inst/isfat Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/isfossil → rc/bin/inst/isfossil Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/isventi → rc/bin/inst/isventi Normal file → Executable file
View file

View file

View file

0
sys/lib/dist/pc/inst/main → rc/bin/inst/main Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/mainloop → rc/bin/inst/mainloop Normal file → Executable file
View file

View file

View file

View file

0
sys/lib/dist/pc/inst/mountfs → rc/bin/inst/mountfs Normal file → Executable file
View file

View file

0
sys/lib/dist/pc/inst/partdisk → rc/bin/inst/partdisk Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/prepdisk → rc/bin/inst/prepdisk Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/replcfg → rc/bin/inst/replcfg Normal file → Executable file
View file

View file

0
sys/lib/dist/pc/inst/startppp → rc/bin/inst/startppp Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/startwin → rc/bin/inst/startwin Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/stop → rc/bin/inst/stop Normal file → Executable file
View file

View file

0
sys/lib/dist/pc/inst/stopppp → rc/bin/inst/stopppp Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/textonly → rc/bin/inst/textonly Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/watchfd → rc/bin/inst/watchfd Normal file → Executable file
View file

0
sys/lib/dist/pc/inst/xxx → rc/bin/inst/xxx Normal file → Executable file
View file

3
sys/lib/dist/mkfile vendored
View file

@ -5,6 +5,3 @@ cd:V: /tmp/9front.iso
bind pc/plan9.ini.cd /n/src9/cfg/plan9.ini
disk/mk9660 -9cj -B 386/9bootiso -p pc/cdproto -s /n/src9 -v 'Plan 9 Front' $target
unmount /n/src9/cfg/plan9.ini
%.bz2: %
bzip2 $prereq

View file

View file

@ -1,4 +0,0 @@
#!/bin/rc
window '0 0 100 100' games/clock
window '80 80 610 360' /usr/glenda/lib/first.window

View file

@ -1,11 +0,0 @@
#!/bin/rc
echo -n readme > /dev/label
echo 'You have completed the Installation Process.'
cat<<'!'
Welcome to Plan 9.
This is rc.
!
exec rc

View file

@ -1,16 +0,0 @@
if(test -f '#m/mousectl') {
echo -n accelerated > '#m/mousectl'
echo -n 'res 3' > '#m/mousectl'
}
user=`{cat /dev/user}
home=/usr/$user
bind -a $home/bin/rc /bin
bind -a $home/bin/$cputype /bin
bind -c $home/tmp /tmp
rio -si inst/gui
echo
echo
echo 'failed to start rio. you can start a text-based installation by running'
echo
echo ' inst/textonly'
echo

100
sys/lib/dist/pc/mkfile vendored
View file

@ -1,100 +0,0 @@
out=outside # outside web server
s=/sys/lib/dist/pc
x=`{bind -b /sys/lib/dist/bin/$cputype /bin}
default:V: ndisk
ls -l ndisk
SUB=`{ls sub inst}
boot.raw:Q: proto $SUB
rm -rf boot
mkdir boot
bind /dev/null /sys/log/timesync
# make files writable for now.
cat proto | sed 's!d000!d775!;s!000!664!;s!555!775!;s!444!664!' >proto.cp
disk/mkfs -a proto.cp | disk/mkext -d boot
@{
cd boot/386
strip init
cd bin
strip * */* >[2]/dev/null || status=''
}
cat proto | sed 's!/.*!!' >proto.cp
disk/mkfs -a -s boot proto.cp | tee >{wc -c >[1=2]} |
touchfs 1000000000 >boot.raw
boot.bz2:Q: boot.raw
ls -l boot.raw
bflz -n 32 < boot.raw >boot.bflz
ls -l boot.bflz
bzip2 -9 < boot.bflz >$target
ls -l $target
root.bz2:Q: boot.bz2
{
echo bzfilesystem
cat boot.bz2
dd -if /dev/zero -bs 1024 -count 1 >[2]/dev/null
} >$target
ls -l $target
/sys/src/9/pc/9pcflop.gz: root.bz2
@{
rfork n
cd /sys/src/9/pc
mk 'CONF=pcflop' 9pcflop.gz
}
/sys/src/9/pc/9pccd.gz:
@{
cd /sys/src/9/pc
mk 'CONF=pccd' 9pccd.gz
}
# disk/format apparently uses stat to obtain a file's real name, so
# binding 9loadusb onto 9load will store the name 9loadusb in the
# generated fat filesystem. the same is true for plan9.ini.cd and plan9.ini.
9load: /386/9loadlite
# cp $prereq $target
if (test -e /386/9loadnousb)
cp /386/9loadnousb $target # cater to old bioses
cp /386/9loadlitedebug 9loaddebug
ndisk: 9load /sys/src/9/pc/9pcflop.gz plan9.ini /lib/vgadb
dd -if /dev/zero -of ndisk -bs 1024 -count 1440 >[2]/dev/null
disk/format -f -b /386/pbs -d ndisk \
9load /sys/src/9/pc/9pcflop.gz plan9.ini /lib/vgadb
ls -l ndisk
# cannot list both 9pcflop.gz and 9pccd.gz because they cannot be built
# in parallel. stupid mk
cddisk:DV: 9load /sys/src/9/pc/9pcflop.gz plan9.ini.cd /lib/vgadb
mk -a /sys/src/9/pc/9pccd.gz
mk -a /sys/src/9/pc/9pcflop.gz
rfork n
cp -x plan9.ini.cd subst/plan9.ini
dd -if /dev/zero -of cddisk -bs 1024 -count 2880 >[2]/dev/null
disk/format -t 3½QD -f -b /386/pbs -d cddisk \
9load /sys/src/9/pc/^(9pcflop.gz 9pccd.gz) \
subst/plan9.ini /lib/vgadb
ls -l cddisk
clean:V:
if (! unmount 9load >[2]/dev/null)
;
rm -rf boot boot.bz2 boot.bflz boot.raw root.bz2 9pcflop ndisk 9load cddisk proto.cp 9loaddebug
install:V: ndisk 9loaddebug
9fs $out
dst=/n/$out/sys/lib/dist/web.protect
cp 9loaddebug $dst
gzip -9 < ndisk > $dst/plan9.flp.gz
# mk clean
test:V: ndisk 9loaddebug
cp 9loaddebug ../web.protect2/n9loaddebug
cp ndisk ../web.protect2/ndisk
cd0:D: cddisk
rm -f cd0
disk/mk9660 -9cj -v 'Plan 9 4th Edition' -s . -p cd0.proto -b cddisk cd0

View file

@ -1,19 +0,0 @@
# very cautious settings to get started.
# will defeat booting from usb devices.
*nomp=1
# *noahciload=1
# *debugload=1
*nodumpstack=1
# this would disable ether and usb probing.
# *nousbprobe=1
# *noetherprobe=1
distname=plan9
partition=new
mouseport=ask
monitor=ask
vgasize=ask
dmamode=ask
# serial console on COM1
#console=0
bootargs=local!#S/sdD0/data
bootfile=/386/9pccd

View file

@ -1,10 +0,0 @@
THIS IS A 512 byte BLANK PLAN9.INI

View file

@ -1,20 +0,0 @@
# config for initial vmware booting
# very cautious settings to get started.
# will defeat booting from usb devices.
*nomp=1
*nobiosload=1
# *noahciload=1
# *debugload=1
# *nodumpstack=1
partition=new
nobootprompt=local!/boot/bzroot
bootfile=fd0!9pcflop.gz
mouseport=ps2
monitor=xga
vgasize=1024x768x16
#adisk=/dev/sdD0/cdboot
console=0
baud=9600

175
sys/lib/dist/pc/proto vendored
View file

@ -1,175 +0,0 @@
386 d775 sys sys
# 9load 555 sys sys
init 555 sys sys
# ld.com 555 sys sys
mbr 555 sys sys
pbs 555 sys sys
pbslba 555 sys sys
bin d775 sys sys
auth d555 sys sys
# i think factotum is only needed if we include cpu
# factotum 555 sys sys
aux d555 sys sys
isvmware 555 sys sys
mouse 555 sys sys /sys/lib/dist/pc/multi/mouse
pcmcia 555 sys sys /sys/lib/dist/pc/multi/pcmcia
# stub 555 sys sys
vga 555 sys sys /sys/lib/dist/pc/multi/vga
vmware 555 sys sys /sys/lib/dist/pc/sub/vmware
# vmware 555 sys sys
# vmwarefs 555 sys sys
# vmmousepoll 555 sys sys
zerotrunc 555 sys sys /sys/lib/dist/pc/multi/zerotrunc
disk d555 sys sys
fdisk 555 sys sys /sys/lib/dist/pc/multi/fdisk
format 555 sys sys /sys/lib/dist/pc/multi/format
# kfs 555 sys sys
# kfscmd 555 sys sys
mbr 555 sys sys /sys/lib/dist/pc/multi/mbr
prep 555 sys sys /sys/lib/dist/pc/multi/prep
fossil d555 sys sys
fossil 555 sys sys
flfmt 555 sys sys
conf 555 sys sys
ip d555 sys sys
ipconfig 555 sys sys /sys/lib/dist/pc/multi/ipconfig
ppp 555 sys sys /sys/lib/dist/pc/multi/ppp
ndb d555 sys sys
# csquery and dnsquery could go
cs 555 sys sys /sys/lib/dist/pc/multi/cs
# csquery 555 sys sys
dns 555 sys sys /sys/lib/dist/pc/multi/dns
# dnsquery 555 sys sys
replica d555 sys sys
applylog 555 sys sys
changes 555 sys sys
compactdb 555 sys sys /sys/lib/dist/pc/sub/compactdb
pull 555 sys sys
venti d555 sys sys
# venti 555 sys sys
# conf 555 sys sys
# fmtarenas 555 sys sys
# fmtindex 555 sys sys
# fmtisect 555 sys sys
9660srv 555 sys sys /sys/lib/dist/pc/multi/9660srv
# acme could go
# acme 555 sys sys
awk 555 sys sys
bargraph 555 sys sys /sys/lib/dist/bin/386/bargraph
basename 555 sys sys /sys/lib/dist/pc/multi/basename
cat 555 sys sys /sys/lib/dist/pc/multi/cat
chgrp 555 sys sys /sys/lib/dist/pc/multi/chgrp
chmod 555 sys sys /sys/lib/dist/pc/multi/chmod
cleanname 555 sys sys /sys/lib/dist/pc/multi/cleanname
cmp 555 sys sys /sys/lib/dist/pc/multi/cmp
cdsh 555 sys sys /sys/lib/dist/bin/386/cdsh
cp 555 sys sys /sys/lib/dist/pc/multi/cp
# cpu could go
# cpu 555 sys sys
date 555 sys sys /sys/lib/dist/pc/multi/date
dd 555 sys sys /sys/lib/dist/pc/multi/dd
dossrv 555 sys sys /sys/lib/dist/pc/multi/dossrv
echo 555 sys sys /sys/lib/dist/pc/multi/echo
ed 555 sys sys /sys/lib/dist/pc/multi/ed
# if cpu goes, exportfs could go
# exportfs 555 sys sys
ext2srv 555 sys sys /sys/lib/dist/pc/multi/ext2srv
fcp 555 sys sys
grep 555 sys sys /sys/lib/dist/pc/multi/grep
hget 555 sys sys /sys/lib/dist/pc/multi/hget
hoc 555 sys sys /sys/lib/dist/pc/multi/hoc
ls 555 sys sys /sys/lib/dist/pc/multi/ls
mc 555 sys sys /sys/lib/dist/pc/multi/mc
mount 555 sys sys /sys/lib/dist/pc/multi/mount
multi 555 sys sys /sys/lib/dist/bin/386/multi
mv 555 sys sys /sys/lib/dist/pc/multi/mv
# netkey 555 sys sys
ps 555 sys sys /sys/lib/dist/pc/multi/ps
rc 555 sys sys
read 555 sys sys /sys/lib/dist/pc/multi/read
rio 555 sys sys
rm 555 sys sys /sys/lib/dist/pc/multi/rm
sed 555 sys sys /sys/lib/dist/pc/multi/sed
# snoopy could go
# snoopy 555 sys sys
sort 555 sys sys /sys/lib/dist/pc/multi/sort
srv 555 sys sys /sys/lib/dist/pc/multi/srv
# ssh 555 sys sys
stats 555 sys sys
syscall 555 sys sys /sys/lib/dist/pc/multi/syscall
tail 555 sys sys /sys/lib/dist/pc/multi/tail
tailfsrv 555 sys sys /sys/lib/dist/bin/386/tailfsrv
tee 555 sys sys /sys/lib/dist/pc/multi/tee
# telnet 555 sys sys
test 555 sys sys /sys/lib/dist/pc/multi/test
wc 555 sys sys /sys/lib/dist/pc/multi/wc
xd 555 sys sys /sys/lib/dist/pc/multi/xd
adm d555 adm adm
timezone d555 sys sys
local 555 sys sys
lib d777 sys sys
font d555 sys sys
bit d555 sys sys
lucidasans d555 sys sys
lstr.12 444 sys sys
typelatin1.7.font 444 sys sys
# lucm d555 sys sys
# latin1.9 444 sys sys
# latin1.9.font 444 sys sys
namespace 444 sys sys
ndb d555 sys sys
common 444 sys sys /sys/lib/dist/pc/sub/common
local 444 sys sys /sys/lib/dist/pc/sub/local
vgadb 666 sys sys /dev/null
fd d555 sys sys
mnt d777 sys sys
arch d000 sys sys
temp d000 sys sys
vmware d000 sys sys
wsys d000 sys sys
n d777 sys sys
a: d000 sys sys
a d000 sys sys
c: d000 sys sys
c d000 sys sys
9fat d000 sys sys
kremvax d000 sys sys /sys/lib/dist/pc/empty
newfs d000 sys sys
dist d000 sys sys /sys/lib/dist/pc/empty
distmedia d000 sys sys /sys/lib/dist/pc/empty
rc d555 sys sys
bin d775 sys sys
inst d775 sys sys /sys/lib/dist/pc/empty
+ - sys sys /sys/lib/dist/pc/inst
9fat: 555 sys sys
a: 555 sys sys /sys/lib/dist/pc/sub/a:
bind 555 sys sys /sys/lib/dist/pc/sub/bind
boota: 555 sys sys /sys/lib/dist/pc/sub/boota:
bunzip2 555 sys sys /sys/lib/dist/pc/sub/bunzip2
c: 555 sys sys
dosmnt 555 sys sys
kill 555 sys sys
lc 555 sys sys
mkdir 555 sys sys /sys/lib/dist/pc/sub/mkdir
pci 555 sys sys
pwd 555 sys sys /sys/lib/dist/pc/sub/pwd
ramfs 555 sys sys /sys/lib/dist/pc/sub/ramfs
replica d555 sys sys
changes 555 sys sys
defs 555 sys sys
pull 555 sys sys
slay 555 sys sys
sleep 555 sys sys /sys/lib/dist/pc/sub/sleep
termrc 555 sys sys /sys/lib/dist/pc/sub/termrc
unmount 555 sys sys /sys/lib/dist/pc/sub/unmount
window 555 sys sys
lib d555 sys sys
rcmain 444 sys sys
sys d555 sys sys
log d555 sys sys
dns 444 sys sys /sys/lib/dist/pc/emptyfile
timesync 444 sys sys /sys/lib/dist/pc/emptyfile
tmp d555 sys sys
usr d555 sys sys
glenda d775 glenda glenda
+ - glenda glenda /sys/lib/dist/pc/glenda

View file

@ -1,22 +0,0 @@
#!/bin/rc
if(! test -f /srv/dos)
dossrv >/dev/null </dev/null >[2]/dev/null
unmount /n/a:>[2]/dev/null
if(~ $#adisk 1)
; # do nothing
if not if(~ $#bootfile 0)
adisk=/dev/fd0disk
if not {
switch($bootfile) {
case sd*
adisk=`{echo $bootfile | sed 's#(sd..).*#/dev/\1/data#'}
case fd*
adisk=`{echo $bootfile | sed 's#(fd.).*#/dev/\1disk#'}
case *
echo 'unknown bootfile '^$bootfile^'; mail 9trouble@plan9.bell-labs.com'
exit oops
}
}
mount -c /srv/dos /n/a: $adisk

View file

@ -1,24 +0,0 @@
#!/bin/rc
rfork e
if(! test -f /srv/dos)
dossrv >/dev/null </dev/null >[2]/dev/null
unmount /n/a:>[2]/dev/null
switch($bootfile) {
case sd*!cdboot!*
# just look for the right file. bootfile isn''t trustworthy
adisk=/dev/sd*/cdboot
if(! ~ $#adisk 1)
adisk=$adisk(1)
case sd*
adisk=`{echo $bootfile | sed 's#(sd..).*#/dev/\1/dos#'}
case fd*
adisk=`{echo $bootfile | sed 's#(fd.).*#/dev/\1disk#'}
case *
echo 'unknown bootfile '^$bootfile^'; mail 9trouble@plan9.bell-labs.com'
exit oops
}
mount -c /srv/dos /n/a: $adisk

View file

@ -1,21 +0,0 @@
#!/bin/rc
rfork e
flag=0
while(~ $1 -*){
switch($1){
case -b
flag=1
case -a
flag=2
case -c
flag=4
case -ac -ca
flag=6
case -bc -cb
flag=5
}
shift
}
syscall bind $1 $2 $flag >[2]/dev/null

View file

@ -1,4 +0,0 @@
#!/bin/rc
exec /boot/kfs BUNZIP
# kfs is bzfs

View file

@ -1,123 +0,0 @@
#
# services
#
tcp=cs port=1
tcp=echo port=7
tcp=discard port=9
tcp=systat port=11
tcp=daytime port=13
tcp=netstat port=15
tcp=chargen port=19
tcp=ftp-data port=20
tcp=ftp port=21
tcp=ssh port=22
tcp=telnet port=23
tcp=smtp port=25
tcp=time port=37
tcp=whois port=43
tcp=domain port=53
tcp=uucp port=64
tcp=gopher port=70
tcp=rje port=77
tcp=finger port=79
tcp=http port=80
tcp=link port=87
tcp=supdup port=95
tcp=hostnames port=101
tcp=iso-tsap port=102
tcp=x400 port=103
tcp=x400-snd port=104
tcp=csnet-ns port=105
tcp=pop-2 port=109
tcp=pop3 port=110
tcp=sunrpc port=111
tcp=uucp-path port=117
tcp=nntp port=119
tcp=netbios port=139
tcp=NeWS port=144
tcp=print-srv port=170
tcp=z39.50 port=210
tcp=fsb port=400
tcp=sysmon port=401
tcp=proxy port=402
tcp=proxyd port=404
tcp=https port=443
tcp=ssmtp port=465
tcp=snntp port=563
tcp=rexec port=512 restricted=
tcp=login port=513 restricted=
tcp=shell port=514 restricted=
tcp=printer port=515
tcp=courier port=530
tcp=cscan port=531
tcp=uucp port=540
tcp=9fs port=564
tcp=whoami port=565
tcp=guard port=566
tcp=ticket port=567
tcp=fmclient port=729
tcp=ingreslock port=1524
tcp=webster port=2627
tcp=weather port=3000
tcp=Xdisplay port=6000
tcp=styx port=6666
tcp=mpeg port=6667
tcp=rstyx port=6668
tcp=infdb port=6669
tcp=infsigner port=6671
tcp=infcsigner port=6672
tcp=inflogin port=6673
tcp=bandt port=7330
tcp=face port=32000
tcp=ocpu port=17005
tcp=ocpunote port=17006
tcp=exportfs port=17007
tcp=rexexec port=17009
tcp=ncpu port=17010
tcp=ncpunote port=17011
tcp=cpu port=17013
tcp=video port=17028
tcp=vgen port=17029
tcp=alefnslook port=17030
tcp=411 port=17031
tcp=flyboy port=17032
il=echo port=7
il=discard port=9
il=chargen port=19
il=whoami port=565
il=ticket port=566
il=challbox port=567
il=ocpu port=17005
il=ocpunote port=17006
il=exportfs port=17007
il=9fs port=17008
il=rexexec port=17009
il=ncpu port=17010
il=ncpunote port=17011
il=tcpu port=17012
il=cpu port=17013
il=fsauth port=17020
il=rexauth port=17021
il=changekey port=17022
il=chal port=17023
il=check port=17024
il=juke port=17026
il=video port=17028
il=vgen port=17029
il=alefnslook port=17030
il=ramfs port=17031
udp=echo port=7
udp=tacacs port=49
udp=tftp port=69
udp=bootpc port=68
udp=bootp port=67
udp=dns port=53
udp=ntp port=123
udp=rip port=520
udp=bfs port=2201
udp=virgil port=2202
udp=bandt2 port=7331
gre=ppp port=34827

View file

@ -1,4 +0,0 @@
#!/bin/rc
exec cat $*

View file

@ -1,8 +0,0 @@
#
# files comprising the database, use as many as you like
#
database=
file=/lib/ndb/local
file=/lib/ndb/common

View file

@ -1,3 +0,0 @@
#!/bin/rc
syscall create $1 0 020000000775 >[2]/dev/null

View file

@ -1,16 +0,0 @@
#!/bin/rc
s=/n/dist/dist/replica
serverroot=/n/dist
serverlog=$s/plan9.log
serverproto=$s/plan9.proto
fn servermount { status='' }
fn serverupdate { status='' }
fn clientmount { status='' }
c=/n/kfs/dist/replica
clientroot=/n/kfs
clientproto=$c/plan9.proto
clientdb=$c/client/plan9.db
clientexclude=(dist/replica/client)
clientlog=$c/client/plan9.log

View file

@ -1,5 +0,0 @@
#!/bin/rc
rfork n
bind '#$' /mnt
cat /mnt/pci/*ctl

View file

@ -1,3 +0,0 @@
#!/bin/rc
syscall -o fd2path 0 buf 1024 < . >[2]/dev/null

View file

@ -1,4 +0,0 @@
#!/bin/rc
exec boot/kfs RAMFS $*
# kfs is bzfs

View file

@ -1,8 +0,0 @@
#!/bin/rc
if(! ~ $#* 1) {
echo 'usage: sleep n' >[1=2]
exit usage
}
syscall sleep $1^000 >/dev/null >[2]/dev/null

View file

@ -1,121 +0,0 @@
#!/bin/rc
if(~ $#debug 1 && ~ $debug yes)
flag x +
if not
debug=0
if(~ $debug yes) echo env...
sysname=gnot
font=/lib/font/bit/lucidasans/typelatin1.7.font
for (i in '#P' '#f' '#m' '#t' '#v') {
if(~ $debug yes) echo bind $i
bind -a $i /dev >/dev/null >[2=1]
}
if(~ $debug yes) echo binddev done
for(disk in /dev/sd??) {
if(test -f $disk/data && test -f $disk/ctl){
disk/fdisk -p $disk/data >$disk/ctl >[2]/dev/null
# if(~ $#nosddma 0)
# echo dma on >$disk/ctl
# if(~ $#nosdrwm 0)
# echo rwm on >$disk/ctl
}
}
for (i in /sys/log/*) {
if(~ $debug yes) echo bind $i
bind /dev/null $i
}
if(~ $debug yes) echo bindlog done
bind -a '#l' /net >/dev/null >[2=1]
dossrv
boota:
boota: # again, just in case a timeout made the earlier one fail
cp /n/a:/plan9.ini /tmp/plan9.orig
if(! ~ $cdboot yes){
pci >/n/a:/pci.txt >[2]/dev/null
cp /dev/kmesg /n/a:/boot.txt >[2]/dev/null
}
# restore a partial install
if(test -f /n/a:/9inst.cnf)
cp /n/a:/9inst.cnf /tmp/vars
# make vgadb easier to edit
if(test -f /n/a:/vgadb)
cp /n/a:/vgadb /lib/vgadb
aux/vmware
# configure loopback device without touching /net/ndb
{
echo bind loopback /dev/null
echo add 127.0.0.1 255.255.255.0
} >/net/ipifc/clone
if(~ $#dmamode 0)
dmamode=ask
if(~ $dmamode ask){
echo -n 'use DMA for ide drives[yes]: '
dmamode=`{read}
if(~ $#dmamode 0)
dmamode=yes
}
if(~ $dmamode yes)
for(i in /dev/sd*/ctl)
if(test -f $i)
{echo dma on; echo rwm on >[2]/dev/null} >$i
if(~ $installmode ask){
echo -n 'install mode is (text, graphics)[graphics]: '
installmode=`{read}
if(~ $#installmode 0)
installmode=graphics
}
if(~ $installmode text){
mouseport=()
vgasize=()
monitor=()
}
if not
installmode=graphics
if(~ $mouseport ask){
echo -n 'mouseport is (ps2, ps2intellimouse, 0, 1, 2)[ps2]: '
mouseport=`{read}
if(~ $#mouseport 0)
mouseport=ps2
}
if(~ $vgasize ask){
echo -n 'vgasize [640x480x8]: '
vgasize=`{read}
if(~ $#vgasize 0)
vgasize=640x480x8
}
if(~ $monitor ask){
echo -n 'monitor is [xga]: '
monitor=`{read}
if(~ $#monitor 0)
monitor=xga
}
if(~ $#mouseport 1) {
aux/mouse $mouseport
if(~ $#vgasize 1 && ! ~ $vgasize '') {
vgasize=`{echo $vgasize}
if(! ~ $cdboot yes)
aux/vga -vip $vgasize >/n/a:/vgainfo.txt
sleep 2 # wait for floppy to finish
aux/vga -l $vgasize
if(! ~ $#novgaaccel 0)
echo -n 'hwaccel off' >'#v/vgactl' >[2]/dev/null
if(! ~ $#novgablank 0)
echo -n 'hwblank off' >'#v/vgactl' >[2]/dev/null
}
}

View file

@ -1,3 +0,0 @@
#!/bin/rc
syscall unmount 0 $1 >[2]/dev/null

View file

@ -1,7 +0,0 @@
-1:adm:adm:
0:none:none:
1:tor:tor:
2:glenda:glenda:
10000:sys::
10001:upas:upas:
10002:bootes:bootes:

View file

@ -1,10 +0,0 @@
#!/bin/rc
# vmware - if we're running in a vmware virtual machine, tweak set up
if(aux/isvmware -s){
echo hwaccel off >'#v/vgactl'
echo -n off >'#P/i8253timerset'
for (ctl in '#S'/sd[C-H]?/ctl)
if (test -e $ctl && grep -s '^config .* dma ' $ctl &&
! grep -s '^config (848A|.* dma 00000000 )' $ctl)
echo 'dma on' >$ctl
}

View file

@ -1,40 +0,0 @@
# config for initial cd booting
[menu]
menuitem=install, Install Plan 9 from this CD
menuitem=cdboot, Boot Plan 9 from this CD
# menuitem=debug, Boot Plan 9 from this CD and debug 9load
[common]
# very cautious settings to get started.
# will defeat booting from usb devices.
*nomp=1
*nobiosload=1
# *noahciload=1
# *debugload=1
*nodumpstack=1
# this would disable ether and usb probing.
# *nousbprobe=1
# *noetherprobe=1
partition=new
mouseport=ask
monitor=ask
vgasize=ask
dmamode=ask
adisk=/dev/sdD0/cdboot
cdboot=yes
# console=0
# baud=9600
[install]
nobootprompt=local!/boot/bzroot
bootfile=sdD0!cdboot!9pcflop.gz
[cdboot]
bootargs=local!#S/sdD0/data
bootfile=sdD0!cdboot!9pccd.gz
# [debug]
# bootargs=local!#S/sdD0/data
# bootfile=sdD0!cdboot!9pccd.gz
# *debugload=1

22
sys/src/cmd/cwfs/64xbit.h Normal file
View file

@ -0,0 +1,22 @@
/*
* fundamental constants and types of the implementation
* changing any of these changes the layout on disk
*/
/* the glorious new, incompatible (on disk) 64-bit world */
/* keeping NAMELEN ≤ 50 bytes permits 3 Dentrys per mag disk sector */
enum {
NAMELEN = 144, /* max size of file name components */
NDBLOCK = 6, /* number of direct blocks in Dentry */
NIBLOCK = 4, /* max depth of indirect blocks */
};
/*
* file offsets & sizes, in bytes & blocks. typically long or vlong.
* vlong is used in the code where would be needed if Off were just long.
*/
typedef vlong Off;
#undef COMPAT32
#define swaboff swab8

View file

@ -36,13 +36,10 @@ consserve1(void *)
char *conline;
for (;;) {
/* conslock(); */
do {
print("%s: ", service);
if ((conline = Brdline(&bin, '\n')) == nil)
print("\n");
else {
if ((conline = Brdline(&bin, '\n')) != nil) {
conline[Blinelen(&bin)-1] = '\0';
print("%s: %s\n", service, conline);
cmd_exec(conline);
}
} while (conline != nil);

View file

@ -82,6 +82,11 @@ devcmpr(Device *d1, Device *d2)
case Devwren:
case Devworm:
case Devlworm:
if(d1->wren.file || d2->wren.file){
if(d1->wren.file == nil || d2->wren.file == nil)
return 1;
return !!strcmp(d1->wren.file, d2->wren.file);
}
if(d1->wren.ctrl == d2->wren.ctrl)
if(d1->wren.targ == d2->wren.targ)
if(d1->wren.lun == d2->wren.lun)
@ -222,7 +227,7 @@ config(void)
{
int c, m;
Device *d;
char *icp;
char *icp, *s, *e;
if(f.error)
return devnone;
@ -248,7 +253,41 @@ config(void)
d->type = Devnone;
break;
case '/': /* /path/to/file mapped file */
case '"': /* "/path/to/file" mapped file */
case '\'': /* '/path/to/file' mapped file */
Mapped:
d->type = Devwren;
if(c == '/'){
s = f.charp-1;
for(e = s+1; *e; e++)
if(*e == ')' || *e == ']' || *e == '}')
break;
f.charp = e;
} else {
s = f.charp;
if((e = strchr(s, c)) == nil){
cdiag("unterminated string", c);
return devnone;
}
f.charp = e+1;
}
d->wren.ctrl = -1;
d->wren.targ = -1;
d->wren.lun = -1;
d->wren.file = malloc((e - s) + 1);
memmove(d->wren.file, s, e - s);
d->wren.file[e - s] = 0;
break;
case 'w': /* w[#.]#[.#] wren [ctrl] unit [lun] */
switch(*f.charp){
case '/':
case '"':
case '\'':
c = *f.charp++;
goto Mapped;
}
case 'r': /* r# worm side */
case 'l': /* l# labelled-worm side */
icp = f.charp;

View file

@ -0,0 +1,31 @@
/* generic old-cw configuration */
#include "all.h"
#ifndef DATE
#define DATE 1170808167L
#endif
Timet fs_mktime = DATE; /* set by mkfile */
Startsb startsb[] = {
"main", 2,
nil,
};
void
localconfinit(void)
{
conf.nfile = 40000;
conf.nodump = 0;
// conf.nodump = 1; /* jukebox is r/o */
conf.firstsb = 13219302;
conf.recovsb = 0;
conf.nlgmsg = 100;
conf.nsmmsg = 500;
}
int (*fsprotocol[])(Msgbuf*) = {
serve9p2,
nil,
};

View file

@ -0,0 +1,36 @@
/* generic old-cw configuration: 16K blocks, 32-bit sizes */
/*
* The most fundamental constant.
* The code will not compile with RBUFSIZE made a variable;
* for one thing, RBUFSIZE determines FEPERBUF, which determines
* the number of elements in a free-list-block array.
*/
#ifndef RBUFSIZE
#define RBUFSIZE (16*1024) /* raw buffer size */
#endif
#include "64bit.h"
/*
* setting this to zero permits the use of discs of different sizes, but
* can make jukeinit() quite slow while the robotics work through each disc
* twice (once per side).
*/
enum { FIXEDSIZE = 1 };
#include "portdat.h"
enum { MAXBANK = 2 };
typedef struct Mbank {
ulong base;
ulong limit;
} Mbank;
typedef struct Mconf {
Lock;
Mbank bank[MAXBANK];
int nbank;
ulong memsize;
} Mconf;
extern Mconf mconf;

View file

@ -0,0 +1,2 @@
FS='64'
<../portmkfile

View file

@ -0,0 +1,31 @@
/* generic old-cw configuration */
#include "all.h"
#ifndef DATE
#define DATE 1170808167L
#endif
Timet fs_mktime = DATE; /* set by mkfile */
Startsb startsb[] = {
"main", 2,
nil,
};
void
localconfinit(void)
{
conf.nfile = 40000;
conf.nodump = 0;
// conf.nodump = 1; /* jukebox is r/o */
conf.firstsb = 13219302;
conf.recovsb = 0;
conf.nlgmsg = 100;
conf.nsmmsg = 500;
}
int (*fsprotocol[])(Msgbuf*) = {
serve9p2,
nil,
};

View file

@ -0,0 +1,36 @@
/* generic old-cw configuration: 16K blocks, 32-bit sizes */
/*
* The most fundamental constant.
* The code will not compile with RBUFSIZE made a variable;
* for one thing, RBUFSIZE determines FEPERBUF, which determines
* the number of elements in a free-list-block array.
*/
#ifndef RBUFSIZE
#define RBUFSIZE (16*1024) /* raw buffer size */
#endif
#include "64xbit.h"
/*
* setting this to zero permits the use of discs of different sizes, but
* can make jukeinit() quite slow while the robotics work through each disc
* twice (once per side).
*/
enum { FIXEDSIZE = 1 };
#include "portdat.h"
enum { MAXBANK = 2 };
typedef struct Mbank {
ulong base;
ulong limit;
} Mbank;
typedef struct Mconf {
Lock;
Mbank bank[MAXBANK];
int nbank;
ulong memsize;
} Mconf;
extern Mconf mconf;

View file

@ -0,0 +1,2 @@
FS='64x'
<../portmkfile

View file

@ -204,21 +204,36 @@ int
checktag(Iobuf *p, int tag, Off qpath)
{
Tag *t;
static Off lastaddr;
ulong pc;
qpath &= ~QPDIR;
t = (Tag*)(p->iobuf+BUFSIZE);
if((tag != t->tag) || ((qpath != QPNONE) && (qpath != t->path))){
pc = getcallerpc(&p);
if(qpath == QPNONE){
print("checktag pc=%lux %Z(%llux) tag/path=%G/%llud; expected %G\n",
pc, p->dev, (Wideoff)p->addr, t->tag, (Wideoff)t->path, tag);
} else {
print("checktag pc=%lux %Z(%llux) tag/path=%G/%llud; expected %G/%llud\n",
pc, p->dev, (Wideoff)p->addr, t->tag, (Wideoff)t->path, tag, qpath);
}
return 1;
}
/*
if(t->tag != tag) {
if(p->flags & Bmod) {
print("\ttag = %d/%llud; expected %lld/%d -- not flushed\n",
print("\t%llux: tag = %G/%llud; expected %G/%d -- not flushed\n",
t->tag, (Wideoff)t->path, (Wideoff)qpath, tag);
return 2;
}
if(p->dev != nil && p->dev->type == Devcw)
cwfree(p->dev, p->addr);
if(p->addr != lastaddr)
print("\ttag = %G/%llud; expected %G/%lld -- flushed (%lld)\n",
t->tag, (Wideoff)t->path, tag, (Wideoff)qpath,
(Wideoff)p->addr);
print("\t%llux: tag = %G/%llud; expected %G/%lld -- flushed\n",
(Wideoff)p->addr, t->tag, (Wideoff)t->path, tag, (Wideoff)qpath);
lastaddr = p->addr;
p->dev = devnone;
p->addr = -1;
@ -226,13 +241,14 @@ checktag(Iobuf *p, int tag, Off qpath)
return 2;
}
if(qpath != QPNONE) {
if((qpath ^ t->path) & ~QPDIR) {
if(1 || CHAT(0))
print("\ttag/path = %llud; expected %d/%llux\n",
(Wideoff)t->path, tag, (Wideoff)qpath);
if(qpath ^ t->path) {
print("\t%llux: tag/path = %G/%llud; expected %G/%llux\n",
(Wideoff)p->addr, t->tag, (Wideoff)t->path, tag, (Wideoff)qpath);
return 0;
}
}
*/
return 0;
}

View file

@ -7,6 +7,7 @@ extern int oldcachefmt;
Map *devmap;
int sfd, rfd;
Biobuf bin;
void
@ -148,6 +149,57 @@ confinit(void)
mapinit(conf.devmap);
}
static int
srvfd(char *s, int mode, int sfd)
{
int fd;
char buf[32];
fd = create(s, ORCLOSE|OWRITE, mode);
if(fd < 0){
remove(s);
fd = create(s, ORCLOSE|OWRITE, mode);
if(fd < 0)
panic(s);
}
sprint(buf, "%d", sfd);
if(write(fd, buf, strlen(buf)) != strlen(buf))
panic("srv write");
return sfd;
}
static void
postservice(void)
{
char buf[3*NAMELEN];
int p[2];
if(sfd < 0){
if(pipe(p) < 0)
panic("can't make a pipe");
sfd = p[0];
rfd = p[1];
}
/* post 9p service */
snprint(buf, sizeof(buf), "#s/%s", service);
srvfd(buf, 0666, sfd);
close(sfd);
srvchan(rfd, buf);
if(pipe(p) < 0)
panic("can't make a pipe");
/* post cmd service */
snprint(buf, sizeof(buf), "#s/%s.cmd", service);
srvfd(buf, 0222, p[0]);
close(p[0]);
/* use it as stdin */
dup(p[1], 0);
close(p[1]);
}
/*
* compute BUFSIZE*(NDBLOCK+INDPERBUF+INDPERBUF+INDPERBUF+INDPERBUF)
* while watching for overflow; in that case, return 0.
@ -224,8 +276,7 @@ printsizes(void)
void
usage(void)
{
fprint(2, "usage: %s [-cf][-a ann-str][-m dev-map] config-dev\n",
argv0);
fprint(2, "usage: %s [ -csC ] [ -a ann-str ] [ -m dev-map ] [-f config-dev ]\n", argv0);
exits("usage");
}
@ -234,11 +285,13 @@ main(int argc, char **argv)
{
int i, nets = 0;
char *ann;
rfork(RFNOTEG);
formatinit();
machinit();
conf.confdev = "n"; /* Devnone */
conf.confdev = "/dev/sdC0/cwfs";
rfd = sfd = -1;
ARGBEGIN{
case 'a': /* announce on this net */
@ -250,12 +303,25 @@ main(int argc, char **argv)
}
annstrs[nets++] = ann;
break;
case 'c': /* use new, faster cache layout */
case 's':
sfd = dup(0, -1);
rfd = dup(1, -1);
close(0);
if(open("/dev/cons", OREAD) < 0)
open("#c/cons", OREAD);
close(1);
if(open("/dev/cons", OWRITE) < 0)
open("#c/cons", OWRITE);
break;
case 'C': /* use new, faster cache layout */
oldcachefmt = 0;
break;
case 'f': /* enter configuration mode first */
case 'c':
conf.configfirst++;
break;
case 'f': /* device / partition / file */
conf.confdev = EARGF(usage());
break;
case 'm': /* name device-map file */
conf.devmap = EARGF(usage());
break;
@ -264,9 +330,8 @@ main(int argc, char **argv)
break;
}ARGEND
if (argc != 1)
if(argc != 0)
usage();
conf.confdev = argv[0]; /* config string for dev holding full config */
Binit(&bin, 0, OREAD);
confinit();
@ -304,6 +369,13 @@ main(int argc, char **argv)
print("sysinit\n");
sysinit();
srvinit();
/*
* post filedescriptors to /srv
*/
postservice();
/*
* Ethernet i/o processes
*/
@ -325,17 +397,15 @@ main(int argc, char **argv)
*/
newproc(wormcopy, 0, "wcp");
/*
* "sync" copy process
*/
newproc(synccopy, 0, "scp");
/*
* processes to read the console
*/
consserve();
/*
* "sync" copy process
* this doesn't return.
*/
procsetname("scp");
synccopy();
}
/*
@ -541,7 +611,7 @@ wormcopy(void *)
* to get up-to-date.
*/
void
synccopy(void)
synccopy(void *)
{
int f;
@ -584,3 +654,4 @@ inqsize(char *file)
free(data);
return rv;
}

View file

@ -2,9 +2,14 @@ default:V: all
all allall first default clean nuke install installall safeinstall safeinstallall update man:V:
cd cwfs && mk $target
emelie.%:V:
cd emelie && mk $stem
fs64.%:V:
cd fs64 && mk $stem
cwfs64.%:V:
cd cwfs64 && mk $stem
cwfs64x.%:V:
cd cwfs64x && mk $stem
cleanall:V: clean emelie.clean fs64.clean
cleanall:V: clean emelie.clean fs64.clean cwfs64.clean cwfs64x.clean

View file

@ -2,16 +2,6 @@
#include "all.h"
#include "io.h"
#include <fcall.h> /* 9p2000 */
#include <thread.h>
enum {
Maxfdata = 8192,
Nqueue = 200, /* queue size (tunable) */
Netclosed = 0, /* Connection state */
Netopen,
};
/*
* the kernel file server read packets directly from
@ -40,14 +30,11 @@ enum {
*/
typedef struct Network Network;
typedef struct Netconn Netconn;
typedef struct Conn9p Conn9p;
/* a network, not necessarily an ethernet */
struct Network {
int ctlrno;
char iname[NAMELEN];
char oname[NAMELEN];
char name[NAMELEN];
char *dialstr;
char anndir[40];
@ -55,295 +42,18 @@ struct Network {
int annfd; /* fd from announce */
};
/* an open tcp (or other transport) connection */
struct Netconn {
Queue* reply; /* network output */
char* raddr; /* remote caller's addr */
Chan* chan; /* list of tcp channels */
int alloc; /* flag: allocated */
int state;
Conn9p* conn9p; /* not reference-counted */
Lock;
};
/*
* incoming 9P network connection from a given machine.
* typically will multiplex 9P sessions for multiple users.
*/
struct Conn9p {
QLock;
Ref;
int fd;
char* dir;
Netconn*netconn; /* cross-connection */
char* raddr;
};
static Network netif[Maxnets];
static struct {
Lock;
Chan* chan;
} netchans;
static Queue *netoq; /* only one network output queue is needed */
char *annstrs[Maxnets] = {
"tcp!*!9fs",
};
/* never returns nil */
static Chan*
getchan(Conn9p *conn9p)
{
Netconn *netconn;
Chan *cp, *xcp;
lock(&netchans);
/* look for conn9p's Chan */
xcp = nil;
for(cp = netchans.chan; cp; cp = netconn->chan) {
netconn = cp->pdata;
if(!netconn->alloc)
xcp = cp; /* remember free Chan */
else if(netconn->raddr != nil &&
strcmp(conn9p->raddr, netconn->raddr) == 0) {
unlock(&netchans);
return cp; /* found conn9p's Chan */
}
}
/* conn9p's Chan not found; if no free Chan, allocate & fill in one */
cp = xcp;
if(cp == nil) {
cp = fs_chaninit(Devnet, 1, sizeof(Netconn));
netconn = cp->pdata;
netconn->chan = netchans.chan;
netconn->state = Netopen; /* a guess */
/* cross-connect netconn and conn9p */
netconn->conn9p = conn9p; /* not reference-counted */
conn9p->netconn = netconn;
netchans.chan = cp;
}
/* fill in Chan's netconn */
netconn = cp->pdata;
netconn->raddr = strdup(conn9p->raddr);
/* fill in Chan */
cp->send = serveq;
if (cp->reply == nil)
cp->reply = netoq;
netconn->reply = netoq;
cp->protocol = nil;
cp->msize = 0;
cp->whotime = 0;
strncpy(cp->whochan, conn9p->raddr, sizeof cp->whochan);
// cp->whoprint = tcpwhoprint;
netconn->alloc = 1;
unlock(&netchans);
return cp;
}
static char *
fd2name(int fd)
{
char data[128];
if (fd2path(fd, data, sizeof data) < 0)
return strdup("/GOK");
return strdup(data);
}
static void
hangupdfd(int dfd)
{
int ctlfd;
char *end, *data;
data = fd2name(dfd);
close(dfd);
end = strstr(data, "/data");
if (end != nil)
strcpy(end, "/ctl");
ctlfd = open(data, OWRITE);
if (ctlfd >= 0) {
hangup(ctlfd);
close(ctlfd);
}
free(data);
}
void
closechan(int n)
{
Chan *cp;
for(cp = chans; cp; cp = cp->next)
if(cp->whotime != 0 && cp->chan == n)
fileinit(cp);
}
void
nethangup(Chan *cp, char *msg, int dolock)
{
Netconn *netconn;
netconn = cp->pdata;
netconn->state = Netclosed;
if(msg != nil)
print("hangup! %s %s\n", msg, netconn->raddr);
fileinit(cp);
cp->whotime = 0;
strcpy(cp->whoname, "<none>");
if(dolock)
lock(&netchans);
netconn->alloc = 0;
free(netconn->raddr);
netconn->raddr = nil;
if(dolock)
unlock(&netchans);
}
void
chanhangup(Chan *cp, char *msg, int dolock)
{
Netconn *netconn = cp->pdata;
Conn9p *conn9p = netconn->conn9p;
if (conn9p->fd > 0)
hangupdfd(conn9p->fd); /* drop it */
nethangup(cp, msg, dolock);
}
/*
* returns length of next 9p message (including the length) and
* leaves it in the first few bytes of abuf.
*/
static long
size9pmsg(int fd, void *abuf, uint n)
{
int m;
uchar *buf = abuf;
if (n < BIT32SZ)
return -1; /* caller screwed up */
/* read count */
m = readn(fd, buf, BIT32SZ);
if(m != BIT32SZ){
if(m < 0)
return -1;
return 0;
}
return GBIT32(buf);
}
static int
readalloc9pmsg(int fd, Msgbuf **mbp)
{
int m, len;
uchar lenbuf[BIT32SZ];
Msgbuf *mb;
*mbp = nil;
len = size9pmsg(fd, lenbuf, BIT32SZ);
if (len <= 0)
return len;
if(len <= BIT32SZ || len > IOHDRSZ+Maxfdata){
werrstr("bad length in 9P2000 message header");
return -1;
}
if ((mb = mballoc(len, nil, Mbeth1)) == nil)
panic("readalloc9pmsg: mballoc failed");
*mbp = mb;
memmove(mb->data, lenbuf, BIT32SZ);
len -= BIT32SZ;
m = readn(fd, mb->data+BIT32SZ, len);
if(m < len)
return 0;
return BIT32SZ+m;
}
static void
connection(void *v)
{
int n;
char buf[64];
Chan *chan9p;
Conn9p *conn9p = v;
Msgbuf *mb;
NetConnInfo *nci;
incref(conn9p); /* count connections */
nci = getnetconninfo(conn9p->dir, conn9p->fd);
if (nci == nil)
panic("connection: getnetconninfo(%s, %d) failed",
conn9p->dir, conn9p->fd);
conn9p->raddr = nci->raddr;
chan9p = getchan(conn9p);
print("new connection on %s pid %d from %s\n",
conn9p->dir, getpid(), conn9p->raddr);
/*
* reading from a pipe or a network device
* will give an error after a few eof reads.
* however, we cannot tell the difference
* between a zero-length read and an interrupt
* on the processes writing to us,
* so we wait for the error.
*/
while (conn9p->fd > 0 && (n = readalloc9pmsg(conn9p->fd, &mb)) >= 0) {
if(n == 0)
continue;
mb->param = (uintptr)conn9p; /* has fd for replies */
mb->chan = chan9p;
assert(mb->magic == Mbmagic);
incref(conn9p); /* & count packets in flight */
fs_send(serveq, mb); /* to 9P server processes */
/* mb will be freed by receiving process */
}
rerrstr(buf, sizeof buf);
qlock(conn9p);
print("connection hung up from %s\n", conn9p->dir);
if (conn9p->fd > 0) /* not poisoned yet? */
hangupdfd(conn9p->fd); /* poison the fd */
nethangup(chan9p, "remote hung up", 1);
closechan(chan9p->chan);
conn9p->fd = -1; /* poison conn9p */
if (decref(conn9p) == 0) { /* last conn.? turn the lights off */
free(conn9p->dir);
qunlock(conn9p);
free(conn9p);
} else
qunlock(conn9p);
freenetconninfo(nci);
if(buf[0] == '\0' || strstr(buf, "hungup") != nil)
exits("");
sysfatal("mount read, pid %d", getpid());
}
static void
neti(void *v)
{
int lisfd, accfd;
Network *net;
Conn9p *conn9p;
NetConnInfo *nci;
net = v;
print("net%di\n", net->ctlrno);
@ -362,77 +72,23 @@ neti(void *v)
continue;
}
/* accepted that call */
conn9p = malloc(sizeof *conn9p);
conn9p->dir = strdup(net->lisdir);
conn9p->fd = accfd;
newproc(connection, conn9p, smprint("9P read %s", conn9p->dir));
nci = getnetconninfo(net->lisdir, accfd);
srvchan(accfd, nci->raddr);
freenetconninfo(nci);
close(lisfd);
}
}
/* only need one of these for all network connections, thus all interfaces */
static void
neto(void *)
{
int len, datafd;
Msgbuf *mb;
Conn9p *conn9p;
print("neto\n");
for(;;) {
/* receive 9P answer from 9P server processes */
while((mb = fs_recv(netoq, 0)) == nil)
continue;
if(mb->data == nil) {
print("neto: pkt nil cat=%d free=%d\n",
mb->category, mb->flags&FREE);
if(!(mb->flags & FREE))
mbfree(mb);
continue;
}
/* send answer back over the network connection in the reply */
len = mb->count;
conn9p = (Conn9p *)mb->param;
assert(conn9p);
qlock(conn9p);
datafd = conn9p->fd;
assert(len >= 0);
/* datafd < 0 probably indicates poisoning by the read side */
if (datafd < 0 || write(datafd, mb->data, len) != len) {
print( "network write error (%r);");
print(" closing connection for %s\n", conn9p->dir);
nethangup(getchan(conn9p), "network write error", 1);
if (datafd > 0)
hangupdfd(datafd); /* drop it */
conn9p->fd = -1; /* poison conn9p */
}
mbfree(mb);
if (decref(conn9p) == 0)
panic("neto: zero ref count");
qunlock(conn9p);
}
}
void
netstart(void)
{
int netorun = 0;
Network *net;
if(netoq == nil)
netoq = newqueue(Nqueue, "network reply");
for(net = &netif[0]; net < &netif[Maxnets]; net++){
if(net->dialstr == nil)
continue;
sprint(net->oname, "neto");
if (netorun++ == 0)
newproc(neto, nil, net->oname);
sprint(net->iname, "net%di", net->ctlrno);
newproc(neti, net, net->iname);
sprint(net->name, "net%di", net->ctlrno);
newproc(neti, net, net->name);
}
}

View file

@ -33,7 +33,7 @@ mconfinit(void)
}
Bterm(bp);
if (pgsize > 0 && userpgs > 0)
size = (((userpgs - userused)*3LL)/4)*pgsize;
size = (((userpgs - userused)*1LL)/4)*pgsize;
}
mconf.memsize = size;
mbp = mconf.bank;

View file

@ -699,6 +699,7 @@ enum
Devfloppy, /* floppy drive */
Devswab, /* swab data between mem and device */
Devmirr, /* mirror devices */
Devsrv, /* pipes and network connections */
MAXDEV
};

View file

@ -197,6 +197,7 @@ void schedinit(void);
int scsiio(Device*, int, uchar*, int, void*, int);
void scsiinit(void);
Off scsiread(int, void*, long);
Devsize scsiseek(int, Devsize);
Off scsiwrite(int, void*, long);
char* sdof(Device*);
void sec2rtc(Timet, Rtc *);
@ -229,7 +230,7 @@ void unlock(Lock*);
void newproc(void(*)(void *), void*, char*);
void wormcopy(void *);
void wormprobe(void);
void synccopy(void);
void synccopy(void *);
long wormsearch(Device*, int, long, long);
int wormread(Device*, Off, void*);
Devsize wormsize(Device*);
@ -243,3 +244,6 @@ int wrenwrite(Device*, Off, void*);
void cmd_exec(char*);
void cmd_install(char*, char*, void (*)(int, char*[]));
ulong flag_install(char*, char*);
void srvinit(void);
Chan *srvchan(int, char *);

View file

@ -27,10 +27,12 @@ OFILES=\
time.$O\
uidgid.$O\
wren.$O\
srv.$O\
HFILES=\
../32bit.h\
../64bit.h\
../64xbit.h\
../9p1.h\
../all.h\
dat.h\

209
sys/src/cmd/cwfs/srv.c Normal file
View file

@ -0,0 +1,209 @@
#include "all.h"
#include "io.h"
#include <fcall.h> /* 9p2000 */
#include <thread.h>
enum {
Maxfdata = 8192,
Nqueue = 200, /* queue size (tunable) */
Nsrvo = 8, /* number of write workers */
};
typedef struct Srv Srv;
struct Srv
{
Ref;
char *name;
Chan *chan;
int fd;
char buf[64];
};
static struct {
Lock;
Chan *hd;
} freechans;
static Queue *srvoq;
void
chanhangup(Chan *chan, char *msg, int dolock)
{
Srv *srv;
USED(dolock);
USED(msg);
fileinit(chan);
if(chan->type != Devsrv)
return;
srv = chan->pdata;
if(srv == nil || srv->chan != chan)
return;
close(srv->fd);
srv->fd = -1;
}
static void
srvput(Srv *srv)
{
Chan *chan;
if(decref(srv))
return;
print("%s closed\n", srv->name);
chanhangup(srv->chan, "", 0);
memset(srv->buf, 0, sizeof(srv->buf));
chan = srv->chan;
lock(&freechans);
srv->chan = freechans.hd;
freechans.hd = chan;
unlock(&freechans);
}
static void
srvo(void *)
{
Srv *srv;
Msgbuf *mb;
char buf[ERRMAX];
print("srvo\n");
for(;;){
mb = fs_recv(srvoq, 0);
if(mb == nil)
continue;
if(mb->data == nil){
if(!(mb->flags & FREE))
mbfree(mb);
continue;
}
srv = (Srv*)mb->param;
while((srv->fd >= 0) && (write(srv->fd, mb->data, mb->count) != mb->count)){
rerrstr(buf, sizeof(buf));
if(strstr(buf, "interrupt"))
continue;
if(buf[0])
print("srvo %s: %s\n", srv->name, buf);
chanhangup(srv->chan, buf, 0);
break;
}
mbfree(mb);
srvput(srv);
}
}
static void
srvi(void *aux)
{
Srv *srv = aux;
Msgbuf *mb, *ms;
uchar *b, *p, *e;
int n, m;
char buf[ERRMAX];
print("srvi %s\n", srv->name);
if((mb = mballoc(IOHDRSZ+Maxfdata, srv->chan, Mbeth1)) == nil)
panic("srvi %s: mballoc failed", srv->name);
b = mb->data;
p = b;
e = b + mb->count;
Read:
while((srv->fd >= 0) && ((n = read(srv->fd, p, e - p)) >= 0)){
p += n;
while((p - b) >= BIT32SZ){
m = GBIT32(b);
if((m < BIT32SZ) || (m > mb->count)){
werrstr("bad length in 9P2000 message header");
goto Error;
}
if((n = (p - b) - m) < 0){
e = b + m;
goto Read;
}
if(m <= SMALLBUF){
if((ms = mballoc(m, srv->chan, Mbeth1)) == nil)
panic("srvi %s: mballoc failed", srv->name);
memmove(ms->data, b, m);
} else {
ms = mb;
if((mb = mballoc(mb->count, srv->chan, Mbeth1)) == nil)
panic("srvi %s: mballoc failed", srv->name);
ms->count = m;
}
if(n > 0)
memmove(mb->data, b + m, n);
b = mb->data;
p = b + n;
incref(srv);
ms->param = (uint)srv;
fs_send(serveq, ms);
}
e = b + mb->count;
}
Error:
rerrstr(buf, sizeof(buf));
if(strstr(buf, "interrupt"))
goto Read;
if(buf[0])
print("srvi %s: %s\n", srv->name, buf);
chanhangup(srv->chan, buf, 0);
srvput(srv);
mbfree(mb);
}
Chan*
srvchan(int fd, char *name)
{
Chan *chan;
Srv *srv;
lock(&freechans);
if(chan = freechans.hd){
srv = chan->pdata;
freechans.hd = srv->chan;
unlock(&freechans);
} else {
unlock(&freechans);
chan = fs_chaninit(Devsrv, 1, sizeof(*srv));
srv = chan->pdata;
}
chan->reply = srvoq;
if(chan->send == nil)
chan->send = serveq;
chan->protocol = nil;
chan->msize = 0;
chan->whotime = 0;
incref(srv);
srv->chan = chan;
srv->fd = fd;
snprint(srv->buf, sizeof(srv->buf), "srvi %s", name);
srv->name = strchr(srv->buf, ' ')+1;
newproc(srvi, srv, srv->buf);
return chan;
}
void
srvinit(void)
{
int i;
if(srvoq != nil)
return;
srvoq = newqueue(Nqueue, "srvoq");
for(i=0; i<Nsrvo; i++)
newproc(srvo, nil, "srvo");
}

View file

@ -614,7 +614,9 @@ Zfmt(Fmt* fmt)
case Devlworm:
if (c == '\0')
c = 'l';
if(d->wren.ctrl == 0 && d->wren.lun == 0)
if(d->wren.file)
snprint(s, sizeof(s), "%c\"%s\"", c, d->wren.file);
else if(d->wren.ctrl == 0 && d->wren.lun == 0)
sprint(s, "%c%d", c, d->wren.targ);
else
sprint(s, "%c%d.%d.%d", c, d->wren.ctrl, d->wren.targ,

View file

@ -116,5 +116,6 @@ wrenwrite(Device *d, Off b, void *c)
cons.nwrenwe++;
r = 1;
}
return r;
}