#!/bin/sh

# $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $
#
# This is just a sample implementation of a slightly less primitive
# interface than xinit.  It looks for user .xinitrc and .xserverrc
# files, then system xinitrc and xserverrc files, else lets xinit choose
# its default.  The system xinitrc should probably do things like check
# for .Xresources files and merge them in, startup up a window manager,
# and pop a clock and serveral xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
#
# $XFree86: xc/programs/xinit/startx.cpp,v 3.16tsi Exp $


userclientrc="$1"
sysclientrc="$1"

pidfilepath="$HOME/.mcepid"
userserverrc="$HOME/.xserverrc"
sysserverrc=/etc/X11/xinit/xserverrc
defaultclientargs=""
defaultserverargs="-nolisten tcp -br vt07"
clientargs=""
serverargs=""

enable_xauth=1

if [ -f $userclientrc ]; then
    defaultclientargs=$userclientrc
elif [ -f $sysclientrc ]; then
    defaultclientargs=$sysclientrc
fi

if [ x"$display" != x ]; then
    export DISPLAY=$display
else
    export DISPLAY=:0
fi


if [ -f $userserverrc ]; then
    defaultserverargs=$userserverrc
elif [ -f $sysserverrc ]; then
    defaultserverargs=$sysserverrc
fi

whoseargs="client"
while [ x"$1" != x ]; do
    case "$1" in
      /''*|\.*)       if [ "$whoseargs" = "client" ]; then
                  if [ "x$clientargs" = x ]; then
                      clientargs="$1"
                  else
                      clientargs="$clientargs $1"
                  fi
              else
                  if [ "x$serverargs" = x ]; then
                      serverargs="$1"
                  else
                      serverargs="$serverargs $1"
                  fi
              fi ;;
      --)     whoseargs="server" ;;
      *)      if [ "$whoseargs" = "client" ]; then
                  if [ "x$clientargs" = x ]; then
                      clientargs="$defaultclientargs $1"
                  else
                      clientargs="$clientargs $1"
                  fi
              else
                  case "$1" in
                      :[0-9]*) display="$1"; serverargs="$serverargs $1";;
                      *) serverargs="$serverargs $1" ;;
                  esac
              fi ;;
    esac
    shift
done

if [ x"$clientargs" = x ]; then
	clientargs="$defaultclientargs"
fi
if [ x"$serverargs" = x ]; then
	serverargs="$defaultserverargs"
fi

if [ x"$enable_xauth" = x1 ] ; then
    if [ x"$XAUTHORITY" = x ]; then
        XAUTHORITY=$HOME/.Xauthority
        export XAUTHORITY
    fi

    removelist=

    # set up default Xauth info for this machine
    case `uname` in
    Linux*)
        if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then
            hostname=`hostname -f`
        else
            hostname=`hostname`
        fi
        ;;
    *)
        hostname=`hostname`
        ;;
    esac

    authdisplay=${display:-:0}

    mcookie=`/usr/bin/mcookie`

    dummy=0

    # create a file with auth information for the server. ':0' is a dummy.
    xserverauthfile=$HOME/.serverauth.$$
    trap "rm -f $xserverauthfile" HUP INT QUIT ILL TRAP KILL BUS TERM
    xauth -q -f $xserverauthfile << EOF
add :$dummy . $mcookie
EOF
    serverargs=${serverargs}" -auth "${xserverauthfile}

    # now add the same credentials to the client authority file
    # if '$displayname' already exists do not overwrite it as another
    # server man need it. Add them to the '$xserverauthfile' instead.
    for displayname in $authdisplay $hostname$authdisplay; do
        authcookie=`xauth list "$displayname" \
        | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null;
        if [ "z${authcookie}" = "z" ] ; then
            xauth -q << EOF 
add $displayname . $mcookie
EOF
        removelist="$displayname $removelist"
        else
            dummy=$(($dummy+1));
            xauth -q -f $xserverauthfile << EOF
add :$dummy . $authcookie
EOF
        fi
    done
fi

cleanup() {

    [ -n "$PID" ] && kill $PID > /dev/null 2>&1
    if [ x"$enable_xauth" = x1 ] ; then
        if [ x"$removelist" != x ]; then
            xauth remove $removelist
        fi
        if [ x"$xserverauthfile" != x ]; then
            rm -f $xserverauthfile
        fi
    fi

}


trap cleanup 0

xinit $clientargs -- $serverargs -deferglyphs 16 &

PID=$!

# Write pid to pid file
echo $PID > $pidfilepath

wait $PID

unset PID
