Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Nov 2015 00:30:33 +0000 (UTC)
From:      Devin Teske <dteske@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r290693 - head/usr.sbin/bsdconfig/share
Message-ID:  <201511120030.tAC0UXOk004720@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dteske
Date: Thu Nov 12 00:30:33 2015
New Revision: 290693
URL: https://svnweb.freebsd.org/changeset/base/290693

Log:
  Add support for "rc.conf.d" file(s).
  
  Differential Revision:	https://reviews.freebsd.org/D3551
  Reviewed by:	allanjude
  MFC after:	1 week
  X-MFC-to:	stable/10
  X-MFC-with:	290337
  Relnotes:	yes

Modified:
  head/usr.sbin/bsdconfig/share/sysrc.subr

Modified: head/usr.sbin/bsdconfig/share/sysrc.subr
==============================================================================
--- head/usr.sbin/bsdconfig/share/sysrc.subr	Thu Nov 12 00:26:47 2015	(r290692)
+++ head/usr.sbin/bsdconfig/share/sysrc.subr	Thu Nov 12 00:30:33 2015	(r290693)
@@ -1,6 +1,6 @@
 if [ ! "$_SYSRC_SUBR" ]; then _SYSRC_SUBR=1
 #
-# Copyright (c) 2006-2012 Devin Teske
+# Copyright (c) 2006-2015 Devin Teske
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -204,6 +204,100 @@ f_sysrc_get()
 	)
 }
 
+# f_sysrc_service_configs [-a|-p] $name [$var_to_set]
+#
+# Get a list of optional `rc.conf.d' entries sourced by system `rc.d' script
+# $name (see rc.subr(8) for additional information on `rc.conf.d'). If $name
+# exists in `/etc/rc.d' or $local_startup directories and is an rc(8) script
+# the result is a space separated list of `rc.conf.d' entries sourced by the
+# $name `rc.d' script. Otherwise, if $name exists as a binary `rc.d' script,
+# the result is ``/etc/rc.conf.d/$name /usr/local/etc/rc.conf.d/$name''. The
+# result is NULL if $name does not exist.
+#
+# If $var_to_set is missing or NULL, output is to standard out. Returns success
+# if $name was found, failure otherwise.
+#
+# If `-a' flag is given and $var_to_set is non-NULL, append result to value of
+# $var_to_set rather than overwriting current contents.
+#
+# If `-p' flag is given and $var_to_set is non-NULL, prepend result to value of
+# $var_to_set rather than overwriting current contents.
+#
+# NB: The `-a' and `-p' option flags are mutually exclusive.
+#
+f_sysrc_service_configs()
+{
+	local OPTIND=1 OPTARG __flag __append= __prepend=
+	local __local_startup __dir __spath __stype __names=
+
+	while getopts ap __flag; do
+		case "$__flag" in
+		a) __append=1 __prepend= ;;
+		p) __prepend=1 __append= ;;
+		esac
+	done
+	shift $(( $OPTIND - 1 ))
+
+	[ $# -gt 0 ] || return $FAILURE
+	local __sname="$1" __var_to_set="$2"
+
+	__local_startup=$( f_sysrc_get local_startup )
+	for __dir in /etc/rc.d $__local_startup; do
+		__spath="$__dir/$__sname"
+		[ -f "$__spath" -a -x "$__spath" ] || __spath= continue
+		break
+	done
+	[ "$__spath" ] || return $FAILURE
+
+	__stype=$( file -b "$__spath" 2> /dev/null )
+	case "$__stype" in
+	*"shell script"*)
+		__names=$( exec 9<&1 1>&- 2>&-
+			last_name=
+			print_name() {
+				local name="$1"
+				[ "$name" = "$last_name" ] && return
+				echo "$name" >&9
+				last_name="$name"
+			}
+			eval "$( awk '{
+				gsub(/load_rc_config /, "print_name ")
+				gsub(/run_rc_command /, ": ")
+				print
+			}' "$__spath" )"
+		) ;;
+	*)
+		__names="$__sname"
+	esac
+
+	local __name __test_path __configs=
+	for __name in $__names; do
+		for __dir in /etc/rc.d $__local_startup; do
+			__test_path="${__dir%/rc.d}/rc.conf.d/$__name"
+			[ -d "$__test_path" ] ||
+				__configs="$__configs $__test_path" continue
+			for __test_path in "$__test_path"/*; do
+				[ -f "$__test_path" ] || continue
+				__configs="$__configs $__test_path"
+			done	
+		done
+	done
+	__configs="${__configs# }"
+
+	if [ "$__var_to_set" ]; then
+		local __cur=
+		[ "$__append" -o "$__prepend" ] &&
+			f_getvar "$__var_to_set" __cur
+		[ "$__append"  ] && __configs="$__cur{$__cur:+ }$__configs"
+		[ "$__prepend" ] && __configs="$__configs${__cur:+ }$__cur"
+		setvar "$__var_to_set" "$__configs"
+	else
+		echo "$__configs"
+	fi
+
+	return $SUCCESS
+}
+
 # f_sysrc_get_default $varname
 #
 # Get a system configuration default setting from the default rc.conf(5) file



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