#!/bin/sh

# This script first starts faked (the daemon), and then it will run
# the requested program with fake root privileges.

usage () {
cat - >&2 <<EOF
fakeroot, create a fake root environment.
   usage: fakeroot [-l|--lib fakerootlib] [-f|--faked fakedbin]
                   [-i file] [-s file] [-u|--unknown-is-real]
		   [-b|--fd-base fd] [-h|--help] [-v|--version]
                   [--] [command]
EOF
  exit 1
}

stderr ()
{
  local i
  for i
  do
      echo >&2 "fakeroot: $i"
  done
}

fatal ()
{
  stderr "$@"
  exit 1
}

# strip /bin/fakeroot to find install prefix
FAKEROOT_PREFIX=/usr/local/google/home/pgynther/clients/buildroot/output/host/usr
FAKEROOT_BINDIR=/usr/local/google/home/pgynther/clients/buildroot/output/host/usr/bin

USEABSLIBPATH=0
LIB=libfakeroot.so
PATHS=/usr/local/google/home/pgynther/clients/buildroot/output/host/usr/lib:${FAKEROOT_PREFIX}/lib64/libfakeroot:${FAKEROOT_PREFIX}/lib32/libfakeroot
FAKED=${FAKEROOT_BINDIR}/faked

FAKED_MODE="unknown-is-root"
export FAKED_MODE

libfound=no

GETOPTEST=`getopt --version`
case $GETOPTEST in
getopt*) # GNU getopt
    FAKE_TEMP=`getopt -l lib: -l faked: -l unknown-is-real -l fd-base: -l version -l help -- +l:f:i:s:ub:vh "$@"`
    ;;
*) # POSIX getopt ?
    FAKE_TEMP=`getopt l:f:i:s:ub:vh "$@"`
    ;;
esac

if test "$?" -ne 0; then
  usage
fi

eval set -- "$FAKE_TEMP"

FAKEDOPTS=""
PIPEIN=""
WAITINTRAP=0

while test "X$1" != "X--"; do
  case "$1" in
    -l|--lib)
       shift
       LIB=`eval echo "$1"`
       PATHS=
       ;;
    -f|--faked)
       shift
       FAKED="$1"
       ;;
    -i)
       shift
       if test -f "$1"; then
         FAKEDOPTS=$FAKEDOPTS" --load"
         PIPEIN="<$1"
       else
         stderr "database file \`$1' does not exist."
       fi
       ;;
    -s)
       shift
       FAKEDOPTS=$FAKEDOPTS" --save-file $1"
       [ -p $1 ] || WAITINTRAP=1
       ;;
    -u|--unknown-is-real)
       FAKEDOPTS=$FAKEDOPTS" --unknown-is-real"
       FAKED_MODE="unknown-is-real"
       ;;
    -b|--fd-base)
       shift
       FAKEROOT_FD_BASE="$1"
       ;;
    -v|--version)
       echo "fakeroot version 1.20.2"
       exit 0
       ;;
    -h|--help)
       usage
       ;;
  esac
  shift
done

shift #get rid of the '--'

# make sure the preload is available
ABSLIB=""
if [ -n "$PATHS" ]
then
    for dir in `echo $PATHS | sed 's/:/ /g'`
    do
	if test -r "$dir/$LIB"
	then
	    libfound=yes
	    ABSLIB="$dir/$LIB"
	fi
    done
else
    if test -r "$LIB"
    then
	libfound=yes
	ABSLIB="$LIB"
    fi
fi

if test $libfound = no
then
    fatal "preload library \`$LIB' not found, aborting."
fi

if test -n "$FAKEROOTKEY"
then
    fatal "FAKEROOTKEY set to $FAKEROOTKEY" \
          "nested operation not yet supported"
fi

unset FAKEROOTKEY
KEY_PID=`eval $FAKED $FAKEDOPTS $PIPEIN`
FAKEROOTKEY=`echo $KEY_PID|cut -d: -f1`
PID=`echo $KEY_PID|cut -d: -f2`

if [ "$WAITINTRAP" -eq 0 ]; then
  trap "kill -s TERM $PID" EXIT INT
else
  trap 'FAKEROOTKEY=$FAKEROOTKEY LD_LIBRARY_PATH="$PATHS" LD_PRELOAD="$LIB" /bin/ls -l / >/dev/null 2>&1; while kill -s TERM $PID 2>/dev/null; do sleep 0.1; done' EXIT INT
  #trap 'FAKEROOTKEY=$FAKEROOTKEY LD_PRELOAD="$LIB" /bin/ls -l / >/dev/null 2>&1; while kill -s TERM $PID 2>/dev/null; do sleep 0.1; done' EXIT INT
fi

if test -z "$FAKEROOTKEY" || test -z "$PID"; then
  fatal "error while starting the \`faked' daemon."
fi

if test $USEABSLIBPATH -ne 0 ; then
  LIB=$ABSLIB
fi
# Keep other library paths
if test -n "$LD_LIBRARY_PATH"; then
  PATHS="$PATHS:$LD_LIBRARY_PATH"
fi
# ...and preloaded libs
if test -n "$LD_PRELOAD"; then
  LIB="$LIB:$LD_PRELOAD"
fi

export FAKEROOT_FD_BASE

if test -z "$*"; then
  FAKEROOTKEY=$FAKEROOTKEY LD_LIBRARY_PATH="$PATHS"  LD_PRELOAD="$LIB" ${SHELL:-/bin/sh}
  #FAKEROOTKEY=$FAKEROOTKEY  LD_PRELOAD="$LIB" ${SHELL:-/bin/sh}
  RESULT=$?
else
  FAKEROOTKEY=$FAKEROOTKEY LD_LIBRARY_PATH="$PATHS"  LD_PRELOAD="$LIB" "$@"
  #FAKEROOTKEY=$FAKEROOTKEY  LD_PRELOAD="$LIB" "$@"
  RESULT=$?
fi

exit $RESULT

# Local Variables:
# mode: shell-script
# End:
