]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
ln: port to platforms lacking O_DIRECTORY
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 16 Mar 2019 18:24:19 +0000 (11:24 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 16 Mar 2019 18:24:58 +0000 (11:24 -0700)
* src/ln.c (main): Port to older platforms lacking
support for POSIX.1-2008’s O_DIRECTORY flag (Bug#34876).

src/ln.c

index afdb61a1d3bd4db401d87dd03a0da069e2c88206..a5b012b39a03088f1d4d0d01f8644bf8e3ee9dc9 100644 (file)
--- a/src/ln.c
+++ b/src/ln.c
@@ -610,13 +610,25 @@ main (int argc, char **argv)
           int flags = (O_PATHSEARCH | O_DIRECTORY
                        | (dereference_dest_dir_symlinks ? 0 : O_NOFOLLOW));
           destdir_fd = openat_safer (AT_FDCWD, d, flags);
+          int err = errno;
+          if (!O_DIRECTORY && 0 <= destdir_fd)
+            {
+              struct stat st;
+              err = (fstat (destdir_fd, &st) != 0 ? errno
+                     : S_ISDIR (st.st_mode) ? 0 : ENOTDIR);
+              if (err != 0)
+                {
+                  close (destdir_fd);
+                  destdir_fd = -1;
+                }
+            }
           if (0 <= destdir_fd)
             {
               n_files -= !target_directory;
               target_directory = d;
             }
           else if (! (n_files == 2 && !target_directory))
-            die (EXIT_FAILURE, errno, _("target %s"), quoteaf (d));
+            die (EXIT_FAILURE, err, _("target %s"), quoteaf (d));
         }
     }