diff options
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 63 |
1 files changed, 25 insertions, 38 deletions
@@ -16,11 +16,12 @@ #include "missing/file.h" #endif #ifdef __CYGWIN__ +#define OpenFile WINAPI_OpenFile #include <windows.h> #include <sys/cygwin.h> +#undef OpenFile #endif -#define OpenFile rb_io_t #include "ruby.h" #include "rubyio.h" #include "rubysig.h" @@ -2335,18 +2336,6 @@ rb_file_s_umask(argc, argv) # endif #endif -#if defined _WIN32 || defined __CYGWIN__ -#define USE_NTFS 1 -#else -#define USE_NTFS 0 -#endif - -#if USE_NTFS -#define istrailinggabage(x) ((x) == '.' || (x) == ' ') -#else -#define istrailinggabage(x) 0 -#endif - #ifdef DOSISH_DRIVE_LETTER static inline int has_drive_letter(buf) @@ -2487,6 +2476,7 @@ rb_path_end(path) static char * ntfs_tail(const char *path) { + while (*path == '.') path++; while (*path && *path != ':') { if (istrailinggabage(*path)) { const char *last = path++; @@ -2516,10 +2506,6 @@ ntfs_tail(const char *path) p = buf + bdiff;\ pend = buf + buflen;\ }\ - rb_str_resize(result, buflen);\ - buf = RSTRING(result)->ptr;\ - p = buf + bdiff;\ - pend = buf + buflen;\ } while (0) #define BUFINIT() (\ @@ -2758,28 +2744,23 @@ file_expand_path(fname, dname, result) #if USE_NTFS *p = '\0'; - if (!strpbrk(b = buf, "*?")) { + if ((s = strrdirsep(b = buf)) != 0 && !strpbrk(s, "*?")) { size_t len; WIN32_FIND_DATA wfd; #ifdef __CYGWIN__ - int lnk_added = 0; + int lnk_added = 0, is_symlink = 0; struct stat st; - char w32buf[MAXPATHLEN], sep = 0; - p = 0; + char w32buf[MAXPATHLEN]; + p = (char *)s; if (lstat(buf, &st) == 0 && S_ISLNK(st.st_mode)) { - p = strrdirsep(buf); - if (!p) p = skipprefix(buf); - if (p) { - sep = *p; - *p = '\0'; - } + is_symlink = 1; + *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 (b == w32buf) { + if (is_symlink && b == w32buf) { + *p = '\\'; strlcat(w32buf, p, sizeof(w32buf)); len = strlen(p); if (len > 4 && strcasecmp(p + len - 4, ".lnk") != 0) { @@ -2787,24 +2768,30 @@ file_expand_path(fname, dname, result) 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) { - len -= 4; + wfd.cFileName[len -= 4] = '\0'; } +#else + p = (char *)s; #endif - if (!p) p = buf; - buflen = ++p - buf + len; - rb_str_resize(result, buflen); + ++p; + BUFCHECK(bdiff + len >= buflen); memcpy(p, wfd.cFileName, len + 1); p += len; } +#ifdef __CYGWIN__ + else { + p += strlen(p); + } +#endif } #endif @@ -3041,7 +3028,7 @@ rb_file_s_extname(klass, fname) if (!p) p = name; else - p++; + name = ++p; e = 0; while (*p) { @@ -3071,7 +3058,7 @@ rb_file_s_extname(klass, fname) break; p = CharNext(p); } - if (!e || e+1 == p) /* no dot, or the only dot is first or end? */ + if (!e || e == name || e+1 == p) /* no dot, or the only dot is first or end? */ return rb_str_new(0, 0); extname = rb_str_new(e, p - e); /* keep the dot, too! */ OBJ_INFECT(extname, fname); |