Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Oct 2011 19:09:52 GMT
From:      Aragon Gouveia <aragon@phat.za.net>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/161977: New port: sysutils/volman FreeBSD specific volume manager
Message-ID:  <201110241909.p9OJ9quU085152@red.freebsd.org>
Resent-Message-ID: <201110241910.p9OJA1u9076813@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         161977
>Category:       ports
>Synopsis:       New port: sysutils/volman FreeBSD specific volume manager
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 24 19:10:01 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Aragon Gouveia
>Release:        8.2-RELEASE-p2
>Organization:
>Environment:
FreeBSD fuzz.geek.sh 8.2-RELEASE-p2 FreeBSD 8.2-RELEASE-p2 #0: Sun Jul 10 15:27:35 SAST 2011     toor@igor.geek.sh:/usr/obj/usr/src-RELENG_8_2/sys/FUZZ  amd64

>Description:
volman is a FreeBSD specific volume manager.  It acts 
as a translator of devd(8) events, probing storage 
devices for their file system information, and serving 
this over a FIFO based API to which clients can 
subscribe.  In addition to notifying clients of new 
or lost volumes, it will mount and unmount such 
volumes at the command of subscribing clients.

It runs as root and allows any local clients the 
ability to mount and unmount volumes which are 
detected, regardless of any user privileges.  This 
is intended for single user X11 systems needing 
an easy way of accessing USB flash disks on the fly.

WWW: http://forums.freebsd.org/showthread.php?t=27233

