diff options
author | Roy Marples <roy@marples.name> | 2007-08-15 14:49:41 +0000 |
---|---|---|
committer | Roy Marples <roy@marples.name> | 2007-08-15 14:49:41 +0000 |
commit | 3950eb6eba585492a9ca31d47d9a59a6e1789a5c (patch) | |
tree | 773523573cbad43ca473dae817222435890ca420 | |
parent | 7d68200f2443fc37809698d612fe6278a8f18016 (diff) |
`config /etc/fstab' can now be used in depend() functions to show that
the deptree should be regenerated if /etc/fstab has changed.
-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 { |