ruby-changes:5286
From: nobu <ko1@a...>
Date: Tue, 3 Jun 2008 16:06:46 +0900 (JST)
Subject: [ruby-changes:5286] Ruby:r16785 (trunk, ruby_1_8): * file.c (file_expand_path): fix for non-existent files and SFN of
nobu 2008-06-03 16:06:23 +0900 (Tue, 03 Jun 2008) New Revision: 16785 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/file.c trunk/ChangeLog trunk/file.c Log: * file.c (file_expand_path): fix for non-existent files and SFN of symlinks. [ruby-talk:303736] http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/file.c?r1=16785&r2=16784&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16785&r2=16784&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16785&r2=16784&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/file.c?r1=16785&r2=16784&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 16784) +++ ChangeLog (revision 16785) @@ -1,3 +1,8 @@ +Tue Jun 3 16:06:09 2008 Nobuyoshi Nakada <nobu@r...> + + * file.c (file_expand_path): fix for non-existent files and SFN of + symlinks. [ruby-talk:303736] + Tue Jun 3 15:12:01 2008 Akinori MUSHA <knu@i...> * lib/set.rb (Set#classify): Back out the `group_by' alias. Index: file.c =================================================================== --- file.c (revision 16784) +++ file.c (revision 16785) @@ -2830,57 +2830,54 @@ #if USE_NTFS *p = '\0'; - if (1 && -#ifdef __CYGWIN__ - !(buf[0] == '/' && !buf[1]) && -#endif - !strpbrk(b = buf, "*?")) { + if (*(s = skipprefix(b = buf)) && !strpbrk(s, "*?")) { size_t len; WIN32_FIND_DATA wfd; #ifdef __CYGWIN__ int lnk_added = 0, is_symlink = 0; struct stat st; - char w32buf[MAXPATHLEN], sep = 0; - p = 0; + char w32buf[MAXPATHLEN]; + p = strrdirsep(s); if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) { is_symlink = 1; - p = strrdirsep(buf); - if (!p) p = skipprefix(buf); - if (p) { - sep = *p; - *p = '\0'; - } + *p = '\0'; } - if (cygwin_conv_to_win32_path(buf, w32buf) == 0) { + if (cygwin_conv_to_win32_path((*buf ? buf : "/"), w32buf) == 0) { b = w32buf; } - if (p) *p = sep; - else p = buf; if (is_symlink && b == w32buf) { + *p = '\\'; + strlcat(w32buf, p, sizeof(w32buf)); len = strlen(p); if (len > 4 && STRCASECMP(p + len - 4, ".lnk") != 0) { lnk_added = 1; strlcat(w32buf, ".lnk", sizeof(w32buf)); } } + *p = '/'; #endif HANDLE h = FindFirstFile(b, &wfd); if (h != INVALID_HANDLE_VALUE) { FindClose(h); - p = strrdirsep(buf); len = strlen(wfd.cFileName); #ifdef __CYGWIN__ if (lnk_added && len > 4 && STRCASECMP(wfd.cFileName + len - 4, ".lnk") == 0) { wfd.cFileName[len -= 4] = '\0'; } +#else + p = strrdirsep(s); #endif - if (!p) p = buf; - else ++p; + ++p; BUFCHECK(bdiff + len >= buflen); memcpy(p, wfd.cFileName, len + 1); p += len; } +#ifdef __CYGWIN__ + else { + p += strlen(p); + } +#endif } #endif Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 16784) +++ ruby_1_8/ChangeLog (revision 16785) @@ -1,3 +1,8 @@ +Tue Jun 3 16:06:09 2008 Nobuyoshi Nakada <nobu@r...> + + * file.c (file_expand_path): fix for non-existent files and SFN of + symlinks. [ruby-talk:303736] + Tue Jun 3 15:06:33 2008 Akinori MUSHA <knu@i...> * lib/set.rb (Set#delete_if, Set#collect!, Set#reject!) Index: ruby_1_8/file.c =================================================================== --- ruby_1_8/file.c (revision 16784) +++ ruby_1_8/file.c (revision 16785) @@ -2746,57 +2746,54 @@ #if USE_NTFS *p = '\0'; - if (1 && -#ifdef __CYGWIN__ - !(buf[0] == '/' && !buf[1]) && -#endif - !strpbrk(b = buf, "*?")) { + if (*(s = skipprefix(b = buf)) && !strpbrk(s, "*?")) { size_t len; WIN32_FIND_DATA wfd; #ifdef __CYGWIN__ int lnk_added = 0, is_symlink = 0; struct stat st; - char w32buf[MAXPATHLEN], sep = 0; - p = 0; + char w32buf[MAXPATHLEN]; + p = strrdirsep(s); if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) { is_symlink = 1; - p = strrdirsep(buf); - if (!p) p = skipprefix(buf); - if (p) { - sep = *p; - *p = '\0'; - } + *p = '\0'; } - if (cygwin_conv_to_win32_path(buf, w32buf) == 0) { + if (cygwin_conv_to_win32_path((*buf ? buf : "/"), w32buf) == 0) { b = w32buf; } - if (p) *p = sep; - else p = buf; if (is_symlink && b == w32buf) { + *p = '\\'; + strlcat(w32buf, p, sizeof(w32buf)); len = strlen(p); if (len > 4 && strcasecmp(p + len - 4, ".lnk") != 0) { lnk_added = 1; strlcat(w32buf, ".lnk", sizeof(w32buf)); } } + *p = '/'; #endif HANDLE h = FindFirstFile(b, &wfd); if (h != INVALID_HANDLE_VALUE) { FindClose(h); - p = strrdirsep(buf); len = strlen(wfd.cFileName); #ifdef __CYGWIN__ if (lnk_added && len > 4 && strcasecmp(wfd.cFileName + len - 4, ".lnk") == 0) { wfd.cFileName[len -= 4] = '\0'; } +#else + p = strrdirsep(s); #endif - if (!p) p = buf; ++p; BUFCHECK(bdiff + len >= buflen); memcpy(p, wfd.cFileName, len + 1); p += len; } +#ifdef __CYGWIN__ + else { + p += strlen(p); + } +#endif } #endif -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/