summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lbu.in34
1 files changed, 29 insertions, 5 deletions
diff --git a/lbu.in b/lbu.in
index dfd7e3c..a0dfe16 100644
--- a/lbu.in
+++ b/lbu.in
@@ -1,7 +1,7 @@
#!/bin/sh
# lbu - utility to create local backups.
-# Copyright (c) 2006 Natanael Copa
+# Copyright (c) 2006-2010 Natanael Copa <ncopa@alpinelinux.org>
# May be distributed under GPL2
VERSION=@VERSION@
@@ -54,6 +54,9 @@ Common options:
cleanup() {
local i
+ for i in $REMOUNT_RO_LIST; do
+ mount -o remount,ro $i
+ done
for i in $UMOUNT_LIST; do
umount $i
done
@@ -64,9 +67,30 @@ exit_clean() {
exit 1
}
+# check if given dir is not a mounted mountpoint
+is_unmounted() {
+ awk "\$2 == \"$1\" {exit 1}" /proc/mounts
+}
+
mount_once() {
- if awk "\$2 == \"$1\" {exit 1}" /proc/mounts; then
- mount $1 && UMOUNT_LIST="$1 $UMOUNT_LIST"
+ if is_unmounted "$1"; then
+ mount $1 && UMOUNT_LIST="$1 $UMOUNT_LIST" || return 1
+ fi
+}
+
+# check if given dir is read-only
+is_ro() {
+ local tmpfile=$(mktemp -p "$1")
+ [ -z "$tmpfile" ] && return 0
+ rm -f "$tmpfile"
+ return 1
+}
+
+mount_once_rw() {
+ mount_once "$1" || return 1
+ if is_ro "$1"; then
+ REMOUNT_RO_LIST="$1 $REMOUNT_RO_LIST"
+ mount -o remount,rw "$1"
fi
}
@@ -385,7 +409,7 @@ cmd_commit() {
# mount media unles its already mounted
mnt=/media/$media
[ -d "$mnt" ] || usage
- mount_once "$mnt" || die "failed to mount $mnt"
+ mount_once_rw "$mnt" || die "failed to mount $mnt"
# find the outfile
outfile="$mnt/$(hostname).apkovl.tar.gz"
@@ -538,7 +562,7 @@ cmd_revert() {
if [ -n "$ENCRYPTION" ]; then
current="$current.$ENCRYPTION"
fi
- mount_once "$mnt" || die "failed to mount $mnt"
+ mount_once_rw "$mnt" || die "failed to mount $mnt"
[ -f "$revertto" ] || die "file not found: $revertto"
backup_apkovl "$current"
vecho "Reverting to $1"