From: Jim Meyering Date: Sat, 1 Sep 2001 16:24:19 +0000 (+0000) Subject: (show_point): Use canonicalize_file_name, if possible. X-Git-Tag: TEXTUTILS-2_0_15~188 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=be53392f0afae47a785312bfa9901ffb95ceaf86;p=thirdparty%2Fcoreutils.git (show_point): Use canonicalize_file_name, if possible. [HAVE_RESOLVEPATH], [!HAVE_RESOLVEPATH]: Use malloc, not alloca, so that these two paths also produce `resolved' in malloc'd storage. Free that memory when done with it. --- diff --git a/src/df.c b/src/df.c index bd361b17b4..f63f33462a 100644 --- a/src/df.c +++ b/src/df.c @@ -1,5 +1,5 @@ /* df - summarize free disk space - Copyright (C) 91, 1995-2000 Free Software Foundation, Inc. + Copyright (C) 91, 1995-2001 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 @@ -526,7 +526,10 @@ show_point (const char *point, const struct stat *statp) goto show_matching_dummy; } -#if HAVE_REALPATH || HAVE_RESOLVEPATH + /* Ideally, the following mess of #if'd code would be in a separate + file, and there'd be a single function call here. FIXME, someday. */ + +#if HAVE_REALPATH || HAVE_RESOLVEPATH || HAVE_CANONICALIZE_FILE_NAME /* Calculate the real absolute path for POINT, and use that to find the mount point. This avoids statting unavailable mount points, which can hang df. */ @@ -536,7 +539,11 @@ show_point (const char *point, const struct stat *statp) ssize_t resolved_len; struct mount_entry *best_match = NULL; -# if HAVE_RESOLVEPATH +# if HAVE_CANONICALIZE_FILE_NAME + resolved = canonicalize_file_name (abspoint); + resolved_len = resolved ? strlen (resolved) : -1; +# else +# if HAVE_RESOLVEPATH /* All known hosts with resolvepath (e.g. Solaris 7) don't turn relative names into absolute ones, so prepend the working directory if the path is not absolute. */ @@ -567,23 +574,28 @@ show_point (const char *point, const struct stat *statp) abspoint = needs_freeing; } } -# endif +# endif -# if HAVE_RESOLVEPATH +# if HAVE_RESOLVEPATH { size_t resolved_size = strlen (abspoint); - do + while (1) { resolved_size = 2 * resolved_size + 1; - resolved = alloca (resolved_size); + resolved = xmalloc (resolved_size); resolved_len = resolvepath (abspoint, resolved, resolved_size); + if (resolved_len < resolved_size) + break; + free (resolved); } - while (resolved_len == resolved_size); } -# else - resolved = alloca (PATH_MAX + 1); +# else + /* Use realpath only as a last resort. + It provides a very poor interface. */ + resolved = xmalloc (PATH_MAX + 1); resolved = (char *) realpath (abspoint, resolved); resolved_len = resolved ? strlen (resolved) : -1; +# endif # endif if (1 <= resolved_len && resolved[0] == '/') @@ -605,6 +617,9 @@ show_point (const char *point, const struct stat *statp) } } + if (resolved) + free (resolved); + if (best_match && !STREQ (best_match->me_type, "lofs") && stat (best_match->me_mountdir, &disk_stats) == 0 && disk_stats.st_dev == statp->st_dev)