introduce sx
This commit is contained in:
commit
161b8be6f5
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright 2017 Earnestly
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,9 @@
|
||||||
|
PREFIX ?= /usr/local
|
||||||
|
bindir ?= /bin
|
||||||
|
mandir ?= /share/man
|
||||||
|
|
||||||
|
install: sx sx.1
|
||||||
|
install -Dm0755 sx $(DESTDIR)$(PREFIX)$(bindir)/sx
|
||||||
|
install -Dm0644 sx.1 $(DESTDIR)$(PREFIX)$(mandir)/man1/sx.1
|
||||||
|
|
||||||
|
.PHONY: install
|
|
@ -0,0 +1,56 @@
|
||||||
|
sx <https://github.com/Earnestly/sx>
|
||||||
|
|
||||||
|
INTRODUCTION
|
||||||
|
|
||||||
|
sx is a simple alternative to both xinit(1) and startx(1).
|
||||||
|
|
||||||
|
It started life as a proof of concept while attempting to learn how both
|
||||||
|
xinit(1) and startx(1) worked.
|
||||||
|
|
||||||
|
It is not a direct replacement however as it provides a different, more
|
||||||
|
limited, interface.
|
||||||
|
|
||||||
|
Some of these differences are as follows:
|
||||||
|
|
||||||
|
* The Xorg server's command-line is hard coded and not exposed to the
|
||||||
|
user.
|
||||||
|
|
||||||
|
* The first DISPLAY is 1 instead of 0 contrary to what X(7) suggests.
|
||||||
|
|
||||||
|
* xauth entries are overwritten if the displayname is identical.
|
||||||
|
|
||||||
|
* Corresponding xauth entries are unconditionally removed when the Xorg
|
||||||
|
server is terminated.
|
||||||
|
|
||||||
|
* The Xorg server uses the -noreset flag.
|
||||||
|
|
||||||
|
* The Xorg server logs are written to $XDG_DATA_HOME/sx/$DISPLAY instead
|
||||||
|
of Xorg.$DISPLAY.log
|
||||||
|
|
||||||
|
* While XAUTHORITY is still honoured, $XDG_CONFIG_HOME/sx/xauthfile is
|
||||||
|
used instead of $HOME/.Xauthority
|
||||||
|
|
||||||
|
* Very little proxy error checking is used preferring instead to let each
|
||||||
|
tool used speak for itself.
|
||||||
|
|
||||||
|
* None of the typical /etc/X11/xinit infrastructure is directly used.
|
||||||
|
|
||||||
|
* Neither XINITRC is honoured nor .xinitrc used.
|
||||||
|
|
||||||
|
* The XDG_CONFIG_HOME/sx/sxrc file is used instead of .xinitrc and is
|
||||||
|
required to be executable.
|
||||||
|
|
||||||
|
For a rational on why this exists, the author invites the reader to look
|
||||||
|
over the source code for both xinit(1) and startx(1).
|
||||||
|
|
||||||
|
REQUIRES
|
||||||
|
|
||||||
|
Notable requirements are for GNU timeout and GNU tail which is used for the
|
||||||
|
--pid option. Beyond these the usual set of POSIX command-line tools along
|
||||||
|
with Xorg and xauth are required.
|
||||||
|
|
||||||
|
BUILD
|
||||||
|
|
||||||
|
As there's nothing to build, simply install using a prefered PREFIX.
|
||||||
|
|
||||||
|
make DESTDIR=staged PREFIX=/usr install
|
|
@ -0,0 +1,81 @@
|
||||||
|
#!/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 [ "$(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
|
||||||
|
|
||||||
|
xauth remove :"$tty"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! stty "$stty"; then
|
||||||
|
stty sane
|
||||||
|
fi
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
trap 'cleanup "$pid"' EXIT
|
||||||
|
|
||||||
|
touch "$XAUTHORITY"
|
||||||
|
export XAUTHORITY
|
||||||
|
|
||||||
|
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
|
|
@ -0,0 +1,58 @@
|
||||||
|
.TH sx 1 2017-05-12 sx
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
sx \- start an xserver
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B sx
|
||||||
|
.RI [ client ]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.B sx
|
||||||
|
can be used to replace both
|
||||||
|
.BR xinit (1)
|
||||||
|
and
|
||||||
|
.BR startx (1)
|
||||||
|
for starting an Xorg server. By default
|
||||||
|
.B sx
|
||||||
|
will attempt execute
|
||||||
|
.I sxrc
|
||||||
|
unless a
|
||||||
|
.I client
|
||||||
|
argument is provided.
|
||||||
|
|
||||||
|
.SH ENVIRONMENT
|
||||||
|
.TP
|
||||||
|
.B XAUTHORITY
|
||||||
|
This environment represents the file used to store authorisation entries used
|
||||||
|
to secure
|
||||||
|
.BR Xorg (1) .
|
||||||
|
If this environment is not set then
|
||||||
|
.B sx
|
||||||
|
will create and use
|
||||||
|
.IR \%$XDG_CONFIG_HOME/sx/xauthfile
|
||||||
|
instead.
|
||||||
|
|
||||||
|
.SH FILES
|
||||||
|
.TP
|
||||||
|
.BR $XDG_CONFIG_HOME/sx/sxrc " " "" ( $HOME/.config/sx/sxrc )
|
||||||
|
The default client started by
|
||||||
|
.BR sx .
|
||||||
|
This file must be executable.
|
||||||
|
.TP
|
||||||
|
.BR $XDG_DATA_HOME/sx " " "" ( $HOME/.local/share/sx )
|
||||||
|
This directory is used for storing the logs generated by
|
||||||
|
.BR Xorg (1) .
|
||||||
|
Each log is named numerically based on the
|
||||||
|
.B DISPLAY
|
||||||
|
environment.
|
||||||
|
|
||||||
|
.SH SOURCE
|
||||||
|
.UR https://github.com/Earnestly/sx
|
||||||
|
.UE
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR xinit (1),
|
||||||
|
.BR startx (1),
|
||||||
|
.BR Xserver (1),
|
||||||
|
.BR X (7)
|
Loading…
Reference in New Issue