Blame SOURCES/rear-bz1930662.patch

6f74ef
diff --git a/usr/share/rear/backup/NETFS/default/500_make_backup.sh b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
6f74ef
index 02c204c5..60c80b5f 100644
6f74ef
--- a/usr/share/rear/backup/NETFS/default/500_make_backup.sh
6f74ef
+++ b/usr/share/rear/backup/NETFS/default/500_make_backup.sh
6f74ef
@@ -16,6 +16,8 @@ function set_tar_features () {
6f74ef
     FEATURE_TAR_IS_SET=1
6f74ef
 }
6f74ef
 
6f74ef
+local backup_prog_rc
6f74ef
+
6f74ef
 local scheme=$( url_scheme $BACKUP_URL )
6f74ef
 local path=$( url_path $BACKUP_URL )
6f74ef
 local opath=$( backup_path $scheme $path )
6f74ef
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
6f74ef
index c560ec94..1692ba4c 100644
6f74ef
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
6f74ef
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/610_start_selinux.sh
6f74ef
@@ -1,5 +1,7 @@
6f74ef
 # Start SELinux if it was stopped - check presence of  $TMP_DIR/selinux.mode
6f74ef
 
6f74ef
+local backup_prog_rc
6f74ef
+
6f74ef
 [ -f $TMP_DIR/selinux.mode ] && {
6f74ef
 	touch "${TMP_DIR}/selinux.autorelabel"
6f74ef
 	cat $TMP_DIR/selinux.mode > $SELINUX_ENFORCE
6f74ef
@@ -13,19 +15,19 @@
6f74ef
 		ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
6f74ef
 		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
6f74ef
 		 "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
6f74ef
-		_rc=$?
6f74ef
-		if [ $_rc -ne 0 ]; then
6f74ef
-			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
6f74ef
+		backup_prog_rc=$?
6f74ef
+		if [ $backup_prog_rc -ne 0 ]; then
6f74ef
+			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
6f74ef
 			#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
6f74ef
 		fi
6f74ef
 		;;
6f74ef
 
6f74ef
 	(rsync)
6f74ef
-		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
6f74ef
+		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
6f74ef
 		 "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
6f74ef
-		_rc=$?
6f74ef
-		if [ $_rc -ne 0 ]; then
6f74ef
-			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
6f74ef
+		backup_prog_rc=$?
6f74ef
+		if [ $backup_prog_rc -ne 0 ]; then
6f74ef
+			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
6f74ef
 			#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
6f74ef
 		fi
6f74ef
 		;;
6f74ef
diff --git a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
6f74ef
index cae12e38..9a17d6bb 100644
6f74ef
--- a/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
6f74ef
+++ b/usr/share/rear/backup/RSYNC/GNU/Linux/620_force_autorelabel.sh
6f74ef
@@ -1,3 +1,5 @@
6f74ef
+local backup_prog_rc
6f74ef
+
6f74ef
 [ -f $TMP_DIR/force.autorelabel ] && {
6f74ef
 
6f74ef
 	> "${TMP_DIR}/selinux.autorelabel"
6f74ef
@@ -11,19 +13,19 @@
6f74ef
 		ssh $RSYNC_USER@$RSYNC_HOST "chmod $v 755 ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" 2>/dev/null
6f74ef
 		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" \
6f74ef
 		 "$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel" 2>/dev/null
6f74ef
-		_rc=$?
6f74ef
-		if [ $_rc -ne 0 ]; then
6f74ef
-			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
6f74ef
+		backup_prog_rc=$?
6f74ef
+		if [ $backup_prog_rc -ne 0 ]; then
6f74ef
+			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
6f74ef
 			#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
6f74ef
 		fi
6f74ef
 		;;
6f74ef
 
6f74ef
 	(rsync)
6f74ef
-		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" ${BACKUP_RSYNC_OPTIONS[@]} \
6f74ef
+		$BACKUP_PROG -a "${TMP_DIR}/selinux.autorelabel" "${BACKUP_RSYNC_OPTIONS[@]}" \
6f74ef
 		 "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup/.autorelabel"
6f74ef
-		_rc=$?
6f74ef
-		if [ $_rc -ne 0 ]; then
6f74ef
-			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$_rc]}]"
6f74ef
+		backup_prog_rc=$?
6f74ef
+		if [ $backup_prog_rc -ne 0 ]; then
6f74ef
+			LogPrint "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup [${rsync_err_msg[$backup_prog_rc]}]"
6f74ef
 			#StopIfError "Failed to create .autorelabel on ${RSYNC_PATH}/${RSYNC_PREFIX}/backup"
6f74ef
 		fi
6f74ef
 		;;
6f74ef
@@ -35,8 +37,7 @@
6f74ef
 		# probably using the BACKUP=NETFS workflow instead
6f74ef
 		if [ -d "${opath}" ]; then
6f74ef
 			if [ ! -f "${opath}/selinux.autorelabel" ]; then
6f74ef
-				> "${opath}/selinux.autorelabel"
6f74ef
-				StopIfError "Failed to create selinux.autorelabel on ${opath}"
6f74ef
+				> "${opath}/selinux.autorelabel" || Error "Failed to create selinux.autorelabel on ${opath}"
6f74ef
 			fi
6f74ef
 		fi
6f74ef
 		;;
