run: make launcher ownership explicit
This commit is contained in:
115
run.sh
115
run.sh
@@ -1,6 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
cd "$(dirname "$0")" || exit 1
|
||||
|
||||
if test "$#" -eq 0; then
|
||||
set --
|
||||
@@ -20,8 +20,115 @@ if test "$#" -eq 0; then
|
||||
fi
|
||||
fi
|
||||
|
||||
pkill strans
|
||||
sleep 1
|
||||
if ! test -x ./strans; then
|
||||
echo "run.sh: ./strans is not executable; run make first" >&2
|
||||
exit 1
|
||||
fi
|
||||
if test -n "${DISPLAY-}" && ! test -x xim/strans-xim; then
|
||||
echo "run.sh: xim/strans-xim is not executable; run make first" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
case ${XDG_RUNTIME_DIR-} in
|
||||
/) ipc=/strans.sock ;;
|
||||
/*/) ipc=${XDG_RUNTIME_DIR}strans.sock ;;
|
||||
/*) ipc=${XDG_RUNTIME_DIR}/strans.sock ;;
|
||||
*) ipc=/tmp/strans.$(id -u) ;;
|
||||
esac
|
||||
if test -n "${XDG_CONFIG_HOME-}"; then
|
||||
busdir=$XDG_CONFIG_HOME/ibus/bus
|
||||
elif test "${HOME+x}" = x; then
|
||||
busdir=$HOME/.config/ibus/bus
|
||||
else
|
||||
echo "run.sh: HOME or XDG_CONFIG_HOME is required for IBus discovery" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
strans_pid=
|
||||
xim_pid=
|
||||
|
||||
cleanup()
|
||||
{
|
||||
status=$?
|
||||
trap - 0 1 2 15
|
||||
if test -n "$xim_pid"; then
|
||||
kill "$xim_pid" 2>/dev/null || :
|
||||
wait "$xim_pid" 2>/dev/null || :
|
||||
xim_pid=
|
||||
fi
|
||||
if test -n "$strans_pid"; then
|
||||
kill "$strans_pid" 2>/dev/null || :
|
||||
wait "$strans_pid" 2>/dev/null || :
|
||||
strans_pid=
|
||||
fi
|
||||
exit "$status"
|
||||
}
|
||||
|
||||
ibusready()
|
||||
{
|
||||
for address in "$busdir"/*; do
|
||||
test -f "$address" || continue
|
||||
foundpid=
|
||||
foundaddress=
|
||||
while IFS= read -r line; do
|
||||
case $line in
|
||||
IBUS_DAEMON_PID="$strans_pid") foundpid=1 ;;
|
||||
IBUS_ADDRESS=unix:abstract=strans-"$strans_pid",*) foundaddress=1 ;;
|
||||
esac
|
||||
done <"$address"
|
||||
if test -n "$foundpid" && test -n "$foundaddress"; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
trap cleanup 0
|
||||
trap 'exit 129' 1
|
||||
trap 'exit 130' 2
|
||||
trap 'exit 143' 15
|
||||
|
||||
./strans map "$@" &
|
||||
sleep 1
|
||||
strans_pid=$!
|
||||
|
||||
attempt=0
|
||||
while test "$attempt" -lt 10; do
|
||||
if test -S "$ipc" && ibusready; then
|
||||
break
|
||||
fi
|
||||
if ! kill -0 "$strans_pid" 2>/dev/null; then
|
||||
wait "$strans_pid"
|
||||
status=$?
|
||||
strans_pid=
|
||||
if test "$status" -eq 0; then
|
||||
status=1
|
||||
fi
|
||||
echo "run.sh: daemon exited before publishing IPC and IBus endpoints" >&2
|
||||
exit "$status"
|
||||
fi
|
||||
attempt=$((attempt + 1))
|
||||
if test "$attempt" -lt 10; then
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
if test "$attempt" -eq 10; then
|
||||
echo "run.sh: daemon did not publish IPC and IBus endpoints within 10 seconds" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "run.sh: daemon $strans_pid is ready"
|
||||
if test -z "${DISPLAY-}"; then
|
||||
echo "run.sh: DISPLAY is unset; XIM will not be started"
|
||||
wait "$strans_pid"
|
||||
status=$?
|
||||
strans_pid=
|
||||
exit "$status"
|
||||
fi
|
||||
|
||||
xim/strans-xim &
|
||||
xim_pid=$!
|
||||
echo "run.sh: started XIM $xim_pid; press Ctrl-C to stop both processes"
|
||||
wait "$xim_pid"
|
||||
status=$?
|
||||
xim_pid=
|
||||
exit "$status"
|
||||
|
||||
Reference in New Issue
Block a user