Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#!/bin/rc

# the venti configuration is stored at the 248kB offset in the first index
# partition and extends for at most 8 kB.

rfork e
fn usage {
        echo 'usage: venti/conf [-w] /dev/sdC0/v.arenas' >[1=2]
        exit usage
}

wflag=no
while(! ~ $#* 0 && ~ $1 -* && ! ~ $1 --){
        switch($1){
        case -w
                wflag=yes
        case *
                usage
        }
        shift
}
if(~ $1 --)
        shift

if(~ $wflag no && ! ~ $#* 1)
        usage
if(~ $wflag yes && ! ~ $#* 1 2)
        usage

disk=$1
if(! test -f $disk){
        echo 'unknown disk' $1 >[1=2]
        exit nodisk
}

fn sigexit {
        #rm -f /tmp/venticonf.$pid
}

if(~ $wflag yes){
        {echo venti config; cat $2} >/tmp/venticonf.$pid || exit oops
        if(! test -s /tmp/venticonf.$pid){
                echo 'config is empty; will not install' >[1=2]
                exit emptyconfig
        }
        if(test `{ls -l /tmp/venticonf.$pid | awk '{print $6}'} -gt 8192){
                echo 'config is too long; max is a little less than eight kilobytes' >[1=2]
                exit toolong
        }
        dd -quiet 1 -bs 1024 -count 8 -if $disk -iseek 248 \
                >/tmp/_venticonf.old || exit backup
        dd -quiet 1 -count 2 </dev/zero >> /tmp/venticonf.$pid || exit dd
        dd -quiet 1 -bs 1024 -count 8 -if /tmp/venticonf.$pid \
                -of $disk -trunc 0 -oseek 248 || exit dd2
        exit 0
}

dd -quiet 1 -bs 1024 -count 8 -if $disk -iseek 248 |
        aux/zerotrunc >/tmp/venticonf.$pid

if(! cmp <{sed 1q /tmp/venticonf.$pid} <{echo venti config}){
        echo 'config has bad header' >[1=2]
        exit badconfig
}

sed 1d /tmp/venticonf.$pid
exit ''