chiark / gitweb /
manager: link ~/.local/share/systemd/session to ~/.config/systemd/session if possible
[elogind.git] / src / manager.c
index f6f205fac8aefc6383516b4530ee0cd7f7bd82fd..5d88875984179949c3f9f80a79c3d1b8fe05db97 100644 (file)
@@ -163,6 +163,16 @@ static char** session_dirs(void) {
         } else if (home) {
                 if (asprintf(&data_home, "%s/.local/share/systemd/session", home) < 0)
                         goto fail;
+
+                /* There is really no need for two unit dirs in $HOME,
+                 * except to be fully compliant with the XDG spec. We
+                 * now try to link the two dirs, so that we can
+                 * minimize disk seeks a little. Further down we'll
+                 * then filter out this link, if it is actually is
+                 * one. */
+
+                mkdir_parents(data_home, 0777);
+                symlink("../../../.config/systemd/session", data_home);
         }
 
         if ((e = getenv("XDG_DATA_DIRS")))
@@ -283,15 +293,33 @@ static int manager_find_paths(Manager *m) {
                 }
         }
 
+        if (m->unit_path)
+                if (!strv_path_canonicalize(m->unit_path))
+                        return -ENOMEM;
+
+        if (m->sysvinit_path)
+                if (!strv_path_canonicalize(m->sysvinit_path))
+                        return -ENOMEM;
+
+        if (m->sysvrcnd_path)
+                if (!strv_path_canonicalize(m->sysvrcnd_path))
+                        return -ENOMEM;
+
         strv_uniq(m->unit_path);
         strv_uniq(m->sysvinit_path);
         strv_uniq(m->sysvrcnd_path);
 
-        assert(!strv_isempty(m->unit_path));
-        if (!(t = strv_join(m->unit_path, "\n\t")))
-                return -ENOMEM;
-        log_debug("Looking for unit files in:\n\t%s", t);
-        free(t);
+        if (!strv_isempty(m->unit_path)) {
+
+                if (!(t = strv_join(m->unit_path, "\n\t")))
+                        return -ENOMEM;
+                log_debug("Looking for unit files in:\n\t%s", t);
+                free(t);
+        } else {
+                log_debug("Ignoring unit files.");
+                strv_free(m->unit_path);
+                m->unit_path = NULL;
+        }
 
         if (!strv_isempty(m->sysvinit_path)) {
 
@@ -300,8 +328,11 @@ static int manager_find_paths(Manager *m) {
 
                 log_debug("Looking for SysV init scripts in:\n\t%s", t);
                 free(t);
-        } else
+        } else {
                 log_debug("Ignoring SysV init scripts.");
+                strv_free(m->sysvinit_path);
+                m->sysvinit_path = NULL;
+        }
 
         if (!strv_isempty(m->sysvrcnd_path)) {
 
@@ -310,8 +341,11 @@ static int manager_find_paths(Manager *m) {
 
                 log_debug("Looking for SysV rcN.d links in:\n\t%s", t);
                 free(t);
-        } else
+        } else {
                 log_debug("Ignoring SysV rcN.d links.");
+                strv_free(m->sysvrcnd_path);
+                m->sysvrcnd_path = NULL;
+        }
 
         return 0;
 }