#!/sbin/sh

#
# add_file(name,size,kind,where)
#
add_file()
{
 if [ "$3" = "overwrite" ] ; then
   mfileno=1
 else
   fileno=`expr $fileno + 1`
   mfileno=$fileno
 fi
 if [ "$3" != "overwrite" ] ; then
   echo >> $tocfile "$volno $mfileno $1 $2	$3	$4"
 else
   sed -e 6,6d -e "7i\\
$volno $mfileno $1 $2	toc	$4" $tocfile > $tocfile.new
 fi
}

#
# add_tarfile(project,filelist,dir,options,set)
#
add_tarfile()
{
 mkdir "$setfile$5"
 cd $3
 seddir=`echo $3 | sed 's/\//\\\\\//g'`
 while read line ; do
   dir=`dirname $line`
   while [ "$dir" != . ] ; do
     echo $dir
     dir=`dirname $dir`
   done
 done < $2 | sort +u | while read name ; do
   make_directory "$setfile$5" "$name"
 done
 if [ $list -eq 0 ] ; then
   add_file $1.dirs `(cd "$setfile$5" ; tar cbf 1 - *) | wc -c` tar "$3 $4"
   add_file $1.files `tar cbf 1 - -I $2 | wc -c` tar "$3 $4"
 else
   add_file $1.dirs 0 tar "$3 $4"
   add_file $1.files 0 tar "$3 $4"
   echo $1.files":"
   tar cbf 1 - -I $2 | tar tf - | sed 's/^\(.*\)$/'$seddir'\/\1/' | sed 's/^\/\//\//'
 fi
}

#
# make_directory(where,name)
#
make_directory()
{
 target="$1/$2"
 set -- `ls -nd $2`
 mkdir $target
 chmod `echo $1 | sed 's/^.\(...\)\(...\)\(...\).*$/u=\1,g=\2,o=\3/' | tr -d '-'` $target
 chown $3 $target
 chgrp $4 $target
}

#
# make_tarfile(filelist,dir,set)
#
make_tarfile()
{
 cd "$setfile$3"
 tar cbf 1 $tape *
 cd $2
 tar cbf 1 $tape -I $1
}

#
# new_volume()
#
new_volume()
{
 if [ -z "$volno" ]
 then
   volno=0
 fi
 volno=`expr $volno + 1`
 fileno=-1
}

#
# Variables and Constants
#
sdir=/usr/opt/contrib/saphir/src
efile=/tmp/boss_tape_empty
tfile=/tmp/boss_tape_xdr
sfile=/tmp/boss_tape_list
tocfile=/tmp/boss_tape_toc
setfile=/tmp/boss_tarset
if [ "$1" = "LIST" ] ; then
  list=1
else
  list=0
  if [ -z "$1" ] ; then
    tape=/dev/rmt/0n
  else
    tape="$1"
  fi
fi

#
# File sets
#
set1="saphir__r $sdir/tape/root.filelist / required_movable"
set2="saphir__u $sdir/tape/usr.filelist /usr required_movable"
set3="saphir__uopt $sdir/tape/usropt.filelist /usr/opt required_movable"
set4="saphir.utils__r $sdir/tape/source.root.filelist / optional_movable"
set5="saphir.utils__u $sdir/tape/source.usr.filelist /usr optional_movable"
set6="saphir.utils__uopt $sdir/tape/source.usropt.filelist /usr/opt optional_movable"
set7="saphir.utils__uopt+ $sfile /usr/opt optional_movable"
sets=7

#
# Setup files
#
if [ -z "$debug" ] ; then
  set -- $sdir/setup.d/usr/*do
  while [ ! -z "$1" ] ; do
    file=/usr/sbin/setup.d/usr/`basename $1`
    cp $1 $file
    chown root $file
    chgrp root $file
    chmod 775 $file
    shift
  done
  
  set -- $sdir/setup.d/root/*do
  while [ ! -z "$1" ] ; do
    file=/sbin/setup.d/root/`basename $1`
    cp $1 $file
    chown root $file
    chgrp root $file
    chmod 775 $file
    shift
  done
fi

#
# Clean it
#
rm -f $efile $sfile $tfile.vol1 $tocfile $tocfile.new 
rm -fr ${setfile}*

#
# Start tape
#
new_volume

#
# Crate Table of Contents
#
cat <<EOF > $tocfile
BOSS/SAPHIR~installation set of June 13th~1991 from JMS [*]
ARCH 88
VOLUME 1
 Vol File             Name       Size	Type
EOF

#
# No images, toc will be corrected later on
#
echo > $efile "This file is not empty but it is"
add_file empty `ls -l $efile | cut -c32-40` image
add_file xdrtoc 0 toc
add_file empty `ls -l $efile | cut -c32-40` image 

#
# Create filelists
#
echo > $sfile contrib/saphir

#
# Count for all tar files
#
setno=1
while [ $setno -le $sets ] ; do
  export set$setno
  set -- `echo echo '$'set$setno | sh`
  add_tarfile $1 $2 $3 "`echo $4 | tr _ ' '`" $setno
  setno=`expr $setno + 1`  
done

#
# Create metafile xdrtoc
#
gen_toc $tocfile $tfile

#
# Overwrite Table of Contents size
#
add_file xdrtoc `ls -l $tfile.vol1 | cut -c32-40` overwrite

#
# Create final xdrtoc
#
mv $tocfile.new $tocfile
gen_toc $tocfile $tfile

#
# Create the tape
#
if [ -z "$debug" -a $list -eq 0 ] ; then
  echo creating installation tape $tape
  mt -f $tape rewind
  dd if=$efile of=$tape conv=sync
  dd if=$tfile.vol1 of=$tape conv=sync
  dd if=$efile of=$tape conv=sync
  setno=1
  while [ $setno -le $sets ] ; do
    set -- `echo echo '$'set$setno | sh`
    echo writing tapeset $1
    make_tarfile $2 $3 $setno
    setno=`expr $setno + 1`  
  done
  mt -f $tape rewind
else
  xdrtoc $tfile.vol1
fi

#
# Clean it
#
rm -f $efile $sfile $tfile.vol1 $tocfile $tocfile.new
rm -fr ${setfile}*
