X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=libiberty%2Flrealpath.c;h=b27c8de990e974c7294dfc4024ef44fbd3844a52;hb=76539d80f708c535133c4a2a1eef61da305a3e80;hp=b001b38ef66325a61f93d8d8a81c64b6cd78eced;hpb=ba61a412530eb1b5ae3edbf319163377f1768d29;p=deliverable%2Fbinutils-gdb.git diff --git a/libiberty/lrealpath.c b/libiberty/lrealpath.c index b001b38ef6..b27c8de990 100644 --- a/libiberty/lrealpath.c +++ b/libiberty/lrealpath.c @@ -17,8 +17,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ /* @@ -64,11 +64,16 @@ extern char *canonicalize_file_name (const char *); # define REALPATH_LIMIT MAXPATHLEN # endif # endif +#else + /* cygwin has realpath, so it won't get here. */ +# if defined (_WIN32) +# define WIN32_LEAN_AND_MEAN +# include /* for GetFullPathName */ +# endif #endif char * -lrealpath (filename) - const char *filename; +lrealpath (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 @@ -112,7 +117,7 @@ lrealpath (filename) { /* PATH_MAX is bounded. */ char *buf, *rp, *ret; - buf = malloc (path_max); + buf = (char *) malloc (path_max); if (buf == NULL) return NULL; rp = realpath (filename, buf); @@ -123,6 +128,30 @@ lrealpath (filename) } #endif + /* The MS Windows method. If we don't have realpath, we assume we + don't have symlinks and just canonicalize to a Windows absolute + path. GetFullPath converts ../ and ./ in relative paths to + absolute paths, filling in current drive if one is not given + or using the current directory of a specified drive (eg, "E:foo"). + It also converts all forward slashes to back slashes. */ +#if defined (_WIN32) + { + char buf[MAX_PATH]; + char* basename; + DWORD len = GetFullPathName (filename, MAX_PATH, buf, &basename); + if (len == 0 || len > MAX_PATH - 1) + return strdup (filename); + else + { + /* The file system is case-preserving but case-insensitive, + Canonicalize to lowercase, using the codepage associated + with the process locale. */ + CharLowerBuff (buf, len); + return strdup (buf); + } + } +#endif + /* This system is a lost cause, just duplicate the filename. */ return strdup (filename); }