Index: etc/rc.subr =================================================================== RCS file: /home/ncvs/src/etc/rc.subr,v retrieving revision 1.13 diff -u -r1.13 rc.subr --- etc/rc.subr 9 Jun 2003 17:31:06 -0000 1.13 +++ etc/rc.subr 1 Aug 2003 23:05:21 -0000 @@ -1033,3 +1033,160 @@ esac fi } + +# devfs_init_rulesets +# Initialize default system supplied rulesets. +# +devfs_init_rulesets() +{ + local rsHide rsBasic rsLogin rsJail _me + rsHide=$devfs_ruleset_hide + rsBasic=$devfs_ruleset_basic + rsLogin=$devfs_ruleset_login + rsJail=$devfs_ruleset_jail + _me="devfs_init_rulesets" + + # Go through this only once + if [ -n "$devfs_rulesets_init" ]; then + debug "$_me: devfs rulesets already initialized" + return + fi + + # Hide: Hide all devices + # + /sbin/devfs rule -s $rsHide delset + /sbin/devfs rule -s $rsHide add hide + + # Basic: Basic devices typically necessary + # + /sbin/devfs rule -s $rsBasic delset + /sbin/devfs rule -s $rsBasic add path null unhide + /sbin/devfs rule -s $rsBasic add path zero unhide + /sbin/devfs rule -s $rsBasic add path random unhide + /sbin/devfs rule -s $rsBasic add path urandom unhide + + # Login: Devices typically needed to support loged-in users + # + /sbin/devfs rule -s $rsLogin delset + /sbin/devfs rule -s $rsLogin add path 'ptyp*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyq*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyr*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptys*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyP*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyQ*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyR*' unhide + /sbin/devfs rule -s $rsLogin add path 'ptyS*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyp*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyq*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyr*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttys*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyP*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyQ*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyR*' unhide + /sbin/devfs rule -s $rsLogin add path 'ttyS*' unhide + /sbin/devfs rule -s $rsLogin add path 'fd/*' unhide + /sbin/devfs rule -s $rsLogin add path stdin unhide + /sbin/devfs rule -s $rsLogin add path stdout unhide + /sbin/devfs rule -s $rsLogin add path stderr unhide + + # Jail: Devices typically usefull in a jail + # + /sbin/devfs rule -s $rsJail add path '*' include $rsHide + /sbin/devfs rule -s $rsJail add path '*' include $rsBasic + /sbin/devfs rule -s $rsJail add path '*' include $rsLogin + + devfs_rulesets_init=1 + debug "$_me: devfs rulesets initialized" +} + +# devfs_set_ruleset ruleset [dir] +# Sets the default ruleset of dir to ruleset. +# Returns non-zero if it could not set it successfully. +# +devfs_set_ruleset() +{ + local devdir rs _me + rs=$1 + [ -n "$2" ] && devdir="-m "$2"" || devdir= + _me="devfs_set_ruleset" + + if [ -z "$rs" ]; then + warn "$_me: you must specify a ruleset number" + return 1 + fi + debug "$_me: setting ruleset ($rs) on mount-point (${devdir#-m })" + if ! /sbin/devfs $devdir ruleset $rs ; then + warn "$_me: unable to set ruleset $rs to ${devdir#-m }" + return 1 + fi + return 0 +} + +# devfs_apply_ruleset ruleset [dir] +# Apply ruleset number $ruleset to the devfs mountpoint $dir. +# Returns 0 on success or non-zero if it could not apply +# the ruleset. +# +devfs_apply_ruleset() +{ + local devdir rs _me + rs=$1 + [ -n "$2" ] && devdir="-m "$2"" || devdir= + _me="devfs_apply_ruleset" + + if [ -z "$rs" ]; then + warn "$_me: you must specify a ruleset" + return 1 + fi + debug "$_me: applying ruleset ($rs) to mount-point (${devdir#-m })" + if ! /sbin/devfs $devdir rule -s $rs applyset ; then + warn "$_me: unable to apply ruleset $rs to ${devdir#-m }" + return 1 + fi + return 0 +} + +# devfs_domount dir [ruleset] +# Mount devfs on dir. If ruleset is specified it is set +# on the mount-point. Returns 0 on success. +# +devfs_domount() +{ + local devdir rs _me + devdir="$1" + [ -n "$2" ] && rs=$2 || rs= + _me="devfs_domount()" + + if [ -z "$devdir" ]; then + warn "$_me: you must specify a mount-point" + return 1 + fi + debug "$_me: mount-point is ($devdir), ruleset is ($rs)" + if ! mount -t devfs dev "$devdir" ; then + warn "$_me: Unable to mount devfs on $devdir" + return 1 + fi + if [ -n "$rs" ]; then + devfs_init_rulesets + devfs_set_ruleset $rs $devdir + fi + return 0 +} + +# devfs_mount_jail dir +# Mounts a devfs file system appropriate for jails +# on the directory dir. Returns non-zero if an error +# occured. +# +devfs_mount_jail() +{ + local jdev _me + jdev="$1" + _me="devfs_mount_jail" + + if ! devfs_domount "$jdev" $devfs_ruleset_jail; then + warn "$_me: devfs was not mounted on $jdev" + return 1 + fi + return 0 +}