startx.cpp revision a73027ba
1a73027baSmrgXCOMM!SHELL_CMD 2a73027baSmrg 3a73027baSmrgXCOMM $Xorg: startx.cpp,v 1.3 2000/08/17 19:54:29 cpqbld Exp $ 4a73027baSmrgXCOMM 5a73027baSmrgXCOMM This is just a sample implementation of a slightly less primitive 6a73027baSmrgXCOMM interface than xinit. It looks for user .xinitrc and .xserverrc 7a73027baSmrgXCOMM files, then system xinitrc and xserverrc files, else lets xinit choose 8a73027baSmrgXCOMM its default. The system xinitrc should probably do things like check 9a73027baSmrgXCOMM for .Xresources files and merge them in, startup up a window manager, 10a73027baSmrgXCOMM and pop a clock and serveral xterms. 11a73027baSmrgXCOMM 12a73027baSmrgXCOMM Site administrators are STRONGLY urged to write nicer versions. 13a73027baSmrgXCOMM 14a73027baSmrgXCOMM $XFree86: xc/programs/xinit/startx.cpp,v 3.16tsi Exp $ 15a73027baSmrg 16a73027baSmrgunset DBUS_SESSION_BUS_ADDRESS 17a73027baSmrgunset SESSION_MANAGER 18a73027baSmrg 19a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) || defined(__APPLE__) 20a73027baSmrg 21a73027baSmrgXCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them. 22a73027baSmrgXCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin 23a73027baSmrgXCOMM and people may use X without changing their PATH. 24a73027baSmrgXCOMM Note that we put our own bin directory at the front of the path, and 25a73027baSmrgXCOMM the standard system path at the back, since if you are using the Xorg 26a73027baSmrgXCOMM server theres a pretty good chance you want to bias the Xorg clients 27a73027baSmrgXCOMM over the old system's clients. 28a73027baSmrg 29a73027baSmrgXCOMM First our compiled path 30a73027baSmrgbindir=__bindir__ 31a73027baSmrg 32a73027baSmrgcase $PATH in 33a73027baSmrg *:$bindir | *:$bindir:* | $bindir:*) ;; 34a73027baSmrg *) PATH=$bindir:$PATH ;; 35a73027baSmrgesac 36a73027baSmrg 37a73027baSmrgXCOMM Now the "old" compiled path 38a73027baSmrg#ifdef __APPLE__ 39a73027baSmrgoldbindir=/usr/X11R6/bin 40a73027baSmrg#else 41a73027baSmrgoldbindir=/usr/bin/X11 42a73027baSmrg#endif 43a73027baSmrg 44a73027baSmrgif [ -d "$oldbindir" ] ; then 45a73027baSmrg case $PATH in 46a73027baSmrg *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; 47a73027baSmrg *) PATH=$PATH:$oldbindir ;; 48a73027baSmrg esac 49a73027baSmrgfi 50a73027baSmrg 51a73027baSmrgXCOMM Bourne shell does not automatically export modified environment variables 52a73027baSmrgXCOMM so export the new PATH just in case the user changes the shell 53a73027baSmrgexport PATH 54a73027baSmrg#endif 55a73027baSmrg 56a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 57a73027baSmrgXCOMM Set up the XMERGE env var so that dos merge is happy under X 58a73027baSmrg 59a73027baSmrgif [ -f /usr/lib/merge/xmergeset.sh ]; then 60a73027baSmrg . /usr/lib/merge/xmergeset.sh 61a73027baSmrgelif [ -f /usr/lib/merge/console.disp ]; then 62a73027baSmrg XMERGE=`cat /usr/lib/merge/console.disp` 63a73027baSmrg export XMERGE 64a73027baSmrgfi 65a73027baSmrg 66a73027baSmrguserclientrc=$HOME/.startxrc 67a73027baSmrgsysclientrc=LIBDIR/sys.startxrc 68a73027baSmrgscouserclientrc=$HOME/.xinitrc 69a73027baSmrgscosysclientrc=XINITDIR/xinitrc 70a73027baSmrg#else 71a73027baSmrguserclientrc=$HOME/.xinitrc 72a73027baSmrgsysclientrc=XINITDIR/xinitrc 73a73027baSmrg#endif 74a73027baSmrg 75a73027baSmrguserserverrc=$HOME/.xserverrc 76a73027baSmrgsysserverrc=XINITDIR/xserverrc 77a73027baSmrgdefaultclient=XTERM 78a73027baSmrgdefaultserver=XSERVER 79a73027baSmrgdefaultclientargs="" 80a73027baSmrgdefaultserverargs="" 81a73027baSmrgdefaultdisplay=":0" 82a73027baSmrgclientargs="" 83a73027baSmrgserverargs="" 84a73027baSmrg 85a73027baSmrg#ifdef __APPLE__ 86a73027baSmrg 87a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages) 88a73027baSmrgif ! defaults read org.x.X11 cache_fonts >& /dev/null ; then 89a73027baSmrg defaults write org.x.X11 cache_fonts -bool true 90a73027baSmrgfi 91a73027baSmrg 92a73027baSmrgif ! defaults read org.x.X11 no_auth >& /dev/null ; then 93a73027baSmrg defaults write org.x.X11 no_auth -bool false 94a73027baSmrgfi 95a73027baSmrg 96a73027baSmrgif ! defaults read org.x.X11 nolisten_tcp >& /dev/null ; then 97a73027baSmrg defaults write org.x.X11 nolisten_tcp -bool true 98a73027baSmrgfi 99a73027baSmrg 100a73027baSmrgXCOMM First, start caching fonts 101a73027baSmrgif [ x`defaults read org.x.X11 cache_fonts` = x1 ] ; then 102a73027baSmrg if [ -x /usr/X11/bin/font_cache ] ; then 103a73027baSmrg /usr/X11/bin/font_cache & 104a73027baSmrg elif [ -x /usr/X11/bin/font_cache.sh ] ; then 105a73027baSmrg /usr/X11/bin/font_cache.sh & 106a73027baSmrg elif [ -x /usr/X11/bin/fc-cache ] ; then 107a73027baSmrg /usr/X11/bin/fc-cache & 108a73027baSmrg fi 109a73027baSmrgfi 110a73027baSmrg 111a73027baSmrgif [ -x XINITDIR/privileged_startx ] ; then 112a73027baSmrg # Don't push this into the background becasue it can cause 113a73027baSmrg # a race to create /tmp/.X11-unix 114a73027baSmrg XINITDIR/privileged_startx 115a73027baSmrgfi 116a73027baSmrg 117a73027baSmrgif [ x`defaults read org.x.X11 no_auth` = x0 ] ; then 118a73027baSmrg enable_xauth=1 119a73027baSmrgelse 120a73027baSmrg enable_xauth=0 121a73027baSmrgfi 122a73027baSmrg 123a73027baSmrgif [ x`defaults read org.x.X11 nolisten_tcp` = x1 ] ; then 124a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 125a73027baSmrgfi 126a73027baSmrg 127a73027baSmrgfor ((d=0; ; d++)) ; do 128a73027baSmrg [[ -e /tmp/.X$d-lock ]] || break 129a73027baSmrgdone 130a73027baSmrgdefaultdisplay=":$d" 131a73027baSmrg 132a73027baSmrg#else 133a73027baSmrgenable_xauth=1 134a73027baSmrg#endif 135a73027baSmrg 136a73027baSmrg 137a73027baSmrgif [ -f $userclientrc ]; then 138a73027baSmrg defaultclientargs=$userclientrc 139a73027baSmrgelif [ -f $sysclientrc ]; then 140a73027baSmrg defaultclientargs=$sysclientrc 141a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 142a73027baSmrgelif [ -f $scouserclientrc ]; then 143a73027baSmrg defaultclientargs=$scouserclientrc 144a73027baSmrgelif [ -f $scosysclientrc ]; then 145a73027baSmrg defaultclientargs=$scosysclientrc 146a73027baSmrg#endif 147a73027baSmrgfi 148a73027baSmrg 149a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 150a73027baSmrg 151a73027baSmrgXCOMM SCO -t option: do not start an X server 152a73027baSmrgcase $1 in 153a73027baSmrg -t) if [ -n "$DISPLAY" ]; then 154a73027baSmrg REMOTE_SERVER=TRUE 155a73027baSmrg shift 156a73027baSmrg else 157a73027baSmrg echo "DISPLAY environment variable not set" 158a73027baSmrg exit 1 159a73027baSmrg fi 160a73027baSmrg ;; 161a73027baSmrgesac 162a73027baSmrg#endif 163a73027baSmrg 164a73027baSmrgwhoseargs="client" 165a73027baSmrgwhile [ x"$1" != x ]; do 166a73027baSmrg case "$1" in 167a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 168a73027baSmrg /''*|\./''*) 169a73027baSmrg if [ "$whoseargs" = "client" ]; then 170a73027baSmrg if [ x"$clientargs" = x ]; then 171a73027baSmrg client="$1" 172a73027baSmrg else 173a73027baSmrg clientargs="$clientargs $1" 174a73027baSmrg fi 175a73027baSmrg else 176a73027baSmrg if [ x"$serverargs" = x ]; then 177a73027baSmrg server="$1" 178a73027baSmrg else 179a73027baSmrg serverargs="$serverargs $1" 180a73027baSmrg fi 181a73027baSmrg fi 182a73027baSmrg ;; 183a73027baSmrg --) 184a73027baSmrg whoseargs="server" 185a73027baSmrg ;; 186a73027baSmrg *) 187a73027baSmrg if [ "$whoseargs" = "client" ]; then 188a73027baSmrg clientargs="$clientargs $1" 189a73027baSmrg else 190a73027baSmrg XCOMM display must be the FIRST server argument 191a73027baSmrg if [ x"$serverargs" = x ] && @@ 192a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 193a73027baSmrg display="$1" 194a73027baSmrg else 195a73027baSmrg serverargs="$serverargs $1" 196a73027baSmrg fi 197a73027baSmrg fi 198a73027baSmrg ;; 199a73027baSmrg esac 200a73027baSmrg shift 201a73027baSmrgdone 202a73027baSmrg 203a73027baSmrgXCOMM process client arguments 204a73027baSmrgif [ x"$client" = x ]; then 205a73027baSmrg XCOMM if no client arguments either, use rc file instead 206a73027baSmrg if [ x"$clientargs" = x ]; then 207a73027baSmrg client="$defaultclientargs" 208a73027baSmrg else 209a73027baSmrg client=$defaultclient 210a73027baSmrg fi 211a73027baSmrgfi 212a73027baSmrg 213a73027baSmrgXCOMM process server arguments 214a73027baSmrgif [ x"$server" = x ]; then 215a73027baSmrg server=$defaultserver 216a73027baSmrg 217a73027baSmrg XCOMM if no server arguments or display either, use defaults 218a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 219a73027baSmrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 220a73027baSmrg if [ -f $userserverrc ]; then 221a73027baSmrg server=$userserverrc 222a73027baSmrg elif [ -f $sysserverrc ]; then 223a73027baSmrg server=$sysserverrc 224a73027baSmrg fi 225a73027baSmrg 226a73027baSmrg serverargs=$defaultserverargs 227a73027baSmrg display=$defaultdisplay 228a73027baSmrg fi 229a73027baSmrgfi 230a73027baSmrg 231a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 232a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 233a73027baSmrg XAUTHORITY=$HOME/.Xauthority 234a73027baSmrg export XAUTHORITY 235a73027baSmrg fi 236a73027baSmrg 237a73027baSmrg removelist= 238a73027baSmrg 239a73027baSmrg XCOMM set up default Xauth info for this machine 240a73027baSmrg case `uname` in 241a73027baSmrg Linux*) 242a73027baSmrg if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then 243a73027baSmrg hostname=`hostname -f` 244a73027baSmrg else 245a73027baSmrg hostname=`hostname` 246a73027baSmrg fi 247a73027baSmrg ;; 248a73027baSmrg *) 249a73027baSmrg hostname=`hostname` 250a73027baSmrg ;; 251a73027baSmrg esac 252a73027baSmrg 253a73027baSmrg authdisplay=${display:-:0} 254a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 255a73027baSmrg mcookie=`MK_COOKIE` 256a73027baSmrg#else 257a73027baSmrg if [ -r /dev/urandom ]; then 258a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 259a73027baSmrg else 260a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 261a73027baSmrg fi 262a73027baSmrg#endif 263a73027baSmrg if test x"$mcookie" = x; then 264a73027baSmrg echo "Couldn't create cookie" 265a73027baSmrg exit 1 266a73027baSmrg fi 267a73027baSmrg dummy=0 268a73027baSmrg 269a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 270a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 271a73027baSmrg trap "rm -f $xserverauthfile" HUP INT QUIT ILL TRAP KILL BUS TERM 272a73027baSmrg xauth -q -f $xserverauthfile << EOF 273a73027baSmrgadd :$dummy . $mcookie 274a73027baSmrgEOF 275a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 276a73027baSmrg 277a73027baSmrg XCOMM now add the same credentials to the client authority file 278a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 279a73027baSmrg XCOMM server man need it. Add them to the '$xserverauthfile' instead. 280a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 281a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 282a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 283a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 284a73027baSmrg XAUTH -q << EOF 285a73027baSmrgadd $displayname . $mcookie 286a73027baSmrgEOF 287a73027baSmrg removelist="$displayname $removelist" 288a73027baSmrg else 289a73027baSmrg dummy=$(($dummy+1)); 290a73027baSmrg XAUTH -q -f $xserverauthfile << EOF 291a73027baSmrgadd :$dummy . $authcookie 292a73027baSmrgEOF 293a73027baSmrg fi 294a73027baSmrg done 295a73027baSmrgfi 296a73027baSmrg 297a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 298a73027baSmrgif [ "$REMOTE_SERVER" = "TRUE" ]; then 299a73027baSmrg exec SHELL_CMD ${client} 300a73027baSmrgelse 301a73027baSmrg XINIT $client $clientargs -- $server $display $serverargs 302a73027baSmrgfi 303a73027baSmrg#else 304a73027baSmrgXINIT $client $clientargs -- $server $display $serverargs 305a73027baSmrg#endif 306a73027baSmrg 307a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 308a73027baSmrg if [ x"$removelist" != x ]; then 309a73027baSmrg XAUTH remove $removelist 310a73027baSmrg fi 311a73027baSmrg if [ x"$xserverauthfile" != x ]; then 312a73027baSmrg rm -f $xserverauthfile 313a73027baSmrg fi 314a73027baSmrgfi 315a73027baSmrg 316a73027baSmrg/* 317a73027baSmrg * various machines need special cleaning up 318a73027baSmrg */ 319a73027baSmrg#ifdef __linux__ 320a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 321a73027baSmrg deallocvt 322a73027baSmrgfi 323a73027baSmrg#endif 324a73027baSmrg 325a73027baSmrg#ifdef macII 326a73027baSmrgXrepair 327a73027baSmrgscreenrestore 328a73027baSmrg#endif 329a73027baSmrg 330a73027baSmrg#if defined(sun) 331a73027baSmrgkbd_mode -a 332a73027baSmrg#endif 333