| #!/bin/bash -p |
| ############################################################################### |
| # BRLTTY - A background process providing access to the console screen (when in |
| # text mode) for a blind person using a refreshable braille display. |
| # |
| # Copyright (C) 1995-2023 by The BRLTTY Developers. |
| # |
| # BRLTTY comes with ABSOLUTELY NO WARRANTY. |
| # |
| # This is free software, placed under the terms of the |
| # GNU Lesser General Public License, as published by the Free Software |
| # Foundation; either version 2.1 of the License, or (at your option) any |
| # later version. Please see the file LICENSE-LGPL for details. |
| # |
| # Web Page: http://brltty.app/ |
| # |
| # This software is maintained by Dave Mielke <dave@mielke.cc>. |
| ############################################################################### |
| |
| set -e |
| readonly defaultPath="/etc/brltty.conf" |
| |
| readonly programPrefix="brltty-" |
| programName="${0##*/}" |
| [ "${programName#${programPrefix}}" = "${programName}" ] && programName="${programPrefix}${programName}" |
| readonly programName |
| |
| programMessage() { |
| local message="${1}" |
| local level="${2}" |
| |
| logger -p "daemon.${level:-info}" -t "${programName}" -- "${1}" && |
| [ ! -t 2 ] || |
| echo >&2 "${programName}: ${message}" |
| } |
| |
| errorMessage() { |
| local message="${1}" |
| local code="${2}" |
| |
| programMessage "${message}" err |
| exit "${code:-1}" |
| } |
| |
| syntaxError() { |
| local message="${1}" |
| |
| errorMessage "${message}" 2 |
| } |
| |
| semanticError() { |
| local message="${1}" |
| |
| errorMessage "${message}" 3 |
| } |
| |
| instancePath="${BRLTTY_SYSTEMD_INSTANCE:-${defaultPath}}" |
| [ "${instancePath#/}" = "${instancePath}" ] && instancePath="/${instancePath}" |
| readonly instancePath |
| |
| if [ "${instancePath#/sys/}" != "${instancePath}" ] |
| then |
| isDeviceInstance=true |
| udevOption="path" |
| elif [ -c "${instancePath}" ] |
| then |
| isDeviceInstance=true |
| udevOption="name" |
| elif [ -f "${instancePath}" ] |
| then |
| isDeviceInstance=false |
| elif [ -e "${instancePath}" ] |
| then |
| semanticError "unsupported instance path: ${instancePath}" |
| else |
| semanticError "instance path not found: ${instancePath}" |
| fi |
| |
| if "${isDeviceInstance}" |
| then |
| isUdevManaged=false |
| |
| while read line |
| do |
| if [[ "${line}" =~ ^'N: ' ]] |
| then |
| isUdevManaged=true |
| elif [[ "${line}" =~ ^'E: '([^ =]+)=(.*) ]] |
| then |
| name="${BASH_REMATCH[1]}" |
| value="${BASH_REMATCH[2]}" |
| |
| [[ "${name}" =~ ^'BRLTTY_' ]] || continue |
| [ -z "${!name}" ] || continue |
| |
| export "${name}=${value}" |
| fi |
| done < <((udevadm info --"${udevOption}"="${instancePath}" --export 2>/dev/null)) |
| |
| "${isUdevManaged}" || semanticError "instance path not managed by udev: ${instancePath}" |
| else |
| export BRLTTY_CONFIGURATION_FILE="${instancePath}" |
| fi |
| |
| set -- "${BRLTTY_EXECUTABLE_PATH:-brltty}" -E ${BRLTTY_EXECUTABLE_ARGUMENTS} "${@}" |
| programMessage "executing command: ${*}" info |
| exec "${@}" |
| exit "${?}" |