diff options
| -rw-r--r-- | ChangeLog | 2 | ||||
| -rwxr-xr-x | init.d/halt.sh | 14 | ||||
| -rwxr-xr-x | init.d/netmount | 1 | ||||
| -rwxr-xr-x | sh.BSD/init.sh | 8 | ||||
| -rwxr-xr-x | sh.Linux/init.sh | 8 | ||||
| -rwxr-xr-x | sh/gendepends.sh | 4 | ||||
| -rw-r--r-- | src/librc-depend.c | 93 | ||||
| -rw-r--r-- | src/rc-misc.h | 3 | ||||
| -rw-r--r-- | src/rc.h | 2 | 
9 files changed, 95 insertions, 40 deletions
@@ -3,6 +3,8 @@    15 Aug 2007; Roy Marples <uberlord@gentoo.org>: +    `config /etc/fstab' can now be used in depend() functions to show that +    the deptree should be regenerated if /etc/fstab has changed.      Add bzr port 4155 to /etc/services, #188970 thanks to Andrew Cowie.    08 Aug 2007; Roy Marples <uberlord@gentoo.org>: diff --git a/init.d/halt.sh b/init.d/halt.sh index dfcacedd..2a735613 100755 --- a/init.d/halt.sh +++ b/init.d/halt.sh @@ -42,15 +42,17 @@ if mountinfo "${RC_SVCDIR}" >/dev/null && [ -w "${RC_LIBDIR}" ]  ; then  		fuser -k ${f_opts} "${svcdir}" 1>/dev/null 2>/dev/null  		sleep 2  	fi -	cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/softlevel \ -		"${RC_SVCDIR}"/nettree "${RC_LIBDIR}" 2>/dev/null +	cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/depconfig \ +		"${RC_SVCDIR}"/softlevel "${RC_SVCDIR}"/nettree \ +		"${RC_LIBDIR}" 2>/dev/null  	umount "${RC_SVCDIR}"  	rm -rf "${RC_SVCDIR}"/*  	# Pipe errors to /dev/null as we may have future timestamps -	cp -p "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/softlevel \ -		"${RC_LIBDIR}"/nettree "${RC_SVCDIR}" 2>/dev/null -	rm -f "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/softlevel \ -		"${RC_LIBDIR}"/nettree +	cp -p "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/depconfig \ +		"${RC_LIBDIR}"/softlevel "${RC_LIBDIR}"/nettree \ +		"${RC_SVCDIR}" 2>/dev/null +	rm -f "${RC_LIBDIR}"/deptree "${RC_LIBDIR}"/depconfig \ +		"${RC_LIBDIR}"/softlevel "${RC_LIBDIR}"/nettree  	# Release the memory disk if we used it  	case "${mnt}" in  		"/dev/md"[0-9]*) mdconfig -d -u "${mnt#/dev/md*}" ;; diff --git a/init.d/netmount b/init.d/netmount index 61b7a6c6..2b0af2fe 100755 --- a/init.d/netmount +++ b/init.d/netmount @@ -25,6 +25,7 @@ depend() {  		myuse="${myuse} ${pmap}"  	fi +	config /etc/fstab  	need net ${myneed}  	use afc-client amd autofs dns nfs nfsmount ${myuse}  } diff --git a/sh.BSD/init.sh b/sh.BSD/init.sh index 3da44a33..1c115909 100755 --- a/sh.BSD/init.sh +++ b/sh.BSD/init.sh @@ -22,15 +22,15 @@ mount_svcdir() {  		try mdconfig -a -t malloc -s 1m -u 1  		try newfs /dev/md1  		try mount /dev/md1 "${RC_LIBDIR}"/tmp -		cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/nettree \ -			"${RC_LIBDIR}"/tmp 2>/dev/null +		cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/depconfig \ +			"${RC_SVCDIR}"/nettree "${RC_LIBDIR}"/tmp 2>/dev/null  	fi  	try mdconfig -a -t malloc -s "${RC_SVCSIZE:-1024}"k -u 0  	try newfs -b 4096 -i 1024 -n /dev/md0  	try mount -o rw,noexec,nosuid /dev/md0 "${RC_SVCDIR}"  	if ${dotmp} ; then -		cp -p "${RC_LIBDIR}"/tmp/deptree "${RC_LIBDIR}"/tmp/nettree \ -			"${RC_SVCDIR}" 2>/dev/null +		cp -p "${RC_LIBDIR}"/tmp/deptree "${RC_LIBDIR}"/tmp/depconfig \ +			"${RC_LIBDIR}"/tmp/nettree "${RC_SVCDIR}" 2>/dev/null  		try umount "${RC_LIBDIR}"/tmp  		try mdconfig -d -u 1  	fi diff --git a/sh.Linux/init.sh b/sh.Linux/init.sh index a5490d9b..48ddf548 100755 --- a/sh.Linux/init.sh +++ b/sh.Linux/init.sh @@ -65,13 +65,13 @@ mount_svcdir() {  	if [ -e "${RC_SVCDIR}"/deptree ] ; then  		dotmp=true  		try mount -n -t "${fs}" -o rw "${devtmp}" "${RC_LIBDIR}"/tmp -		cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/nettree \ -			"${RC_LIBDIR}"/tmp 2>/dev/null +		cp -p "${RC_SVCDIR}"/deptree "${RC_SVCDIR}"/depconfig \ +			"${RC_SVCDIR}"/nettree "${RC_LIBDIR}"/tmp 2>/dev/null  	fi  	try mount -n ${mntcmd}  	if ${dotmp} ; then -		cp -p "${RC_LIBDIR}"/tmp/deptree "${RC_LIBDIR}"/tmp/nettree \ -			"${RC_SVCDIR}" 2>/dev/null +		cp -p "${RC_LIBDIR}"/tmp/deptree "${RC_LIBDIR}"/tmp/depconfig \ +			"${RC_LIBDIR}"/tmp/nettree "${RC_SVCDIR}" 2>/dev/null  		try umount -n "${RC_LIBDIR}"/tmp  	fi  } diff --git a/sh/gendepends.sh b/sh/gendepends.sh index c40a80e7..d970fa5d 100755 --- a/sh/gendepends.sh +++ b/sh/gendepends.sh @@ -5,6 +5,9 @@  . /etc/init.d/functions.sh +config() { +	[ -n "$*" ] && echo "${SVCNAME} config $*" >&3 +}  need() {  	[ -n "$*" ] && echo "${SVCNAME} ineed $*" >&3  } @@ -49,6 +52,7 @@ for SVCNAME in * ; do  		depend  		# Add any user defined depends +		config ${RC_CONFIG}  		need ${RC_NEED}  		use ${RC_USE}  		before ${RC_BEFORE} diff --git a/src/librc-depend.c b/src/librc-depend.c index b51fc3cb..c3ccaf75 100644 --- a/src/librc-depend.c +++ b/src/librc-depend.c @@ -6,7 +6,9 @@  #include "librc.h" -#define GENDEP	RC_LIBDIR "/sh/gendepends.sh" +#define GENDEP          RC_LIBDIR "/sh/gendepends.sh" + +#define RC_DEPCONFIG    RC_SVCDIR "/depconfig"  static const char *bootlevel = NULL; @@ -610,13 +612,14 @@ int rc_update_deptree (bool force)  	char *service;  	char *type;  	char *depend; +	char **config = NULL;  	int retval = 0;  	FILE *fp;  	rc_depinfo_t *deptree;  	rc_depinfo_t *depinfo;  	rc_depinfo_t *di;  	rc_depinfo_t *last_depinfo = NULL; -	rc_deptype_t *deptype; +	rc_deptype_t *deptype = NULL;  	rc_deptype_t *dt;  	rc_deptype_t *last_deptype = NULL;  	char buffer[RC_LINEBUFFER]; @@ -632,12 +635,33 @@ int rc_update_deptree (bool force)  			if (mkdir (depdirs[i], 0755) != 0)  				eerrorx ("mkdir `%s': %s", depdirs[i], strerror (errno)); -	if (! force) -		if (is_newer_than (RC_DEPTREE, RC_INITDIR) && -			is_newer_than (RC_DEPTREE, RC_CONFDIR) && -			is_newer_than (RC_DEPTREE, "/etc/rc.conf")) +	/* Quick test to see if anything we use has changed */ +	if (! force &&  +		is_newer_than (RC_DEPTREE, RC_INITDIR) && +		is_newer_than (RC_DEPTREE, RC_CONFDIR) && +		is_newer_than (RC_DEPTREE, "/etc/rc.conf")) +	{ +		bool newer = false; + +		/* Some init scripts dependencies change depending on config files +		 * outside of baselayout, like syslog-ng, so we check those too. */ +		if (! rc_exists (RC_DEPCONFIG))  			return 0; +		config = rc_get_list (NULL, RC_DEPCONFIG); +		STRLIST_FOREACH (config, service, i) { +			if (! is_newer_than (RC_DEPTREE, service)) { +				newer = true; +				break; +			} +		} +		rc_strlist_free (config); +		config = NULL; + +		if (! newer) +			return (0); +	} +  	ebegin ("Caching service dependencies");  	/* Some init scripts need RC_LIBDIR to source stuff @@ -690,28 +714,31 @@ int rc_update_deptree (bool force)  		if (! type || ! depends)  			continue; -		last_deptype = NULL; -		for (deptype = depinfo->depends; deptype; deptype = deptype->next) -		{ -			last_deptype = deptype; -			if (strcmp (deptype->type, type) == 0) -				break; -		} - -		if (! deptype) -		{ -			if (! last_deptype) +		/* Get the type */ +		if (strcmp (type, "config") != 0) { +			last_deptype = NULL; +			for (deptype = depinfo->depends; deptype; deptype = deptype->next)  			{ -				depinfo->depends = rc_xmalloc (sizeof (rc_deptype_t)); -				deptype = depinfo->depends; +				last_deptype = deptype; +				if (strcmp (deptype->type, type) == 0) +					break;  			} -			else + +			if (! deptype)  			{ -				last_deptype->next = rc_xmalloc (sizeof (rc_deptype_t)); -				deptype = last_deptype->next; +				if (! last_deptype) +				{ +					depinfo->depends = rc_xmalloc (sizeof (rc_deptype_t)); +					deptype = depinfo->depends; +				} +				else +				{ +					last_deptype->next = rc_xmalloc (sizeof (rc_deptype_t)); +					deptype = last_deptype->next; +				} +				memset (deptype, 0, sizeof (rc_deptype_t)); +				deptype->type = rc_xstrdup (type);  			} -			memset (deptype, 0, sizeof (rc_deptype_t)); -			deptype->type = rc_xstrdup (type);  		}  		/* Now add each depend to our type. @@ -721,6 +748,11 @@ int rc_update_deptree (bool force)  			if (depend[0] == 0)  				continue; +			if (strcmp (type, "config") == 0) { +				config = rc_strlist_addsort (config, depend); +				continue; +			} +  			/* .sh files are not init scripts */  			len = strlen (depend);  			if (len > 2 && @@ -848,6 +880,19 @@ int rc_update_deptree (bool force)  		fclose (fp);  	} +	/* Save our external config files to disk */ +	if (config) { +		if (! (fp = fopen (RC_DEPCONFIG, "w"))) +			eerror ("fopen `%s': %s", RC_DEPCONFIG, strerror (errno)); +		else +		{ +			STRLIST_FOREACH (config, service, i) +				fprintf (fp, "%s\n", service); +			fclose (fp); +		} +		rc_strlist_free (config); +	} +  	rc_free_deptree (deptree);  	eend (retval, "Failed to update the service dependency tree"); diff --git a/src/rc-misc.h b/src/rc-misc.h index 6ffc868f..7f9b824d 100644 --- a/src/rc-misc.h +++ b/src/rc-misc.h @@ -11,6 +11,9 @@  #  define LIB "lib"  #endif +#define RC_LEVEL_BOOT       "boot" +#define RC_LEVEL_DEFAULT    "default" +  #define RC_LIBDIR	"/" LIB "/rcscripts"  #define RC_SVCDIR	RC_LIBDIR "/init.d"  #define RC_DEPTREE 	RC_SVCDIR "/deptree" @@ -23,11 +23,9 @@  /* Special level names */  #define RC_LEVEL_SYSINIT    "sysinit" -#define RC_LEVEL_BOOT       "boot"  #define RC_LEVEL_SINGLE     "single"  #define RC_LEVEL_SHUTDOWN   "shutdown"  #define RC_LEVEL_REBOOT     "reboot" -#define RC_LEVEL_DEFAULT    "default"  typedef enum  {  | 
