71 lines
1.6 KiB
Bash
Executable File
71 lines
1.6 KiB
Bash
Executable File
#!/bin/sh --
|
|
# sx - start an xserver
|
|
|
|
# requires fgconsole stty timeout xauth Xorg
|
|
|
|
# I'm willing to take advantage of errexit for this script as roughly 85% of
|
|
# the error checking would take the form of:
|
|
# if ! command; then
|
|
# exit
|
|
# fi
|
|
set -o errexit
|
|
|
|
cleanup() {
|
|
# Return to conventional flow control here as we need to continue
|
|
# regardless of failure.
|
|
set +o errexit
|
|
|
|
if [ "$1" ] && [ "$(ps -o comm= "$1")" = Xorg ]; then
|
|
kill "$1"
|
|
|
|
# Send SIGKILL after 10 seconds if the xserver is taking too long to
|
|
# terminate.
|
|
timeout 10 tail --pid="$1" -f /dev/null
|
|
|
|
case $? in
|
|
124) kill -s KILL "$1"
|
|
esac
|
|
|
|
fi
|
|
|
|
if ! stty "$stty"; then
|
|
stty sane
|
|
fi
|
|
|
|
xauth remove :"$tty"
|
|
exit
|
|
}
|
|
|
|
stty=$(stty -g)
|
|
tty=$(ps -o tty= $$)
|
|
|
|
case $tty in
|
|
tty*) tty=${tty#tty}
|
|
esac
|
|
|
|
cfgdir=${XDG_CONFIG_HOME:-$HOME/.config}/sx
|
|
XAUTHORITY=${XAUTHORITY:-$cfgdir/xauthority}
|
|
|
|
mkdir -p "$cfgdir"
|
|
|
|
touch "$XAUTHORITY"
|
|
export XAUTHORITY
|
|
|
|
trap 'cleanup "$pid"' EXIT
|
|
|
|
xauth add :"$tty" MIT-MAGIC-COOKIE-1 "$(mcookie)"
|
|
|
|
# Xorg will check if SIGUSR1 was set to SIG_IGN in its environment and issue
|
|
# its own SIGUSR1 back to the parent process when it is ready to accept
|
|
# connections. See Xserver(1).
|
|
|
|
# We take advantage of this feature to launch our client directly from the
|
|
# SIGUSR1 handler and avoid the need to poll for readiness.
|
|
trap 'DISPLAY=:$tty "${@:-"$cfgdir"/sxrc}"' USR1
|
|
(
|
|
trap '' USR1
|
|
exec /usr/lib/xorg-server/Xorg :"$tty" -keeptty vt"$tty" -noreset -auth "$XAUTHORITY"
|
|
) & pid=$!
|
|
|
|
wait
|