ref: 2e2e412d056d214d103bceec96186b35ea45acd1
dir: /overlay/
#!/bin/rc -e
# Overlays a directory tree over another
fn usage {
echo usage: $0 [-u] source target >[1=2]
exit 'usage'
}
mode=bind
while(~ $1 -*) {
switch($1) {
case -u
mode=unbind
case *
usage
}
shift
}
source=$1
target=$2
if(! test -d $source || ! test -d $target)
usage
files=`{walk -f $source}
mtpts=`{{for(file in $files) basename -d $file} | sort | uniq | sed 's@^'$source@$target@g}
for(mtpt in $mtpts)
switch($mode) {
case bind
if(test -d $mtpt)
bind -cq $mtpt $mtpt || status=''
if not { # This might not be desirable
aux/stub -d $mtpt
ramfs -m $mtpt
}
case unbind
unmount $mtpt >/dev/null >[2=1] || status=''
}
if(~ $mode bind)
for(file in $files) {
dest=`{echo $file | sed s@$source@$target@g}
aux/stub $dest
bind -c $file $dest
}
if not
status=''