From nobody@FreeBSD.org  Mon Oct 24 19:09:52 2011
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id ADC611065677
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 24 Oct 2011 19:09:52 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id 9CE1D8FC1A
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 24 Oct 2011 19:09:52 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id p9OJ9qPH085153
	for <freebsd-gnats-submit@FreeBSD.org>; Mon, 24 Oct 2011 19:09:52 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id p9OJ9quU085152;
	Mon, 24 Oct 2011 19:09:52 GMT
	(envelope-from nobody)
Message-Id: <201110241909.p9OJ9quU085152@red.freebsd.org>
Date: Mon, 24 Oct 2011 19:09:52 GMT
From: Aragon Gouveia <aragon@phat.za.net>
To: freebsd-gnats-submit@FreeBSD.org
Subject: New port: sysutils/volman FreeBSD specific volume manager
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         161977
>Category:       ports
>Synopsis:       New port: sysutils/volman FreeBSD specific volume manager
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    eadler
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Oct 24 19:10:01 UTC 2011
>Closed-Date:    Sat Jan 07 05:01:46 UTC 2012
>Last-Modified:  Sat Jan 07 05:01:46 UTC 2012
>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:
Responsible-Changed-From-To: freebsd-ports-bugs->eadler 
Responsible-Changed-By: eadler 
Responsible-Changed-When: Sun Dec 25 18:28:47 UTC 2011 
Responsible-Changed-Why:  
I'll take it. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=161977 
State-Changed-From-To: open->feedback 
State-Changed-By: eadler 
State-Changed-When: Sun Dec 25 18:41:54 UTC 2011 
State-Changed-Why:  
I'd rather not keep the source files in the ports tree. Can you start a 
Google Code project (or something like that) and host the source there? 

http://www.freebsd.org/cgi/query-pr.cgi?pr=161977 

From: Aragon Gouveia <aragon@phat.za.net>
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/161977: New port: sysutils/volman FreeBSD specific volume
 manager
Date: Mon, 02 Jan 2012 23:34:50 +0200

 This is a multi-part message in MIME format.
 --------------080406030202000104010604
 Content-Type: text/plain; charset=ISO-8859-1; format=flowed
 Content-Transfer-Encoding: 7bit
 
 Hi.  Updated port skeleton attached.  Thanks!
 
 --------------080406030202000104010604
 Content-Type: text/plain;
  name="volman.shar"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="volman.shar"
 
 # 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/volmand.in
 #	volman/Makefile
 #	volman/pkg-plist
 #	volman/pkg-descr
 #	volman/distinfo
 #
 echo c - volman
 mkdir -p volman > /dev/null 2>&1
 echo c - volman/files
 mkdir -p volman/files > /dev/null 2>&1
 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=	http://cloud.github.com/downloads/jmptbl/volman/
 X
 XMAINTAINER=	aragon@phat.za.net
 XCOMMENT=	FreeBSD specific volume manager
 X
 XUSE_XZ=		yes
 XUSE_RC_SUBR=	volmand
 XVM_SUB_FILES=	vmount volmand
 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)
 XVM_SUB_FILES+=	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-build:
 X.for file in ${VM_SUB_FILES}
 X	${SED} -e 's#%%PREFIX%%#${PREFIX}#g' ${WRKSRC}/${file}.in >${WRKSRC}/${file}
 X.endfor
 X
 Xdo-install:
 X	${INSTALL_SCRIPT} ${WRKSRC}/volmand ${PREFIX}/sbin
 X	${INSTALL_SCRIPT} ${WRKSRC}/vmount ${PREFIX}/bin
 X.if defined(WITH_OPENBOX)
 X	${INSTALL_SCRIPT} ${WRKSRC}/obvolman ${PREFIX}/bin
 X.endif
 X	${INSTALL_DATA} ${WRKSRC}/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
 echo x - volman/distinfo
 sed 's/^X//' >volman/distinfo << 'a6c92568ad7809aeaf492ffd40adc837'
 XSHA256 (volman-0.7.tar.xz) = a2efc86f990b547245f58ec3db20059f597ad040805b6834fc6b9aab66df78b5
 XSIZE (volman-0.7.tar.xz) = 4988
 a6c92568ad7809aeaf492ffd40adc837
 exit
 
 
 --------------080406030202000104010604--
State-Changed-From-To: feedback->open 
State-Changed-By: eadler 
State-Changed-When: Mon Jan 2 22:57:13 UTC 2012 
State-Changed-Why:  
Submitter has fixed. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=161977 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: ports/161977: commit references a PR
Date: Sat,  7 Jan 2012 04:59:50 +0000 (UTC)

 eadler      2012-01-07 04:59:41 UTC
 
   FreeBSD ports repository
 
   Modified files:
     sysutils             Makefile 
   Added files:
     sysutils/volman      Makefile distinfo pkg-descr pkg-plist 
     sysutils/volman/files volmand.in 
   Log:
   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
   
   PR:             ports/161977
   Submitted by:   Aragon Gouveia <aragon@phat.za.net>
   
   Revision  Changes    Path
   1.1367    +1 -0      ports/sysutils/Makefile
   1.1       +53 -0     ports/sysutils/volman/Makefile (new)
   1.1       +2 -0      ports/sysutils/volman/distinfo (new)
   1.1       +17 -0     ports/sysutils/volman/files/volmand.in (new)
   1.1       +15 -0     ports/sysutils/volman/pkg-descr (new)
   1.1       +4 -0      ports/sysutils/volman/pkg-plist (new)
 _______________________________________________
 cvs-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/cvs-all
 To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->closed 
State-Changed-By: eadler 
State-Changed-When: Sat Jan 7 05:01:43 UTC 2012 
State-Changed-Why:  
Committed. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=161977 
>Unformatted:
