sx/sx

81 lines
1.9 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
error() {
# To expose printf's DSL we will need to use a positional argument for the
# format string.
# shellcheck disable=SC2059
printf -- "sx: $2" "${@:3}" >&2
exit "$1"
}
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
datadir=${XDG_DATA_HOME:-$HOME/.local/share}/sx
XAUTHORITY=${XAUTHORITY:-$cfgdir/xauthfile}
mkdir -p "$cfgdir" "$datadir"
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 \
-logfile "$datadir/$tty" -auth "$XAUTHORITY"
) & pid=$!
wait