aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2007-08-15 14:49:41 +0000
committerRoy Marples <roy@marples.name>2007-08-15 14:49:41 +0000
commit3950eb6eba585492a9ca31d47d9a59a6e1789a5c (patch)
tree773523573cbad43ca473dae817222435890ca420
parent7d68200f2443fc37809698d612fe6278a8f18016 (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--ChangeLog2
-rwxr-xr-xinit.d/halt.sh14
-rwxr-xr-xinit.d/netmount1
-rwxr-xr-xsh.BSD/init.sh8
-rwxr-xr-xsh.Linux/init.sh8
-rwxr-xr-xsh/gendepends.sh4
-rw-r--r--src/librc-depend.c93
-rw-r--r--src/rc-misc.h3
-rw-r--r--src/rc.h2
9 files changed, 95 insertions, 40 deletions
diff --git a/ChangeLog b/ChangeLog
index 21525706..354f36e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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"
diff --git a/src/rc.h b/src/rc.h
index 829f8b95..8f73fca9 100644
--- a/src/rc.h
+++ b/src/rc.h
@@ -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
{