1#!/bin/rc 2 3# the venti configuration is stored at the 248kB offset in the first index 4# partition and extends for at most 8 kB. 5 6rfork e 7fn usage { 8 echo 'usage: venti/conf [-w] /dev/sdC0/v.arenas' >[1=2] 9 exit usage 10} 11 12wflag=no 13while(! ~ $#* 0 && ~ $1 -* && ! ~ $1 --){ 14 switch($1){ 15 case -w 16 wflag=yes 17 case * 18 usage 19 } 20 shift 21} 22if(~ $1 --) 23 shift 24 25if(~ $wflag no && ! ~ $#* 1) 26 usage 27if(~ $wflag yes && ! ~ $#* 1 2) 28 usage 29 30disk=$1 31if(! test -f $disk){ 32 echo 'unknown disk' $1 >[1=2] 33 exit nodisk 34} 35 36fn sigexit { 37 #rm -f /tmp/venticonf.$pid 38} 39 40if(~ $wflag yes){ 41 {echo venti config; cat $2} >/tmp/venticonf.$pid || exit oops 42 if(! test -s /tmp/venticonf.$pid){ 43 echo 'config is empty; will not install' >[1=2] 44 exit emptyconfig 45 } 46 if(test `{ls -l /tmp/venticonf.$pid | awk '{print $6}'} -gt 8192){ 47 echo 'config is too long; max is a little less than eight kilobytes' >[1=2] 48 exit toolong 49 } 50 dd -quiet 1 -bs 1024 -count 8 -if $disk -iseek 248 \ 51 >/tmp/_venticonf.old || exit backup 52 dd -quiet 1 -count 2 </dev/zero >> /tmp/venticonf.$pid || exit dd 53 dd -quiet 1 -bs 1024 -count 8 -if /tmp/venticonf.$pid \ 54 -of $disk -trunc 0 -oseek 248 || exit dd2 55 exit 0 56} 57 58dd -quiet 1 -bs 1024 -count 8 -if $disk -iseek 248 | 59 aux/zerotrunc >/tmp/venticonf.$pid 60 61if(! cmp <{sed 1q /tmp/venticonf.$pid} <{echo venti config}){ 62 echo 'config has bad header' >[1=2] 63 exit badconfig 64} 65 66sed 1d /tmp/venticonf.$pid 67exit '' 68