-mt -f ${TAPE_FILE} rewind
-rm ${VOLNO_FILE}
-
-set ${BACKUP_DIRS}
-while [ $# -ne 0 ] ; do
- host=`echo ${1} | sed 's/:.*$//'`
- fs=`echo ${1} | sed 's/^.*://'`
- date=`date`
- fsname=`echo $1 | sed 's/\//:/g'`
-
- TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
- TAR_PART3="--label='Full backup of ${fs} on ${host} at ${date}' -C ${fs} ."
-
- echo Backing up ${1} at ${date} | tee -a ${LOGFILE}
-
- # Actually back things up.
-
- if [ ${HOST} != ${host} ] ; then
- # Removed 2>&1/dev/null cruft since that's incorrect sh syntax.
- rsh ${host} mkdir /etc/tar-backup > /dev/null 2>&1
- rsh ${host} rm -f /etc/tar-backup/temp.level-0
- rsh ${host} ${TAR_PART1} -f ${HOST}:${TAPE_FILE} ${TAR_PART2} ${TAR_PART3} 2>&1 | tee -a ${LOGFILE}
- else
- mkdir /etc/tar-backup > /dev/null 2>&1
- rm -f /etc/tar-backup/temp.level-0
-# Using `sh -c exec' causes nested quoting and shell substitution
-# to be handled here in the same way rsh handles it.
- sh -c "exec ${TAR_PART1} -f ${TAPE_FILE} ${TAR_PART2} ${TAR_PART3}" 2>&1 | tee -a ${LOGFILE}
- fi
- # This doesn't presently work, of course, because $? is set to the exit
- # status of the last thing in the pipeline of the previous command,
- # namely `tee'. We really want the exit status of the sh command
- # running tar, but getting this seems to be nontrivial. --friedman
- if [ $? -ne 0 ] ; then
- echo Backup of ${1} failed. | tee -a ${LOGFILE}
+# Most everything below here is run in a subshell for which all output is
+# piped through `tee' to the logfile. Doing this, instead of having
+# multiple pipelines all over the place, is cleaner and allows access to
+# the exit value from various commands more easily.
+(
+ # Caveat: Some version of `mt' require `-t', not `-f'.
+ mt -f "${TAPE_FILE}" rewind
+ rm -f "${VOLNO_FILE}"
+
+ set - ${BACKUP_DIRS}
+ while [ $# -ne 0 ] ; do
+ date="`date`"
+ remotehost="`echo \"${1}\" | sed -e 's/:.*$//'`"
+ fs="`echo \"${1}\" | sed -e 's/^.*://'`"
+ fsname="`echo \"${1}\" | sed -e 's/\//:/g'`"
+
+ # This filename must be absolute; it is opened on the machine that runs tar.
+ TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
+ TAR_PART3="--label='Full backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
+
+ echo "Backing up ${1} at ${date}"
+
+ # Actually back things up.
+
+ if [ "z${localhost}" != "z${remotehost}" ] ; then
+ rsh "${remotehost}" mkdir /etc/tar-backup > /dev/null 2>&1
+ rsh "${remotehost}" rm -f /etc/tar-backup/temp.level-0
+ rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
+ else
+ mkdir /etc/tar-backup > /dev/null 2>&1
+ rm -f /etc/tar-backup/temp.level-0
+ # Using `sh -c exec' causes nested quoting and shell substitution
+ # to be handled here in the same way rsh handles it.
+ sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3}"
+ fi
+
+ # `rsh' doesn't exit with the exit status of the remote command. What
+ # stupid lossage. TODO: think of a reliable workaround.
+ if [ $? -ne 0 ] ; then
+ echo "Backup of ${1} failed." 1>&2
+ # I'm assuming that the tar will have written an empty
+ # file to the tape, otherwise I should do a cat here.
+ else
+ if [ "z${localhost}" != "z${remotehost}" ] ; then
+ rsh "${remotehost}" mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
+ else
+ mv -f /etc/tar-backup/temp.level-0 "/etc/tar-backup/${fsname}.level-0"
+ fi
+ fi
+ ${TAPE_STATUS}
+ sleep 60
+ shift
+ done
+
+ # Dump any individual files requested.
+
+ if [ "x${BACKUP_FILES}" != "x" ] ; then
+ date="`date`"
+
+ TAR_PART2="--listed=/etc/tar-backup/temp.level-0"
+ TAR_PART3="--label='Full backup of miscellaneous files at ${date}'"
+
+ mkdir /etc/tar-backup > /dev/null 2>&1
+ rm -f /etc/tar-backup/temp.level-0
+
+ echo "Backing up miscellaneous files at ${date}"
+
+ # Using `sh -c exec' causes nested quoting and shell substitution
+ # to be handled here in the same way rsh handles it.
+ sh -c "exec ${TAR_PART1} -f \"${TAPE_FILE}\" ${TAR_PART2} ${TAR_PART3} ${BACKUP_FILES}"
+
+ # `rsh' doesn't exit with the exit status of the remote command. What
+ # lossage. TODO: think of a reliable workaround.
+ if [ $? -ne 0 ] ; then
+ echo "Backup of miscellaneous files failed."