chiark / gitweb /
fstab-generator: support fstab=/rd.fstab= kernel cmdline
[elogind.git] / src / core / unit.c
index 1f1a5314f7e4e5820ae5a3517d687b7fc5a85a9d..4cffc57793723c612cf1303bd5e0c702e28625e3 100644 (file)
@@ -399,6 +399,7 @@ void unit_free(Unit *u) {
         free(u->description);
         strv_free(u->documentation);
         free(u->fragment_path);
+        free(u->source_path);
         free(u->instance);
 
         set_free_free(u->names);
@@ -682,6 +683,9 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
         if (u->fragment_path)
                 fprintf(f, "%s\tFragment Path: %s\n", prefix, u->fragment_path);
 
+        if (u->source_path)
+                fprintf(f, "%s\tSource Path: %s\n", prefix, u->source_path);
+
         if (u->job_timeout > 0)
                 fprintf(f, "%s\tJob Timeout: %s\n", prefix, format_timespan(timespan, sizeof(timespan), u->job_timeout));
 
@@ -1831,20 +1835,12 @@ int set_unit_path(const char *p) {
 }
 
 char *unit_dbus_path(Unit *u) {
-        char *p, *e;
-
         assert(u);
 
         if (!u->id)
                 return NULL;
 
-        if (!(e = bus_path_escape(u->id)))
-                return NULL;
-
-        p = strappend("/org/freedesktop/systemd1/unit/", e);
-        free(e);
-
-        return p;
+        return unit_dbus_path_from_name(u->id);
 }
 
 int unit_add_cgroup(Unit *u, CGroupBonding *b) {
@@ -2575,11 +2571,11 @@ void unit_status_printf(Unit *u, const char *status, const char *format, ...) {
 }
 
 bool unit_need_daemon_reload(Unit *u) {
+        struct stat st;
+
         assert(u);
 
         if (u->fragment_path) {
-                struct stat st;
-
                 zero(st);
                 if (stat(u->fragment_path, &st) < 0)
                         /* What, cannot access this anymore? */
@@ -2590,8 +2586,15 @@ bool unit_need_daemon_reload(Unit *u) {
                         return true;
         }
 
-        if (UNIT_VTABLE(u)->need_daemon_reload)
-                return UNIT_VTABLE(u)->need_daemon_reload(u);
+        if (u->source_path) {
+                zero(st);
+                if (stat(u->source_path, &st) < 0)
+                        return true;
+
+                if (u->source_mtime > 0 &&
+                    timespec_load(&st.st_mtim) != u->source_mtime)
+                        return true;
+        }
 
         return false;
 }