1a73027baSmrgXCOMM!SHELL_CMD 2a73027baSmrg 3a73027baSmrgXCOMM 4a73027baSmrgXCOMM This is just a sample implementation of a slightly less primitive 57aed6334SmrgXCOMM interface than xinit. It looks for XINITRC and XSERVERRC environment 67aed6334SmrgXCOMM variables, then user .xinitrc and .xserverrc files, and then system 77aed6334SmrgXCOMM xinitrc and xserverrc files, else lets xinit choose its default. 87aed6334SmrgXCOMM The system xinitrc should probably do things like check for 97aed6334SmrgXCOMM .Xresources files and merge them in, start up a window manager, and 107aed6334SmrgXCOMM pop a clock and several xterms. 11a73027baSmrgXCOMM 12a73027baSmrgXCOMM Site administrators are STRONGLY urged to write nicer versions. 13a73027baSmrgXCOMM 14a73027baSmrg 15ac57ed83Smrgxinitdir=XINITDIR 16ac57ed83Smrgxterm=XTERM 17ac57ed83Smrgxserver=XSERVER 18ac57ed83Smrgxinit=XINIT 19ac57ed83Smrgbundle_id_prefix=BUNDLE_ID_PREFIX 20ac57ed83Smrgxauth=XAUTH 21ac57ed83Smrgbindir=__bindir__ 22ac57ed83Smrglibexecdir=__libexecdir__ 2306dc2f4aSmrg# XXX using $mk_cookie here expands bad. 2406dc2f4aSmrg# mk_cookie=MK_COOKIE 25ac57ed83Smrghas_cookie_maker=HAS_COOKIE_MAKER 26ac57ed83Smrg 27a73027baSmrgunset SESSION_MANAGER 28a73027baSmrg 29ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then 30a73027baSmrg 31ac57ed83Smrg XCOMM Check for /usr/bin/X11 and BINDIR in the path, if not add them. 32ac57ed83Smrg XCOMM This allows startx to be placed in a place like /usr/bin or /usr/local/bin 33ac57ed83Smrg XCOMM and people may use X without changing their PATH. 34ac57ed83Smrg XCOMM Note that we put our own bin directory at the front of the path, and 35ac57ed83Smrg XCOMM the standard system path at the back, since if you are using the Xorg 36ac57ed83Smrg XCOMM server there's a pretty good chance you want to bias the Xorg clients 37ac57ed83Smrg XCOMM over the old system's clients. 38a73027baSmrg 39ac57ed83Smrg case $PATH in 40ac57ed83Smrg *:$bindir | *:$bindir:* | $bindir:*) ;; 41ac57ed83Smrg *) PATH=$bindir:$PATH ;; 42ac57ed83Smrg esac 43a73027baSmrg 44ac57ed83Smrg XCOMM Now the "old" compiled path 45ac57ed83Smrg oldbindir=/usr/X11R6/bin 46a73027baSmrg 47ac57ed83Smrg if [ -d "$oldbindir" ] ; then 48ac57ed83Smrg case $PATH in 49ac57ed83Smrg *:$oldbindir | *:$oldbindir:* | $oldbindir:*) ;; 50ac57ed83Smrg *) PATH=$PATH:$oldbindir ;; 51ac57ed83Smrg esac 52ac57ed83Smrg fi 53a73027baSmrg 54ac57ed83Smrg XCOMM Bourne shell does not automatically export modified environment variables 55ac57ed83Smrg XCOMM so export the new PATH just in case the user changes the shell 56ac57ed83Smrg export PATH 57a73027baSmrgfi 58a73027baSmrg 59a73027baSmrguserclientrc=$HOME/.xinitrc 607aed6334Smrg[ -f "${XINITRC}" ] && userclientrc="${XINITRC}" 61a73027baSmrgsysclientrc=XINITDIR/xinitrc 62a73027baSmrg 63a73027baSmrguserserverrc=$HOME/.xserverrc 64ac57ed83Smrg[ -f "${XSERVERRC}" ] && userserverrc="${XSERVERRC}" 65ac57ed83Smrgsysserverrc=$xinitdir/xserverrc 66ac57ed83Smrgdefaultclient=$xterm 67ac57ed83Smrgdefaultserver=$xserver 68a73027baSmrgdefaultclientargs="" 69040e9fe7Smartindefaultserverargs="-noretro" 70d712a854Smrgdefaultdisplay="" 71a73027baSmrgclientargs="" 72a73027baSmrgserverargs="" 7341667ceaSmrgvtarg="" 74a73027baSmrg 75a73027baSmrg 76ac57ed83Smrgif [ "$(uname -s)" = "Darwin" ] ; then 7772e81212Smrg 78ac57ed83Smrg if [ "$X11_PREFS_DOMAIN" = "" ] ; then 79ac57ed83Smrg export X11_PREFS_DOMAIN=$bundle_id_prefix".X11" 80ac57ed83Smrg fi 81a73027baSmrg 82ac57ed83Smrg XCOMM Initialize defaults (this will cut down on "safe" error messages) 83ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN cache_fonts > /dev/null 2>&1 ; then 84ac57ed83Smrg defaults write $X11_PREFS_DOMAIN cache_fonts -bool true 85ac57ed83Smrg fi 86a73027baSmrg 87ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN no_auth > /dev/null 2>&1 ; then 88ac57ed83Smrg defaults write $X11_PREFS_DOMAIN no_auth -bool false 89ac57ed83Smrg fi 90a73027baSmrg 91ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN nolisten_tcp > /dev/null 2>&1 ; then 92ac57ed83Smrg defaults write $X11_PREFS_DOMAIN nolisten_tcp -bool true 93ac57ed83Smrg fi 94d712a854Smrg 95ac57ed83Smrg if ! defaults read $X11_PREFS_DOMAIN enable_iglx > /dev/null 2>&1 ; then 96ac57ed83Smrg defaults write $X11_PREFS_DOMAIN enable_iglx -bool false 97a73027baSmrg fi 98a73027baSmrg 99ac57ed83Smrg XCOMM First, start caching fonts 100ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN cache_fonts)" = 1 ] ; then 101ac57ed83Smrg if [ -x $bindir/font_cache ] ; then 102ac57ed83Smrg $bindir/font_cache 103ac57ed83Smrg elif [ -x $bindir/font_cache.sh ] ; then 104ac57ed83Smrg $bindir/font_cache.sh 105ac57ed83Smrg elif [ -x $bindir/fc-cache ] ; then 106ac57ed83Smrg $bindir/fc-cache 107ac57ed83Smrg fi 108ac57ed83Smrg fi 109ac57ed83Smrg 110ac57ed83Smrg if [ -x $libexecdir/privileged_startx ] ; then 1117aed6334Smrg XCOMM Don't push this into the background because it can cause 1127aed6334Smrg XCOMM a race to create /tmp/.X11-unix 113ac57ed83Smrg $libexecdir/privileged_startx 114ac57ed83Smrg fi 115a73027baSmrg 116ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN no_auth)" = 0 ] ; then 117ac57ed83Smrg enable_xauth=1 118ac57ed83Smrg else 119ac57ed83Smrg enable_xauth=0 120ac57ed83Smrg fi 121a73027baSmrg 122ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN nolisten_tcp)" = 1 ] ; then 123ac57ed83Smrg defaultserverargs="$defaultserverargs -nolisten tcp" 124ac57ed83Smrg else 125ac57ed83Smrg defaultserverargs="$defaultserverargs -listen tcp" 126ac57ed83Smrg fi 127d712a854Smrg 128ac57ed83Smrg if [ "$(defaults read $X11_PREFS_DOMAIN enable_iglx)" = 1 ] ; then 129ac57ed83Smrg defaultserverargs="$defaultserverargs +iglx +extension GLX" 130ac57ed83Smrg else 131ac57ed83Smrg defaultserverargs="$defaultserverargs -iglx" 132ac57ed83Smrg fi 133a73027baSmrg 134ac57ed83Smrg XCOMM The second check is the real one. The first is to hopefully avoid 135ac57ed83Smrg XCOMM needless syslog spamming. 136ac57ed83Smrg if defaults read $X11_PREFS_DOMAIN 2> /dev/null | grep -q 'dpi' && defaults read $X11_PREFS_DOMAIN dpi > /dev/null 2>&1 ; then 137ac57ed83Smrg defaultserverargs="$defaultserverargs -dpi $(defaults read $X11_PREFS_DOMAIN dpi)" 138ac57ed83Smrg fi 13972e81212Smrg 140ac57ed83Smrgelse 141ac57ed83Smrg enable_xauth=1 142ac57ed83Smrgfi 1431b180c10Smrg 1441b180c10SmrgXCOMM Automatically determine an unused $DISPLAY 14529004570Smrgd=0 14629004570Smrgwhile true ; do 147d712a854Smrg [ -e "/tmp/.X$d-lock" -o -S "/tmp/.X11-unix/X$d" ] || break 14829004570Smrg d=$(($d + 1)) 149a73027baSmrgdone 150a73027baSmrgdefaultdisplay=":$d" 15129004570Smrgunset d 152a73027baSmrg 153a73027baSmrgwhoseargs="client" 154ac57ed83Smrgwhile [ "$1" != "" ]; do 155a73027baSmrg case "$1" in 156a73027baSmrg XCOMM '' required to prevent cpp from treating "/*" as a C comment. 157a73027baSmrg /''*|\./''*) 158a73027baSmrg if [ "$whoseargs" = "client" ]; then 159ac57ed83Smrg if [ "$client" = "" ] && [ "$clientargs" = "" ]; then 160a73027baSmrg client="$1" 161a73027baSmrg else 162a73027baSmrg clientargs="$clientargs $1" 163a73027baSmrg fi 164a73027baSmrg else 165ac57ed83Smrg if [ "$server" = "" ] && [ "$serverargs" = "" ]; then 166a73027baSmrg server="$1" 167a73027baSmrg else 168a73027baSmrg serverargs="$serverargs $1" 169a73027baSmrg fi 170a73027baSmrg fi 171a73027baSmrg ;; 172a73027baSmrg --) 173a73027baSmrg whoseargs="server" 174a73027baSmrg ;; 175a73027baSmrg *) 176a73027baSmrg if [ "$whoseargs" = "client" ]; then 177a73027baSmrg clientargs="$clientargs $1" 178a73027baSmrg else 179a73027baSmrg XCOMM display must be the FIRST server argument 180ac57ed83Smrg if [ "$serverargs" = "" ] && @@ 181a73027baSmrg expr "$1" : ':[0-9][0-9]*$' > /dev/null 2>&1; then 182a73027baSmrg display="$1" 183a73027baSmrg else 184a73027baSmrg serverargs="$serverargs $1" 185a73027baSmrg fi 186a73027baSmrg fi 187a73027baSmrg ;; 188a73027baSmrg esac 189a73027baSmrg shift 190a73027baSmrgdone 191a73027baSmrg 192a73027baSmrgXCOMM process client arguments 193ac57ed83Smrgif [ "$client" = "" ]; then 19472e81212Smrg client=$defaultclient 19572e81212Smrg 1961b180c10Smrg XCOMM For compatibility reasons, only use startxrc if there were no client command line arguments 197ac57ed83Smrg if [ "$clientargs" = "" ]; then 19872e81212Smrg if [ -f "$userclientrc" ]; then 19972e81212Smrg client=$userclientrc 20072e81212Smrg elif [ -f "$sysclientrc" ]; then 20172e81212Smrg client=$sysclientrc 20272e81212Smrg fi 203a73027baSmrg fi 204a73027baSmrgfi 205a73027baSmrg 2061b180c10SmrgXCOMM if no client arguments, use defaults 207ac57ed83Smrgif [ "$clientargs" = "" ]; then 2081b180c10Smrg clientargs=$defaultclientargs 2091b180c10Smrgfi 2101b180c10Smrg 211a73027baSmrgXCOMM process server arguments 212ac57ed83Smrgif [ "$server" = "" ]; then 213a73027baSmrg server=$defaultserver 214a73027baSmrg 215ac57ed83Smrgif [ "$(uname -s)" = "Linux" ] ; then 21641667ceaSmrg XCOMM When starting the defaultserver start X on the current tty to avoid 21741667ceaSmrg XCOMM the startx session being seen as inactive: 21841667ceaSmrg XCOMM "https://bugzilla.redhat.com/show_bug.cgi?id=806491" 21941667ceaSmrg tty=$(tty) 220d712a854Smrg if expr "$tty" : '/dev/tty[0-9][0-9]*$' > /dev/null; then 2217aed6334Smrg tty_num=${tty#/dev/tty} 222d712a854Smrg vtarg="vt$tty_num -keeptty" 22341667ceaSmrg fi 224ac57ed83Smrgfi 22541667ceaSmrg 2261b180c10Smrg XCOMM For compatibility reasons, only use xserverrc if there were no server command line arguments 227ac57ed83Smrg if [ "$serverargs" = "" ] && [ "$display" = "" ]; then 22872e81212Smrg if [ -f "$userserverrc" ]; then 229a73027baSmrg server=$userserverrc 23072e81212Smrg elif [ -f "$sysserverrc" ]; then 231a73027baSmrg server=$sysserverrc 232a73027baSmrg fi 233a73027baSmrg fi 234a73027baSmrgfi 235a73027baSmrg 2361b180c10SmrgXCOMM if no server arguments, use defaults 237ac57ed83Smrgif [ "$serverargs" = "" ]; then 2381b180c10Smrg serverargs=$defaultserverargs 2391b180c10Smrgfi 2401b180c10Smrg 24141667ceaSmrgXCOMM if no vt is specified add vtarg (which may be empty) 24241667ceaSmrghave_vtarg="no" 24341667ceaSmrgfor i in $serverargs; do 2445dda8871Swiz if expr "$i" : 'vt[0-9][0-9]*$' > /dev/null; then 24541667ceaSmrg have_vtarg="yes" 24641667ceaSmrg fi 24741667ceaSmrgdone 24841667ceaSmrgif [ "$have_vtarg" = "no" ]; then 24941667ceaSmrg serverargs="$serverargs $vtarg" 25041667ceaSmrgfi 25141667ceaSmrg 2521b180c10SmrgXCOMM if no display, use default 253ac57ed83Smrgif [ "$display" = "" ]; then 2541b180c10Smrg display=$defaultdisplay 2551b180c10Smrgfi 2561b180c10Smrg 257ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then 258ac57ed83Smrg if [ "$XAUTHORITY" = "" ]; then 259a73027baSmrg XAUTHORITY=$HOME/.Xauthority 260a73027baSmrg export XAUTHORITY 261a73027baSmrg fi 262a73027baSmrg 263a73027baSmrg removelist= 264a73027baSmrg 265a73027baSmrg XCOMM set up default Xauth info for this machine 266ac57ed83Smrg hostname="$(uname -n)" 267a73027baSmrg 268a73027baSmrg authdisplay=${display:-:0} 26906dc2f4aSmrg if [ -n "$has_cookie_maker" ] && [ -n 'MK_COOKIE' ] ; then 27006dc2f4aSmrg mcookie=`MK_COOKIE` 271a73027baSmrg else 272ac57ed83Smrg if [ -r /dev/urandom ]; then 273ac57ed83Smrg mcookie=$(dd if=dev/urandom bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\") 274ac57ed83Smrg else 275ac57ed83Smrg mcookie=$(dd if=/dev/random bs=16 count=1 2>/dev/null | hexdump -e \\"%08x\\") 276ac57ed83Smrg fi 277a73027baSmrg fi 278ac57ed83Smrg if [ "$mcookie" = "" ]; then 279a73027baSmrg echo "Couldn't create cookie" 280a73027baSmrg exit 1 281a73027baSmrg fi 282a73027baSmrg dummy=0 283a73027baSmrg 284a73027baSmrg XCOMM create a file with auth information for the server. ':0' is a dummy. 285a73027baSmrg xserverauthfile=$HOME/.serverauth.$$ 286a8eb8bc0Snia trap "rm -f '$xserverauthfile'" HUP INT QUIT ILL TRAP BUS TERM 28772e81212Smrg xauth -q -f "$xserverauthfile" << EOF 288a73027baSmrgadd :$dummy . $mcookie 289a73027baSmrgEOF 290ac57ed83Smrg 291ac57ed83Smrg case "$(uname -s)" in 292ac57ed83Smrg CYGWIN*|Darwin) 293ac57ed83Smrg xserverauthfilequoted=$(echo ${xserverauthfile} | sed "s/'/'\\\\''/g") 294ac57ed83Smrg serverargs=${serverargs}" -auth '"${xserverauthfilequoted}"'" 295ac57ed83Smrg ;; 296ac57ed83Smrg *) 297ac57ed83Smrg serverargs=${serverargs}" -auth "${xserverauthfile} 298ac57ed83Smrg ;; 299ac57ed83Smrg esac 300a73027baSmrg 301a73027baSmrg XCOMM now add the same credentials to the client authority file 302a73027baSmrg XCOMM if '$displayname' already exists do not overwrite it as another 303d712a854Smrg XCOMM server may need it. Add them to the '$xserverauthfile' instead. 304a73027baSmrg for displayname in $authdisplay $hostname$authdisplay; do 305ac57ed83Smrg authcookie=$(xauth list "$displayname" @@ 306ac57ed83Smrg | sed -n 's/.*'"$displayname"'[[:space:]*].*[[:space:]*]//p' 2>/dev/null); 307a73027baSmrg if [ "z${authcookie}" = "z" ] ; then 308ac57ed83Smrg $xauth -q << EOF 309a73027baSmrgadd $displayname . $mcookie 310a73027baSmrgEOF 311a73027baSmrg removelist="$displayname $removelist" 312a73027baSmrg else 313a73027baSmrg dummy=$(($dummy+1)); 314ac57ed83Smrg $xauth -q -f "$xserverauthfile" << EOF 315a73027baSmrgadd :$dummy . $authcookie 316a73027baSmrgEOF 317a73027baSmrg fi 318a73027baSmrg done 319a73027baSmrgfi 320a73027baSmrg 321ac57ed83Smrgcase "$(uname -s)" in 322ac57ed83SmrgCYGWIN_NT*|Darwin) 323ac57ed83Smrg eval $xinit \"$client\" $clientargs -- \"$server\" $display $serverargs 324ac57ed83Smrg ;; 325ac57ed83Smrg*) 326ac57ed83Smrg $xinit "$client" $clientargs -- "$server" $display $serverargs 327ac57ed83Smrg ;; 328ac57ed83Smrgesac 329bf4a254eSmrgretval=$? 330a73027baSmrg 331ac57ed83Smrgif [ "$enable_xauth" = 1 ] ; then 332ac57ed83Smrg if [ "$removelist" != "" ]; then 333ac57ed83Smrg $xauth remove $removelist 334a73027baSmrg fi 335ac57ed83Smrg if [ "$xserverauthfile" != "" ]; then 33672e81212Smrg rm -f "$xserverauthfile" 337a73027baSmrg fi 338a73027baSmrgfi 339a73027baSmrg 340ac57ed83SmrgXCOMM various machines need special cleaning up 341ac57ed83Smrgif [ "$(uname -s)" = "Linux" ]; then 342ac57ed83Smrg if command -v deallocvt > /dev/null 2>&1; then 343ac57ed83Smrg deallocvt 344ac57ed83Smrg fi 345a73027baSmrgfi 346a73027baSmrg 347ac57ed83Smrgif [ "$(uname -s)" = "SunOS" ]; then 348ac57ed83Smrg kbd_mode -a 349ac57ed83Smrgfi 350bf4a254eSmrg 351bf4a254eSmrgexit $retval 352