>From d5b578b84e638c1223de3b25f9614844206673c2 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 4 Feb 2011 18:49:54 +0100 Subject: [PATCH 3/4] canonicalize-lgpl: Add an implementation for mingw to pass newly added tests. 2011-02-04 Jan Nieuwenhuizen * lib/canonicalize-lgpl.c (__realpath)[(_WIN32 || __WIN32__) && ! __CYGWIN__]: Add an implementation for mingw to pass newly added tests. --- ChangeLog | 5 +++ lib/canonicalize-lgpl.c | 85 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 87 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 24d1998..f984aa8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-02-04 Jan Nieuwenhuizen + * lib/canonicalize-lgpl.c (__realpath)[(_WIN32 || __WIN32__) && ! __CYGWIN__]: + Add an implementation for mingw to pass newly added tests. + +2011-02-04 Jan Nieuwenhuizen + * tests/test-canonicalize-lgpl.c (main)[(_WIN32 || __WIN32__) && ! __CYGWIN__]: Add basic sanity checks for mingw along with debug printing demonstrating general breakage. diff --git a/lib/canonicalize-lgpl.c b/lib/canonicalize-lgpl.c index 9bfb44f..4a58aa8 100644 --- a/lib/canonicalize-lgpl.c +++ b/lib/canonicalize-lgpl.c @@ -95,10 +95,42 @@ that cannot be resolved. If the path can be resolved, RESOLVED holds the same value as the value returned. */ +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ +#include +#include +#include + +static char const * +slashify (char const *str) +{ + char *p = (char*)str; + + while (*p) + { + if (*p == '\\') + *p = '/'; + p++; + } + return str; +} + +static char const * +strlower (char const *str) +{ + char *p = (char*)str; + while (*p) + { + *p = (char)tolower (*p); + p++; + } + return str; +} +#endif /* (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ */ + char * __realpath (const char *name, char *resolved) { - char *rpath, *dest, *extra_buf = NULL; + char *fname, *rpath, *dest, *extra_buf = NULL, *sname = NULL; const char *start, *end, *rpath_limit; long int path_max; int num_links = 0; @@ -144,6 +176,49 @@ __realpath (const char *name, char *resolved) rpath = resolved; rpath_limit = rpath + path_max; + fname = rpath; + +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + { + sname = malloc (PATH_MAX); + if (sname == NULL) + goto error; + strcpy (sname, name); + name = strlower (slashify (sname)); + } + if (name[1] && (name[1] != ':' || name[2] != '/')) + { + DWORD cwd_len; + char root[3] = "."; + + if (name[0] == '/') + { + root[0] = *name++; + root[1] = '\0'; + } + else if (name[1] == ':') + { + root[0] = *name++; + root[1] = *name++; + root[2] = '\0'; + } + + cwd_len = GetFullPathName (root, PATH_MAX, fname, NULL); + if (!cwd_len) + goto error; + strlower (slashify (fname)); + rpath = fname + cwd_len - 1; + } + else + { + strncpy (fname, name, 3); + name += 2; + rpath = fname + 3; + } + if (1) + dest = rpath + 1; + else +#endif /* (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ */ if (name[0] != '/') { if (!__getcwd (rpath, path_max)) @@ -241,7 +316,7 @@ __realpath (const char *name, char *resolved) #ifdef _LIBC if (__lxstat64 (_STAT_VER, rpath, &st) < 0) #else - if (lstat (rpath, &st) < 0) + if (lstat (fname, &st) < 0) #endif goto error; @@ -329,7 +404,7 @@ __realpath (const char *name, char *resolved) if (extra_buf) freea (extra_buf); - return rpath; + return fname; error: { @@ -338,6 +413,10 @@ error: freea (extra_buf); if (resolved == NULL) free (rpath); +#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + if (sname != NULL) + free (sname); +#endif /* (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ */ errno = saved_errno; } return NULL; -- 1.7.1