#!/bin/sh
###############################################################################
# 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>.
###############################################################################

# Convert the boot parameter to configuration file directives.
# If /proc is mounted then use the brltty= boot parameter in /proc/cmdline.
# If /proc is not mounted then use the brltty environment variable.
# Invoke with -h for usage information.

programName="${0##*/}"
programMessage()
{
   echo 2>&1 "${programName}: ${1}"
}
syntaxError()
{
   programMessage "${1}"
   exit 2
}
internalError()
{
   programMessage "${1}"
   exit 3
}

configurationFile=""
requestedAction=create
deviceTranslation=none
requestedParameter=""
OPTIND=1
while getopts ":f:cundop:h" option
do
   case "${option}"
   in
      f) configurationFile="${OPTARG}";;
      c) requestedAction=create;;
      u) requestedAction=update;;
      n) deviceTranslation=none;;
      d) deviceTranslation=devfs;;
      o) deviceTranslation=old;;
      p) requestedParameter="${OPTARG}";;
      h)
         cat <<EOF
Usage: ${programName} [option ...]
-f file  The configuration file to create/update.
-c       Create the configuration file (write to stdout if no -f).
-u       Update the configuration file (copying from stdin to stdout if no -f).
-n       Do not translate device paths.
-d       Do old-style to devfs device path translation.
-o       Do devfs to old-style device path translation.
-p [driver][,[device][,[table]]]
         Explicitly specify the boot parameter.
-h       Display this usage summary.
EOF
         exit 0
         ;;
     \?) syntaxError "unknown option: -${OPTARG}";;
      :) syntaxError "missing value: -${OPTARG}";;
      *) internalError "unimplemented option: -${option}";;
   esac
done
shift "`expr $OPTIND - 1`"
[ "${#}" -eq 0 ] || syntaxError "too many parameters."

case "${requestedAction}"
in
   create)
      putConfigurationLine()
      {
         echo "${1}" || exit 4
      }
      startConfigurationFile()
      {
         [ -n "${configurationFile}" ] && exec >"${configurationFile}"
         putConfigurationLine "`makeHeaderLine Created`"
         putConfigurationLine "`makeParameterLine`"
         putConfigurationLine ""
      }
      putConfigurationDirective()
      {
         putConfigurationLine "${1} ${2}"
      }
      finalizeConfigurationFile()
      {
         :
      }
      ;;
   update)
      putSedCommand()
      {
         sedScript="${sedScript}
${1}"
      }
      startConfigurationFile()
      {
         if [ -n "${configurationFile}" ]
         then
            [ -e "${configurationFile}" ] || syntaxError "file not found: ${configurationFile}"
            [ -f "${configurationFile}" ] || syntaxError "not a file: ${configurationFile}"
            [ -r "${configurationFile}" ] || syntaxError "file not readable: ${configurationFile}"
            [ -w "${configurationFile}" ] || syntaxError "file not writable: ${configurationFile}"
            outputFile="${configurationFile}.new"
            exec <"${configurationFile}" >"${outputFile}"
         fi
         sedScript=""
         putSedCommand "\$a\\
\\
`makeHeaderLine Updated`\\
`makeParameterLine`\\
"
      }
      putConfigurationDirective()
      {
         value="`echo "${2}" | sed -e 's%\\([/\\]\\)%\\\\\\1%g'`"
         putSedCommand "/^[[:space:]]*${1}[[:space:]]/s/^/#/"
         putSedCommand "\$a${1} ${value}"
      }
      finalizeConfigurationFile()
      {
         sed -e "${sedScript}"
         [ -n "${outputFile}" ] && mv -f "${outputFile}" "${configurationFile}"
      }
      ;;
   *) internalError "unimplemented action: ${requestedAction}";;
esac

translateDevice_none()
{
   :
}
translateDevice_devfs()
{
   minor="${device#ttyS}"
   if [ "${minor}" != "${device}" ]
   then
      device="tts/${minor}"
      return 0
   fi
   minor="${device#lp}"
   if [ "${minor}" != "${device}" ]
   then
      device="printers/${minor}"
      return 0
   fi
   programMessage "unsupported old-style device: ${device}"
}
translateDevice_old()
{
   major="${device%%/*}" 
   if [ "${major}" != "${device}" ]
   then
      minor="${device#*/}"
      case "${major}"
      in
         tts) devfs="ttyS${minor}";;
         printers) devfs="lp${minor}";;
      esac
   fi
   if [ -n "${devfs}" ]
   then
      device="${devfs}"
   else
      programMessage "unsupported devfs device: ${device}"
   fi
}

makeHeaderLine()
{
   echo "# ${1} by brltty-bp2cf`date +' on %Y-%m-%d at %H:%M:%S %Z (UTC%z)'`."
}
makeParameterLine()
{
   echo "# Boot Parameter:${bootParameter}"
}
putConfigurationFile()
{
   startConfigurationFile
   [ -n "${brailleDriver}" ] && putConfigurationDirective "braille-driver" "${brailleDriver}"
   [ -n "${brailleDevice}" ] && {
      device="`echo "${brailleDevice}" | sed -e 's%//*%/%g' -e 's%^/dev/%%'`"
      if [ "${device#/}" = "${device}" ]
      then
         translateDevice_${deviceTranslation}
      fi
      putConfigurationDirective "braille-device" "${device}"
   }
   [ -n "${textTable}" ] && putConfigurationDirective "text-table" "${textTable}"
   finalizeConfigurationFile
}
parseBootParameter()
{
   bootParameter="${bootParameter} ${1}"
   number=1
   while [ "${number}" -le 3 ]
   do
      cut="cut -d, -f${number}"
      [ "${number}" -gt 1 ] && cut="${cut} -s"
      operand="`echo ${1} | ${cut}`"
      if [ -n "${operand}" ]
      then
         case "${number}"
         in
            1) brailleDriver="${operand}";;
            2) brailleDevice="${operand}";;
            3) textTable="${operand}";;
         esac
      fi
      number="`expr ${number} + 1`"
   done
}
putBootParameter()
{
   parseBootParameter "${1}"
   putConfigurationFile
}
parseBootCommand()
{
   found=false
   while [ "${#}" -gt 0 ]
   do
      case "${1}"
      in
         "brltty="*)
            found=true
            parseBootParameter "${1#*=}"
            ;;
      esac
      shift
   done
   "${found}" && putConfigurationFile
}

brailleDriver=""
brailleDevice=""
textTable=""
bootCommandFile="/proc/cmdline"
if [ -n "${requestedParameter}" ]
then
   putBootParameter "${requestedParameter}"
elif [ -f "${bootCommandFile}" ]
then
   parseBootCommand `cat "${bootCommandFile}"`
elif [ -n "${brltty}" ]
then
   putBootParameter "${brltty}"
fi
exit 0
