diff options
author | Andrew Cagney <cagney@redhat.com> | 2002-11-12 17:19:06 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2002-11-12 17:19:06 +0000 |
commit | 70d358198ff91ea7401b66393952d28a6d7c2466 (patch) | |
tree | 640c5ea01223cdcfb198598588dffdd7937f1b18 | |
parent | 9835a8b012c3beec8e6d9ab314094f072e19c53c (diff) | |
download | gdb-70d358198ff91ea7401b66393952d28a6d7c2466.zip gdb-70d358198ff91ea7401b66393952d28a6d7c2466.tar.gz gdb-70d358198ff91ea7401b66393952d28a6d7c2466.tar.bz2 |
2002-11-12 Andrew Cagney <ac131313@redhat.com>
* utils.c (gdb_realpath): Rewrite. Try, in order: realpath() with
a constant buffer; cannonicalize_file_name(); realpath() with a
pathconf() defined buffer, xstrdup().
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/utils.c | 65 |
2 files changed, 55 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4e50111..55a1134 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,11 @@ 2002-11-12 Andrew Cagney <ac131313@redhat.com> + * utils.c (gdb_realpath): Rewrite. Try, in order: realpath() with + a constant buffer; cannonicalize_file_name(); realpath() with a + pathconf() defined buffer, xstrdup(). + +2002-11-12 Andrew Cagney <ac131313@redhat.com> + * config/djgpp/fnchange.lst: Fix typo, hang1.c to hang1.C; hang2.c to hang2.C; hang3.c to hang3.C. diff --git a/gdb/utils.c b/gdb/utils.c index 24a2819..b2a1d18 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -2704,31 +2704,64 @@ string_to_core_addr (const char *my_string) char * gdb_realpath (const char *filename) { + /* Method 1: The system has a compile time upper bound on a filename + path. Use that and realpath() to canonicalize the name. This is + the most common case. Note that, if there isn't a compile time + upper bound, you want to avoid realpath() at all costs. */ #if defined(HAVE_REALPATH) + { # if defined (PATH_MAX) - char buf[PATH_MAX]; + char buf[PATH_MAX]; # define USE_REALPATH # elif defined (MAXPATHLEN) - char buf[MAXPATHLEN]; -# define USE_REALPATH -# elif defined (HAVE_UNISTD_H) && defined(HAVE_ALLOCA) - char *buf = alloca ((size_t)pathconf ("/", _PC_PATH_MAX)); + char buf[MAXPATHLEN]; # define USE_REALPATH # endif +# if defined (USE_REALPATH) + char *rp = realpath (filename, buf); + if (rp == NULL) + rp = filename; + return xstrdup (rp); + } +# endif #endif /* HAVE_REALPATH */ -#if defined(USE_REALPATH) - char *rp = realpath (filename, buf); - return xstrdup (rp ? rp : filename); -#elif defined(HAVE_CANONICALIZE_FILE_NAME) - char *rp = canonicalize_file_name (filename); - if (rp == NULL) - return xstrdup (filename); - else - return rp; -#else - return xstrdup (filename); + /* Method 2: The host system (i.e., GNU) has the function + canonicalize_file_name() which malloc's a chunk of memory and + returns that, use that. */ +#if defined(HAVE_CANONICALIZE_FILE_NAME) + { + char *rp = canonicalize_file_name (filename); + if (rp == NULL) + return xstrdup (filename); + else + return rp; + } #endif + + /* Method 3: Now we're getting desperate! The system doesn't have a + compile time buffer size and no alternative function. Query the + OS, using pathconf(), for the buffer limit. Care is needed + though, some systems do not limit PATH_MAX (return -1 for + pathconf()) making it impossible to pass a correctly sized buffer + to realpath() (it could always overflow). On those systems, we + skip this. */ +#if defined (HAVE_REALPATH) && defined (HAVE_UNISTD_H) && defined(HAVE_ALLOCA) + { + /* Find out the max path size. */ + long path_max = pathconf ("/", _PC_PATH_MAX); + if (path_max > 0) + { + /* PATH_MAX is bounded. */ + char *buf = alloca (path_max); + char *rp = realpath (filename, buf); + return xstrdup (rp ? rp : filename); + } + } +#endif + + /* This system is a lost cause, just dup the buffer. */ + return xstrdup (filename); } /* Return a copy of FILENAME, with its directory prefix canonicalized |