XCOMM!SHELL_CMD XCOMM $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $ XCOMM XCOMM This is just a sample implementation of a slightly less primitive XCOMM interface than xinit. It looks for user .xinitrc and .xserverrc XCOMM files, then system xinitrc and xserverrc files, else lets xinit choose XCOMM its default. The system xinitrc should probably do things like check XCOMM for .Xresources files and merge them in, startup up a window manager, XCOMM and pop a clock and serveral xterms. XCOMM XCOMM Site administrators are STRONGLY urged to write nicer versions. XCOMM XCOMM $XFree86: xc/programs/xinit/startx.cpp,v 3.16tsi Exp $ unset DBUS_SESSION_BUS_ADDRESS unset SESSION_MANAGER #if defined(__SCO__) || defined(__UNIXWARE__) || defined(__APPLE__) XCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them. XCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin XCOMM and people may use X without changing their PATH. XCOMM Note that we put our own bin directory at the front of the path, and XCOMM the standard system path at the back, since if you are using the Xorg XCOMM server theres a pretty good chance you want to bias the Xorg clients XCOMM over the old system's clients. XCOMM First our compiled path bindir=__bindir__ case $PATH in *:$bindir | *:$bindir:* | $bindir:*) ;; *) PATH=$bindir:$PATH ;; esac XCOMM Now the "old" compiled path #ifdef __APPLE__ oldbindir=/usr/X11R6/bin #else oldbindir=/usr/bin/X11 #endif if [ -d "$oldbindir" ] ; then case $PATH in *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; *) PATH=$PATH:$oldbindir ;; esac fi XCOMM Bourne shell does not automatically export modified environment variables XCOMM so export the new PATH just in case the user changes the shell export PATH #endif #if defined(__SCO__) || defined(__UNIXWARE__) XCOMM Set up the XMERGE env var so that dos merge is happy under X if [ -f /usr/lib/merge/xmergeset.sh ]; then . /usr/lib/merge/xmergeset.sh elif [ -f /usr/lib/merge/console.disp ]; then XMERGE=`cat /usr/lib/merge/console.disp` export XMERGE fi userclientrc=$HOME/.startxrc sysclientrc=LIBDIR/sys.startxrc scouserclientrc=$HOME/.xinitrc scosysclientrc=XINITDIR/xinitrc #else userclientrc=$HOME/.xinitrc sysclientrc=XINITDIR/xinitrc #endif userserverrc=$HOME/.xserverrc sysserverrc=XINITDIR/xserverrc defaultclient=XTERM defaultserver=XSERVER defaultclientargs="" defaultserverargs="" defaultdisplay=":0" clientargs="" serverargs="" #ifdef __APPLE__ XCOMM Initialize defaults (this will cut down on "safe" error messages) if ! defaults read org.x.X11 cache_fonts >& /dev/null ; then defaults write org.x.X11 cache_fonts -bool true fi if ! defaults read org.x.X11 no_auth >& /dev/null ; then defaults write org.x.X11 no_auth -bool false fi if ! defaults read org.x.X11 nolisten_tcp >& /dev/null ; then defaults write org.x.X11 nolisten_tcp -bool true fi XCOMM First, start caching fonts if [ x`defaults read org.x.X11 cache_fonts` = x1 ] ; then if [ -x /usr/X11/bin/font_cache ] ; then /usr/X11/bin/font_cache & elif [ -x /usr/X11/bin/font_cache.sh ] ; then /usr/X11/bin/font_cache.sh & elif [ -x /usr/X11/bin/fc-cache ] ; then /usr/X11/bin/fc-cache & fi fi if [ -x XINITDIR/privileged_startx ] ; then # Don't push this into the background becasue it can cause # a race to create /tmp/.X11-unix XINITDIR/privileged_startx fi if [ x`defaults read org.x.X11 no_auth` = x0 ] ; then enable_xauth=1 else enable_xauth=0 fi if [ x`defaults read org.x.X11 nolisten_tcp` = x1 ] ; then defaultserverargs="$defaultserverargs -nolisten tcp" fi for ((d=0; ; d++)) ; do [[ -e /tmp/.X$d-lock ]] || break done defaultdisplay=":$d" #else enable_xauth=1 #endif if [ -f $userclientrc ]; then defaultclientargs=$userclientrc elif [ -f $sysclientrc ]; then defaultclientargs=$sysclientrc #if defined(__SCO__) || defined(__UNIXWARE__) elif [ -f $scouserclientrc ]; then defaultclientargs=$scouserclientrc elif [ -f $scosysclientrc ]; then defaultclientargs=$scosysclientrc #endif fi #if defined(__SCO__) || defined(__UNIXWARE__) XCOMM SCO -t option: do not start an X server case $1 in -t) if [ -n "$DISPLAY" ]; then REMOTE_SERVER=TRUE shift else echo "DISPLAY environment variable not set" exit 1 fi ;; esac #endif whoseargs="client" while [ x"$1" != x ]; do case "$1" in XCOMM '' required to prevent cpp from treating "/*" as a C comment. /''*|\./''*) if [ "$whoseargs" = "client" ]; then if [ x"$clientargs" = x ]; then client="$1" else clientargs="$clientargs $1" fi else if [ x"$serverargs" = x ]; then server="$1" else serverargs="$serverargs $1" fi fi ;; --) whoseargs="server" ;; *) if [ "$whoseargs" = "client" ]; then clientargs="$clientargs $1" else XCOMM display must be the FIRST server argument if [ x"$serverargs" = x ] && @@ expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then display="$1" else serverargs="$serverargs $1" fi fi ;; esac shift done XCOMM process client arguments if [ x"$client" = x ]; then XCOMM if no client arguments either, use rc file instead if [ x"$clientargs" = x ]; then client="$defaultclientargs" else client=$defaultclient fi fi XCOMM process server arguments if [ x"$server" = x ]; then server=$defaultserver XCOMM if no server arguments or display either, use defaults if [ x"$serverargs" = x -a x"$display" = x ]; then XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments if [ -f $userserverrc ]; then server=$userserverrc elif [ -f $sysserverrc ]; then server=$sysserverrc fi serverargs=$defaultserverargs display=$defaultdisplay fi fi if [ x"$enable_xauth" = x1 ] ; then if [ x"$XAUTHORITY" = x ]; then XAUTHORITY=$HOME/.Xauthority export XAUTHORITY fi removelist= XCOMM 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} #if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) mcookie=`MK_COOKIE` #else if [ -r /dev/urandom ]; then mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` else mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` fi #endif if test x"$mcookie" = x; then echo "Couldn't create cookie" exit 1 fi dummy=0 XCOMM 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} XCOMM now add the same credentials to the client authority file XCOMM if '$displayname' already exists do not overwrite it as another XCOMM 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 #if defined(__SCO__) || defined(__UNIXWARE__) if [ "$REMOTE_SERVER" = "TRUE" ]; then exec SHELL_CMD ${client} else XINIT $client $clientargs -- $server $display $serverargs fi #else XINIT $client $clientargs -- $server $display $serverargs #endif 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 /* * various machines need special cleaning up */ #ifdef __linux__ if command -v deallocvt > /dev/null 2>&1; then deallocvt fi #endif #ifdef macII Xrepair screenrestore #endif #if defined(sun) kbd_mode -a #endif