devfs ruleset processing in rc.subr

Rob Farmer rfarmer at predatorlabs.net
Wed Jan 6 02:52:09 UTC 2010


Hello,

I am trying to fix an issue with the port shells/scponly's rc.d script
and I think I may have come across a bug in /etc/rc.subr related to
devfs.

Here's what I'm trying to do:

make_devfs() {
	# $1 is the user name whose home directory needs a minimal
	# devfs created. If ~/dev exists, it will be deleted.

	eval DEV="~$1/dev"
	while /sbin/umount "${DEV}" 2>/dev/null; do :; done
	/bin/rm -rf "${DEV}"
	/bin/mkdir -p "${DEV}"
	devfs_domount "${DEV}"
	if devfs_init_rulesets; then
		devfs_apply_ruleset "1" "${DEV}" && \
		devfs_apply_ruleset "2" "${DEV}" || \
		/sbin/umount "${DEV}" 2>/dev/null
	fi
}

The devfs_apply_ruleset function doesn't seem to process its arguments
properly - it fails on the second invocation:

+ devfs_apply_ruleset 1 /home/test/dev
+ local devdir rs _me
+ [ -n 1 ]
+ eval 'rs=$1'
+ rs=1
+ [ -n /home/test/dev ]
+ devdir='-m /home/test/dev'
+ _me=devfs_apply_ruleset
+ [ -z 1 ]
+ debug 'devfs_apply_ruleset: applying ruleset (1) to mount-point
(/home/test/dev)'
+ /sbin/devfs -m /home/test/dev rule -s 1 applyset
+ return 0
+ devfs_apply_ruleset 2 /home/test/dev
+ local devdir rs _me
+ [ -n 2 ]
+ eval 'rs=$2'
+ rs=/home/test/dev
+ [ -n /home/test/dev ]
+ devdir='-m /home/test/dev'
+ _me=devfs_apply_ruleset
+ [ -z /home/test/dev ]
+ debug 'devfs_apply_ruleset: applying ruleset (/home/test/dev) to
mount-point (/home/test/dev)'
+ /sbin/devfs -m /home/test/dev rule -s /home/test/dev applyset
devfs rule: error converting to number: /home/test/dev
+ warn 'devfs_apply_ruleset: unable to apply ruleset /home/test/dev to
/home/test/dev'
+ [ -x /usr/bin/logger ]
+ logger 'scponlyc: WARNING: devfs_apply_ruleset: unable to apply
ruleset /home/test/dev to /home/test/dev'
+ echo 'scponlyc: WARNING: devfs_apply_ruleset: unable to apply
ruleset /home/test/dev to /home/test/dev'
scponlyc: WARNING: devfs_apply_ruleset: unable to apply ruleset
/home/test/dev to /home/test/dev
+ return 1
+ /sbin/umount /home/test/dev
+ read USER
+ _return=0
+ [ 0 -ne 0 ]
+ return 0
+ _run_rc_postcmd
+ [ -n '' ]
+ return 0
+ return 0

The following fixes it for me (on 9.0):

Index: rc.subr
===================================================================
--- rc.subr	(revision 201473)
+++ rc.subr	(working copy)
@@ -1378,7 +1378,7 @@
 devfs_set_ruleset()
 {
 	local devdir rs _me
-	[ -n "$1" ] && eval rs=\$$1 || rs=
+	[ -n "$1" ] && eval rs=$1 || rs=
 	[ -n "$2" ] && devdir="-m "$2"" || devdir=
 	_me="devfs_set_ruleset"

@@ -1403,7 +1403,7 @@
 devfs_apply_ruleset()
 {
 	local devdir rs _me
-	[ -n "$1" ] && eval rs=\$$1 || rs=
+	[ -n "$1" ] && eval rs=$1 || rs=
 	[ -n "$2" ] && devdir="-m "$2"" || devdir=
 	_me="devfs_apply_ruleset"

So, my question is, is this a bug or am I not understanding something here?

----
Rob Farmer


More information about the freebsd-rc mailing list