diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-09 15:02:14 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2001-02-09 15:02:14 +0000 |
commit | 08f8ab9c37e995d5a7e4060b0b1497c37a437750 (patch) | |
tree | 32a348c99c65875729f5f1f37f496cd15ac4811f | |
parent | b4ea8ddcdd86cdfaf48e3217ef02a7530827232f (diff) | |
download | ruby-08f8ab9c37e995d5a7e4060b0b1497c37a437750.tar.gz |
* win32/win32.c (win32_stat): replace stat for enable when pathname
ends with '/' or '\' for mswin32 on Win9X / Win2k.
* win32/win32.h: ditto.
* ruby.h: ditto.
* dir.c (rb_glob_helper): ditto.
* file.c (rb_stat, rb_file_s_stat, eaccess, check3rdbyte): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1173 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | dir.c | 2 | ||||
-rw-r--r-- | file.c | 10 | ||||
-rw-r--r-- | ruby.h | 4 | ||||
-rw-r--r-- | win32/win32.c | 21 | ||||
-rw-r--r-- | win32/win32.h | 2 |
6 files changed, 46 insertions, 6 deletions
@@ -1,3 +1,16 @@ +Fri Feb 10 00:00:30 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp> + + * win32/win32.c (win32_stat): replace stat for enable when pathname + ends with '/' or '\' for mswin32 on Win9X / Win2k. + + * win32/win32.h: ditto. + + * ruby.h: ditto. + + * dir.c (rb_glob_helper): ditto. + + * file.c (rb_stat, rb_file_s_stat, eaccess, check3rdbyte): ditto. + Fri Feb 9 22:54:57 2001 WATANABE Hirofumi <eban@ruby-lang.org> * ruby.c (ruby_init_loadpath): convert '\\' to '/' @@ -568,7 +568,7 @@ rb_glob_helper(path, flag, func, arg) char *p, *m; if (!has_magic(path, 0)) { - if (stat(path, &st) == 0) { + if (rb_sys_stat(path, &st) == 0) { (*func)(path, arg); } return; @@ -67,7 +67,7 @@ char *strrchr _((const char*,const char)); #include <sys/stat.h> #ifndef HAVE_LSTAT -#define lstat stat +#define lstat rb_sys_stat #endif VALUE rb_cFile; @@ -313,7 +313,7 @@ rb_stat(file, st) #if defined DJGPP if (RSTRING(file)->len == 0) return -1; #endif - return stat(RSTRING(file)->ptr, st); + return rb_sys_stat(RSTRING(file)->ptr, st); } static VALUE @@ -323,7 +323,7 @@ rb_file_s_stat(obj, fname) struct stat st; Check_SafeStr(fname); - if (stat(RSTRING(fname)->ptr, &st) == -1) { + if (rb_sys_stat(RSTRING(fname)->ptr, &st) == -1) { rb_sys_fail(RSTRING(fname)->ptr); } return stat_new(&st); @@ -419,7 +419,7 @@ eaccess(path, mode) struct stat st; static int euid = -1; - if (stat(path, &st) < 0) return (-1); + if (rb_sys_stat(path, &st) < 0) return (-1); if (euid == -1) euid = geteuid (); @@ -721,7 +721,7 @@ check3rdbyte(file, mode) { struct stat st; - if (stat(file, &st) < 0) return Qfalse; + if (rb_sys_stat(file, &st) < 0) return Qfalse; if (st.st_mode & mode) return Qtrue; return Qfalse; } @@ -591,6 +591,10 @@ rb_special_const_p(VALUE obj) static char *dln_libs_to_be_linked[] = { EXTLIB, 0 }; #endif +#ifndef rb_sys_stat +#define rb_sys_stat stat +#endif + #if defined(__cplusplus) } /* extern "C" { */ #endif diff --git a/win32/win32.c b/win32/win32.c index 3fcef7c771..dd6597ea1c 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -29,6 +29,7 @@ #ifndef index #define index(x, y) strchr((x), (y)) #endif +#define isdirsep(x) ((x) == '/' || (x) == '\\') #ifndef bool #define bool int @@ -2612,6 +2613,26 @@ myrename(const char *oldpath, const char *newpath) return res; } +int +win32_stat(const char *path, struct stat *st) +{ + const char *p = path; + + if ((isdirsep(*p) && (p++, TRUE)) || /* absolute path or UNC */ + (ISALPHA(*p) && p[1] == ':' && (p += 2, TRUE))) { /* has drive */ + if (isdirsep(*p)) p++; + } + if (*p && (p = CharPrev(p, p + strlen(p)), isdirsep(*p))) { + /* Win95/2000 fail with trailing path separator? */ + int len = p - path; + char *s = ALLOCA_N(char, len + 1); + memcpy(s, path, len); + s[len] = '\0'; + path = s; + } + return stat(path, st); +} + static long filetime_to_clock(FILETIME *ft) { diff --git a/win32/win32.h b/win32/win32.h index ebffc5c8ab..ffbe967703 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -162,6 +162,8 @@ extern "C++" { #define pclose _pclose #define strcasecmp _stricmp #define strncasecmp _strnicmp +#undef rb_sys_stat +#define rb_sys_stat win32_stat /* these are defined in nt.c */ #ifdef __MINGW32__ |