-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'`
-
-# This filename must be absolute; it is opened on the machine that runs tar.
- TAR_PART2="--listed=/etc/tar-backup/temp.level-1"
- TAR_PART3="--label='level 1 backup of ${fs} on ${host} at ${date}' -C ${fs} ."
-
- echo Backing up ${1} at ${date} | tee -a ${LOGFILE}
- echo Last full dump on this filesystem: | tee -a ${LOGFILE}
-
- if [ ${HOST} != ${host} ] ; then
- rsh ${host} "ls -l /etc/tar-backup/${fsname}.level-0; \
- cp /etc/tar-backup/${fsname}.level-0 /etc/tar-backup/temp.level-1" \
- 2>&1 | tee -a ${LOGFILE}
- else
- ls -l /etc/tar-backup/${fsname}.level-0 2>&1 | tee -a ${LOGFILE}
- cp /etc/tar-backup/${fsname}.level-0 /etc/tar-backup/temp.level-1 2>&1 | tee -a ${LOGFILE}
- fi
-
- # Actually back things up.
-
- if [ ${HOST} != ${host} ] ; then
- rsh ${host} ${TAR_PART1} -f ${HOST}:${TAPE_FILE} ${TAR_PART2} ${TAR_PART3} 2>&1 | tee -a ${LOGFILE}
- else
-# 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-1"
+ TAR_PART3="--label='level 1 backup of ${fs} on ${remotehost} at ${date}' -C ${fs} ."
+
+ echo "Backing up ${1} at ${date}"
+ echo "Last full dump on this filesystem:"
+
+ if [ "z${remotehost}" != "z${localhost}" ] ; then
+ rsh "${remotehost}" "ls -l /etc/tar-backup/${fsname}.level-0; \
+ cp /etc/tar-backup/${fsname}.level-0 /etc/tar-backup/temp.level-1"
+ else
+ ls -l "/etc/tar-backup/${fsname}.level-0"
+ cp "/etc/tar-backup/${fsname}.level-0" /etc/tar-backup/temp.level-1
+ fi
+
+ # Actually back things up.
+
+ if [ "z${remotehost}" != "z${localhost}" ] ; then
+ rsh "${remotehost}" ${TAR_PART1} -f "${localhost}:${TAPE_FILE}" ${TAR_PART2} ${TAR_PART3}
+ else
+ # 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."
+ # 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-1 "/etc/tar-backup/${fsname}.level-1"
+ else
+ mv -f /etc/tar-backup/temp.level-1 "/etc/tar-backup/${fsname}.level-1"
+ 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-1"
+ TAR_PART3="--label='Incremental backup of miscellaneous files at ${date}'"
+
+ echo "Backing up miscellaneous files at ${date}"
+ echo "Last full dump of these files:"
+ ls -l /etc/tar-backup/misc.level-0
+
+ rm -f /etc/tar-backup/temp.level-1
+ cp /etc/tar-backup/misc.level-0 /etc/tar-backup/temp.level-1
+
+ # 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}"
+
+ if [ $? -ne 0 ] ; then
+ echo "Backup of miscellaneous files failed." 1>&2