#!/bin/bash

ME="$0"
if [ -h "$0" ] ; then
	ME=`readlink -f "$0"`
fi

sbinpath=`dirname "$ME"`
if [ "z$sbinpath" = 'z.' ] ; then
	sbinpath=`pwd`
fi

sboxrel=`dirname "$sbinpath"`

SBOX_DIR=`readlink -f $sboxrel`

if [ "x$1" = x ]; then
	echo "Usage: $0 <username>"
	exit 1
fi

if [ ! -f $SBOX_DIR/.run_me_first_done ]; then
	exit 0
fi

realpath()
{
	readlink -f $1 2> /dev/null
	return $?
}

is_mounted()
{
	local path=`realpath $1`
	if [ x"$path" != x ]; then
		mount | grep "on $path type" > /dev/null
		return $?
	fi
	return 1
}

do_mount()
{
	if ! is_mounted $3 ; then
		if ! (mkdir -p $3 && mount $2 `realpath $3` $1) ; then
			echo "ERROR: Unable to mount $3" 1>&2
			exit 1
		fi
	fi
}

if [ -e /dev/.udevdb ] || [ -e /dev/.udev/db ] ; then
	DEV_DIR=/dev
else
	DEV_DIR=$SBOX_DIR/dev
	if [ ! -c $DEV_DIR/null ]; then
		echo "ERROR: $DEV_DIR does not contain standard device nodes!" 1>&2
		exit 1
	fi
fi

umask 0022

ROOT=$SBOX_DIR/users/$1

do_mount --bind $SBOX_DIR $ROOT/scratchbox
do_mount --bind /tmp      $ROOT/tmp
do_mount --bind /proc     $ROOT/proc
do_mount --bind $DEV_DIR  $ROOT/dev
do_mount --bind /dev/pts  $ROOT/dev/pts

is_mounted /dev/shm && do_mount --bind /dev/shm $ROOT/dev/shm

# /sys is sometimes required even when it's not really available
mkdir -p $ROOT/sys
is_mounted /sys && do_mount --bind /sys $ROOT/sys

exit 0
