| #!/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>. | |
| ############################################################################### | |
| umask 077 | |
| programName="`echo "${0}" | sed -e 's%^.*/%%'`" | |
| programMessage() { | |
| echo >&2 "${programName}: ${1}" | |
| } | |
| syntaxError() { | |
| programMessage "${1}" | |
| exit 2 | |
| } | |
| defaultMode="0755" | |
| defaultStripCommand="strip" | |
| copyCommand="cp" | |
| directoryCommand="mkdir -p" | |
| groupCommand="chgrp" | |
| modeCommand="chmod" | |
| ownerCommand="chown" | |
| stripCommand="${defaultStripCommand}" | |
| createDirectories=false | |
| newGroup="" | |
| newMode="${defaultMode}" | |
| newOwner="" | |
| showActions=false | |
| showUsage=false | |
| stripSymbols=false | |
| while [ "${#}" -gt 0 ] | |
| do | |
| option="${1}" | |
| operand="" | |
| case "${option}" | |
| in | |
| -c) ;; | |
| -d|--directory) createDirectories=true;; | |
| -g|--group) operand=newGroup;; | |
| -h|--help) showUsage=true;; | |
| -m|--mode) operand=newMode;; | |
| -o|--owner) operand=newOwner;; | |
| -s|--strip) stripSymbols=true;; | |
| --strip-program) operand=stripCommand;; | |
| -v|--verbose) showActions=true;; | |
| -*) syntaxError "unknown option: ${option}";; | |
| *) break;; | |
| esac | |
| shift | |
| [ -z "${operand}" ] && continue | |
| [ "${#}" -eq 0 ] && syntaxError "missing operand: ${option}" | |
| eval "${operand}"'="${1}"' | |
| shift | |
| done | |
| "${showUsage}" && { | |
| cat <<END_OF_USAGE | |
| Usage: | |
| ${programName} [-option ...] source destination | |
| ${programName} [-option ...] source ... destination-directory | |
| ${programName} -d [-option ...] new-directory ... | |
| Options: | |
| -c ignored (for backward compatibility) | |
| -d|--directory create all components of specified directories | |
| -g|--group group set owning group | |
| -h|--help display usage summary (this text), and then exit | |
| -m|--mode mode set permission mode (default is ${defaultMode}) | |
| -o|--owner owner set owning user | |
| -s|--strip strip symbols from executables | |
| --strip-program set symbol stripping command (default is ${defaultStripCommand}) | |
| -v|--verbose re[prt each successful action | |
| END_OF_USAGE | |
| exit 0 | |
| } | |
| changeAttributes=' | |
| [ "${newMode}" != "" ] && { | |
| ${modeCommand} "${newMode}" "${path}" || exit 3 | |
| "${showActions}" && programMessage "mode changed: ${path}" | |
| } | |
| [ "${newGroup}" != "" ] && { | |
| ${groupCommand} "${newGroup}" "${path}" || exit 3 | |
| "${showActions}" && programMessage "group changed: ${path}" | |
| } | |
| [ "${newOwner}" != "" ] && { | |
| ${ownerCommand} "${newOwner}" "${path}" || exit 3 | |
| "${showActions}" && programMessage "owner changed: ${path}" | |
| } | |
| ' | |
| "${createDirectories}" && { | |
| "${stripSymbols}" && syntaxError "cannot strip a directory." | |
| [ "${#}" -eq 0 ] && syntaxError "directory not specified." | |
| for destination | |
| do | |
| [ "${destination}" = "" ] && { | |
| programMessage "null directory." | |
| continue | |
| } | |
| directory="" | |
| paths="" | |
| for component in `echo "${destination}" | sed -e 's%/% %g' -e 's%^ %/ %' -e 's% *$%%' -e 's% *% %g'` | |
| do | |
| directory="${directory}${component}" | |
| [ "${component}" = "/" ] || directory="${directory}/" | |
| [ -d "${directory}" ] || { | |
| ${directoryCommand} "${directory}" || exit 3 | |
| "${showActions}" && programMessage "directory created: ${directory}" | |
| paths="${directory} ${paths}" | |
| } | |
| done | |
| [ -n "${paths}" ] && { | |
| for path in $paths | |
| do | |
| eval "${changeAttributes}" | |
| done | |
| } | |
| done | |
| exit 0 | |
| } | |
| [ "${#}" -eq 0 ] && syntaxError "source not specified." | |
| [ "${#}" -eq 1 ] && syntaxError "destination not specified." | |
| count="`expr "${#}" - 1`" | |
| destination="`( shift "${count}"; echo "${1}" )`" | |
| if [ -d "${destination}" ] | |
| then | |
| toDirectory=true | |
| else | |
| [ "${#}" -eq 2 ] || syntaxError "more than one source - destination not a directory: ${destination}" | |
| toDirectory=false | |
| fi | |
| while [ "${#}" -gt 1 ] | |
| do | |
| source="${1}" | |
| shift | |
| if [ -f "${source}" ] | |
| then | |
| type=file | |
| else | |
| syntaxError "source not a file: ${source}" | |
| fi | |
| path="${destination}" | |
| "${toDirectory}" && path="${path}/`basename ${source}`" | |
| ${copyCommand} "${source}" "${path}" || exit 3 | |
| "${showActions}" && programMessage "${type} copied: ${source} -> ${path}" | |
| "${stripSymbols}" && { | |
| ${stripCommand} "${path}" || exit 3 | |
| "${showActions}" && programMessage "symbols stripped: ${path}" | |
| } | |
| eval "${changeAttributes}" | |
| done | |
| exit 0 |