diff options
| author | Ulf Hermann <[email protected]> | 2018-07-17 09:14:31 +0200 |
|---|---|---|
| committer | Ulf Hermann <[email protected]> | 2018-07-20 14:45:07 +0000 |
| commit | 6166020e5f1acc87c3f00f0d2f15f073971be545 (patch) | |
| tree | 14720ecb9d6e28847c78fa77a931a5328e8afe31 /libgnu/lstat.c | |
| parent | 191f0057b0b978a0e5bf9168acdcc381b4196494 (diff) | |
Update gnulib modules, replacing canonicalize with canonicalize-lgpl
We need realpath() now, as upstream has changed to use that. Updating
single gnulib modules is not really possible, so we update everything.
Change-Id: I32943a1c8af7c1ecce625dca173a942cc58d9c38
Reviewed-by: Christian Kandeler <[email protected]>
Diffstat (limited to 'libgnu/lstat.c')
| -rw-r--r-- | libgnu/lstat.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/libgnu/lstat.c b/libgnu/lstat.c index f4dc43ec..5873bbd6 100644 --- a/libgnu/lstat.c +++ b/libgnu/lstat.c @@ -1,6 +1,6 @@ /* Work around a bug of lstat on some systems - Copyright (C) 1997-2006, 2008-2017 Free Software Foundation, Inc. + Copyright (C) 1997-2006, 2008-2018 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,7 +13,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. */ + along with this program. If not, see <https://www.gnu.org/licenses/>. */ /* written by Jim Meyering */ @@ -47,6 +47,8 @@ orig_lstat (const char *filename, struct stat *buf) above. */ # include "sys/stat.h" +# include "stat-time.h" + # include <string.h> # include <errno.h> @@ -66,32 +68,33 @@ orig_lstat (const char *filename, struct stat *buf) int rpl_lstat (const char *file, struct stat *sbuf) { - size_t len; - int lstat_result = orig_lstat (file, sbuf); - - if (lstat_result != 0) - return lstat_result; + int result = orig_lstat (file, sbuf); /* This replacement file can blindly check against '/' rather than using the ISSLASH macro, because all platforms with '\\' either lack symlinks (mingw) or have working lstat (cygwin) and thus do not compile this file. 0 len should have already been filtered out above, with a failure return of ENOENT. */ - len = strlen (file); - if (file[len - 1] != '/' || S_ISDIR (sbuf->st_mode)) - return 0; - - /* At this point, a trailing slash is only permitted on - symlink-to-dir; but it should have found information on the - directory, not the symlink. Call stat() to get info about the - link's referent. Our replacement stat guarantees valid results, - even if the symlink is not pointing to a directory. */ - if (!S_ISLNK (sbuf->st_mode)) + if (result == 0) { - errno = ENOTDIR; - return -1; + if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/') + result = stat_time_normalize (result, sbuf); + else + { + /* At this point, a trailing slash is permitted only on + symlink-to-dir; but it should have found information on the + directory, not the symlink. Call 'stat' to get info about the + link's referent. Our replacement stat guarantees valid results, + even if the symlink is not pointing to a directory. */ + if (!S_ISLNK (sbuf->st_mode)) + { + errno = ENOTDIR; + return -1; + } + result = stat (file, sbuf); + } } - return stat (file, sbuf); + return result; } #endif /* HAVE_LSTAT */ |