Please note!  This replaces PR ports/159631 which was never committed.  Please could that old PR be closed.

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	volman
#	volman/files
#	volman/files/dist
#	volman/files/dist/obvolman.in
#	volman/files/dist/vmount.in
#	volman/files/dist/volmand.in
#	volman/files/dist/volman.conf
#	volman/files/volmand.in
#	volman/Makefile
#	volman/pkg-plist
#	volman/pkg-descr
#
echo c - volman
mkdir -p volman > /dev/null 2>&1
echo c - volman/files
mkdir -p volman/files > /dev/null 2>&1
echo c - volman/files/dist
mkdir -p volman/files/dist > /dev/null 2>&1
echo x - volman/files/dist/obvolman.in
sed 's/^X//' >volman/files/dist/obvolman.in << 'faf461b0b9b5f3018e6c2d02a1c9f0ac'
X#!/bin/sh
X#
X# Volume manager CLI client
X# version 0.7
X
Xcleanup () {
X	trap - EXIT
X	if [ -z "${OUTPUT}" ]; then
X		OUTPUT='<item label="Unexpected error"/>'
X	fi
X	if [ -z "${DOMOUNT}" ]; then
X		echo '<openbox_pipe_menu>'
X		printf "${OUTPUT}\\n"
X		echo '</openbox_pipe_menu>'
X	fi
X}
X
Xset -e
Xtrap cleanup EXIT
X
Xif [ -r %%PREFIX%%/etc/volman.conf ]; then
X        . %%PREFIX%%/etc/volman.conf
Xfi
X
X: ${WRKDIR:=/tmp/volman}
X
Xi=0
Xwhile [ ! -e ${WRKDIR}/fifo.obvolman -a ${i} -lt 3 ]; do
X	i=$((${i}+1))
X	echo "obvolman SUBSCRIBE" >${WRKDIR}/fifo.volmand
X	sleep 0.5
Xdone
X
Xecho "obvolman VOLUMES" >${WRKDIR}/fifo.volmand
Xif [ ${#} -eq 1 ]; then
X	DOMOUNT="${1}"
Xfi
X
Xwhile read RESP DATA <&3; do
X	case "${RESP}" in
X	VOLUME)
X		set -- ${DATA}
X		if [ "${1}" = "LIST" ]; then
X			case "${2}" in
X			m)
X				out="*"
X				if [ "${DOMOUNT}" = "${3}" ]; then
X					echo "obvolman UMOUNT ${3}" >${WRKDIR}/fifo.volmand
X				fi
X				;;
X			u)
X				out=" "
X				if [ "${DOMOUNT}" = "${3}" ]; then
X					echo "obvolman MOUNT ${3}" >${WRKDIR}/fifo.volmand
X				fi
X				;;
X			END)
X				if [ -n "${DOMOUNT}" ]; then
X					continue
X				else
X					if [ -z "${OUTPUT}" ]; then
X						OUTPUT="<item label=\"No devices\"/>"
X					fi
X					break
X				fi
X				;;
X			esac
X			if [ -z "${DOMOUNT}" ]; then
X				size=${5}
X				unit=B
X				while [ ${size} -gt 1000 ]; do
X					size=$((${size} / 1000))
X					case "${unit}" in
X					B) unit=KB ;;
X					KB) unit=MB ;;
X					MB) unit=GB ;;
X					GB) unit=TB ;;
X					TB) unit=PB ;;
X					esac
X				done
X				out="${out} ${3} ${4} ${size}${unit}"
X				dev=${3}
X				if [ ${#} -gt 5 ]; then
X					shift 5
X					out="${out} ${*}"
X				fi
X				OUTPUT="${OUTPUT}<item label=\"${out}\"><action name=\"Execute\">"
X				OUTPUT="${OUTPUT}<command>${0} ${dev}</command></action></item>"
X			fi
X		fi
X		;;
X	ERROR)
X		if [ -z "${DOMOUNT}" ]; then
X			OUTPUT="<item label\"ERROR: ${DATA}\"/>"
X		else
X			xmessage -nearmouse -timeout 5 ERROR: ${DATA}
X		fi
X		break
X		;;
X	MOUNT)
X		set -- ${DATA}
X		if [ "${1}" = "${DOMOUNT}" ]; then
X			shift
X			xmessage -nearmouse -timeout 3 mounted: ${*}
X		fi
X		break
X		;;
X	UMOUNT)
X		set -- ${DATA}
X		if [ "${1}" = "${DOMOUNT}" ]; then
X			shift
X			xmessage -nearmouse -timeout 1 unmounted
X		fi
X		break
X		;;
X	PING)
X		echo "obvolman PONG" >${WRKDIR}/fifo.volmand
X		;;
X	esac
Xdone 3<${WRKDIR}/fifo.obvolman
faf461b0b9b5f3018e6c2d02a1c9f0ac
echo x - volman/files/dist/vmount.in
sed 's/^X//' >volman/files/dist/vmount.in << 'e3bac69a3764b727eb76345aad0be18e'
X#!/bin/sh
X#
X# Volume manager CLI client
X# version 0.7
X
Xset -e
X
Xif [ -r %%PREFIX%%/etc/volman.conf ]; then
X        . %%PREFIX%%/etc/volman.conf
Xfi
X
X: ${WRKDIR:=/tmp/volman}
X
Xi=0
Xwhile [ ! -e ${WRKDIR}/fifo.vmount -a ${i} -lt 3 ]; do
X	i=$((${i}+1))
X	echo "vmount SUBSCRIBE" >${WRKDIR}/fifo.volmand
X	sleep 0.5
Xdone
X
Xecho "vmount VOLUMES" >${WRKDIR}/fifo.volmand
Xif [ ${#} -eq 1 ]; then
X	DOMOUNT="${1}"
Xfi
X
Xwhile read RESP DATA <&3; do
X	case "${RESP}" in
X	VOLUME)
X		set -- ${DATA}
X		if [ "${1}" = "LIST" ]; then
X			case "${2}" in
X			m)
X				out="[m]"
X				if [ "${DOMOUNT}" = "${3}" ]; then
X					echo -n "umounting ${3}... "
X					echo "vmount UMOUNT ${3}" >${WRKDIR}/fifo.volmand
X				fi
X				;;
X			u)
X				out="[u]"
X				if [ "${DOMOUNT}" = "${3}" ]; then
X					echo -n "mounting ${3}... "
X					echo "vmount MOUNT ${3}" >${WRKDIR}/fifo.volmand
X				fi
X				;;
X			END)
X				if [ -n "${DOMOUNT}" ]; then
X					continue
X				else
X					break
X				fi
X				;;
X			esac
X			if [ -z "${DOMOUNT}" ]; then
X				size=${5}
X				unit=B
X				while [ ${size} -gt 1000 ]; do
X					size=$((${size} / 1000))
X					case "${unit}" in
X					B) unit=KB ;;
X					KB) unit=MB ;;
X					MB) unit=GB ;;
X					GB) unit=TB ;;
X					TB) unit=PB ;;
X					esac
X				done
X				out="${out} ${3} ${4} ${size}${unit}"
X				if [ ${#} -gt 5 ]; then
X					shift 5
X					out="${out} ${*}"
X				fi
X				echo ${out}
X			fi
X		fi
X		;;
X	ERROR)
X		echo ERROR: ${DATA}
X		break
X		;;
X	MOUNT)
X		set -- ${DATA}
X		if [ "${1}" = "${DOMOUNT}" ]; then
X			shift
X			echo success: ${*}
X		fi
X		break
X		;;
X	UMOUNT)
X		set -- ${DATA}
X		if [ "${1}" = "${DOMOUNT}" ]; then
X			shift
X			echo success
X		fi
X		break
X		;;
X	PING)
X		echo "vmount PONG" >${WRKDIR}/fifo.volmand
X		;;
X	esac
Xdone 3<${WRKDIR}/fifo.vmount
e3bac69a3764b727eb76345aad0be18e
echo x - volman/files/dist/volmand.in
sed 's/^X//' >volman/files/dist/volmand.in << 'f28555958277b552f6e4c1a317e9ab89'
X#!/bin/sh
X#
X# Volume manager daemon for FreeBSD's devd(8)
X# version 0.7
X
Xif [ "${1}" != "daemon" ]; then
X	daemon -cf -p /var/run/volmand.pid %%PREFIX%%/sbin/volmand daemon
X	exit $?
Xfi
X
Xif [ -r %%PREFIX%%/etc/volman.conf ]; then
X	. %%PREFIX%%/etc/volman.conf
Xfi
X
X: ${WRKDIR:=/tmp/volman}
X: ${DEVMATCH:="^(da|mmcsd)"}
X: ${LABELMATCH:="^(msdosfs|ntfs|ufs)/"}
X: ${MNTPREFIX=/media}
X: ${DEVMPOINT=NO}
X
Xcleanup () {
X	trap - 1 15 EXIT
X	rm -rf ${WRKDIR}
X	kill -1 -${MASTERPID}
X	kill -15 -${MASTERPID}
X	exit 0
X}
X
Xlog () {
X	local level
X	level=${1}
X	shift
X	logger -p user.${level} -t volmand $*
X}
X
XpollDev () {
X	local status
X	status=0
X	while true; do
X		log info polling ${1}
X		sleep 5
X		if camcontrol tur ${1} >/dev/null 2>/dev/null; then
X			[ ${status} -eq 0 ] || continue
X			status=1
X			echo "!system=DEVFS subsystem=CDEV type=CREATE cdev=${1}" >${WRKDIR}/internal
X			sleep 1
X			:>/dev/${1}
X		else
X			if ! camcontrol devlist |grep -q "[(,]${1}[,)]"; then
X				log info lost device ${1}
X				echo "!system=VOLMAND _poller ENDPOLL ${1}" >${WRKDIR}/internal
X				return 0
X			fi
X			[ ${status} -eq 1 ] || continue
X			status=0
X			echo "!system=DEVFS subsystem=CDEV type=DESTROY cdev=${1}" >${WRKDIR}/internal
X		fi
X	done
X}
X
XprobeMagic () {
X	local probe size
X	probe=$(dd if=/dev/${1} bs=128k count=1 2>/dev/null |file -Ls /dev/stdin)
X	size=$(diskinfo ${1} |cut -f 3 -d "	")
X	case "${probe}" in
X	*FAT*)
X		addDev ${1} ${size} msdosfs
X		return 0
X		;;
X	*Linux*ext2*)
X		addDev ${1} ${size} ext2fs
X		return 0
X		;;
X	*NTFS*)
X		addDev ${1} ${size} ntfs
X		return 0
X		;;
X	esac
X	return 1
X}
X
XprobeDev () {
X	local dev gtype gprov gsize status pollpid mntcmd
X	dev=$1
X	eval "status=\$STATUS_${dev}"
X	eval "pollpid=\$POLLPID_${dev}"
X	if [ -n "${status}" ]; then return 0; fi
X	if [ -z "${pollpid}" ]; then
X		if camcontrol devlist |grep -q "[(,]${dev}[,)]"; then
X			if ! camcontrol tur ${dev} >/dev/null; then
X				pollDev ${dev} &
X				eval "POLLPID_${dev}=$!"
X				log info forking poller at PID $!
X				return 1
X			fi
X		fi
X	fi
X	if [ ${OSREL} -lt 802503 ]; then
X		probe=$(gpart show -r ${dev} 2>/dev/null)
X	else
X		probe=$(gpart show -rp ${dev} 2>/dev/null)
X	fi
X	if [ $? -ne 0 ]; then
X		probeMagic ${dev}
X		return $?
X	fi
X	IFS="
X"
X	for line in ${probe}; do
X		IFS=" 	"
X		set -- ${line}
X		[ "${3}" != "-" ] || continue
X		if [ "${1}" = "=>" ]; then
X			shift
X			gtype=${4}
X			continue
X		fi
X		if [ ${OSREL} -lt 802503 ]; then
X			gprov=$(gpart modify -i ${3} -f x ${dev} 2>/dev/null |cut -f 1 -d " ")
X			gpart undo ${dev} >/dev/null 2>&1
X		else
X			gprov=${3}
X		fi
X		gsize=$(diskinfo ${gprov} |cut -f 3 -d "	")
X		case "${gtype}" in
X		MBR)
X			case "${4}" in
X			1|4|5|6|12|13|15|16)
X				addDev ${gprov} ${gsize} msdosfs
X				;;
X			7)
X				if dd if=/dev/${gprov} bs=128k count=1 2>/dev/null \
X					|file -Ls /dev/stdin |grep -q "NTFS"; then
X					addDev ${gprov} ${gsize} ntfs
X				fi
X				;;
X			83)
X				if dd if=/dev/${gprov} bs=128k count=1 2>/dev/null \
X					|file -Ls /dev/stdin |grep -q "Linux.*ext2"; then
X					addDev ${gprov} ${gsize} ext2fs
X				fi
X				;;
X			165)
X				probeDev ${gprov}
X				if [ $? -eq 1 ]; then
X					addDev ${gprov} ${gsize} ufs
X				fi
X				;;
X			esac
X			;;
X		BSD)
X			case "${4}" in
X			7)
X				addDev ${gprov} ${gsize} ufs
X				;;
X			esac
X			;;
X		esac
X	done
X	# partitionless devices with a boot record (eg. emulated floppy disks)
X	# look like empty MBR providers to gpart, so must be probed with file(1)
X	if [ "${gtype}" = "MBR" -a -z "${gprov}" ]; then
X		if ! probeMagic ${dev}; then
X			eval "STATUS_${dev}=novolume"
X		fi
X	fi
X	unset IFS
X	return 0
X}
X
XprobeLabel () {
X	local label curlabel curstatus glabel subscriber
X	label=${1}
X	glabel=$(glabel status |grep "${label}")
X	[ $? -eq 0 ] || return 1
X	set -- ${glabel}
X	shift $((${#}-1))
X	eval "curlabel=\$LABEL_${1}"
X	[ -z "${curlabel}" ] || return 0
X	eval "curstatus=\$STATUS_${1}"
X	case "${curstatus}" in
X	novolume)
X		return 1
X		;;
X	umounted|mounted)
X		;;
X	*)
X		addDev ${1} $(diskinfo ${1} |cut -f 3 -d "	") ${label%/*}
X		sleep 0.5
X		;;
X	esac
X	for subscriber in ${SUBSCRIBERS}; do
X		echo "VOLUME LABEL ${1} ${label#*/}" >>${WRKDIR}/fifo.${subscriber} &
X	done
X	eval "LABEL_${1}=\"${label#*/}\""
X	return 0
X}
X
X# $1 = dev node
X# $2 = size in bytes
X# $3 = filesystem
XaddDev () {
X	local status subscriber
X	eval "status=\$STATUS_${1}"
X	case "${status}" in
X	umounted|mounted)
X		;;
X	*)
X		eval "STATUS_${1}=umounted"
X		eval "SIZE_${1}=${2}"
X		eval "FS_${1}=${3}"
X		if [ "${3}" = "msdosfs" -a ${2} -gt 68719476736 ]; then
X			# MSDOS volumes larger than 64 GiB
X			eval "MNTCMD_${1}=\"\$MNTCMD_${3} -o large\""
X		else
X			eval "MNTCMD_${1}=\"\$MNTCMD_${3}\""
X		fi
X		MOUNTABLE="${MOUNTABLE} ${1}"
X		for subscriber in ${SUBSCRIBERS}; do
X			echo "VOLUME CREATE ${1} ${3} ${2}" >>${WRKDIR}/fifo.${subscriber} &
X		done
X		;;
X	esac
X}
X
XgetInput () {
X	local src cmd data
X	while true; do
X		while read src cmd data <&3; do
X			echo "${src}" |grep -Eq "^[a-z][a-z0-9]+" || continue
X			case "${cmd}" in
X			SUBSCRIBE)
X				echo "!system=VOLMAND ${src} SUBSCRIBE" >${WRKDIR}/internal
X				;;
X			VOLUMES)
X				echo "!system=VOLMAND ${src} VOLUMES" >${WRKDIR}/internal
X				;;
X			MOUNT|UMOUNT)
X				if echo "${data}" |grep -Eq ${DEVMATCH}; then
X					echo "!system=VOLMAND ${src} ${cmd} ${data}" >${WRKDIR}/internal
X				else
X					if [ -e ${WRKDIR}/fifo.${src} ]; then
X						echo "ERROR ${data} unmountable" >${WRKDIR}/fifo.${src}
X					fi
X				fi
X				;;
X			PONG)
X				echo "!system=VOLMAND ${src} PONG" >${WRKDIR}/internal
X				;;
X			esac
X		done 3<${WRKDIR}/fifo.volmand
X	done
X}
X
Xpinger () {
X	local subscriber pings subpids keep
X	for subscriber in ${SUBSCRIBERS}; do
X		eval "pings=\$PINGS_${subscriber}"
X		pings=$((${pings}+1))
X		if [ ${pings} -le 3 ]; then
X			keep="${keep} ${subscriber}"
X			echo "PING" >>${WRKDIR}/fifo.${subscriber} &
X			eval "PINGS_${subscriber}=${pings}"
X		else
X			eval "subpids=\"\$SUBPIDS_${subscriber}\""
X			kill ${subpids}
X			rm -f ${WRKDIR}/fifo.${subscriber}
X			unset PINGS_${subscriber} SUBPIDS_${subscriber}
X		fi
X	done
X	SUBSCRIBERS="${keep}"
X	LASTPING=$(date +%s)
X}
X
X# $1 = type paramter
X# $2 = cdev paramter
XmsgDevfs () {
X	local probefunc oldmountable mountable fs mntcmd label subscriber
X	if echo ${2} |grep -qE ${DEVMATCH}; then
X		probefunc=probeDev
X	elif echo ${2} |grep -qE ${LABELMATCH}; then
X		probefunc=probeLabel
X	else
X		continue
X	fi
X	log notice ${1} ${2}
X	case "${1}" in
X	CREATE)
X		${probefunc} "${2}"
X		;;
X	DESTROY)
X		if [ "${probefunc}" = "probeDev" ]; then
X			eval "fs=\$FS_${2}"
X			if [ -n "${fs}" ]; then
X				oldmountable=${MOUNTABLE}
X				MOUNTABLE=""
X				for mountable in ${oldmountable}; do
X					[ "${mountable}" != "${2}" ] || continue
X					MOUNTABLE="${MOUNTABLE} ${mountable}"
X				done
X				for subscriber in ${SUBSCRIBERS}; do
X					echo "VOLUME REMOVE ${2}" >>${WRKDIR}/fifo.${subscriber} &
X				done
X				unset FS_${2} SIZE_${2} MNTCMD_${2} LABEL_${2}
X			fi
X			unset STATUS_${2}
X		fi
X		;;
X	esac
X	:>${WRKDIR}/mountable
X	for mountable in ${MOUNTABLE}; do
X		eval "fs=\$FS_${mountable}"
X		eval "mntcmd=\"\$MNTCMD_${mountable}\""
X		eval "label=\$LABEL_${mountable}"
X		printf '%s\t%s\t%s\t%s\n' ${mountable} ${fs} "${mntcmd}" "${label}" >>${WRKDIR}/mountable
X	done
X}
X
X# $1 = subsys
X# $2 = cmd
X# $3+ = data
XmsgVolmand () {
X	local pings vol status fs size label mntcmd mdev mpoint subscriber
X	case "${2}" in
X	SUBSCRIBE)
X		eval "pings=\$PINGS_${1}"
X		if [ -z "${pings}" ]; then
X			if mkfifo -m 644 ${WRKDIR}/fifo.${1}; then
X				SUBSCRIBERS="${SUBSCRIBERS} ${1}"
X				cat ${WRKDIR}/block >${WRKDIR}/fifo.${1} &
X				eval "SUBPIDS_${1}=$!"
X				eval "PINGS_${1}=0"
X			fi
X		fi
X		;;
X	VOLUMES)
X		if [ -e ${WRKDIR}/fifo.${1} ]; then
X			(
X			for vol in ${MOUNTABLE}; do
X				eval "status=\$STATUS_${vol}"
X				eval "fs=\$FS_${vol}"
X				eval "size=\$SIZE_${vol}"
X				eval "label=\"\$LABEL_${vol}\""
X				case "${status}" in
X				umounted)
X					echo "VOLUME LIST u ${vol} ${fs} ${size} ${label}" >${WRKDIR}/fifo.${1}
X					;;
X				mounted)
X					echo "VOLUME LIST m ${vol} ${fs} ${size} ${label}" >${WRKDIR}/fifo.${1}
X					;;
X				esac
X			done
X			echo "VOLUME LIST END" >${WRKDIR}/fifo.${1}
X			) &
X		fi
X		;;
X	MOUNT)
X		if [ -e ${WRKDIR}/fifo.${1} ]; then
X			(
X			eval "status=\$STATUS_${3}"
X			case "${status}" in
X			umounted)
X				eval "fs=\$FS_${3}"
X				eval "label=\"\$LABEL_${3}\""
X				eval "mntcmd=\"\$MNTCMD_${3}\""
X				if [ -n "${label}" -a "${DEVMPOINT}" = "NO" ]; then
X					mdev="/dev/${fs}/${label}"
X					mpoint="/media/${label}"
X				else
X					mdev="/dev/${3}"
X					mpoint="/media/${3}"
X				fi
X				if [ -n "${mdev}" -a -n "${mpoint}" ]; then
X					log notice mounting ${mdev} to ${mpoint}
X					if mkdir -p "${mpoint}" && ${mntcmd} "${mdev}" "${mpoint}"; then
X						echo "!system=VOLMAND _mounter STATUS ${3} mounted ${mpoint}" >${WRKDIR}/internal
X					else
X						echo "ERROR ${3} mount error occured" >${WRKDIR}/fifo.${1}
X					fi
X				fi
X				;;
X			mounted)
X				echo "ERROR ${3} volume already mounted" >${WRKDIR}/fifo.${1}
X				;;
X			*)
X				echo "ERROR ${3} volume unmountable" >${WRKDIR}/fifo.${1}
X				;;
X			esac
X			) &
X		fi
X		;;
X	UMOUNT)
X		if [ -e ${WRKDIR}/fifo.${1} ]; then
X			(
X			eval "status=\$STATUS_${3}"
X			case "${status}" in
X			mounted)
X				eval "fs=\$FS_${3}"
X				eval "label=\"\$LABEL_${3}\""
X				if [ -n "${label}" -a "${DEVMPOINT}" = "NO" ]; then
X					mdev="/dev/${fs}/${label}"
X					mpoint="/media/${label}"
X				else
X					mdev="/dev/${3}"
X					mpoint="/media/${3}"
X				fi
X				if [ -n "${mdev}" ]; then
X					log notice umounting ${mdev} from ${mpoint}
X					if umount "${mpoint}"; then
X						rmdir "${mpoint}"
X						echo "!system=VOLMAND _mounter STATUS ${3} umounted ${mpoint}" >${WRKDIR}/internal
X					else
X						echo "ERROR ${3} umount error occured" >${WRKDIR}/fifo.${1}
X					fi
X				fi
X				;;
X			*)
X				echo "ERROR ${3} volume not mounted" >${WRKDIR}/fifo.${1}
X				;;
X			esac
X			) &
X		fi
X		;;
X	PONG)
X		eval "pings=\$PINGS_${1}"
X		if [ -n "${pings}" ]; then
X			eval "PINGS_${1}=0"
X		fi
X		;;
X	ENDPOLL)
X		if [ "${1}" = "_poller" ]; then
X			eval "unset POLLPID_${3}"
X		fi
X		;;
X	STATUS)
X		if [ "${1}" = "_mounter" ]; then
X			vol=${3}
X			status=${4}
X			case "${4}" in
X			mounted)
X				shift 4
X				mntcmd="MOUNT ${vol} ${*}"
X				;;
X			umounted)
X				shift 4
X				mntcmd="UMOUNT ${vol} ${*}"
X				;;
X			esac
X			eval "STATUS_${vol}=${status}"
X			for subscriber in ${SUBSCRIBERS}; do
X				if [ -e ${WRKDIR}/fifo.${subscriber} ]; then
X					echo ${mntcmd} >${WRKDIR}/fifo.${subscriber} &
X				fi
X			done
X		fi
X		;;
X	esac
X}
X
XMASTERPID=$$
XMNTCMD_msdosfs="mount_msdosfs -m 666 -M 777"
XMNTCMD_ext2fs="mount -t ext2fs"
XMNTCMD_ufs="mount -t ufs"
Xif kldstat -q -m fuse && test -x /usr/local/bin/ntfs-3g; then
X	MNTCMD_ntfs="/usr/local/bin/ntfs-3g"
Xelse
X	MNTCMD_ntfs="mount_ntfs -o ro -m 555"
Xfi
XOSREL=$(sysctl -n kern.osreldate)
XMNTFILE=mountable
Xtrap cleanup 1 2 13 14 15 EXIT
Xtest -d ${WRKDIR} && rm -rf ${WRKDIR}
Xmkdir ${WRKDIR} || ( log err unable to create WRKDIR at ${WRKDIR} && exit 1 )
Xmkfifo -m 666 ${WRKDIR}/fifo.volmand || ( log err unable to create FIFO at ${WRKDIR}/fifo.volmand && exit 1 )
Xmkfifo -m 600 ${WRKDIR}/internal || ( log err unable to create FIFO at ${WRKDIR}/internal && exit 1 )
Xmkfifo -m 600 ${WRKDIR}/block || ( log err unable to create FIFO at ${WRKDIR}/block && exit 1 )
Xif [ -S /var/run/devd.pipe -a -r /var/run/devd.pipe ]; then
X	cat /var/run/devd.pipe >${WRKDIR}/internal 2>/dev/null &
X	DEVDCATPID=$!
Xelse
X	log err devd domain socket non-existant or unreadable
X	exit 1
Xfi
X
XgetInput &
XGETINPUTPID=$!
X
XMOUNTABLE=""
XSUBSCRIBERS=""
XLASTPING=$(date +%s)
X:>${WRKDIR}/mountable
X
Xwhile read SYSTEM SUBSYS TYPE EXTRA <&3; do
X	case "${SYSTEM#*=}" in
X	DEVFS)
X		if [ "${SUBSYS#*=}" = "CDEV" ]; then
X			msgDevfs "${TYPE#*=}" "${EXTRA#cdev=}"
X		fi
X		;;
X	VOLMAND)
X		msgVolmand "${SUBSYS}" "${TYPE}" ${EXTRA}
X		;;
X	esac
X	if [ $(date +%s) -gt $((${LASTPING}+10)) ]; then
X		pinger
X	fi
Xdone 3<${WRKDIR}/internal
f28555958277b552f6e4c1a317e9ab89
echo x - volman/files/dist/volman.conf
sed 's/^X//' >volman/files/dist/volman.conf << 'f2f1858a3eb3e87f1977b3302f8dea48'
X# What device names amountd must look for.
X#DEVMATCH="^(da|mmcsd)"
X
X# What label names amountd must look for.
X#LABELMATCH="^(msdosfs|ntfs|ufs)/"
X
X# Base directory into which volumes will be mounted.
X#MNTPREFIX=/media
X
X# If YES, subdirectories below MNTPREFIX will always match the device name.
X# Otherwise the volume's label will be used if it exists.
X#DEVMPOINT=NO
X
X# Where amount keeps all its working data and FIFOs.
X#WRKDIR=/tmp/volman
f2f1858a3eb3e87f1977b3302f8dea48
echo x - volman/files/volmand.in
sed 's/^X//' >volman/files/volmand.in << '176101677fb39c3f3d2fb42c2c7fec49'
X#!/bin/sh
X
X# PROVIDE: volmand
X# REQUIRE: DAEMON%%RCFUSEFS%%
X# KEYWORD: shutdown nojail
X
X. /etc/rc.subr
X
Xname="volmand"
Xrcvar=`set_rcvar`
Xcommand="%%PREFIX%%/sbin/volmand"
Xload_rc_config $name
Xpidfile="/var/run/volmand.pid"
Xcommand_interpreter=/bin/sh
X
Xrun_rc_command "$1"
176101677fb39c3f3d2fb42c2c7fec49
echo x - volman/Makefile
sed 's/^X//' >volman/Makefile << 'abfc7d8c56087f9b9852f092b0260e77'
X# New ports collection makefile for:   volman
X# Date created:        24 October 2011
X# Whom:                Aragon Gouveia <aragon@phat.za.net>
X#
X# $FreeBSD$
X#
X
XPORTNAME=	volman
XPORTVERSION=	0.7
XCATEGORIES=	sysutils
XMASTER_SITES=	# empty
XDISTFILES=	# none
XEXTRACT_ONLY=	# empty
X
XMAINTAINER=	aragon@phat.za.net
XCOMMENT=	FreeBSD specific volume manager
X
XSUB_FILES=	dist/vmount dist/volmand
XUSE_RC_SUBR=	volmand
XNO_BUILD=	yes
X
XOPTIONS=	OPENBOX "Install Openbox pipemenu script" off \
X		NTFS3G "Use fusefs-ntfs extensions" off
X
X.include <bsd.port.options.mk>
X
X.if defined(WITH_OPENBOX)
XSUB_FILES+=	dist/obvolman
XRUN_DEPENDS+=	${LOCALBASE}/bin/xmessage:${PORTSDIR}/x11/xmessage
XPLIST_SUB+=	OPENBOX=""
X.else
XPLIST_SUB+=	OPENBOX="@comment "
X.endif
X
X.if defined(WITH_NTFS3G)
XRUN_DEPENDS+=	${LOCALBASE}/bin/ntfs-3g:${PORTSDIR}/sysutils/fusefs-ntfs
XSUB_LIST+=	RCFUSEFS=" fusefs"
X.else
XSUB_LIST+=	RCFUSEFS=""
X.endif
X
Xdo-extract:
X	@${MKDIR} ${WRKDIR}/dist
X
Xdo-install:
X	${INSTALL_SCRIPT} ${WRKDIR}/dist/volmand ${PREFIX}/sbin
X	${INSTALL_SCRIPT} ${WRKDIR}/dist/vmount ${PREFIX}/bin
X.if defined(WITH_OPENBOX)
X	${INSTALL_SCRIPT} ${WRKDIR}/dist/obvolman ${PREFIX}/bin
X.endif
X	${INSTALL_DATA} ${FILESDIR}/dist/volman.conf ${PREFIX}/etc/volman.conf.sample
X
X.include <bsd.port.mk>
abfc7d8c56087f9b9852f092b0260e77
echo x - volman/pkg-plist
sed 's/^X//' >volman/pkg-plist << '0e14d6a002ec56ebcdd9da429ce217f5'
Xetc/volman.conf.sample
Xsbin/volmand
Xbin/vmount
X%%OPENBOX%%bin/obvolman
0e14d6a002ec56ebcdd9da429ce217f5
echo x - volman/pkg-descr
sed 's/^X//' >volman/pkg-descr << 'dcfffd20bc23fe8b4ec7bf65c3b123e3'
Xvolman is a FreeBSD specific volume manager.  It acts 
Xas a translator of devd(8) events, probing storage 
Xdevices for their file system information, and serving 
Xthis over a FIFO based API to which clients can 
Xsubscribe.  In addition to notifying clients of new 
Xor lost volumes, it will mount and unmount such 
Xvolumes at the command of subscribing clients.
X
XIt runs as root and allows any local clients the 
Xability to mount and unmount volumes which are 
Xdetected, regardless of any user privileges.  This 
Xis intended for single user X11 systems needing 
Xan easy way of accessing USB flash disks on the fly.
X
XWWW: http://forums.freebsd.org/showthread.php?t=27233
dcfffd20bc23fe8b4ec7bf65c3b123e3
exit



>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110241909.p9OJ9quU085152>