blob: b0b5dade964b1d1252c145b52a5771a4da8cc311 [file] [log] [blame]
#!/bin/sh
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This script starts brltty in a minijail sandbox.
if [ $# -ne 0 ]; then
echo "ERROR: $0 takes no arguments"
exit 1
fi
BRLTTY_RUNDIR=/run/brltty
BRLAPI_SOCKETDIR="${BRLTTY_RUNDIR}"/BrlAPI
# The number (0) must be kept in sync with the Host api parameter in
# brltty.conf.
BRLAPI_SOCKETFILE="${BRLAPI_SOCKETDIR}/0"
log() {
logger -t brltty_udev "$@"
}
# Kill any stale brltty processes that might be holding on to the
# BrlAPI socket. We try hard, because failure to free up the socket will lock
# the braille user out from the machine!
kill_stale_brltty() {
local SIGTERM_MAX_TRIES=5
if fuser -s -k -TERM "${BRLAPI_SOCKETFILE}"; then
log "Waiting for stale brltty process to terminate"
local i=0
while [ ${i} -lt ${SIGTERM_MAX_TRIES} ]; do
sleep .1
if ! fuser -s -k -TERM "${BRLAPI_SOCKETFILE}"; then
return
fi
: $(( i += 1 ))
done
log "Sending SIGKILL to stale brltty process"
fuser -s -k -KILL "${BRLAPI_SOCKET_FILE}"
fi
}
kill_stale_brltty
# Ensure that the directories exist and have the right permissions.
# NOTE: Chrome is observing ${BRLAPI_SOCKETDIR} for changes.
# It is important to only remove world-readability *after* setting the
# group ownership so that the browser doesn't lose read access.
# This is a race that would cause chrome to stop observing the directory
# and therefore not get notified when a braille display is connected.
mkdir -p -m 0755 "${BRLTTY_RUNDIR}" "${BRLAPI_SOCKETDIR}"
chown -R brltty:brltty "${BRLTTY_RUNDIR}" "${BRLAPI_SOCKETDIR}"
chmod 750 "${BRLTTY_RUNDIR}" "${BRLAPI_SOCKETDIR}"
# Files created by the daemon shouldn't be accessible by users not in the
# brltty group.
umask 0007
log "Starting brltty, device: ${BRLTTY_BRAILLE_DEVICE}, " \
"driver: ${BRLTTY_BRAILLE_DRIVER}"
# -d: device for accessing braille.
if [ -n "${ADDRESS}" ]; then
set -- "$@" -d "bluetooth:${ADDRESS}"
fi
# Start brltty in the jail.
# The options used below are:
# - -q: No startup announcement of brltty's version on the braille display.
# - -E: Get some arguments (driver, device, etc) from the environment.
# - -n: makes Brltty run without forking (keeping this job started/stoppable).
exec /sbin/minijail0 -u brltty -g brltty -G -- /bin/brltty -q -E -n "$@"