conf/128433: [patch] Add option to allow a full login when doing 'su' in /etc/rc.subr

Volker Theile votdev at
Tue Oct 28 10:10:02 UTC 2008

>Number:         128433
>Category:       conf
>Synopsis:       [patch] Add option to allow a full login when doing 'su' in /etc/rc.subr
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct 28 10:10:01 UTC 2008
>Originator:     Volker Theile
>Release:        FreeBSD 6.4rc1
To allow running an application using a specific user i have to modify the /etc/rc.subr script because the current
implementation does not do a full login when using 'su'. But sometimes it is necessary to do a full login to allow the application to
read/write config data in the user home directory.

To enable a full login when doing a 'su' the application rc-script can be modified the following way:


Please see also

Don't know if this behaviour can be solved another way, but if not, i think it is a useful enhancement. Anyway,
i'm wondering that nobody else had this problem till now.


Try to run transmission daemon as user 'transmission'. It fails to start the daemon because it was not possible to read/write config data in /root/.config/transmission_daemon.

Using the patch a full login will be done when doing 'su' in rc.subr and the daemon will read/write config data in /home/transmission/.config/transmission_daemon

--- rc.subr.orig	2008-10-28 10:01:04.000000000 +0100
+++ rc.subr	2008-10-28 09:56:20.000000000 +0100
@@ -438,6 +438,8 @@
 #				to run the chrooted ${command} with.
 #				Requires /usr to be mounted.
+#	${name}_suopt	n	Command parameter for 'su'. Default is '-m'.
 #	${rc_arg}_cmd	n	If set, use this as the method when invoked;
 #				Otherwise, use default command (see below)
@@ -595,7 +597,8 @@
 	eval _chdir=\$${name}_chdir	_chroot=\$${name}_chroot \
 	    _nice=\$${name}_nice	_user=\$${name}_user \
-	    _group=\$${name}_group	_groups=\$${name}_groups
+	    _group=\$${name}_group	_groups=\$${name}_groups \
+		_suopt=\$${name}_suopt
 	if [ -n "$_user" ]; then	# unset $_user if running as that user
 		if [ "$_user" = "$(eval $IDCMD)" ]; then
@@ -603,6 +606,10 @@
+	if [ -z "$_suopt" ]; then # set default value
+		_suopt="-m"
+	fi
 					# if ${rcvar} is set, and $1 is not
 					# "rcvar", then run
 					#	checkyesno ${rcvar}
@@ -673,7 +680,7 @@
 ${_chdir:+cd $_chdir && }\
 $command $rc_flags $command_args"
 				if [ -n "$_user" ]; then
-				    _doit="su -m $_user -c 'sh -c \"$_doit\"'"
+				    _doit="su $_suopt $_user -c 'sh -c \"$_doit\"'"
 				if [ -n "$_nice" ]; then
 					if [ -z "$_user" ]; then
@@ -852,7 +859,7 @@
 	_cmd="kill -$1 $rc_pid"
 	if [ -n "$_user" ]; then
-		_cmd="su -m ${_user} -c 'sh -c \"${_cmd}\"'"
+		_cmd="su ${_suopt} ${_user} -c 'sh -c \"${_cmd}\"'"
 	echo "$_cmd"


More information about the freebsd-bugs mailing list