Index: configure.in
===================================================================
RCS file: /cvs/ruby/src/ruby/configure.in,v
retrieving revision 1.283
diff -U2 -p -r1.283 configure.in
--- configure.in	3 Aug 2005 01:21:16 -0000	1.283
+++ configure.in	14 Aug 2005 07:07:20 -0000
@@ -214,4 +214,11 @@ dnl check for large file stuff
 AC_SYS_LARGEFILE
 
+case "$target_os" in
+mingw*)
+	ac_cv_type_off_t=yes
+	ac_cv_sizeof_off_t=8
+	;;
+esac
+
 AC_CHECK_TYPES([long long, off_t])
 
@@ -362,4 +369,7 @@ mingw*)		LIBS="-lshell32 -lws2_32 $LIBS"
 		ac_cv_func_finite=yes
 		ac_cv_func_link=yes
+		ac_cv_func_truncate=yes
+		ac_cv_func_fseeko=yes
+		ac_cv_func_ftello=yes
 		ac_cv_lib_crypt_crypt=no
 		ac_cv_func_getpgrp_void=no
Index: defines.h
===================================================================
RCS file: /cvs/ruby/src/ruby/defines.h,v
retrieving revision 1.43
diff -U2 -p -r1.43 defines.h
--- defines.h	2 Jul 2005 08:11:24 -0000	1.43
+++ defines.h	14 Aug 2005 07:07:20 -0000
@@ -212,4 +212,8 @@ void xfree _((void*));
 #endif
 
+#ifndef STRUCT_STAT
+#define STRUCT_STAT struct stat
+#endif
+
 #if defined(sparc) || defined(__sparc__)
 static inline void
Index: dir.c
===================================================================
RCS file: /cvs/ruby/src/ruby/dir.c,v
retrieving revision 1.142
diff -U2 -p -r1.142 dir.c
--- dir.c	27 Jul 2005 07:27:19 -0000	1.142
+++ dir.c	14 Aug 2005 07:07:20 -0000
@@ -925,5 +925,5 @@ static int
 do_stat(path, pst)
     const char *path;
