startx.cpp revision 72e81212
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 8772e81212Smrgif [ "x$X11_PREFS_DOMAIN" = x ] ; then 8872e81212Smrg X11_PREFS_DOMAIN="org.x.X11" 8972e81212Smrgfi 9072e81212Smrg 91a73027baSmrgXCOMM Initialize defaults (this will cut down on "safe" error messages) 9272e81212Smrgif ! defaults read $X11_PREFS_DOMAIN cache_fonts >& /dev/null ; then 9372e81212Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 94a73027baSmrgfi 95a73027baSmrg 9672e81212Smrgif ! defaults read $X11_PREFS_DOMAIN no_auth >& /dev/null ; then 9772e81212Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 98a73027baSmrgfi 99a73027baSmrg 10072e81212Smrgif ! defaults read $X11_PREFS_DOMAIN nolisten_tcp >& /dev/null ; then 10172e81212Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 102a73027baSmrgfi 103a73027baSmrg 104a73027baSmrgXCOMM First, start caching fonts 10572e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN cache_fonts` = x1 ] ; then 10672e81212Smrg if [ -x $bindir/font_cache ] ; then 10772e81212Smrg $bindir/font_cache & 10872e81212Smrg elif [ -x $bindir/font_cache.sh ] ; then 10972e81212Smrg $bindir/font_cache.sh & 11072e81212Smrg elif [ -x $bindir/fc-cache ] ; then 11172e81212Smrg $bindir/fc-cache & 112a73027baSmrg fi 113a73027baSmrgfi 114a73027baSmrg 115a73027baSmrgif [ -x XINITDIR/privileged_startx ] ; then 116a73027baSmrg # Don't push this into the background becasue it can cause 117a73027baSmrg # a race to create /tmp/.X11-unix 118a73027baSmrg XINITDIR/privileged_startx 119a73027baSmrgfi 120a73027baSmrg 12172e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN no_auth` = x0 ] ; then 122a73027baSmrg enable_xauth=1 123a73027baSmrgelse 124a73027baSmrg enable_xauth=0 125a73027baSmrgfi 126a73027baSmrg 12772e81212Smrgif [ x`defaults read $X11_PREFS_DOMAIN nolisten_tcp` = x1 ] ; then 128a73027baSmrg defaultserverargs="$defaultserverargs -nolisten tcp" 129a73027baSmrgfi 130a73027baSmrg 13172e81212Smrgif defaults read $X11_PREFS_DOMAIN dpi >& /dev/null ; then 13272e81212Smrg defaultserverargs="$defaultserverargs -dpi `defaults read $X11_PREFS_DOMAIN dpi`" 13372e81212Smrgfi 13472e81212Smrg 135a73027baSmrgfor ((d=0; ; d++)) ; do 136a73027baSmrg [[ -e /tmp/.X$d-lock ]] || break 137a73027baSmrgdone 138a73027baSmrgdefaultdisplay=":$d" 139a73027baSmrg 140a73027baSmrg#else 141a73027baSmrgenable_xauth=1 142a73027baSmrg#endif 143a73027baSmrg 144a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 145a73027baSmrg 146a73027baSmrgXCOMM SCO -t option: do not start an X server 147a73027baSmrgcase $1 in 148a73027baSmrg -t) if [ -n "$DISPLAY" ]; then 149a73027baSmrg REMOTE_SERVER=TRUE 150a73027baSmrg shift 151a73027baSmrg else 152a73027baSmrg echo "DISPLAY environment variable not set" 153a73027baSmrg exit 1 154a73027baSmrg fi 155a73027baSmrg ;; 156a73027baSmrgesac 157a73027baSmrg#endif 158a73027baSmrg 159a73027baSmrgwhoseargs="client" 160a73027baSmrgwhile [ x"$1" != x ]; do 161a73027baSmrg case "$1" in 162a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 163a73027baSmrg /''*|\./''*) 164a73027baSmrg if [ "$whoseargs" = "client" ]; then 165a73027baSmrg if [ x"$clientargs" = x ]; then 166a73027baSmrg client="$1" 167a73027baSmrg else 168a73027baSmrg clientargs="$clientargs $1" 169a73027baSmrg fi 170a73027baSmrg else 171a73027baSmrg if [ x"$serverargs" = x ]; then 172a73027baSmrg server="$1" 173a73027baSmrg else 174a73027baSmrg serverargs="$serverargs $1" 175a73027baSmrg fi 176a73027baSmrg fi 177a73027baSmrg ;; 178a73027baSmrg --) 179a73027baSmrg whoseargs="server" 180a73027baSmrg ;; 181a73027baSmrg *) 182a73027baSmrg if [ "$whoseargs" = "client" ]; then 183a73027baSmrg clientargs="$clientargs $1" 184a73027baSmrg else 185a73027baSmrg XCOMM display must be the FIRST server argument 186a73027baSmrg if [ x"$serverargs" = x ] && @@ 187a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 188a73027baSmrg display="$1" 189a73027baSmrg else 190a73027baSmrg serverargs="$serverargs $1" 191a73027baSmrg fi 192a73027baSmrg fi 193a73027baSmrg ;; 194a73027baSmrg esac 195a73027baSmrg shift 196a73027baSmrgdone 197a73027baSmrg 198a73027baSmrgXCOMM process client arguments 199a73027baSmrgif [ x"$client" = x ]; then 20072e81212Smrg client=$defaultclient 20172e81212Smrg 202a73027baSmrg XCOMM if no client arguments either, use rc file instead 203a73027baSmrg if [ x"$clientargs" = x ]; then 20472e81212Smrg if [ -f "$userclientrc" ]; then 20572e81212Smrg client=$userclientrc 20672e81212Smrg elif [ -f "$sysclientrc" ]; then 20772e81212Smrg client=$sysclientrc 20872e81212Smrg#if defined(__SCO__) || defined(__UNIXWARE__) 20972e81212Smrg elif [ -f "$scouserclientrc" ]; then 21072e81212Smrg client=$scouserclientrc 21172e81212Smrg elif [ -f "$scosysclientrc" ]; then 21272e81212Smrg client=$scosysclientrc 21372e81212Smrg#endif 21472e81212Smrg fi 21572e81212Smrg 21672e81212Smrg clientargs=$defaultclientargs 217a73027baSmrg fi 218a73027baSmrgfi 219a73027baSmrg 220a73027baSmrgXCOMM process server arguments 221a73027baSmrgif [ x"$server" = x ]; then 222a73027baSmrg server=$defaultserver 223a73027baSmrg 224a73027baSmrg XCOMM if no server arguments or display either, use defaults 225a73027baSmrg if [ x"$serverargs" = x -a x"$display" = x ]; then 226a73027baSmrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 22772e81212Smrg if [ -f "$userserverrc" ]; then 228a73027baSmrg server=$userserverrc 22972e81212Smrg elif [ -f "$sysserverrc" ]; then 230a73027baSmrg server=$sysserverrc 231a73027baSmrg fi 232a73027baSmrg 233a73027baSmrg serverargs=$defaultserverargs 234a73027baSmrg display=$defaultdisplay 235a73027baSmrg fi 236a73027baSmrgfi 237a73027baSmrg 238a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 239a73027baSmrg if [ x"$XAUTHORITY" = x ]; then 240a73027baSmrg XAUTHORITY=$HOME/.Xauthority 241a73027baSmrg export XAUTHORITY 242a73027baSmrg fi 243a73027baSmrg 244a73027baSmrg removelist= 245a73027baSmrg 246a73027baSmrg XCOMM set up default Xauth info for this machine 247a73027baSmrg case `uname` in 248a73027baSmrg Linux*) 249a73027baSmrg if [ -z "`hostname --version 2>&1 | grep GNU`" ]; then 250a73027baSmrg hostname=`hostname -f` 251a73027baSmrg else 252a73027baSmrg hostname=`hostname` 253a73027baSmrg fi 254a73027baSmrg ;; 255a73027baSmrg *) 256a73027baSmrg hostname=`hostname` 257a73027baSmrg ;; 258a73027baSmrg esac 259a73027baSmrg 260a73027baSmrg authdisplay=${display:-:0} 261a73027baSmrg#if defined(HAS_COOKIE_MAKER) && defined(MK_COOKIE) 262a73027baSmrg mcookie=`MK_COOKIE` 263a73027baSmrg#else 264a73027baSmrg if [ -r /dev/urandom ]; then 265a73027baSmrg mcookie=`dd if=/dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 266a73027baSmrg else 267a73027baSmrg mcookie=`dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\"` 268a73027baSmrg fi 269a73027baSmrg#endif 270a73027baSmrg if test x"$mcookie" = x; then 271a73027baSmrg echo "Couldn't create cookie" 272a73027baSmrg exit 1 273a73027baSmrg fi 274a73027baSmrg dummy=0 275a73027baSmrg 276a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 277a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 27872e81212Smrg trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP KILL BUS TERM 27972e81212Smrg xauth -q -f "$xserverauthfile" << EOF 280a73027baSmrgadd :$dummy . $mcookie 281a73027baSmrgEOF 28272e81212Smrg#ifdef __APPLE__ 28372e81212Smrg serverargs=${serverargs}" -auth '"${xserverauthfile}"'" 28472e81212Smrg#else 285a73027baSmrg serverargs=${serverargs}" -auth "${xserverauthfile} 28672e81212Smrg#endif 287a73027baSmrg 288a73027baSmrg XCOMM now add the same credentials to the client authority file 289a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 290a73027baSmrg XCOMM server man need it. Add them to the '$xserverauthfile' instead. 291a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 292a73027baSmrg authcookie=`XAUTH list "$displayname" @@ 293a73027baSmrg | sed -n "s/.*$displayname[[:space:]*].*[[:space:]*]//p"` 2>/dev/null; 294a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 295a73027baSmrg XAUTH -q << EOF 296a73027baSmrgadd $displayname . $mcookie 297a73027baSmrgEOF 298a73027baSmrg removelist="$displayname $removelist" 299a73027baSmrg else 300a73027baSmrg dummy=$(($dummy+1)); 30172e81212Smrg XAUTH -q -f "$xserverauthfile" << EOF 302a73027baSmrgadd :$dummy . $authcookie 303a73027baSmrgEOF 304a73027baSmrg fi 305a73027baSmrg done 306a73027baSmrgfi 307a73027baSmrg 308a73027baSmrg#if defined(__SCO__) || defined(__UNIXWARE__) 309a73027baSmrgif [ "$REMOTE_SERVER" = "TRUE" ]; then 310a73027baSmrg exec SHELL_CMD ${client} 311a73027baSmrgelse 31272e81212Smrg XINIT "$client" $clientargs -- "$server" $display $serverargs 313a73027baSmrgfi 314a73027baSmrg#else 31572e81212Smrg 31672e81212Smrg#ifdef __APPLE__ 31772e81212Smrgeval XINIT \"$client\" $clientargs -- \"$server\" $display $serverargs 31872e81212Smrg#else 31972e81212SmrgXINIT "$client" $clientargs -- "$server" $display $serverargs 32072e81212Smrg#endif 32172e81212Smrg 322a73027baSmrg#endif 323a73027baSmrg 324a73027baSmrgif [ x"$enable_xauth" = x1 ] ; then 325a73027baSmrg if [ x"$removelist" != x ]; then 326a73027baSmrg XAUTH remove $removelist 327a73027baSmrg fi 328a73027baSmrg if [ x"$xserverauthfile" != x ]; then 32972e81212Smrg rm -f "$xserverauthfile" 330a73027baSmrg fi 331a73027baSmrgfi 332a73027baSmrg 333a73027baSmrg/* 334a73027baSmrg * various machines need special cleaning up 335a73027baSmrg */ 336a73027baSmrg#ifdef __linux__ 337a73027baSmrgif command -v deallocvt > /dev/null 2>&1; then 338a73027baSmrg deallocvt 339a73027baSmrgfi 340a73027baSmrg#endif 341a73027baSmrg 342a73027baSmrg#ifdef macII 343a73027baSmrgXrepair 344a73027baSmrgscreenrestore 345a73027baSmrg#endif 346a73027baSmrg 347a73027baSmrg#if defined(sun) 348a73027baSmrgkbd_mode -a 349a73027baSmrg#endif 350