:
#
 # mklinks - Creates symlinks to directories containing separate SW packages
 #
 # Aufruf   : mklinks [<opts>] [{pkgDir}]
 # Optionen : -b      : base dir for dirs containing links (Default: /usr/local)
 #            -f      : don't fix permissions
 #            -l      : don't create symlinks (only fix perms)
 #            -L      : force (re)creation of symlinks
 #            -r      : no 'rm' before creating symlinks
 #            -s <ls> : put <ls> in pkgDir/.i/lscheme; pkgDir required
 #                      (<ls> = std|bin|inc|lib|tex|man|binlib|binman)
 # Funktion : 
 # Beispiel :
 #
 #-
 #tmpD
 #
 # erstellt         :            28-Feb-1997 / 18:40 / (mk)
 # letzte Aenderung :       Fri, 05-May-2000 / 22:53 / (mk)
 #
#

DoXargs()
{
  [ -z "$2" ] && return
  cmd="$1"; shift
  eval "$cmd $*"
}


GFixPerms()
{
  touch /tmp/fp$$
  (gfind .   -perm +4000 ! -type d -print;echo /tmp/fp$$) | xargs chmod 4711
  (gfind .   -perm +2000 ! -type d -print;echo /tmp/fp$$) | xargs chmod 2711
  (gfind .   -perm +111  -print;echo /tmp/fp$$) | xargs chmod 755
  (gfind . ! -perm +111  -print;echo /tmp/fp$$) | xargs chmod 644
  rm -f /tmp/fp$$
}


FixPerms()
{
  if   [ -r ".i/perms" ]
  then $BITSLIB/service/fixperm.pl .i/perms
       return
  fi
  if   [ -x $LNBASE/bin/gfind ]
  then GFixPerms
       return;
  fi
  find . -print |
  while read x; do
      if   [ -u "$x" ]
      then echo "chmod 4711 \"$x\"" | door
      elif [ -g "$x" ]
      then echo "chmod 2711 \"$x\"" | door
      elif [ -x "$x" ]
      then chmod 755 "$x"
      else chmod 644 "$x"
      fi
  done
}


LnR()
{
  if   [ -n "$corr" ]
  then lnName="$corr$1"
       corr=
  else lnName=$1
  fi
  lnDir=$2
  [ -d "$lnDir" ] || mkdir -p -m 775 $lnDir || return
  for f in *; do
      if   [ "$f" != "*" ]
      then if   [ -d $f ]
	   then [ -d $lnDir/$f ] || mkdir -m 775 $lnDir/$f || return
		cmd="(cd $f; LnR ../$lnName/$f $lnDir/$f)"
		echo $cmd; eval $cmd || return
	   else cmd="ln -s $lnName/$corr$f $lnDir/$f"
		echo $cmd; eval $cmd || return
	   fi
      fi
  done
}


StdLnScheme()
{
  pkgBase=$1
  pkg=$2
  recurse=$3
  noRecurse=$4
  savedPwd=`/bin/pwd`
  cd $pkg
  [ -z "$optNoFixperm" ] && FixPerms
  if   [ -n "$recurse" ]
  then for dir in $recurse; do
	   if   [ -d "$dir" ] && [ "`echo $dir/*`" != "$dir/*" ]
	   then _pwd=`pwd`
	        cd $dir
		if   [ -z "$optNoRm" ]
		then for file in `find . ! -type d -print`; do
			 cmd="rm -f $LNBASE/$dir/$file"
			 echo $cmd; eval $cmd;
		     done
		fi
		if   [ -z "$optNoLn" ]
		then corr=`(IFS=/;set -- $dir;IFS=" ";shift;while [ -n "$1" ]; do corr="$corr../"; shift; done; echo $corr)`
		     echo "corr='$corr'"
		     LnR $pkgBase/$pkg/$dir $LNBASE/$dir
		fi
		cd $_pwd
	   fi
       done
  fi
  if   [ -n "$noRecurse" ]
  then for dir in $noRecurse; do
	   if   [ -d "$dir" ] && [ "`echo $dir/*`" != "$dir/*" ]
	   then cd $dir
		if   [ -z "$optNoRm" ]
		then for file in *; do
			 #--- kein rm -rf ! (->htdocs z.B. wre groer Verlust)
			 if   [ -h "$LNBASE/$dir/$file" ] || [ -f $LNBASE/$dir/$file ]
			 then cmd="rm -f $LNBASE/$dir/$file"
			      echo $cmd; eval $cmd;
			 else true
			 fi
		     done
		fi
		if   [ -z "$optNoLn" ]
		then [ -d $LNBASE/$dir ] || mkdir $LNBASE/$dir && {
			 for file in *; do
			     if   [ "$file" != "locale" ]
			     then cmd="(cd $LNBASE/$dir && ln -s $pkgBase/$pkg/$dir/$file .)"
				  echo $cmd; eval $cmd;
			     else true
			     fi
			 done
		     }
		fi
		cd ..
	   fi
       done
  fi
  cd $savedPwd
}

#
#------------------------------------------------------------------------------
#

