aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-rw-r--r--src/librc-depend.c93
-rw-r--r--src/rc-misc.h3
-rw-r--r--src/rc.h2
3 files changed, 72 insertions, 26 deletions
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
{