6f74ef
diff --git a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
6f74ef
index 60330007..cedee9ce 100644
6f74ef
--- a/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
6f74ef
+++ b/usr/share/rear/backup/RSYNC/default/200_check_rsync_relative_option.sh
6f74ef
@@ -4,7 +4,7 @@
6f74ef
 # check for the --relative option in BACKUP_RSYNC_OPTIONS array
6f74ef
 # for the default values see the standard definition in conf/default.conf file
6f74ef
 
6f74ef
-if ! grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
6f74ef
+if ! grep -q relative <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
6f74ef
     BACKUP_RSYNC_OPTIONS+=( --relative )
6f74ef
     Log "Added option '--relative' to the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
6f74ef
 fi
6f74ef
diff --git a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
6f74ef
index 0d67d362..750a04ca 100644
6f74ef
--- a/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
6f74ef
+++ b/usr/share/rear/backup/RSYNC/default/500_make_rsync_backup.sh
6f74ef
@@ -2,6 +2,9 @@
6f74ef
 # This file is part of Relax-and-Recover, licensed under the GNU General
6f74ef
 # Public License. Refer to the included COPYING for full text of license.
6f74ef
 
6f74ef
+local backup_prog_rc
6f74ef
+local backup_log_message
6f74ef
+
6f74ef
 Log "Include list:"
6f74ef
 while read -r ; do
6f74ef
 	Log "  $REPLY"
6f74ef
@@ -11,9 +14,9 @@ while read -r ; do
6f74ef
 	Log " $REPLY"
6f74ef
 done < $TMP_DIR/backup-exclude.txt
6f74ef
 
6f74ef
-LogPrint "Creating $BACKUP_PROG archive on '${RSYNC_HOST}:${RSYNC_PATH}'"
6f74ef
+LogPrint "Creating $BACKUP_PROG backup on '${RSYNC_HOST}:${RSYNC_PATH}'"
6f74ef
 
6f74ef
-ProgressStart "Running archive operation"
6f74ef
+ProgressStart "Running backup operation"
6f74ef
 (
6f74ef
 	case "$(basename $BACKUP_PROG)" in
6f74ef
 
6f74ef
@@ -37,7 +40,7 @@ ProgressStart "Running archive operation"
6f74ef
 			;;
6f74ef
 
6f74ef
 		(*)
6f74ef
-			# no other backup programs foreseen then rsync so far
6f74ef
+			# no other backup programs foreseen than rsync so far
6f74ef
 			:
6f74ef
 			;;
6f74ef
 
6f74ef
@@ -96,7 +99,7 @@ case "$(basename $BACKUP_PROG)" in
6f74ef
 			;;
6f74ef
 			esac
6f74ef
 
6f74ef
-			ProgressInfo "Archived $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
6f74ef
+			ProgressInfo "Backed up $((size/1024/1024)) MiB [avg $((size/1024/(SECONDS-starttime))) KiB/sec]"
6f74ef
 		done
6f74ef
 		;;
6f74ef
 
6f74ef
@@ -113,24 +116,23 @@ ProgressStop
6f74ef
 wait $BackupPID
6f74ef
 
6f74ef
 transfertime="$((SECONDS-starttime))"
6f74ef
-_rc="$(cat $TMP_DIR/retval)"
6f74ef
+backup_prog_rc="$(cat $TMP_DIR/retval)"
6f74ef
 
6f74ef
 sleep 1
6f74ef
 # everyone should see this warning, even if not verbose
6f74ef
-test "$_rc" -gt 0 && VERBOSE=1 LogPrint "WARNING !
6f74ef
-There was an error (${rsync_err_msg[$_rc]}) during archive creation.
6f74ef
-Please check the archive and see '$RUNTIME_LOGFILE' for more information.
6f74ef
+test "$backup_prog_rc" -gt 0 && Error "
6f74ef
+There was an error (${rsync_err_msg[$backup_prog_rc]}) during backup creation.
6f74ef
+Please check the destination and see '$RUNTIME_LOGFILE' for more information.
6f74ef
 
6f74ef
-Since errors are often related to files that cannot be saved by
6f74ef
-$BACKUP_PROG, we will continue the $WORKFLOW process. However, you MUST
6f74ef
-verify the backup yourself before trusting it !
6f74ef
+If the error is related to files that cannot and should not be saved by
6f74ef
+$BACKUP_PROG, they should be excluded from the backup.
6f74ef
 
6f74ef
 "
6f74ef
 
6f74ef
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
6f74ef
-if [ $_rc -eq 0 -a "$_message" ] ; then
6f74ef
-	LogPrint "$_message in $transfertime seconds."
6f74ef
+backup_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log)"
6f74ef
+if [ $backup_prog_rc -eq 0 -a "$backup_log_message" ] ; then
6f74ef
+	LogPrint "$backup_log_message in $transfertime seconds."
6f74ef
 elif [ "$size" ]; then
6f74ef
-	LogPrint "Archived $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
6f74ef
+	LogPrint "Backed up $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
6f74ef
 fi
6f74ef
 
6f74ef
diff --git a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
6f74ef
index 01801a4e..b90d459b 100644
6f74ef
--- a/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
6f74ef
+++ b/usr/share/rear/backup/RSYNC/default/700_copy_backup_log.sh
6f74ef
@@ -1,6 +1,8 @@
6f74ef
 
6f74ef
 # copy the backup.log & rear.log file to remote destination with timestamp added
