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