summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--dir.c2
-rw-r--r--file.c10
-rw-r--r--ruby.h4
-rw-r--r--win32/win32.c21
-rw-r--r--win32/win32.h2
6 files changed, 46 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index e4d43c8b4f..005021e0cd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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 '/'
diff --git a/dir.c b/dir.c
index 49002fc77c..eee5fd3d6a 100644
--- a/dir.c
+++ b/dir.c
@@ -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;
diff --git a/file.c b/file.c
index 37a3ec1f63..749eb061fa 100644
--- a/file.c
+++ b/file.c
@@ -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;
}
diff --git a/ruby.h b/ruby.h
index dcbfba4b18..14833877f4 100644
--- a/ruby.h
+++ b/ruby.h
@@ -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__