]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
portable: create/remove the 'attached' unit file directory when we can
authorLennart Poettering <lennart@poettering.net>
Mon, 8 Oct 2018 15:44:52 +0000 (17:44 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 8 Oct 2018 16:49:45 +0000 (18:49 +0200)
Let's not litter the system with this unit directory unnecessarily, and
let's try to create/remove it when necessary.

src/portable/portable.c

index 49eaf84b1aa8175aa42e11d6a9f1fac18710751d..ca8043b41eeca0da4821fd34c4358061812c3807 100644 (file)
@@ -850,14 +850,24 @@ static int attach_unit_file(
         assert(PORTABLE_METADATA_IS_UNIT(m));
 
         where = attached_path(paths, flags);
-        path = strjoina(where, "/", m->name);
 
+        (void) mkdir_parents(where, 0755);
+        if (mkdir(where, 0755) < 0) {
+                if (errno != EEXIST)
+                        return -errno;
+        } else
+                (void) portable_changes_add(changes, n_changes, PORTABLE_MKDIR, where, NULL);
+
+        path = strjoina(where, "/", m->name);
         dropin_dir = strjoin(path, ".d");
         if (!dropin_dir)
                 return -ENOMEM;
 
-        (void) mkdir_p(dropin_dir, 0755);
-        (void) portable_changes_add(changes, n_changes, PORTABLE_MKDIR, dropin_dir, NULL);
+        if (mkdir(dropin_dir, 0755) < 0) {
+                if (errno != EEXIST)
+                        return -errno;
+        } else
+                (void) portable_changes_add(changes, n_changes, PORTABLE_MKDIR, dropin_dir, NULL);
 
         /* We install the drop-ins first, and the actual unit file last to achieve somewhat atomic behaviour if PID 1
          * is reloaded while we are creating things here: as long as only the drop-ins exist the unit doesn't exist at
@@ -1291,6 +1301,10 @@ int portable_detach(
                         portable_changes_add(changes, n_changes, PORTABLE_UNLINK, sl, NULL);
         }
 
+        /* Try to remove the unit file directory, if we can */
+        if (rmdir(where) >= 0)
+                portable_changes_add(changes, n_changes, PORTABLE_UNLINK, where, NULL);
+
         return ret;
 
 not_found: