]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tmpfiles: Allow create symlink on directories (#6039)
authorWilliam Douglas <william.r.douglas@gmail.com>
Wed, 9 Aug 2017 15:53:03 +0000 (08:53 -0700)
committerLennart Poettering <lennart@poettering.net>
Wed, 9 Aug 2017 15:53:03 +0000 (17:53 +0200)
Currently if tmpfiles is run with force on symlink creation but there already
exists a directory at that location, the creation will fail. This change
updates the behavior to remove the directory with rm_fr and then attempts to
create the symlink again.

man/tmpfiles.d.xml
src/tmpfiles/tmpfiles.c

index 555e9c2d56c854d8eb3af02bc2eb6cfd53d37da2..91434d7b7ab8202004a3c461346f645f4b16103a 100644 (file)
@@ -273,13 +273,14 @@ L     /tmp/foobar -    -    -    -   /dev/null</programlisting>
           <term><varname>L</varname></term>
           <term><varname>L+</varname></term>
           <listitem><para>Create a symlink if it does not exist
-          yet. If suffixed with <varname>+</varname> and a file
-          already exists where the symlink is to be created, it will
-          be removed and be replaced by the symlink. If the argument
-          is omitted, symlinks to files with the same name residing in
-          the directory <filename>/usr/share/factory/</filename> are
-          created. Note that permissions and ownership on symlinks
-          are ignored.</para></listitem>
+          yet. If suffixed with <varname>+</varname> and a file or
+          directory already exists where the symlink is to be created,
+          it will be removed and be replaced by the symlink. If the
+          argument is omitted, symlinks to files with the same name
+          residing in the directory
+          <filename>/usr/share/factory/</filename> are created. Note
+          that permissions and ownership on symlinks are ignored.
+          </para></listitem>
         </varlistentry>
 
         <varlistentry>
index 9419c99e28e93e0d3465fd56a09cb1d74686d456..2ab0cd127011d02b751223beae39af230fa6cd2b 100644 (file)
@@ -1353,6 +1353,15 @@ static int create_item(Item *i) {
                                         r = symlink_atomic(resolved, i->path);
                                         mac_selinux_create_file_clear();
 
+                                        if (IN_SET(r, -EEXIST, -ENOTEMPTY)) {
+                                                r = rm_rf(i->path, REMOVE_ROOT|REMOVE_PHYSICAL);
+                                                if (r < 0)
+                                                        return log_error_errno(r, "rm -fr %s failed: %m", i->path);
+
+                                                mac_selinux_create_file_prepare(i->path, S_IFLNK);
+                                                r = symlink(resolved, i->path) < 0 ? -errno : 0;
+                                                mac_selinux_create_file_clear();
+                                        }
                                         if (r < 0)
                                                 return log_error_errno(r, "symlink(%s, %s) failed: %m", resolved, i->path);