-    struct stat *pst;
+    STRUCT_STAT *pst;
 {
     int ret = stat(path, pst);
@@ -937,5 +937,5 @@ static int
 do_lstat(path, pst)
     const char *path;
-    struct stat *pst;
+    STRUCT_STAT *pst;
 {
     int ret = lstat(path, pst);
@@ -1197,5 +1197,5 @@ glob_helper(path, dirsep, exist, isdir, 
     VALUE arg;
 {
-    struct stat st;
+    STRUCT_STAT st;
     int status = 0;
     struct glob_pattern **cur, **new_beg, **new_end;
Index: dln.c
===================================================================
RCS file: /cvs/ruby/src/ruby/dln.c,v
retrieving revision 1.65
diff -U2 -p -r1.65 dln.c
--- dln.c	19 Jul 2005 08:31:04 -0000	1.65
+++ dln.c	14 Aug 2005 07:07:20 -0000
@@ -1681,5 +1681,5 @@ dln_find_1(fname, path, exe_flag)
     register char *ep;
     register char *bp;
-    struct stat st;
+    STRUCT_STAT st;
 #ifdef __MACOS__
     const char* mac_fullpath;
Index: file.c
===================================================================
RCS file: /cvs/ruby/src/ruby/file.c,v
retrieving revision 1.200
diff -U2 -p -r1.200 file.c
--- file.c	30 Jun 2005 06:20:08 -0000	1.200
+++ file.c	14 Aug 2005 07:07:20 -0000
@@ -144,10 +144,10 @@ static VALUE
 stat_new_0(klass, st)
     VALUE klass;
-    struct stat *st;
+    STRUCT_STAT *st;
 {
-    struct stat *nst = 0;
+    STRUCT_STAT *nst = 0;
 
     if (st) {
-	nst = ALLOC(struct stat);
+	nst = ALLOC(STRUCT_STAT);
 	*nst = *st;
     }
@@ -157,15 +157,15 @@ stat_new_0(klass, st)
 static VALUE
 stat_new(st)
-    struct stat *st;
+    STRUCT_STAT *st;
 {
     return stat_new_0(rb_cStat, st);
 }
 
-static struct stat*
+static STRUCT_STAT*
 get_stat(self)
     VALUE self;
 {
-    struct stat* st;
-    Data_Get_Struct(self, struct stat, st);
+    STRUCT_STAT* st;
+    Data_Get_Struct(self, STRUCT_STAT, st);
     if (!st) rb_raise(rb_eTypeError, "uninitialized File::Stat");
     return st;
@@ -627,5 +627,5 @@ static int
 rb_stat(file, st)
     VALUE file;
-    struct stat *st;
+    STRUCT_STAT *st;
 {
     VALUE tmp;
@@ -658,5 +658,5 @@ rb_file_s_stat(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(4);
@@ -688,5 +688,5 @@ rb_io_stat(obj)
 {
     OpenFile *fptr;
-    struct stat st;
+    STRUCT_STAT st;
 
     GetOpenFile(obj, fptr);
@@ -716,5 +716,5 @@ rb_file_s_lstat(klass, fname)
 {
 #ifdef HAVE_LSTAT
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(2);
@@ -750,5 +750,5 @@ rb_file_lstat(obj)
 #ifdef HAVE_LSTAT
     OpenFile *fptr;
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(2);
@@ -804,5 +804,5 @@ eaccess(path, mode)
 {
 #if defined(S_IXGRP) && !defined(_WIN32) && !defined(__CYGWIN__)
-    struct stat st;
+    STRUCT_STAT st;
     int euid;
 
@@ -870,5 +870,5 @@ test_d(obj, fname)
 #endif
 
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -893,5 +893,5 @@ test_p(obj, fname)
 #  endif
 
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -928,5 +928,5 @@ test_l(obj, fname)
 
 #ifdef S_ISLNK
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(2);
@@ -965,5 +965,5 @@ test_S(obj, fname)
 
 #ifdef S_ISSOCK
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -994,5 +994,5 @@ test_b(obj, fname)
 
 #ifdef S_ISBLK
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1017,5 +1017,5 @@ test_c(obj, fname)
 #endif
 
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1038,5 +1038,5 @@ test_e(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1107,5 +1107,5 @@ test_wr(obj, fname)
 {
 #ifdef S_IROTH
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qnil;
@@ -1172,5 +1172,5 @@ test_ww(obj, fname)
 {
 #ifdef S_IWOTH
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1234,5 +1234,5 @@ test_f(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1253,5 +1253,5 @@ test_z(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1272,5 +1272,5 @@ test_s(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qnil;
@@ -1292,5 +1292,5 @@ test_owned(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1303,5 +1303,5 @@ test_rowned(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1324,5 +1324,5 @@ test_grpowned(obj, fname)
 {
 #ifndef _WIN32
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0) return Qfalse;
@@ -1338,5 +1338,5 @@ check3rdbyte(fname, mode)
     int mode;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(2);
@@ -1413,5 +1413,5 @@ rb_file_s_size(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0)
@@ -1422,5 +1422,5 @@ rb_file_s_size(klass, fname)
 static VALUE
 rb_file_ftype(st)
-    struct stat *st;
+    STRUCT_STAT *st;
 {
     char *t;
@@ -1481,5 +1481,5 @@ rb_file_s_ftype(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     rb_secure(2);
@@ -1506,5 +1506,5 @@ rb_file_s_atime(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0)
@@ -1529,5 +1529,5 @@ rb_file_atime(obj)
 {
     OpenFile *fptr;
-    struct stat st;
+    STRUCT_STAT st;
 
     GetOpenFile(obj, fptr);
@@ -1552,5 +1552,5 @@ rb_file_s_mtime(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0)
@@ -1574,5 +1574,5 @@ rb_file_mtime(obj)
 {
     OpenFile *fptr;
-    struct stat st;
+    STRUCT_STAT st;
 
     GetOpenFile(obj, fptr);
@@ -1599,5 +1599,5 @@ rb_file_s_ctime(klass, fname)
     VALUE klass, fname;
 {
-    struct stat st;
+    STRUCT_STAT st;
 
     if (rb_stat(fname, &st) < 0)
@@ -1622,5 +1622,5 @@ rb_file_ctime(obj)
 {
     OpenFile *fptr;
-    struct stat st;
+    STRUCT_STAT st;
 
     GetOpenFile(obj, fptr);
@@ -3275,5 +3275,5 @@ rb_f_test(argc, argv)
 
     if (strchr("MAC", cmd)) {
-	struct stat st;
+	STRUCT_STAT st;
 
 	CHECK(1);
@@ -3293,5 +3293,5 @@ rb_f_test(argc, argv)
 
     if (strchr("-=<>", cmd)) {
-	struct stat st1, st2;
+	STRUCT_STAT st1, st2;
 
 	CHECK(2);
@@ -3360,5 +3360,5 @@ rb_stat_init(obj, fname)
     VALUE obj, fname;
 {
-    struct stat st, *nst;
+    STRUCT_STAT st, *nst;
 
     rb_secure(2);
@@ -3371,5 +3371,5 @@ rb_stat_init(obj, fname)
 	DATA_PTR(obj) = NULL;
     }
-    nst = ALLOC(struct stat);
+    nst = ALLOC(STRUCT_STAT);
     *nst = st;
     DATA_PTR(obj) = nst;
@@ -3383,5 +3383,5 @@ rb_stat_init_copy(copy, orig)
     VALUE copy, orig;
 {
-    struct stat *nst;
+    STRUCT_STAT *nst;
 
     if (copy == orig) return orig;
@@ -3396,6 +3396,6 @@ rb_stat_init_copy(copy, orig)
     }
     if (DATA_PTR(orig)) {
-	nst = ALLOC(struct stat);
-	*nst = *(struct stat*)DATA_PTR(orig);
+	nst = ALLOC(STRUCT_STAT);
+	*nst = *(STRUCT_STAT*)DATA_PTR(orig);
 	DATA_PTR(copy) = nst;
     }
@@ -3623,5 +3623,5 @@ rb_stat_r(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IRUSR
@@ -3656,5 +3656,5 @@ rb_stat_R(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IRUSR
@@ -3714,5 +3714,5 @@ rb_stat_w(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IWUSR
@@ -3745,5 +3745,5 @@ rb_stat_W(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IWUSR
@@ -3805,5 +3805,5 @@ rb_stat_x(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IXUSR
@@ -3834,5 +3834,5 @@ rb_stat_X(obj)
     VALUE obj;
 {
-    struct stat *st = get_stat(obj);
+    STRUCT_STAT *st = get_stat(obj);
 
 #ifdef S_IXUSR
@@ -4005,5 +4005,5 @@ path_check_1(path)
      VALUE path;
 {
-    struct stat st;
+    STRUCT_STAT st;
     char *p0 = StringValueCStr(path);
     char *p = 0, *s;
Index: io.c
===================================================================
RCS file: /cvs/ruby/src/ruby/io.c,v
retrieving revision 1.375
diff -U2 -p -r1.375 io.c
--- io.c	27 Jul 2005 07:27:18 -0000	1.375
+++ io.c	14 Aug 2005 07:07:20 -0000
@@ -1187,5 +1187,5 @@ remain_size(fptr)
     OpenFile *fptr;
 {
-    struct stat st;
+    STRUCT_STAT st;
     off_t siz = READ_DATA_PENDING_COUNT(fptr);
     off_t pos;
@@ -4290,5 +4290,5 @@ next_argv()
 
 		if (ruby_inplace_mode) {
-		    struct stat st, st2;
+		    STRUCT_STAT st, st2;
 		    VALUE str;
 		    int fw;
Index: random.c
===================================================================
RCS file: /cvs/ruby/src/ruby/random.c,v
retrieving revision 1.39
diff -U2 -p -r1.39 random.c
--- random.c	12 Feb 2005 06:07:34 -0000	1.39
+++ random.c	13 Feb 2005 23:40:53 -0000
@@ -259,5 +259,5 @@ random_seed()
     struct timeval tv;
     int fd;
-    struct stat statbuf;
+    STRUCT_STAT statbuf;
 
     int seed_len;
Index: bcc32/Makefile.sub
===================================================================
RCS file: /cvs/ruby/src/ruby/bcc32/Makefile.sub,v
retrieving revision 1.82
diff -U2 -p -r1.82 Makefile.sub
--- bcc32/Makefile.sub	3 Aug 2005 15:26:17 -0000	1.82
+++ bcc32/Makefile.sub	14 Aug 2005 07:07:20 -0000
@@ -212,4 +212,5 @@ $(CONFIG_H): $(MKFILES) $(srcdir)bcc32/M
 \#define HAVE_STRING_H 1
 \#define HAVE_MEMORY_H 1
+\#define HAVE_LONG_LONG 1
 \#define HAVE_OFF_T 1
 \#define SIZEOF_INT 4
@@ -218,5 +219,5 @@ $(CONFIG_H): $(MKFILES) $(srcdir)bcc32/M
 \#define SIZEOF_LONG_LONG 0
 \#define SIZEOF___INT64 8
-\#define SIZEOF_OFF_T 4
+\#define SIZEOF_OFF_T 8
 \#define SIZEOF_VOIDP 4
 \#define SIZEOF_FLOAT 4
@@ -260,5 +261,7 @@ $(CONFIG_H): $(MKFILES) $(srcdir)bcc32/M
 \#define HAVE_FSYNC 1
 \#define HAVE_GETCWD 1
-\#define HAVE_CHSIZE 1
+\#define HAVE_TRUNCATE 1
+\#define HAVE_FSEEKO 1
+\#define HAVE_FTELLO 1
 \#define HAVE_TIMES 1
 \#define HAVE_FCNTL 1
Index: win32/Makefile.sub
===================================================================
RCS file: /cvs/ruby/src/ruby/win32/Makefile.sub,v
retrieving revision 1.101
diff -U2 -p -r1.101 Makefile.sub
--- win32/Makefile.sub	3 Aug 2005 15:26:18 -0000	1.101
+++ win32/Makefile.sub	14 Aug 2005 07:07:20 -0000
@@ -198,4 +198,6 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/
 #define HAVE_STRING_H 1
 #define HAVE_MEMORY_H 1
+#define _INTEGRAL_MAX_BITS 64
+#define HAVE_LONG_LONG 1
 #define HAVE_OFF_T 1
 #define SIZEOF_INT 4
@@ -204,5 +206,5 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/
 #define SIZEOF_LONG_LONG 0
 #define SIZEOF___INT64 8
-#define SIZEOF_OFF_T 4
+#define SIZEOF_OFF_T 8
 #define SIZEOF_VOIDP 4
 #define SIZEOF_FLOAT 4
@@ -257,5 +259,7 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/
 #define HAVE_FSYNC 1
 #define HAVE_GETCWD 1
-#define HAVE_CHSIZE 1
+#define HAVE_TRUNCATE 1
+#define HAVE_FSEEKO 1
+#define HAVE_FTELLO 1
 #define HAVE_TIMES 1
 #define HAVE_FCNTL 1
Index: win32/dir.h
===================================================================
RCS file: /cvs/ruby/src/ruby/win32/dir.h,v
retrieving revision 1.9
diff -U2 -p -r1.9 dir.h
--- win32/dir.h	19 Jan 2004 12:28:14 -0000	1.9
+++ win32/dir.h	11 Feb 2005 07:30:37 -0000
@@ -30,6 +30,6 @@ typedef struct {
 DIR*           rb_w32_opendir(const char*);
 struct direct* rb_w32_readdir(DIR *);
-long           rb_w32_telldir(DIR *);
-void           rb_w32_seekdir(DIR *, long);
+off_t          rb_w32_telldir(DIR *);
+void           rb_w32_seekdir(DIR *, off_t);
 void           rb_w32_rewinddir(DIR *);
 void           rb_w32_closedir(DIR *);
Index: win32/win32.c
===================================================================
RCS file: /cvs/ruby/src/ruby/win32/win32.c,v
retrieving revision 1.163
diff -U2 -p -r1.163 win32.c
--- win32/win32.c	3 Aug 2005 01:21:20 -0000	1.163
+++ win32/win32.c	14 Aug 2005 07:07:20 -0000
@@ -26,4 +26,5 @@
 #include <winbase.h>
 #include <wincon.h>
+#include <share.h>
 #include <shlobj.h>
 #ifdef __MINGW32__
@@ -1373,5 +1374,5 @@ rb_w32_opendir(const char *filename)
     char               scannamespc[PATHLEN];
     char	      *scanname = scannamespc;
-    struct stat	       sbuf;
+    STRUCT_STAT	       sbuf;
     WIN32_FIND_DATA fd;
     HANDLE          fh;
@@ -1532,5 +1533,5 @@ rb_w32_readdir(DIR *dirp)
 //
 
-long
+off_t
 rb_w32_telldir(DIR *dirp)
 {
@@ -1543,7 +1544,7 @@ rb_w32_telldir(DIR *dirp)
 
 void
-rb_w32_seekdir(DIR *dirp, long loc)
+rb_w32_seekdir(DIR *dirp, off_t loc)
 {
-	dirp->curr = (char *) loc;	/* ouch! long to pointer cast */
+	dirp->curr = (char *) (long)loc;	/* ouch! long to pointer cast */
 }
 
@@ -2994,14 +2995,27 @@ isUNCRoot(const char *path)
 #undef fstat
 int
-rb_w32_fstat(int fd, struct stat *st)
+rb_w32_fstat(int fd, STRUCT_STAT *st)
 {
     BY_HANDLE_FILE_INFORMATION info;
-    int ret = fstat(fd, st);
+    struct stat tmp;
+    int ret = fstat(fd, &tmp);
 
     if (ret) return ret;
-    st->st_mode &= ~(S_IWGRP | S_IWOTH);
-    if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &info) &&
-	!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
-	st->st_mode |= S_IWUSR;
+    st->st_dev = tmp.st_dev;
+    st->st_ino = tmp.st_ino;
+    st->st_mode = tmp.st_mode  & ~(S_IWGRP | S_IWOTH);
+    st->st_nlink = tmp.st_nlink;
+    st->st_uid = tmp.st_uid;
+    st->st_gid = tmp.st_gid;
+    st->st_rdev = tmp.st_rdev;
+    st->st_size = tmp.st_size;
+    st->st_atime = tmp.st_atime;
+    st->st_mtime = tmp.st_mtime;
+    st->st_ctime = tmp.st_ctime;
+    if (GetFileInformationByHandle((HANDLE)_get_osfhandle(fd), &info)) {
+	if (!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
+	    st->st_mode |= S_IWUSR;
+	}
+	st->st_size = ((__int64)info.nFileSizeHigh << 32) | info.nFileSizeLow;
     }
     return ret;
@@ -3010,5 +3024,5 @@ rb_w32_fstat(int fd, struct stat *st)
 
 int
-rb_w32_stat(const char *path, struct stat *st)
+rb_w32_stat(const char *path, STRUCT_STAT *st)
 {
     const char *p;
@@ -3041,8 +3055,10 @@ rb_w32_stat(const char *path, struct sta
 	else if (*end != '\\')
 	    strcat(buf1, "\\");
-    } else if (*end == '\\' || (buf1 + 1 == end && *end == ':'))
+    }
+    else if (*end == '\\' || (buf1 + 1 == end && *end == ':')) {
 	strcat(buf1, ".");
+    }
 
-    ret = stat(buf1, st);
+    ret = _stati64(buf1, st);
     if (ret == 0) {
 	st->st_mode &= ~(S_IWGRP | S_IWOTH);
@@ -3051,4 +3067,138 @@ rb_w32_stat(const char *path, struct sta
 }
 
+static int
+rb_chsize(HANDLE h, off_t size)
+{
+    long upos, lpos, usize, lsize, uend, lend;
+    off_t end;
+    int ret = -1;
+    DWORD e;
+
+    if (((lpos = SetFilePointer(h, 0, (upos = 0, &upos), SEEK_CUR)) == -1L &&
+	 (e = GetLastError())) ||
+	((lend = GetFileSize(h, (DWORD *)&uend)) == -1L && (e = GetLastError()))) {
+	errno = map_errno(e);
+	return -1;
+    }
+    end = ((off_t)uend << 32) | (unsigned long)lend;
+    usize = (long)(size >> 32);
+    lsize = (long)size;
+    if (SetFilePointer(h, lsize, &usize, SEEK_SET) == -1L &&
+	(e = GetLastError())) {
+	errno = map_errno(e);
+    }
+    else if (!SetEndOfFile(h)) {
+	errno = map_errno(GetLastError());
+    }
+    else {
+	ret = 0;
+    }
+    SetFilePointer(h, lpos, &upos, SEEK_SET);
+    return ret;
+}
+
+int
+truncate(const char *path, off_t length)
+{
+    HANDLE h;
+    int ret;
+    if (IsWin95()) {
+	int fd = open(path, O_WRONLY), e;
+	if (fd == -1) return -1;
+	ret = chsize(fd, (unsigned long)length);
+	if (ret == -1) e = errno;
+	close(fd);
+	if (ret == -1) errno = e;
+	return ret;
+    }
+    h = CreateFile(path, GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
+    if (h == INVALID_HANDLE_VALUE) {
+	errno = map_errno(GetLastError());
+	return -1;
+    }
+    ret = rb_chsize(h, length);
+    CloseHandle(h);
+    return ret;
+}
+
+int
+ftruncate(int fd, off_t length)
+{
+    long h;
+
+    if (IsWin95()) {
+	return chsize(fd, (unsigned long)length);
+    }
+    h = _get_osfhandle(fd);
+    if (h == -1) return -1;
+    return rb_chsize((HANDLE)h, length);
+}
+
+#ifdef __BORLANDC__
+off_t
+_filelengthi64(int fd)
+{
+    DWORD u, l;
+    int e;
+
+    l = GetFileSize((HANDLE)_get_osfhandle(fd), &u);
+    if (l == (DWORD)-1L && (e = GetLastError())) {
+	errno = map_errno(e);
+	return (off_t)-1;
+    }
+    return ((off_t)u << 32) | l;
+}
+
+off_t
+_lseeki64(int fd, off_t offset, int whence)
+{
+    long u, l;
+    int e;
+    HANDLE h = (HANDLE)_get_osfhandle(fd);
+
+    if (!h) {
+	errno = EBADF;
+	return -1;
+    }
+    u = (long)(offset >> 32);
+    if ((l = SetFilePointer(h, (long)offset, &u, whence)) == -1L &&
+	(e = GetLastError())) {
+	errno = map_errno(e);
+	return -1;
+    }
+    return ((off_t)u << 32) | l;
+}
+#endif
+
+int
+fseeko(FILE *stream, off_t offset, int whence)
+{
+    off_t pos;
+    switch (whence) {
+      case SEEK_CUR:
+	if (fgetpos(stream, (fpos_t *)&pos))
+	    return -1;
+	pos += offset;
+	break;
+      case SEEK_END:
+	if ((pos = _filelengthi64(fileno(stream))) == (off_t)-1)
+	    return -1;
+	pos += offset;
+	break;
+      default:
+	pos = offset;
+	break;
+    }
+    return fsetpos(stream, (fpos_t *)&pos);
+}
+
+off_t
+ftello(FILE *stream)
+{
+    off_t pos;
+    if (fgetpos(stream, (fpos_t *)&pos)) return (off_t)-1;
+    return pos;
+}
+
 static long
 filetime_to_clock(FILETIME *ft)
@@ -3567,5 +3717,5 @@ rb_w32_utime(const char *path, struct ut
     FILETIME atime, mtime;
     struct tm *tm;
-    struct stat stat;
+    STRUCT_STAT stat;
     int ret = 0;
 
@@ -3694,4 +3844,26 @@ rb_w32_isatty(int fd)
 #endif
 
+#ifndef __BORLANDC__
+#undef _open
+__declspec(dllexport) int
+open(const char *path, int flags, ...)
+{
+    va_list ap;
+    int f, mode;
+
+    va_start(ap, flags);
+    mode = va_arg(ap, int);
+    va_end(ap);
+
+    f = _sopen(path, flags, _SH_DENYNO, mode);
+    if (f == -1) {
+	DWORD attr = GetFileAttributes(path);
+	if (!(attr & FILE_ATTRIBUTE_SPARSE_FILE))
+	    SetFileAttributes(path, attr | FILE_ATTRIBUTE_SPARSE_FILE);
+    }
+    return f;
+}
+#endif
+
 //
 // Fix bcc32's stdio bug
Index: win32/win32.h
===================================================================
RCS file: /cvs/ruby/src/ruby/win32/win32.h,v
retrieving revision 1.70
diff -U2 -p -r1.70 win32.h
--- win32/win32.h	3 Aug 2005 01:21:20 -0000	1.70
+++ win32/win32.h	14 Aug 2005 07:07:20 -0000
@@ -70,4 +70,10 @@ extern "C++" {
 #endif
 
+#ifndef __BORLANDC__
+#define STRUCT_STAT struct _stati64
+#else
+#define STRUCT_STAT struct stati64
+#endif
+#define off_t __int64
 #define WNOHANG -1
 
@@ -90,8 +96,10 @@ extern "C++" {
 #define fputchar(_c)		putchar(_c)
 #define utime(_p, _t)		rb_w32_utime(_p, _t)
+#define lseek(_f, _o, _w)	_lseeki64(_f, _o, _w)
 
 #define strcasecmp(s1, s2)	stricmp(s1, s2)
 #define strncasecmp(s1, s2, n)	strnicmp(s1, s2, n)
 
+#undef fstat
 #define close(h)		rb_w32_close(h)
 #define fclose(f)		rb_w32_fclose(f)
@@ -108,5 +116,4 @@ extern "C++" {
 #define _open			_sopen
 #define sopen			_sopen
-#undef fstat
 #define fstat(fd,st)		rb_w32_fstat(fd,st)
 #undef fopen
@@ -116,4 +123,6 @@ extern "C++" {
 #undef fsopen
 #define fsopen(p, m, sh)	rb_w32_fsopen(p, m, sh)
+#else
+#define fstat(fd,st)		_fstati64(fd,st)
 #endif
 
@@ -181,4 +190,5 @@ extern void   rb_w32_free_environ(char *
 #define vsnprintf(s,n,f,l) rb_w32_vsnprintf(s,n,f,l)
 #define snprintf   rb_w32_snprintf
+extern int rb_w32_stat(const char *, STRUCT_STAT *);
 extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list);
 extern int rb_w32_snprintf(char *, size_t, const char *, ...);
@@ -203,5 +213,6 @@ extern int rb_w32_unlink(const char*);
 
 #ifdef __BORLANDC__
-extern int rb_w32_fstat(int, struct stat *);
+extern off_t _lseeki64(int, off_t, int);
+extern int rb_w32_fstat(int, STRUCT_STAT *);
 extern FILE *rb_w32_fopen(const char *, const char *);
 extern FILE *rb_w32_fdopen(int, const char *);
@@ -275,4 +286,8 @@ extern FILE *rb_w32_fsopen(const char *,
 
 //
+extern int       truncate(const char *path, off_t length);
+extern int       ftruncate(int fd, off_t length);
+extern int       fseeko(FILE *stream, off_t offset, int whence);
+extern off_t     ftello(FILE *stream);
 // stubs
 //