6f74ef
-Timestamp=$( date +%Y%m%d.%H%M )
6f74ef
+local timestamp
6f74ef
+
6f74ef
+timestamp=$( date +%Y%m%d.%H%M )
6f74ef
 
6f74ef
 # compress the log file first
6f74ef
 gzip "$TMP_DIR/$BACKUP_PROG_ARCHIVE.log" || Error "Failed to 'gzip $TMP_DIR/$BACKUP_PROG_ARCHIVE.log'"
6f74ef
@@ -10,15 +12,15 @@ case $RSYNC_PROTO in
6f74ef
         # FIXME: Add an explanatory comment why "2>/dev/null" is useful here
6f74ef
         # or remove it according to https://github.com/rear/rear/issues/1395
6f74ef
         $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" \
6f74ef
-        "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz" 2>/dev/null
6f74ef
+        "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz" 2>/dev/null
6f74ef
 
6f74ef
-        $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${Timestamp}.log" 2>/dev/null
6f74ef
+        $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/rear-${timestamp}.log" 2>/dev/null
6f74ef
         ;;
6f74ef
     (rsync)
6f74ef
-        $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" ${BACKUP_RSYNC_OPTIONS[@]} \
6f74ef
-        "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${Timestamp}.log.gz"
6f74ef
+        $BACKUP_PROG -a "${TMP_DIR}/${BACKUP_PROG_ARCHIVE}.log.gz" "${BACKUP_RSYNC_OPTIONS[@]}" \
6f74ef
+        "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/${BACKUP_PROG_ARCHIVE}-${timestamp}.log.gz"
6f74ef
 
6f74ef
-        $BACKUP_PROG -a "$RUNTIME_LOGFILE" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${Timestamp}.log"
6f74ef
+        $BACKUP_PROG -a "$RUNTIME_LOGFILE" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}//rear-${timestamp}.log"
6f74ef
         ;;
6f74ef
 esac
6f74ef
 
6f74ef
diff --git a/usr/share/rear/conf/default.conf b/usr/share/rear/conf/default.conf
6f74ef
index 455aa3ce..0c230f38 100644
6f74ef
--- a/usr/share/rear/conf/default.conf
6f74ef
+++ b/usr/share/rear/conf/default.conf
6f74ef
@@ -1106,7 +1106,8 @@ BACKUP_ONLY_EXCLUDE="no"
6f74ef
 MANUAL_INCLUDE=NO
6f74ef
 # Disable SELinux policy during backup with NETFS or RSYNC (default yes)
6f74ef
 BACKUP_SELINUX_DISABLE=1
6f74ef
-# Enable integrity check of the backup archive (only with BACKUP=NETFS and BACKUP_PROG=tar)
6f74ef
+# Enable integrity check of the backup archive (full check only with BACKUP=NETFS and BACKUP_PROG=tar,
6f74ef
+# with BACKUP=rsync or BACKUP_PROG=rsync it only checks whether rsync completed the restore successfully)
6f74ef
 BACKUP_INTEGRITY_CHECK=
6f74ef
 # Define BACKUP_TYPE.
6f74ef
 # By default BACKUP_TYPE is empty which means "rear mkbackup" will create a full backup.
6f74ef
diff --git a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
6f74ef
index 32ac391d..519febf5 100644
6f74ef
--- a/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
6f74ef
+++ b/usr/share/rear/output/RSYNC/default/200_make_prefix_dir.sh
6f74ef
@@ -2,21 +2,19 @@
6f74ef
 # RSYNC_PREFIX=$HOSTNAME as set in default.conf
6f74ef
 
6f74ef
 # create temporary local work-spaces to collect files (we already make the remote backup dir with the correct mode!!)
6f74ef
-mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2
6f74ef
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
6f74ef
-mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2
6f74ef
-StopIfError "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
6f74ef
+mkdir -p $v -m0750 "${TMP_DIR}/rsync/${RSYNC_PREFIX}" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}'"
6f74ef
+mkdir -p $v -m0755 "${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup" >&2 || Error "Could not mkdir '${TMP_DIR}/rsync/${RSYNC_PREFIX}/backup'"
6f74ef
 
6f74ef
 case $RSYNC_PROTO in
6f74ef
 
6f74ef
 	(ssh)
6f74ef
-		$BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1
6f74ef
-		StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
6f74ef
+		$BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}" >/dev/null 2>&1 \
6f74ef
+                    || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
6f74ef
 		;;
6f74ef
 
6f74ef
 	(rsync)
6f74ef
-		$BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null
6f74ef
-		StopIfError "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
6f74ef
+		$BACKUP_PROG -a $v -r "${TMP_DIR}/rsync/${RSYNC_PREFIX}" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/" >/dev/null \
6f74ef
+                    || Error "Could not create '${RSYNC_PATH}/${RSYNC_PREFIX}' on remote ${RSYNC_HOST}"
6f74ef
 		;;
6f74ef
 
6f74ef
 esac
6f74ef
diff --git a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
6f74ef
index c7b430d8..96b62da1 100644
6f74ef
--- a/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
6f74ef
+++ b/usr/share/rear/output/RSYNC/default/900_copy_result_files.sh
6f74ef
@@ -5,19 +5,19 @@ LogPrint "Copying resulting files to $OUTPUT_URL location"
6f74ef
 
