#!/bin/sh

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

usage () {
  echo >&2 "fakechroot, create a fake chroot environment."
  echo >&2 "   usage: fakeroot [-l|--lib fakerootlib] [-r|--faked fakedbin]"
  echo >&2 "                   [-i file] [-s file] [-u|--unknown-is-real]"
  echo >&2 "                   [--] [command]"
  exit 1
}

# strip /bin/fakechroot to find install prefix
BINDIR=`dirname $0`
PREFIX=`dirname ${BINDIR}`
    
LIB=libfakechroot.so.0
PATHS=${PREFIX}/lib/libfakechroot:${PREFIX}/lib64/libfakechroot
FAKED=${BINDIR}/faked

FAKED_MODE="unknown-is-root"
export FAKED_MODE

libfound=no

GETOPTEST=`getopt --version`
case $GETOPTEST in
getopt*) # GNU getopt
    TEMP=`getopt -l lib: -l faked: -l unknown-is-real -- +l:f:i:s:u "$@"`
    ;;
*) # POSIX getopt ?
    TEMP=`getopt l:f:i:s:u "$@"`
    ;;
esac

if test "$?" != "0"; then
  usage
fi

eval set -- "$TEMP"

FAKEDOPTS=""
PIPEIN=""
while test "X$1" != "X--"; do
  case "$1" in
    -l|--lib)
       shift
       LIB=`eval echo "$1"`
       PATHS=
       ;;
    -f|--faked)
       shift
       FAKED="$1"
       ;;
    -i)
       shift
       FAKEDOPTS=$FAKEDOPTS" --load"
       PIPEIN="<$1"
       ;;
    -s)
       shift
       FAKEDOPTS=$FAKEDOPTS" --save-file $1"
       ;;
    -u|--unknown-is-real)
       FAKEDOPTS=$FAKEDOPTS" --unknown-is-real"
       FAKED_MODE="unknown-is-real"
       ;;
    -h|--help)
       usage
       ;;
  esac
  shift
done

shift #get rid of the '--'

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

if test $libfound = no
then
    echo >&2 "fakechroot: preload library not found, aborting."
    exit 1
fi

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

trap "kill -s TERM $PID" EXIT INT

if test -z "$FAKEROOTKEY" || test -z "$PID"; then
  echo >&2 "fakechroot: error while starting the \`faked' daemon."
  exit 1
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

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

exit $RESULT