MakeLinks()
{
  if   [ -z "$1" ]
  then pkgList=`echo *`
  else pkgList=`echo "$@"`
  fi
  for pkg in $pkgList; do
      if   [ -z "$fromRemoveLinks" ]
      then if   [ -x "$pkg/.i/lnCmds" ]
           then (cd $pkg/.i;echo "lnCmds" | door)
           fi
      elif [ -x "$pkg/.i/rmCmds" ]
      then (cd $pkg/.i;echo "rmCmds" | door)
      fi
      [ -n "$optForceLn" ] && rm -f $pkg/.i/linked
      if   [ -d "$pkg" ] && [ -r "$pkg/.i/lscheme" ] && [ ! -r $pkg/.i/linked ]
      then lscheme=`cat $pkg/.i/lscheme`
           case "$lscheme" in
		   std) (StdLnScheme $PKGBASE $pkg "include bin sbin share etc cgi-bin libexec man info i386-pc-solaris2.5.1 i386-pc-solaris2.6 i386-sun-solaris2 mips-sgi-irix5 mips-sgi-irix6 sparc-sun-solaris2 app-defaults lib/locale" "doc html lib") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		   bin) (StdLnScheme $PKGBASE $pkg "bin sbin cgi-bin libexec" "") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		   inc) (StdLnScheme $PKGBASE $pkg "include" "") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		   lib) (StdLnScheme $PKGBASE $pkg "share lib/locale" "doc html lib") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		   tex) (StdLnScheme $PKGBASE $pkg "include bin sbin etc cgi-bin libexec man info i386-pc-solaris2.5.1 i386-pc-solaris2.6 i386-sun-solaris2 mips-sgi-irix5 mips-sgi-irix6 sparc-sun-solaris2 app-defaults lib/locale" "share doc html lib") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		   man) (StdLnScheme $PKGBASE $pkg "man" "") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
                binlib) (StdLnScheme $PKGBASE $pkg "bin sbin share etc cgi-bin libexec lib/locale" "doc html lib") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		binman) (StdLnScheme $PKGBASE $pkg "bin sbin cgi-bin libexec man" "doc html") &&
			[ -z "$optNoLn" ] && touch $pkg/.i/linked
			;;
		     *) echo "unknown value in $pkg/.i/lscheme: '$lscheme'"
			;;
           esac
      elif [ -r $pkg/.i/linked ]
      then echo "already linked '$pkg'"
      else echo "ignoring '$pkg'"
      fi
  done
}


RemoveLinks()
{
  fromRemoveLinks=1
  optNoRm=
  optNoLn=1
  optForceLn=1
  optNoFixperm=1
  MakeLinks "$@"
}

#
# -----------------------------------------------------------------------------
#

umask 0

myName=`basename $0`
pwd=`pwd`

optNoRm=
optNoLn=
optForceLn=
optNoFixperm=
optScheme=
LNBASE=
export optNoRm optNoLn optForceLn optNoFixperm LNBASE

set -- `getopt "b:flLrs:" $*`
while [ -n "$1" ]
do  case $1 in
         -b) LNBASE=$2;      shift; shift;;
         -f) optNoFixperm=1; shift;;
         -l) optNoLn=1;      shift;;
         -L) optForceLn=1;   shift;;
         -r) optNoRm=1;      shift;;
         -s) optScheme=$2;   shift; shift;;
         --) shift; break;;
          *) echo "$myName : illegal option : '$1'"
             exit 1;;
    esac
done

if   [ -z "$LNBASE" ]
then LNBASE=/usr/local
     if   [ -d $LNBASE/artcom ] && [ ! -h $LNBASE/artcom ]
     then PKGBASE=../artcom
     elif [ -d $LNBASE/pkgs   ] && [ ! -h $LNBASE/pkgs   ]
     then PKGBASE=../pkgs
     else echo "neither '$LNBASE/artcom' nor '$LNBASE/pkgs exist"
          exit 1
     fi
     export LNBASE PKGBASE
fi

if   [ ! -d "$LNBASE" ]
then echo "LNBASE directory '$LNBASE' does not exist"
     exit 1
fi
for dir in include bin sbin libexec man info share lib; do
    [ -d $LNBASE/$dir ] || echo "mkdir $LNBASE/$dir" | door || {
        echo "cannot create directory '$LNBASE/$dir'"
        exit 1
    }
    echo "chmod 775 $LNBASE/$dir; chgrp bits $LNBASE/$dir" | door
done

if   [ -n "$optScheme" ]
then [ -z "$1" ] && {
         echo "at least one pkgDir required with -s"
         exit 1
     }
     for dir in "$@"; do
         if   [ ! -d $dir ]
         then echo "pkgDir '$dir' does not exist"
              exit 1
         fi
         if   [ ! -d $dir/.i ]
         then mkdir $dir/.i || {
                  echo "cannot create '$dir/.i'"
                  exit 1
              }
         fi
	 echo $optScheme >$dir/.i/lscheme || {
	     echo "cannot create '$dir/.i/lscheme'"
	     exit 1
	 }
     done
fi

(
if   [ "$PKGBASE" != "../pkgs" ] && [ "$PKGBASE" != "../artcom" ]
then echo "Don't know how to make links to this dirs"
     exit 1
fi
case $myName in
     mklinks) MakeLinks   "$@";;
     rmlinks) RemoveLinks "$@";;
	   *) echo "Illegal link to mklinks/rmlinks"; exit 1;;
esac
) 2>&1 | tee /tmp/$myName.log

echo "\nLog in /tmp/$myName.log\n"
