| #!/usr/bin/env bash |
| ############################################################################### |
| # 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>. |
| ############################################################################### |
| |
| . "$(dirname "${0}")/brltty-prologue.sh" |
| |
| usageSummary="\ |
| Run a shell or terminal manager via the brltty-pty terminal emulator |
| and brltty using its Terminal Emulator screen driver. |
| |
| Syntax: ${programName} [shell] [-option ...] |
| |
| This script is especially useful on platforms that don't support a native screen driver. |
| This newer method may (should) be used in preference to the older method of |
| running brltty in conjunction with its provided patch to the screen program. |
| |
| All of the arguments to this script are interpreted as brltty options, |
| with the following exceptions: |
| * If the first argument is -h then this usage summary is displayed. |
| * If the first argument doesn't begin with - (i.e. it isn't an option) |
| then it's interpreted as the shell to run, and the rest of the arguments |
| are interpreted as brltty options. |
| |
| The shell may be specified via either its name or its path. It's also okay |
| to specify a terminal manager rather than a shell. For example: |
| * ${programName} screen |
| * ${programName} tmux |
| |
| If the shell isn't specified on the command line then, in decreasing |
| precedence, one of the following is used: |
| 1: If set, the \$BRLTTY_TERM_SHELL environment variable. |
| 2: If set, the \$SHELL environment variable. |
| 3: The default shell (sh). |
| |
| Brltty is run as root so that it can access the braille device. If its |
| set-user-id bit is set and/or if this script is already running as root |
| then it's run directly. If neither, it's run via sudo. In this case, you |
| may wish to consider configuring sudo so that it won't prompt for the |
| user's password since the braille device wouldn't be operational yet. |
| |
| If the copy of this script in its installed location is used then the |
| installed brltty is run. If, however, the copy in the top-level directory |
| of the source tree is used then brltty in the build tree (which needn't |
| be installed) is run. |
| |
| " |
| |
| shellCommand="" |
| |
| [ "${#}" -eq 0 ] || { |
| argument="${1}" |
| |
| [ "${argument}" = "-h" ] && { |
| echo -n "${usageSummary}" |
| exit 0 |
| } |
| |
| [ "${#argument}" -eq 0 ] || { |
| [ "${argument:0:1}" = "-" ] || { |
| shellCommand="${argument}" |
| shift 1 |
| } |
| } |
| } |
| |
| [ -t 0 ] || semanticError "standard input isn't a terminal" |
| [ -t 1 ] || semanticError "standard output isn't a terminal" |
| |
| findSiblingCommand brlttyPath brltty run-brltty || { |
| semanticError "brltty not found" |
| } |
| |
| [ -n "${shellCommand}" ] || shellCommand="${BRLTTY_TERM_SHELL}" |
| [ -n "${shellCommand}" ] || shellCommand="${SHELL}" |
| [ -n "${shellCommand}" ] || shellCommand="sh" |
| |
| findHostCommand shellPath "${shellCommand}" || { |
| semanticError "shell not found: ${shellCommand}" |
| } |
| |
| screenDriver="em" |
| screenParameters=() |
| |
| addScreenParameter() { |
| local name="${1}" |
| local value="${2}" |
| |
| screenParameters+=("-X${screenDriver}:${name}=${value}") |
| } |
| |
| currentUser="$(id -u)" |
| currentGroup="$(id -g)" |
| |
| addScreenParameter shell "${shellPath}" |
| addScreenParameter user "${currentUser}" |
| addScreenParameter group "${currentGroup}" |
| addScreenParameter directory "${PWD}" |
| addScreenParameter home "${HOME}" |
| |
| SUDO="sudo --bell --preserve-env --preserve-env=USER,LOGNAME --" |
| [ -u "${brlttyPath}" ] && SUDO="" |
| [ "${currentUser}" -eq 0 ] && SUDO="" |
| |
| exec ${SUDO} "${brlttyPath}" -n -z -x"${screenDriver}" "${screenParameters[@]}" "${@}" |
| exit "${?}" |