chiark / gitweb /
service: check whether sysv scripts where changed
authorLennart Poettering <lennart@poettering.net>
Wed, 15 Jun 2011 13:34:19 +0000 (15:34 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 21 Jun 2011 17:29:45 +0000 (19:29 +0200)
man/systemd.exec.xml
src/service.c
src/service.h
src/unit.c
src/unit.h

index 9f71492bc15b0db81fdfdfbd40d91f06baaec9b5..ffc257383d7bf21d84259e67ed62b8cee432ee6b 100644 (file)
                                 removed. If the list of capabilities
                                 is prefixed with ~ all but the listed
                                 capabilities will be included, the
                                 removed. If the list of capabilities
                                 is prefixed with ~ all but the listed
                                 capabilities will be included, the
-                                effect of this assignment
+                                effect of the assignment
                                 inverted. Note that this option does
                                 not actually set or unset any
                                 capabilities in the effective,
                                 inverted. Note that this option does
                                 not actually set or unset any
                                 capabilities in the effective,
index 62027f3a2eac56ac11d003c2c972b690247f845a..4ee7900e0833f408d49fa53436382b1e0c8efb12 100644 (file)
@@ -470,6 +470,7 @@ static int service_load_sysv_path(Service *s, const char *path) {
                 LSB_DESCRIPTION
         } state = NORMAL;
         char *short_description = NULL, *long_description = NULL, *chkconfig_description = NULL, *description;
                 LSB_DESCRIPTION
         } state = NORMAL;
         char *short_description = NULL, *long_description = NULL, *chkconfig_description = NULL, *description;
+        struct stat st;
 
         assert(s);
         assert(path);
 
         assert(s);
         assert(path);
@@ -481,12 +482,26 @@ static int service_load_sysv_path(Service *s, const char *path) {
                 goto finish;
         }
 
                 goto finish;
         }
 
+        zero(st);
+        if (fstat(fileno(f), &st) < 0) {
+                r = -errno;
+                goto finish;
+        }
+
         free(s->sysv_path);
         if (!(s->sysv_path = strdup(path))) {
                 r = -ENOMEM;
                 goto finish;
         }
 
         free(s->sysv_path);
         if (!(s->sysv_path = strdup(path))) {
                 r = -ENOMEM;
                 goto finish;
         }
 
+        s->sysv_mtime = timespec_load(&st.st_mtim);
+
+        if (null_or_empty(&st)) {
+                u->meta.load_state = UNIT_MASKED;
+                r = 0;
+                goto finish;
+        }
+
         while (!feof(f)) {
                 char l[LINE_MAX], *t;
 
         while (!feof(f)) {
                 char l[LINE_MAX], *t;
 
@@ -3212,6 +3227,29 @@ static void service_reset_failed(Unit *u) {
         s->failure = false;
 }
 
         s->failure = false;
 }
 
+static bool service_need_daemon_reload(Unit *u) {
+        Service *s = SERVICE(u);
+
+        assert(s);
+
+#ifdef HAVE_SYSV_COMPAT
+        if (s->sysv_path) {
+                struct stat st;
+
+                zero(st);
+                if (stat(s->sysv_path, &st) < 0)
+                        /* What, cannot access this anymore? */
+                        return true;
+
+                if (s->sysv_mtime > 0 &&
+                    timespec_load(&st.st_mtim) != s->sysv_mtime)
+                        return true;
+        }
+#endif
+
+        return false;
+}
+
 static int service_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
         Service *s = SERVICE(u);
         int r = 0;
 static int service_kill(Unit *u, KillWho who, KillMode mode, int signo, DBusError *error) {
         Service *s = SERVICE(u);
         int r = 0;
@@ -3361,6 +3399,8 @@ const UnitVTable service_vtable = {
 
         .reset_failed = service_reset_failed,
 
 
         .reset_failed = service_reset_failed,
 
+        .need_daemon_reload = service_need_daemon_reload,
+
         .cgroup_notify_empty = service_cgroup_notify_event,
         .notify_message = service_notify_message,
 
         .cgroup_notify_empty = service_cgroup_notify_event,
         .notify_message = service_notify_message,
 
index 55b9513f48aa3da64e94fef0ef8033faf081286a..e28f74b8988c221a9c5eb690424ad635dd2fc2e3 100644 (file)
@@ -144,6 +144,7 @@ struct Service {
 
         char *sysv_path;
         char *sysv_runlevels;
 
         char *sysv_path;
         char *sysv_runlevels;
+        usec_t sysv_mtime;
 #endif
 
         char *bus_name;
 #endif
 
         char *bus_name;
index 057431c8087a7d17b85fd8cb49374a1a6598a966..87b7edf145824ee735448f6f4d44aa4fe9d6741c 100644 (file)
@@ -2305,21 +2305,25 @@ void unit_status_printf(Unit *u, const char *format, ...) {
 }
 
 bool unit_need_daemon_reload(Unit *u) {
 }
 
 bool unit_need_daemon_reload(Unit *u) {
-        struct stat st;
-
         assert(u);
 
         assert(u);
 
-        if (!u->meta.fragment_path)
-                return false;
+        if (u->meta.fragment_path) {
+                struct stat st;
 
 
-        zero(st);
-        if (stat(u->meta.fragment_path, &st) < 0)
-                /* What, cannot access this anymore? */
-                return true;
+                zero(st);
+                if (stat(u->meta.fragment_path, &st) < 0)
+                        /* What, cannot access this anymore? */
+                        return true;
 
 
-        return
-                u->meta.fragment_mtime &&
-                timespec_load(&st.st_mtim) != u->meta.fragment_mtime;
+                if (u->meta.fragment_mtime > 0 &&
+                    timespec_load(&st.st_mtim) != u->meta.fragment_mtime)
+                        return true;
+        }
+
+        if (UNIT_VTABLE(u)->need_daemon_reload)
+                return UNIT_VTABLE(u)->need_daemon_reload(u);
+
+        return false;
 }
 
 void unit_reset_failed(Unit *u) {
 }
 
 void unit_reset_failed(Unit *u) {
index 1c8cf6387018efed910bcb6353bf3b5498556382..79f15103baaf65cba3c1db22ebf9c1495d27927f 100644 (file)
@@ -317,6 +317,9 @@ struct UnitVTable {
         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
         void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
 
         void (*sigchld_event)(Unit *u, pid_t pid, int code, int status);
         void (*timer_event)(Unit *u, uint64_t n_elapsed, Watch *w);
 
+        /* Check whether unit needs a daemon reload */
+        bool (*need_daemon_reload)(Unit *u);
+
         /* Reset failed state if we are in failed state */
         void (*reset_failed)(Unit *u);
 
         /* Reset failed state if we are in failed state */
         void (*reset_failed)(Unit *u);