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