6f74ef
 # if called as mkbackuponly then we just don't have any result files.
6f74ef
 if test "$RESULT_FILES" ; then
6f74ef
-    Log "Copying files '${RESULT_FILES[@]}' to $OUTPUT_URL location"
6f74ef
-    cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
6f74ef
-    StopIfError "Could not copy files to local rsync location"
6f74ef
+    Log "Copying files '${RESULT_FILES[*]}' to $OUTPUT_URL location"
6f74ef
+    cp $v "${RESULT_FILES[@]}" "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
6f74ef
+        || Error "Could not copy files to local rsync location"
6f74ef
 fi
6f74ef
 
6f74ef
-echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION"
6f74ef
-StopIfError "Could not create VERSION file on local rsync location"
6f74ef
+echo "$VERSION_INFO" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/VERSION" \
6f74ef
+    || Error "Could not create VERSION file on local rsync location"
6f74ef
 
6f74ef
-cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README"
6f74ef
-StopIfError "Could not copy usage file to local rsync location"
6f74ef
+cp $v $(get_template "RESULT_usage_$OUTPUT.txt") "${TMP_DIR}/rsync/${RSYNC_PREFIX}/README" \
6f74ef
+    || Error "Could not copy usage file to local rsync location"
6f74ef
 
6f74ef
-cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log"
6f74ef
-StopIfError "Could not copy $RUNTIME_LOGFILE to local rsync location"
6f74ef
+cat "$RUNTIME_LOGFILE" >"${TMP_DIR}/rsync/${RSYNC_PREFIX}/rear.log" \
6f74ef
+    || Error "Could not copy $RUNTIME_LOGFILE to local rsync location"
6f74ef
 
6f74ef
 case $RSYNC_PROTO in
6f74ef
 
6f74ef
@@ -25,20 +25,20 @@ case $RSYNC_PROTO in
6f74ef
     Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/"
6f74ef
     # FIXME: Add an explanatory comment why "2>/dev/null" is useful here
6f74ef
     # or remove it according to https://github.com/rear/rear/issues/1395
6f74ef
-    $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
6f74ef
-    StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
6f74ef
+    $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
6f74ef
+        || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
6f74ef
     ;;
6f74ef
 
6f74ef
     (rsync)
6f74ef
-    Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
6f74ef
+    Log "$BACKUP_PROG -a ${TMP_DIR}/rsync/${RSYNC_PREFIX}/ ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/"
6f74ef
     # FIXME: Add an explanatory comment why "2>/dev/null" is useful here
6f74ef
     # or remove it according to https://github.com/rear/rear/issues/1395
6f74ef
-    $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" ${BACKUP_RSYNC_OPTIONS[@]} "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null
6f74ef
-    StopIfError "Could not copy '${RESULT_FILES[@]}' to $OUTPUT_URL location"
6f74ef
+    $BACKUP_PROG -a "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" "${BACKUP_RSYNC_OPTIONS[@]}" "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/" 2>/dev/null \
6f74ef
+        || Error "Could not copy '${RESULT_FILES[*]}' to $OUTPUT_URL location"
6f74ef
     ;;
6f74ef
 
6f74ef
 esac
6f74ef
 
6f74ef
 # cleanup the temporary space (need it for the log file during backup)
6f74ef
-rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
6f74ef
-LogIfError "Could not cleanup temoprary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
6f74ef
+rm -rf "${TMP_DIR}/rsync/${RSYNC_PREFIX}/" \
6f74ef
+    || Log "Could not cleanup temporary rsync space: ${TMP_DIR}/rsync/${RSYNC_PREFIX}/"
6f74ef
diff --git a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
6f74ef
index fadf9d72..3c719c44 100644
6f74ef
--- a/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
6f74ef
+++ b/usr/share/rear/prep/NETFS/default/400_automatic_exclude_recreate.sh
6f74ef
@@ -31,7 +31,7 @@ case $scheme in
6f74ef
         backup_directory_mountpoint=$( df -P "$backup_directory" | tail -1 | awk '{print $6}' )
6f74ef
         test "/" = "$backup_directory_mountpoint" && Error "URL '$BACKUP_URL' has the backup directory '$backup_directory' in the '/' filesystem which is forbidden."
6f74ef
         # When the mountpoint of the backup directory is not yet excluded add its mountpoint to the EXCLUDE_RECREATE array:
6f74ef
-        if ! grep -q "$backup_directory_mountpoint" <<< $( echo ${EXCLUDE_RECREATE[@]} ) ; then
6f74ef
+        if ! grep -q "$backup_directory_mountpoint" <<< "${EXCLUDE_RECREATE[*]}" ; then
6f74ef
             EXCLUDE_RECREATE+=( "fs:$backup_directory_mountpoint" )
6f74ef
         fi
6f74ef
         ;;
6f74ef
diff --git a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
6f74ef
index ac26edfa..eb7df29e 100644
6f74ef
--- a/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
6f74ef
+++ b/usr/share/rear/prep/RSYNC/GNU/Linux/200_selinux_in_use.sh
6f74ef
@@ -33,7 +33,7 @@ case $(basename $BACKUP_PROG) in
6f74ef
 			touch $TMP_DIR/force.autorelabel	# after reboot the restored system do a forced SELinux relabeling
6f74ef
 		else
6f74ef
 			# if --xattrs is already set; no need to do it again
