diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/block.sh | 85 | ||||
-rw-r--r-- | lib/local.mk | 1 |
2 files changed, 86 insertions, 0 deletions
diff --git a/lib/block.sh b/lib/block.sh new file mode 100644 index 0000000..7060690 --- /dev/null +++ b/lib/block.sh @@ -0,0 +1,85 @@ +# Functions for mounting and unmounting block devices +# +# Copyright (C) 2015 Patrick "P. J." McDermott +# +# This file is part of the ProteanOS Development Kit. +# +# The ProteanOS Development Kit is free software: you can redistribute +# it and/or modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The ProteanOS Development Kit is distributed in the hope that it +# will be useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with the ProteanOS Development Kit. If not, see +# <http://www.gnu.org/licenses/>. + +[ "x${_BLOCK_SM+set}" = 'xset' ] && return 0 +_BLOCK_SM=1 + +use rand + +is_block() +{ + local dev="${1}" + + [ -b "${dev}" ] + return ${?} +} + +block_mount() +{ + local dev="${1}" + local dir= + + if ! [ -b "${dev}" ]; then + error 2 "$(get_msg 'block_device_invalid')" + fi + + rand + # FIXME: Hardcoded tmpdir + dir="/tmp/prokit-block-$(printf '%010d' ${rand_x})" + if ! mkdir "${dir}"; then + error 2 "$(get_msg 'block_mkdir_fail' "${dir}")" + fi + + if ! mount "${dev}" "${dir}"; then + rmdir "${dir}" + error 2 "$(get_msg 'block_mount_fail' "${dev}")" + fi + + printf '%s' "${dir}" + return 0 +} + +block_umount() +{ + local dir="${1}" + local i= + local timed_out= + + i=0 + timed_out=false + while ! umount "${dir}"; do + i=$(($i + 1)) + if [ ${i} -eq 10 ]; then + timed_out=true + break + fi + sleep 1 + done + + if ${timed_out}; then + error 2 "$(get_msg 'block_umount_fail' "${dir}")" + fi + + if ! rmdir "${dir}"; then + error 2 "$(get_msg 'block_rmdir_fail' "${dir}")" + fi + + return 0 +} diff --git a/lib/local.mk b/lib/local.mk index 1ce768c..84a2ee6 100644 --- a/lib/local.mk +++ b/lib/local.mk @@ -12,6 +12,7 @@ pkgdata_sources = \ lib/pkg.sh \ lib/mutex.sh \ lib/session.sh \ + lib/block.sh \ lib/opkg.sh \ lib/rand.sh \ lib/cmd.sh \ |