From 4e7ab7455206ec157a72d07c40c07f1a299529f1 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Fri, 3 Dec 2010 08:49:43 +0000 Subject: [PATCH] lbu: remount LBU_MEDIA as read-write if it was read-only ref #477 --- lbu.in | 34 +++++++++++++++++++++++++++++----- 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 # 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" -- 1.7.3.2