diff options
Diffstat (limited to 'src/rc')
-rw-r--r-- | src/rc/builtins.h | 4 | ||||
-rw-r--r-- | src/rc/rc-applets.c | 6 | ||||
-rw-r--r-- | src/rc/rc-depend.c | 63 | ||||
-rw-r--r-- | src/rc/rc-status.c | 6 | ||||
-rw-r--r-- | src/rc/rc-update.c | 11 | ||||
-rw-r--r-- | src/rc/rc.c | 6 | ||||
-rw-r--r-- | src/rc/runscript.c | 8 |
7 files changed, 67 insertions, 37 deletions
diff --git a/src/rc/builtins.h b/src/rc/builtins.h index 0cd03d3c..d7fab143 100644 --- a/src/rc/builtins.h +++ b/src/rc/builtins.h @@ -1,5 +1,5 @@ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -39,7 +39,7 @@ int start_stop_daemon(int, char **); void run_applets(int, char **); /* Handy function so we can wrap einfo around our deptree */ -RC_DEPTREE *_rc_deptree_load (int *); +RC_DEPTREE *_rc_deptree_load (int, int *); /* Test to see if we can see pid 1 or not */ bool _rc_can_find_pids(void); diff --git a/src/rc/rc-applets.c b/src/rc/rc-applets.c index 57d03446..3d6ce90c 100644 --- a/src/rc/rc-applets.c +++ b/src/rc/rc-applets.c @@ -7,7 +7,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -451,7 +451,7 @@ void run_applets(int argc, char **argv) if (argc < 3) exit (EXIT_FAILURE); while (i < argc) { - if (!rc_newer_than(argv[1], argv[i++])) + if (!rc_newer_than(argv[1], argv[i++], NULL, NULL)) exit(EXIT_SUCCESS); } exit(EXIT_FAILURE); @@ -461,7 +461,7 @@ void run_applets(int argc, char **argv) if (argc < 3) exit (EXIT_FAILURE); while (i < argc) { - if (!rc_newer_than(argv[1], argv[i++])) + if (!rc_newer_than(argv[1], argv[i++], NULL, NULL)) exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); diff --git a/src/rc/rc-depend.c b/src/rc/rc-depend.c index 1cd32ffd..5d10da10 100644 --- a/src/rc/rc-depend.c +++ b/src/rc/rc-depend.c @@ -4,7 +4,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -29,17 +29,21 @@ * SUCH DAMAGE. */ -#include <sys/types.h> #include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> -#include <getopt.h> #include <errno.h> #include <fcntl.h> +#include <getopt.h> +#include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <unistd.h> +#include <utime.h> #include "builtins.h" #include "einfo.h" @@ -49,13 +53,19 @@ extern const char *applet; RC_DEPTREE * -_rc_deptree_load(int *regen) { +_rc_deptree_load(int force, int *regen) { int fd; int retval; int serrno = errno; int merrno; - - if (rc_deptree_update_needed()) { + time_t t; + char file[PATH_MAX]; + struct stat st; + struct utimbuf ut; + FILE *fp; + + t = 0; + if (rc_deptree_update_needed(file, &t) || force != 0) { /* Test if we have permission to update the deptree */ fd = open(RC_DEPTREE_CACHE, O_WRONLY); merrno = errno; @@ -67,8 +77,30 @@ _rc_deptree_load(int *regen) { if (regen) *regen = 1; ebegin("Caching service dependencies"); - retval = rc_deptree_update(); - eend (retval ? 0 : -1, "Failed to update the dependency tree"); + retval = rc_deptree_update() ? 0 : -1; + eend (retval, "Failed to update the dependency tree"); + + if (retval == 0) { + stat(RC_DEPTREE_CACHE, &st); + if (st.st_mtime < t) { + eerror("Clock skew detected with `%s'", file); + eerrorn("Adjusting mtime of `" RC_DEPTREE_CACHE + "' to %s", ctime(&t)); + fp = fopen(RC_DEPTREE_SKEWED, "w"); + if (fp != NULL) { + fprintf(fp, RC_DEPTREE_SKEWED "\n"); + fclose(fp); + } + ut.actime = t; + ut.modtime = t; + utime(RC_DEPTREE_CACHE, &ut); + } else { + if (exists(RC_DEPTREE_SKEWED)) + unlink(RC_DEPTREE_SKEWED); + } + } + if (force == -1 && regen != NULL) + *regen = retval; } return rc_deptree_load(); } @@ -104,9 +136,8 @@ rc_depend(int argc, char **argv) RC_STRINGLIST *depends; RC_STRING *s; RC_DEPTREE *deptree = NULL; - int options = RC_DEP_TRACE; + int options = RC_DEP_TRACE, update = 0; bool first = true; - bool update = false; char *runlevel = xstrdup(getenv("RC_RUNLEVEL")); int opt; char *token; @@ -130,7 +161,7 @@ rc_depend(int argc, char **argv) rc_stringlist_add(types, token); break; case 'u': - update = true; + update = 1; break; case 'T': options &= RC_DEP_TRACE; @@ -140,15 +171,7 @@ rc_depend(int argc, char **argv) } } - if (update) { - ebegin("Caching service dependencies"); - update = rc_deptree_update(); - eend(update ? 0 : -1, "%s: %s", applet, strerror(errno)); - if (!update) - eerrorx("Failed to update the dependency tree"); - } - - if (!(deptree = _rc_deptree_load(NULL))) + if (!(deptree = _rc_deptree_load(update, NULL))) eerrorx("failed to load deptree"); if (!runlevel) diff --git a/src/rc/rc-status.c b/src/rc/rc-status.c index 619b68c3..88018262 100644 --- a/src/rc/rc-status.c +++ b/src/rc/rc-status.c @@ -4,7 +4,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -140,7 +140,7 @@ print_services(const char *runlevel, RC_STRINGLIST *svcs) if (!svcs) return; if (!deptree) - deptree = _rc_deptree_load(NULL); + deptree = _rc_deptree_load(0, NULL); if (!deptree) { TAILQ_FOREACH(s, svcs, entries) if (!runlevel || @@ -260,7 +260,7 @@ rc_status(int argc, char **argv) } /* Output the services in the order in which they would start */ - deptree = _rc_deptree_load(NULL); + deptree = _rc_deptree_load(0, NULL); TAILQ_FOREACH(l, levels, entries) { print_level(l->value); diff --git a/src/rc/rc-update.c b/src/rc/rc-update.c index 64e24000..5a0264cd 100644 --- a/src/rc/rc-update.c +++ b/src/rc/rc-update.c @@ -4,7 +4,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -138,11 +138,13 @@ show(RC_STRINGLIST *runlevels, bool verbose) "Usage: rc-update [options] add service <runlevel>\n" \ " rc-update [options] del service <runlevel>\n" \ " rc-update [options] show" -#define getoptstring getoptstring_COMMON +#define getoptstring "u" getoptstring_COMMON static const struct option longopts[] = { + { "update", 0, NULL, 'u' }, longopts_COMMON }; static const char * const longopts_help[] = { + "Force an update of the dependency tree", longopts_help_COMMON }; #include "_usage.c" @@ -167,8 +169,11 @@ rc_update(int argc, char **argv) int ret; while ((opt = getopt_long(argc, argv, getoptstring, - longopts, (int *) 0)) != -1) + longopts, (int *)0)) != -1) switch (opt) { + case 'u': + _rc_deptree_load(-1, &ret); + return ret; case_RC_COMMON_GETOPT } diff --git a/src/rc/rc.c b/src/rc/rc.c index d0748a99..b5459601 100644 --- a/src/rc/rc.c +++ b/src/rc/rc.c @@ -9,7 +9,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -944,8 +944,10 @@ main(int argc, char **argv) } /* Load our deptree */ - if ((deptree = _rc_deptree_load(®en)) == NULL) + if ((deptree = _rc_deptree_load(0, ®en)) == NULL) eerrorx("failed to load deptree"); + if (exists(RC_DEPTREE_SKEWED)) + ewarn("WARNING: clock skew detected!"); /* Clean the failed services state dir */ clean_failed(); diff --git a/src/rc/runscript.c b/src/rc/runscript.c index e5077d8d..b7e9f352 100644 --- a/src/rc/runscript.c +++ b/src/rc/runscript.c @@ -4,7 +4,7 @@ */ /* - * Copyright 2007-2008 Roy Marples <roy@marples.name> + * Copyright 2007-2009 Roy Marples <roy@marples.name> * All rights reserved * Redistribution and use in source and binary forms, with or without @@ -748,7 +748,7 @@ svc_start(bool deps) depoptions |= RC_DEP_STRICT; if (deps) { - if (!deptree && ((deptree = _rc_deptree_load(NULL)) == NULL)) + if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) eerrorx("failed to load deptree"); if (!types_b) setup_types(); @@ -977,7 +977,7 @@ svc_stop(bool deps) if (rc_conf_yesno("rc_depend_strict") || errno == ENOENT) depoptions |= RC_DEP_STRICT; - if (!deptree && ((deptree = _rc_deptree_load(NULL)) == NULL)) + if (!deptree && ((deptree = _rc_deptree_load(0, NULL)) == NULL)) eerrorx("failed to load deptree"); if (!types_m) @@ -1368,7 +1368,7 @@ runscript(int argc, char **argv) depoptions |= RC_DEP_STRICT; if (!deptree && - ((deptree = _rc_deptree_load(NULL)) == NULL)) + ((deptree = _rc_deptree_load(0, NULL)) == NULL)) eerrorx("failed to load deptree"); tmplist = rc_stringlist_new(); |