6f74ef
-			if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
6f74ef
+			if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
6f74ef
 				BACKUP_RSYNC_OPTIONS+=( --xattrs )
6f74ef
 			fi
6f74ef
 			RSYNC_SELINUX=1		# variable used in recover mode (means using xattr and not disable SELinux)
6f74ef
diff --git a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
6f74ef
index b8535352..c964a148 100644
6f74ef
--- a/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
6f74ef
+++ b/usr/share/rear/prep/RSYNC/default/100_check_rsync.sh
6f74ef
@@ -33,22 +33,20 @@ RSYNC_PORT=873                  # default port (of rsync server)
6f74ef
 RSYNC_PATH=
6f74ef
 
6f74ef
 
6f74ef
-echo $BACKUP_URL | egrep -q '(::)'      # new style '::' means rsync protocol
6f74ef
-if [[ $? -eq 0 ]]; then
6f74ef
+if egrep -q '(::)' <<< $BACKUP_URL ; then # new style '::' means rsync protocol
6f74ef
     RSYNC_PROTO=rsync
6f74ef
 else
6f74ef
     RSYNC_PROTO=ssh
6f74ef
 fi
6f74ef
 
6f74ef
-echo $host | grep -q '@'
6f74ef
-if [[ $? -eq 0 ]]; then
6f74ef
+if grep -q '@' <<< $host ; then
6f74ef
     RSYNC_USER="${host%%@*}"    # grab user name
6f74ef
 else
6f74ef
     RSYNC_USER=root
6f74ef
 fi
6f74ef
 
6f74ef
 # remove USER@ if present (we don't need it anymore)
6f74ef
-tmp2="${host#*@}"
6f74ef
+local tmp2="${host#*@}"
6f74ef
 
6f74ef
 case "$RSYNC_PROTO" in
6f74ef
 
6f74ef
@@ -56,8 +54,7 @@ case "$RSYNC_PROTO" in
6f74ef
         # tmp2=witsbebelnx02::backup or tmp2=witsbebelnx02::
6f74ef
         RSYNC_HOST="${tmp2%%::*}"
6f74ef
         # path=/gdhaese1@witsbebelnx02::backup or path=/backup
6f74ef
-        echo $path | grep -q '::'
6f74ef
-        if [[ $? -eq 0 ]]; then
6f74ef
+        if grep -q '::' <<< $path ; then
6f74ef
             RSYNC_PATH="${path##*::}"
6f74ef
         else
6f74ef
             RSYNC_PATH="${path##*/}"
6f74ef
@@ -79,8 +76,7 @@ esac
6f74ef
 
6f74ef
 # check if host is reachable
6f74ef
 if test "$PING" ; then
6f74ef
-    ping -c 2 "$RSYNC_HOST" >/dev/null
6f74ef
-    StopIfError "Backup host [$RSYNC_HOST] not reachable."
6f74ef
+    ping -c 2 "$RSYNC_HOST" >/dev/null || Error "Backup host [$RSYNC_HOST] not reachable."
6f74ef
 else
6f74ef
     Log "Skipping ping test"
6f74ef
 fi
6f74ef
@@ -89,15 +85,15 @@ fi
6f74ef
 case "$RSYNC_PROTO" in
6f74ef
 
6f74ef
     (rsync)
