blob: 2a99c338491a13c4d1434a622bfda1352e332f03 [file] [log] [blame] [edit]
#!/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