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