6f74ef
-        Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
6f74ef
-        $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[@]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null
6f74ef
-        StopIfError "Rsync daemon not running on $RSYNC_HOST"
6f74ef
+        Log "Test: $BACKUP_PROG ${BACKUP_RSYNC_OPTIONS[*]} ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/"
6f74ef
+        $BACKUP_PROG "${BACKUP_RSYNC_OPTIONS[@]}" ${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/ >/dev/null \
6f74ef
+            || Error "Rsync daemon not running on $RSYNC_HOST"
6f74ef
         ;;
6f74ef
 
6f74ef
     (ssh)
6f74ef
         Log "Test: ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true"
6f74ef
-        ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1
6f74ef
-        StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
6f74ef
+        ssh ${RSYNC_USER}@${RSYNC_HOST} /bin/true >/dev/null 2>&1 \
6f74ef
+            || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
6f74ef
         ;;
6f74ef
 
6f74ef
 esac
6f74ef
diff --git a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
6f74ef
index 446dd736..e9103531 100644
6f74ef
--- a/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
6f74ef
+++ b/usr/share/rear/prep/RSYNC/default/150_check_rsync_protocol_version.sh
6f74ef
@@ -2,15 +2,17 @@
6f74ef
 # This file is part of Relax-and-Recover, licensed under the GNU General
6f74ef
 # Public License. Refer to the included COPYING for full text of license.
6f74ef
 # try to grab the rsync protocol version of rsync on the remote server
6f74ef
+
6f74ef
+local remote_mountpoint
6f74ef
+
6f74ef
 if [ -z "$RSYNC_PROTOCOL_VERSION" ]; then
6f74ef
 
6f74ef
     case $RSYNC_PROTO in
6f74ef
 
6f74ef
     (ssh)
6f74ef
-        ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1
6f74ef
-        StopIfError "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
6f74ef
-        grep -q "protocol version" "$TMP_DIR/rsync_protocol"
6f74ef
-        if [ $? -eq 0 ]; then
6f74ef
+        ssh ${RSYNC_USER}@${RSYNC_HOST} rsync --version >"$TMP_DIR/rsync_protocol" 2>&1 \
6f74ef
+            || Error "Secure shell connection not setup properly [$RSYNC_USER@$RSYNC_HOST]"
6f74ef
+        if grep -q "protocol version" "$TMP_DIR/rsync_protocol" ; then
6f74ef
             RSYNC_PROTOCOL_VERSION=$(grep 'protocol version' "$TMP_DIR/rsync_protocol" | awk '{print $6}')
6f74ef
         else
6f74ef
             RSYNC_PROTOCOL_VERSION=29   # being conservative (old rsync version < 3.0)
6f74ef
@@ -30,25 +32,21 @@ else
6f74ef
 
6f74ef
 fi
6f74ef
 
6f74ef
-if [ "${RSYNC_USER}" != "root" ]; then
6f74ef
+if [ "${RSYNC_USER}" != "root" -a $RSYNC_PROTO = "ssh" ]; then
6f74ef
     if [ $RSYNC_PROTOCOL_VERSION -gt 29 ]; then
6f74ef
         if grep -q "no xattrs" "$TMP_DIR/rsync_protocol"; then
6f74ef
             # no xattrs available in remote rsync, so --fake-super is not possible
6f74ef
             Error "rsync --fake-super not possible on system ($RSYNC_HOST) (no xattrs compiled in rsync)"
6f74ef
         else
6f74ef
             # when using --fake-super we must have user_xattr mount options on the remote mntpt
6f74ef
-            _mntpt=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
6f74ef
-            ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete"
6f74ef
-            StopIfError "Remote file system $_mntpt does not have user_xattr mount option set!"
6f74ef
-            #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="""rsync --fake-super""" )
6f74ef
+            remote_mountpoint=$(ssh ${RSYNC_USER}@${RSYNC_HOST} 'cd ${RSYNC_PATH}; df -P .' 2>/dev/null | tail -1 | awk '{print $6}')
6f74ef
+            ssh ${RSYNC_USER}@${RSYNC_HOST} "cd ${RSYNC_PATH} && touch .is_xattr_supported && setfattr -n user.comment -v 'File created by ReaR to test if this filesystems supports extended attributes.' .is_xattr_supported && getfattr -n user.comment .is_xattr_supported 1>/dev/null; find .is_xattr_supported -empty -delete" \
6f74ef
+                || Error "Remote file system $remote_mountpoint does not have user_xattr mount option set!"
6f74ef
+            #BACKUP_RSYNC_OPTIONS+=( --xattrs --rsync-path="rsync --fake-super" )
6f74ef
             # see issue #366 for explanation of removing --xattrs
6f74ef
-            BACKUP_RSYNC_OPTIONS+=( --rsync-path="""rsync --fake-super""" )
6f74ef
+            BACKUP_RSYNC_OPTIONS+=( --rsync-path="rsync --fake-super" )
6f74ef
         fi
6f74ef
     else
6f74ef
-        if [ ${BACKUP_RSYNC_OPTIONS[@]/--fake-super/} != ${BACKUP_RSUNC_OPTIONS[@]} ]; then
6f74ef
-            Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
6f74ef
-        else
6f74ef
-            Log "Warning: rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
6f74ef
-        fi
6f74ef
+        Error "rsync --fake-super not possible on system ($RSYNC_HOST) (please upgrade rsync to 3.x)"
6f74ef
     fi
6f74ef
 fi
6f74ef
diff --git a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
6f74ef
index 0a9c9648..220ccc57 100644
6f74ef
--- a/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
6f74ef
+++ b/usr/share/rear/restore/DUPLICITY/default/400_restore_duplicity.sh
6f74ef
@@ -5,6 +5,8 @@
6f74ef
 # Restore from remote backup via DUPLICIY over rsync
6f74ef
 
6f74ef
 if [ "$BACKUP_PROG" = "duplicity" ]; then
6f74ef
+    local backup_prog_rc
6f74ef
+    local restore_log_message
6f74ef
 
6f74ef
     LogPrint "========================================================================"
6f74ef
     LogPrint "Restoring backup with $BACKUP_PROG from '$BACKUP_DUPLICITY_URL'"
6f74ef
@@ -49,7 +51,8 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
6f74ef
         LogPrint "with CMD: $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir=$DUPLICITY_TEMPDIR $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT"
6f74ef
         $DUPLICITY_PROG -v 5 $GPG_KEY --force --tempdir="$DUPLICITY_TEMPDIR" $BACKUP_DUPLICITY_URL/$HOSTNAME/ $TARGET_FS_ROOT 0<&6 | tee $TMP_DIR/duplicity-restore.log
6f74ef
     fi
6f74ef
-    _rc=$?
6f74ef
+    # FIXME: this collects the exit code from "tee", not from $DUPLICITY_PROG
6f74ef
+    backup_prog_rc=$?
6f74ef
 
6f74ef
     transfertime="$((SECONDS-$starttime))"
6f74ef
     sleep 1
6f74ef
@@ -65,20 +68,20 @@ if [ "$BACKUP_PROG" = "duplicity" ]; then
6f74ef
     LogPrint "========================================================================"
6f74ef
 
6f74ef
 
6f74ef
-    if [ "$_rc" -gt 0 ]; then
6f74ef
+    if [ "$backup_prog_rc" -gt 0 ]; then
6f74ef
         LogPrint "WARNING !
6f74ef
     There was an error while restoring the archive.
6f74ef
     Please check '$RUNTIME_LOGFILE' and $TMP_DIR/duplicity-restore.log for more information.
6f74ef
     You should also manually check the restored system to see whether it is complete.
6f74ef
     "
6f74ef
 
6f74ef
-        _message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
6f74ef
+        restore_log_message="$(tail -14 ${TMP_DIR}/duplicity-restore.log)"
6f74ef
 
6f74ef
         LogPrint "Last 14 Lines of ${TMP_DIR}/duplicity-restore.log:"
6f74ef
-        LogPrint "$_message"
6f74ef
+        LogPrint "$restore_log_message"
6f74ef
     fi
6f74ef
 
6f74ef
-    if [ $_rc -eq 0 ] ; then
6f74ef
+    if [ $backup_prog_rc -eq 0 ] ; then
6f74ef
         LogPrint "Restore completed in $transfertime seconds."
6f74ef
     fi
6f74ef
 
6f74ef
diff --git a/usr/share/rear/restore/RBME/default/400_restore_backup.sh b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
6f74ef
index 28a3c354..3e97e16b 100644
6f74ef
--- a/usr/share/rear/restore/RBME/default/400_restore_backup.sh
6f74ef
+++ b/usr/share/rear/restore/RBME/default/400_restore_backup.sh
6f74ef
@@ -2,6 +2,8 @@ if [[ -z "$RBME_BACKUP" ]] ; then
6f74ef
     Error "No RBME backup selected (BACKUP_URL?). Aborting."
6f74ef
 fi
6f74ef
 
6f74ef
+local backup_prog_rc
6f74ef
+
6f74ef
 scheme=$(url_scheme "$BACKUP_URL")
6f74ef
 
6f74ef
 LogPrint "Restoring from backup $RBME_BACKUP."
6f74ef
@@ -43,11 +45,11 @@ transfertime="$((SECONDS-starttime))"
6f74ef
 # harvest return code from background job. The kill -0 $BackupPID loop above should
6f74ef
 # have made sure that this wait won't do any real "waiting" :-)
6f74ef
 wait $BackupPID
6f74ef
-_rc=$?
6f74ef
+backup_prog_rc=$?
6f74ef
 
6f74ef
 sleep 1
6f74ef
-test "$_rc" -gt 0 && LogPrint "WARNING !
6f74ef
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
6f74ef
+test "$backup_prog_rc" -gt 0 && LogPrint "WARNING !
6f74ef
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the archive.
6f74ef
 Please check '$RUNTIME_LOGFILE' for more information. You should also
6f74ef
 manually check the restored system to see whether it is complete.
6f74ef
 "
6f74ef
diff --git a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
6f74ef
index 53915322..a792f195 100644
6f74ef
--- a/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
6f74ef
+++ b/usr/share/rear/restore/RSYNC/default/200_remove_relative_rsync_option.sh
6f74ef
@@ -4,11 +4,11 @@
6f74ef
 # without the --relative option ; my feeling says it is better to remove it from array BACKUP_RSYNC_OPTIONS
6f74ef
 # If I'm wrong please let us know (use issue mentioned above to comment)
6f74ef
 
6f74ef
-if grep -q relative <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
6f74ef
+if grep -q -- "--relative" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
6f74ef
     BACKUP_RSYNC_OPTIONS=( $( RmInArray "--relative" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
6f74ef
     Log "Removed option '--relative' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
6f74ef
 fi
6f74ef
-if grep -q "-R" <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
6f74ef
+if grep -q -- "-R" <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
6f74ef
     BACKUP_RSYNC_OPTIONS=( $( RmInArray "-R" "${BACKUP_RSYNC_OPTIONS[@]}" ) )
6f74ef
     Log "Removed option '-R' from the BACKUP_RSYNC_OPTIONS array during $WORKFLOW workflow"
6f74ef
 fi
6f74ef
diff --git a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
6f74ef
index 2a0bf15e..993088be 100644
6f74ef
--- a/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
6f74ef
+++ b/usr/share/rear/restore/RSYNC/default/400_restore_rsync_backup.sh
6f74ef
@@ -4,10 +4,10 @@ get_size() {
6f74ef
 	echo $( stat --format '%s' "$TARGET_FS_ROOT/$1" )
6f74ef
 }
6f74ef
 
6f74ef
-mkdir -p "${TMP_DIR}/rsync/${NETFS_PREFIX}"
6f74ef
-StopIfError "Could not mkdir '$TMP_DIR/rsync/${NETFS_PREFIX}'"
6f74ef
+local backup_prog_rc
6f74ef
+local restore_log_message
6f74ef
 
6f74ef
-LogPrint "Restoring $BACKUP_PROG archive from '${RSYNC_HOST}:${RSYNC_PATH}'"
6f74ef
+LogPrint "Restoring $BACKUP_PROG backup from '${RSYNC_HOST}:${RSYNC_PATH}'"
6f74ef
 
6f74ef
 ProgressStart "Restore operation"
6f74ef
 (
6f74ef
@@ -33,9 +33,10 @@ ProgressStart "Restore operation"
6f74ef
 			;;
6f74ef
 
6f74ef
 		(*)
6f74ef
-			# no other backup programs foreseen then rsync so far
6f74ef
+			# no other backup programs foreseen than rsync so far
6f74ef
 			:
6f74ef
 			;;
6f74ef
+
6f74ef
 	esac
6f74ef
 	echo $? >$TMP_DIR/retval
6f74ef
 ) >"${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log" &
6f74ef
@@ -65,6 +66,7 @@ case "$(basename $BACKUP_PROG)" in
6f74ef
 			ProgressStep
6f74ef
 		done
6f74ef
 		;;
6f74ef
+
6f74ef
 esac
6f74ef
 ProgressStop
6f74ef
 
6f74ef
@@ -72,20 +74,28 @@ transfertime="$((SECONDS-starttime))"
6f74ef
 
6f74ef
 # harvest return code from background job. The kill -0 $BackupPID loop above should
6f74ef
 # have made sure that this wait won't do any real "waiting" :-)
6f74ef
-wait $BackupPID
6f74ef
-_rc=$?
6f74ef
+wait $BackupPID || LogPrintError "Restore job returned a nonzero exit code $?"
6f74ef
+# harvest the actual return code of rsync. Finishing the pipeline with an error code above is actually unlikely,
6f74ef
+# because rsync is not the last command in it. But error returns from rsync are common and must be handled.
6f74ef
+backup_prog_rc="$(cat $TMP_DIR/retval)"
6f74ef
 
6f74ef
 sleep 1
6f74ef
-test "$_rc" -gt 0 && LogPrint "WARNING !
6f74ef
-There was an error (${rsync_err_msg[$_rc]}) while restoring the archive.
6f74ef
+if test "$backup_prog_rc" -gt 0 ; then
6f74ef
+    # TODO: Shouldn't we tell the user to check ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log as well?
6f74ef
+    LogPrintError "WARNING !
6f74ef
+There was an error (${rsync_err_msg[$backup_prog_rc]}) while restoring the backup.
6f74ef
 Please check '$RUNTIME_LOGFILE' for more information. You should also
6f74ef
 manually check the restored system to see whether it is complete.
6f74ef
 "
6f74ef
+    is_true "$BACKUP_INTEGRITY_CHECK" && Error "Integrity check failed, restore aborted because BACKUP_INTEGRITY_CHECK is enabled"
6f74ef
+fi
6f74ef
 
6f74ef
-_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
6f74ef
+restore_log_message="$(tail -14 ${TMP_DIR}/${BACKUP_PROG_ARCHIVE}-restore.log)"
6f74ef
 
6f74ef
-if [ $_rc -eq 0 -a "$_message" ] ; then
6f74ef
-        LogPrint "$_message in $transfertime seconds."
6f74ef
+if [ $backup_prog_rc -eq 0 -a "$restore_log_message" ] ; then
6f74ef
+        LogPrint "$restore_log_message in $transfertime seconds."
6f74ef
 elif [ "$size" ]; then
6f74ef
         LogPrint "Restored $((size/1024/1024)) MiB in $((transfertime)) seconds [avg $((size/1024/transfertime)) KiB/sec]"
6f74ef
 fi
6f74ef
+
6f74ef
+return $backup_prog_rc
6f74ef
diff --git a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
6f74ef
index 3622884a..890161f1 100644
6f74ef
--- a/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
6f74ef
+++ b/usr/share/rear/verify/RSYNC/GNU/Linux/600_check_rsync_xattr.sh
6f74ef
@@ -3,8 +3,8 @@
6f74ef
 [[ $RSYNC_SELINUX ]] && {
6f74ef
 
6f74ef
 	# if --xattrs is already set; no need to do it again
6f74ef
-	if ! grep -q xattrs <<< $(echo ${BACKUP_RSYNC_OPTIONS[@]}); then
6f74ef
-		RSYNC_OPTIONS=( "${BACKUP_RSYNC_OPTIONS[@]}" --xattrs )
6f74ef
+	if ! grep -q xattrs <<< "${BACKUP_RSYNC_OPTIONS[*]}" ; then
6f74ef
+		BACKUP_RSYNC_OPTIONS+=( --xattrs )
6f74ef
 	fi
6f74ef
 
6f74ef
 }
6f74ef
diff --git a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
6f74ef
index 47ed9e02..b2fb72f5 100644
6f74ef
--- a/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
6f74ef
+++ b/usr/share/rear/verify/RSYNC/default/550_check_remote_backup_archive.sh
6f74ef
@@ -3,12 +3,12 @@
6f74ef
 case $RSYNC_PROTO in
6f74ef
 
6f74ef
 	(ssh)
6f74ef
-		ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
6f74ef
-		StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
6f74ef
+		ssh ${RSYNC_USER}@${RSYNC_HOST} "ls -ld ${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
6f74ef
+		    || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
6f74ef
 		;;
6f74ef
 
6f74ef
 	(rsync)
6f74ef
-		$BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1
6f74ef
-		StopIfError "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
6f74ef
+		$BACKUP_PROG "${RSYNC_PROTO}://${RSYNC_USER}@${RSYNC_HOST}:${RSYNC_PORT}/${RSYNC_PATH}/${RSYNC_PREFIX}/backup" >/dev/null 2>&1 \
6f74ef
+		    || Error "Archive not found on [$RSYNC_USER@$RSYNC_HOST:${RSYNC_PATH}/${RSYNC_PREFIX}]"
6f74ef
 		;;
6f74ef
 esac