diff options
Diffstat (limited to 'lbu.in')
-rw-r--r-- | lbu.in | 34 |
1 files changed, 29 insertions, 5 deletions
@@ -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" |