From bf77b190c769131a175a3b41c599a7f92d356519 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sun, 24 May 2015 01:55:40 -0400 Subject: lib/block.sh: New file --- 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 +# . + +[ "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 \ diff --git a/locale/en_US.sh b/locale/en_US.sh index 3063cb0..cfeecac 100644 --- a/locale/en_US.sh +++ b/locale/en_US.sh @@ -48,6 +48,13 @@ msg_prokit_cant_lock_sessions='Cannot acquire sessions state lock' msg_prokit_install_running='Another instance of prokit is installing this '\ 'system' +# lib/block.sh +msg_prokit_block_device_invalid='Not a block device: %s' +msg_prokit_block_mkdir_fail='Failed to create block device mount point "%s"' +msg_prokit_block_mount_fail='Failed to mount block device "%s"' +msg_prokit_block_umount_fail='Failed to unmount block device mounted at "%s"' +msg_prokit_block_rmdir_fail='Failed to remove block device mount point "%s"' + # lib/rand.sh msg_prokit_rand_bad_x='Invalid random number generator seed value' -- cgit v0.9.1