OSDN Git Service

* cygwin.din (fstat64): New symbol.
authorcorinna <corinna>
Mon, 25 Feb 2002 17:47:44 +0000 (17:47 +0000)
committercorinna <corinna>
Mon, 25 Feb 2002 17:47:44 +0000 (17:47 +0000)
(ftruncate64): Ditto.
(lseek64): Ditto.
(lstat64): Ditto.
(mmap64): Ditto.
(seekdir64): Ditto.
(stat64): Ditto.
(telldir64): Ditto.
(truncate64): Ditto.
* dir.cc (telldir64): New function.
(telldir): Call telldir64().
(seekdir64): New function.
(seekdir): Call seekdir64().
* fhandler.h: Redefine all methods using __off32_t to use __off64_t.
* fhandler.cc: Use __off64_t and struct __stat64 throughout.
* fhandler_clipboard.cc: Ditto.
* fhandler_disk_file.cc: Ditto.
* fhandler_dsp.cc: Ditto.
* fhandler_floppy.cc: Ditto.
* fhandler_mem.cc: Ditto.
* fhandler_random.cc: Ditto.
* fhandler_socket.cc: Ditto.
* fhandler_tape.cc: Ditto.
* fhandler_zero.cc: Ditto.
* pipe.cc: Ditto.
* glob.c: Ditto, call lstat64 and stat64 in Cygwin.
* mmap.cc: Use __off64_t throughout.
(mmap64): New function.
* sec_acl.cc (acl_worker): Use struct __stat64, call stat64 and lstat64.
* syscalls.cc (lseek64): New function.
(stat64_to_stat32): Ditto.
(fstat64): Ditto.
(stat64): Ditto.
(lstat64): Ditto.
(ftruncate64): Ditto.
(truncate64): Ditto.
(_fstat): Call fstat64.
(_stat): Call stat64.
(cygwin_lstat): Rename to avoid declaration problem.  Call lstat64.
(stat_worker): Use struct __stat64.
(access): Ditto.
(ftruncate): Call ftruncate64.
(truncate): Call truncate64.
* wincap.cc: Set flag has_64bit_file_access appropriately.
* wincap.h: Add flag has_64bit_file_access.
* winsup.h (ILLEGAL_SEEK): Define as __off64_t.
(stat_dev): Declare using struct __stat64.
(stat_worker): Ditto.
* include/cygwin/stat.h (struct __stat32): Define if compiling Cygwin.
(struct __stat64): Ditto.
(struct stat): Revert definition with explicitly sized datatypes.
Eliminate sized field names.
* include/cygwin/types.h (blksize_t): New type.
(__blkcnt32_t): Ditto.
(__blkcnt64_t): Ditto.
(blkcnt_t): Ditto.

24 files changed:
winsup/cygwin/ChangeLog
winsup/cygwin/cygwin.din
winsup/cygwin/dir.cc
winsup/cygwin/fhandler.cc
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_clipboard.cc
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/fhandler_dsp.cc
winsup/cygwin/fhandler_floppy.cc
winsup/cygwin/fhandler_mem.cc
winsup/cygwin/fhandler_random.cc
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/fhandler_tape.cc
winsup/cygwin/fhandler_zero.cc
winsup/cygwin/glob.c
winsup/cygwin/include/cygwin/stat.h
winsup/cygwin/include/cygwin/types.h
winsup/cygwin/mmap.cc
winsup/cygwin/pipe.cc
winsup/cygwin/sec_acl.cc
winsup/cygwin/syscalls.cc
winsup/cygwin/wincap.cc
winsup/cygwin/wincap.h
winsup/cygwin/winsup.h

index 7b5ad1c..fab0f33 100644 (file)
@@ -1,3 +1,62 @@
+2002-02-23  Corinna Vinschen  <corinna@vinschen.de>
+
+       * cygwin.din (fstat64): New symbol.
+       (ftruncate64): Ditto.
+       (lseek64): Ditto.
+       (lstat64): Ditto.
+       (mmap64): Ditto.
+       (seekdir64): Ditto.
+       (stat64): Ditto.
+       (telldir64): Ditto.
+       (truncate64): Ditto.
+       * dir.cc (telldir64): New function.
+       (telldir): Call telldir64().
+       (seekdir64): New function.
+       (seekdir): Call seekdir64().
+       * fhandler.h: Redefine all methods using __off32_t to use __off64_t.
+       * fhandler.cc: Use __off64_t and struct __stat64 throughout.
+       * fhandler_clipboard.cc: Ditto.
+       * fhandler_disk_file.cc: Ditto.
+       * fhandler_dsp.cc: Ditto.
+       * fhandler_floppy.cc: Ditto.
+       * fhandler_mem.cc: Ditto.
+       * fhandler_random.cc: Ditto.
+       * fhandler_socket.cc: Ditto.
+       * fhandler_tape.cc: Ditto.
+       * fhandler_zero.cc: Ditto.
+       * pipe.cc: Ditto.
+       * glob.c: Ditto, call lstat64 and stat64 in Cygwin.
+       * mmap.cc: Use __off64_t throughout.
+       (mmap64): New function.
+       * sec_acl.cc (acl_worker): Use struct __stat64, call stat64 and lstat64.
+       * syscalls.cc (lseek64): New function.
+       (stat64_to_stat32): Ditto.
+       (fstat64): Ditto.
+       (stat64): Ditto.
+       (lstat64): Ditto.
+       (ftruncate64): Ditto.
+       (truncate64): Ditto.
+       (_fstat): Call fstat64.
+       (_stat): Call stat64.
+       (cygwin_lstat): Rename to avoid declaration problem.  Call lstat64.
+       (stat_worker): Use struct __stat64.
+       (access): Ditto.
+       (ftruncate): Call ftruncate64.
+       (truncate): Call truncate64.
+       * wincap.cc: Set flag has_64bit_file_access appropriately.
+       * wincap.h: Add flag has_64bit_file_access.
+       * winsup.h (ILLEGAL_SEEK): Define as __off64_t.
+       (stat_dev): Declare using struct __stat64.
+       (stat_worker): Ditto.
+       * include/cygwin/stat.h (struct __stat32): Define if compiling Cygwin.
+       (struct __stat64): Ditto.
+       (struct stat): Revert definition with explicitly sized datatypes.
+       Eliminate sized field names.
+       * include/cygwin/types.h (blksize_t): New type.
+       (__blkcnt32_t): Ditto.
+       (__blkcnt64_t): Ditto.
+       (blkcnt_t): Ditto.
+
 2002-02-22  Christopher Faylor  <cgf@redhat.com>
 
        * sync.h (new_muto): Just accept an argument which denotes the name of
index 4f98f28..e2bf1fa 100644 (file)
@@ -304,6 +304,7 @@ fsetpos
 _fsetpos = fsetpos
 fstat
 _fstat = fstat
+fstat64
 fstatfs
 _fstatfs = fstatfs
 fsync
@@ -318,6 +319,7 @@ ftime
 _ftime = ftime
 ftruncate
 _ftruncate = ftruncate
+ftruncate64
 fwrite
 _fwrite = fwrite
 gamma
@@ -510,8 +512,10 @@ longjmp
 _longjmp = longjmp
 lseek
 _lseek = lseek
-lstat
-_lstat = lstat
+lseek64
+lstat = cygwin_lstat
+_lstat = cygwin_lstat
+lstat64
 malloc = export_malloc
 _malloc = export_malloc
 matherr
@@ -544,6 +548,7 @@ _mktemp = mktemp
 mktime
 _mktime = mktime
 mmap
+mmap64
 mprotect
 msync
 munmap
@@ -646,6 +651,7 @@ _scanf_r
 scanf_r = _scanf_r
 seekdir
 _seekdir = seekdir
+seekdir64
 setbuf
 _setbuf = setbuf
 setdtablesize
@@ -745,6 +751,7 @@ _sscanf_r
 sscanf_r = _sscanf_r
 stat
 _stat = stat
+stat64
 statfs
 _statfs = statfs
 strcasecmp
@@ -841,6 +848,7 @@ tcsetpgrp
 _tcsetpgrp = tcsetpgrp
 telldir
 _telldir = telldir
+telldir64
 tempnam
 _tempnam = tempnam
 time
@@ -860,6 +868,7 @@ toupper
 _toupper = toupper
 truncate
 _truncate = truncate
+truncate64
 ttyname
 _ttyname = ttyname
 tzset
index e3fd896..0294c09 100644 (file)
@@ -118,9 +118,8 @@ readdir (DIR *dir)
   return ((fhandler_base *) dir->__d_u.__d_data.__fh)->readdir (dir);
 }
 
-/* telldir */
-extern "C" __off32_t
-telldir (DIR *dir)
+extern "C" __off64_t
+telldir64 (DIR *dir)
 {
   if (check_null_invalid_struct_errno (dir))
     return -1;
@@ -130,9 +129,15 @@ telldir (DIR *dir)
   return ((fhandler_base *) dir->__d_u.__d_data.__fh)->telldir (dir);
 }
 
-/* seekdir */
+/* telldir */
+extern "C" __off32_t
+telldir (DIR *dir)
+{
+  return telldir64 (dir);
+}
+
 extern "C" void
-seekdir (DIR *dir, __off32_t loc)
+seekdir64 (DIR *dir, __off64_t loc)
 {
   if (check_null_invalid_struct_errno (dir))
     return;
@@ -142,6 +147,13 @@ seekdir (DIR *dir, __off32_t loc)
   return ((fhandler_base *) dir->__d_u.__d_data.__fh)->seekdir (dir, loc);
 }
 
+/* seekdir */
+extern "C" void
+seekdir (DIR *dir, __off32_t loc)
+{
+  seekdir64 (dir, (__off64_t)loc);
+}
+
 /* rewinddir: POSIX 5.1.2.1 */
 extern "C" void
 rewinddir (DIR *dir)
index b458049..cb74ffa 100644 (file)
@@ -27,6 +27,7 @@ details. */
 #include "sigproc.h"
 #include "pinfo.h"
 #include <assert.h>
+#include <limits.h>
 
 static NO_COPY const int CHUNK_SIZE = 1024; /* Used for crlf conversions */
 
@@ -693,10 +694,22 @@ fhandler_base::write (const void *ptr, size_t len)
   return res;
 }
 
-__off32_t
-fhandler_base::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_base::lseek (__off64_t offset, int whence)
 {
-  __off32_t res;
+  __off64_t res;
+
+  /* 9x/Me doesn't support 64bit offsets.  We trap that here and return
+     EINVAL.  It doesn't make sense to simulate bigger offsets by a
+     SetFilePointer sequence since FAT and FAT32 don't support file
+     size >= 4GB anyway. */
+  if (!wincap.has_64bit_file_access ()
+      && (offset < LONG_MIN || offset > LONG_MAX))
+    {
+      debug_printf ("Win9x, offset not 32 bit.");
+      set_errno (EINVAL);
+      return (__off64_t)-1;
+    }
 
   /* Seeks on text files is tough, we rewind and read till we get to the
      right place.  */
@@ -708,70 +721,16 @@ fhandler_base::lseek (__off32_t offset, int whence)
       set_readahead_valid (0);
     }
 
-  debug_printf ("lseek (%s, %d, %d)", unix_path_name, offset, whence);
-
-#if 0  /* lseek has no business messing about with text-mode stuff */
-
-  if (!get_r_binary ())
-    {
-      int newplace;
-
-      if (whence == 0)
-       {
-         newplace = offset;
-       }
-      else if (whence ==1)
-       {
-         newplace = rpos +  offset;
-       }
-      else
-       {
-         /* Seek from the end of a file.. */
-         if (rsize == -1)
-           {
-             /* Find the size of the file by reading till the end */
-
-             char b[CHUNK_SIZE];
-             while (read (b, sizeof (b)) > 0)
-               ;
-             rsize = rpos;
-           }
-         newplace = rsize + offset;
-       }
-
-      if (rpos > newplace)
-       {
-         SetFilePointer (handle, 0, 0, 0);
-         rpos = 0;
-       }
-
-      /* You can never shrink something more than 50% by turning CRLF into LF,
-        so we binary chop looking for the right place */
-
-      while (rpos < newplace)
-       {
-         char b[CHUNK_SIZE];
-         size_t span = (newplace - rpos) / 2;
-         if (span == 0)
-           span = 1;
-         if (span > sizeof (b))
-           span = sizeof (b);
-
-         debug_printf ("lseek (%s, %d, %d) span %d, rpos %d newplace %d",
-                      name, offset, whence,span,rpos, newplace);
-         read (b, span);
-       }
-
-      debug_printf ("Returning %d", newplace);
-      return newplace;
-    }
-#endif /* end of deleted code dealing with text mode */
+  debug_printf ("lseek (%s, %D, %d)", unix_path_name, offset, whence);
 
   DWORD win32_whence = whence == SEEK_SET ? FILE_BEGIN
                       : (whence == SEEK_CUR ? FILE_CURRENT : FILE_END);
 
-  res = SetFilePointer (get_handle(), offset, 0, win32_whence);
-  if (res == -1)
+  LONG off_low = offset & 0xffffffff;
+  LONG off_high = wincap.has_64bit_file_access () ? offset >> 32 : 0;
+
+  res = SetFilePointer (get_handle(), off_low, &off_high, win32_whence);
+  if (res == INVALID_SET_FILE_POINTER && GetLastError ())
     {
       __seterrno ();
     }
@@ -862,7 +821,7 @@ rootdir(char *full_path)
 }
 
 int __stdcall
-fhandler_base::fstat (struct stat *buf, path_conv *)
+fhandler_base::fstat (struct __stat64 *buf, path_conv *)
 {
   switch (get_device ())
     {
@@ -1181,7 +1140,7 @@ fhandler_base::readdir (DIR *)
   return NULL;
 }
 
-__off32_t
+__off64_t
 fhandler_base::telldir (DIR *)
 {
   set_errno (ENOTDIR);
@@ -1189,7 +1148,7 @@ fhandler_base::telldir (DIR *)
 }
 
 void
-fhandler_base::seekdir (DIR *, __off32_t)
+fhandler_base::seekdir (DIR *, __off64_t)
 {
   set_errno (ENOTDIR);
   return;
index e9080ea..7a94f04 100644 (file)
@@ -282,19 +282,19 @@ class fhandler_base
 
   virtual int open (path_conv * real_path, int flags, mode_t mode = 0);
   virtual int close ();
-  virtual int __stdcall fstat (struct stat *buf, path_conv *) __attribute__ ((regparm (3)));
+  virtual int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
   virtual int ioctl (unsigned int cmd, void *);
   virtual int fcntl (int cmd, void *);
   virtual char const * ttyname () { return get_name(); }
   virtual int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
   virtual int write (const void *ptr, size_t len);
-  virtual __off32_t lseek (__off32_t offset, int whence);
+  virtual __off64_t lseek (__off64_t offset, int whence);
   virtual int lock (int, struct flock *);
   virtual void dump ();
   virtual int dup (fhandler_base *child);
 
   virtual HANDLE mmap (caddr_t *addr, size_t len, DWORD access,
-                      int flags, __off32_t off);
+                      int flags, __off64_t off);
   virtual int munmap (HANDLE h, caddr_t addr, size_t len);
   virtual int msync (HANDLE h, caddr_t addr, size_t len, int flags);
   virtual BOOL fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
@@ -347,8 +347,8 @@ class fhandler_base
   virtual void set_eof () {}
   virtual DIR *opendir (path_conv& pc);
   virtual dirent *readdir (DIR *);
-  virtual __off32_t telldir (DIR *);
-  virtual void seekdir (DIR *, __off32_t);
+  virtual __off64_t telldir (DIR *);
+  virtual void seekdir (DIR *, __off64_t);
   virtual void rewinddir (DIR *);
   virtual int closedir (DIR *);
 };
@@ -382,7 +382,7 @@ class fhandler_socket: public fhandler_base
 
   int ioctl (unsigned int cmd, void *);
   int fcntl (int cmd, void *);
-  __off32_t lseek (__off32_t, int) { return 0; }
+  __off64_t lseek (__off64_t, int) { return 0; }
   int close ();
   void hclose (HANDLE) {close ();}
   int dup (fhandler_base *child);
@@ -405,7 +405,7 @@ class fhandler_socket: public fhandler_base
   int check_peer_secret_event (struct sockaddr_in *peer, int *secret = NULL);
   void signal_secret_event ();
   void close_secret_event ();
-  int __stdcall fstat (struct stat *buf, path_conv *) __attribute__ ((regparm (3)));
+  int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
 };
 
 class fhandler_pipe: public fhandler_base
@@ -417,7 +417,7 @@ class fhandler_pipe: public fhandler_base
   unsigned id;
  public:
   fhandler_pipe (DWORD devtype);
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
   select_record *select_read (select_record *s);
   select_record *select_write (select_record *s);
   select_record *select_except (select_record *s);
@@ -489,7 +489,7 @@ class fhandler_dev_floppy: public fhandler_dev_raw
   virtual int open (path_conv *, int flags, mode_t mode = 0);
   virtual int close (void);
 
-  virtual __off32_t lseek (__off32_t offset, int whence);
+  virtual __off64_t lseek (__off64_t offset, int whence);
 
   virtual int ioctl (unsigned int cmd, void *buf);
 };
@@ -512,9 +512,9 @@ class fhandler_dev_tape: public fhandler_dev_raw
   int open (path_conv *, int flags, mode_t mode = 0);
   int close (void);
 
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
 
-  int __stdcall fstat (struct stat *buf, path_conv *) __attribute__ ((regparm (3)));
+  int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
 
   int dup (fhandler_base *child);
 
@@ -545,18 +545,18 @@ class fhandler_disk_file: public fhandler_base
   int close ();
   int lock (int, struct flock *);
   BOOL is_device () { return FALSE; }
-  int __stdcall fstat (struct stat *buf, path_conv *pc) __attribute__ ((regparm (3)));
-  int __stdcall fstat_helper (struct stat *buf) __attribute__ ((regparm (2)));
+  int __stdcall fstat (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
+  int __stdcall fstat_helper (struct __stat64 *buf) __attribute__ ((regparm (2)));
 
-  HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, __off32_t off);
+  HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, __off64_t off);
   int munmap (HANDLE h, caddr_t addr, size_t len);
   int msync (HANDLE h, caddr_t addr, size_t len, int flags);
   BOOL fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
                              DWORD size, void *address);
   DIR *opendir (path_conv& pc);
   struct dirent *readdir (DIR *);
-  __off32_t telldir (DIR *);
-  void seekdir (DIR *, __off32_t);
+  __off64_t telldir (DIR *);
+  void seekdir (DIR *, __off64_t);
   void rewinddir (DIR *);
   int closedir (DIR *);
 };
@@ -572,11 +572,11 @@ class fhandler_cygdrive: public fhandler_disk_file
   fhandler_cygdrive (int unit);
   DIR *opendir (path_conv& pc);
   struct dirent *readdir (DIR *);
-  __off32_t telldir (DIR *);
-  void seekdir (DIR *, __off32_t);
+  __off64_t telldir (DIR *);
+  void seekdir (DIR *, __off64_t);
   void rewinddir (DIR *);
   int closedir (DIR *);
-  int __stdcall fstat (struct stat *buf, path_conv *pc) __attribute__ ((regparm (3)));
+  int __stdcall fstat (struct __stat64 *buf, path_conv *pc) __attribute__ ((regparm (3)));
 };
 
 class fhandler_serial: public fhandler_base
@@ -606,7 +606,7 @@ class fhandler_serial: public fhandler_base
   int tcflow (int);
   int tcsetattr (int a, const struct termios *t);
   int tcgetattr (struct termios *t);
-  __off32_t lseek (__off32_t, int) { return 0; }
+  __off64_t lseek (__off64_t, int) { return 0; }
   int tcflush (int);
   void dump ();
   int is_tty () { return 1; }
@@ -837,7 +837,7 @@ class fhandler_tty_slave: public fhandler_tty_common
   int tcflush (int);
   int ioctl (unsigned int cmd, void *);
 
-  __off32_t lseek (__off32_t, int) { return 0; }
+  __off64_t lseek (__off64_t, int) { return 0; }
   select_record *select_read (select_record *s);
   int ready_for_read (int fd, DWORD howlong);
 };
@@ -864,7 +864,7 @@ class fhandler_pty_master: public fhandler_tty_common
   int tcflush (int);
   int ioctl (unsigned int cmd, void *);
 
-  __off32_t lseek (__off32_t, int) { return 0; }
+  __off64_t lseek (__off64_t, int) { return 0; }
   char *ptsname ();
 
   void set_close_on_exec (int val);
@@ -903,7 +903,7 @@ class fhandler_dev_zero: public fhandler_base
   int open (path_conv *, int flags, mode_t mode = 0);
   int write (const void *ptr, size_t len);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
   int close (void);
 
   void dump ();
@@ -926,7 +926,7 @@ class fhandler_dev_random: public fhandler_base
   int open (path_conv *, int flags, mode_t mode = 0);
   int write (const void *ptr, size_t len);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
   int close (void);
   int dup (fhandler_base *child);
 
@@ -938,7 +938,7 @@ class fhandler_dev_mem: public fhandler_base
  protected:
   int unit;
   DWORD mem_size;
-  DWORD pos;
+  __off64_t pos;
 
  public:
   fhandler_dev_mem (int unit);
@@ -947,12 +947,12 @@ class fhandler_dev_mem: public fhandler_base
   int open (path_conv *, int flags, mode_t mode = 0);
   int write (const void *ptr, size_t ulen);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
   int close (void);
-  int __stdcall fstat (struct stat *buf, path_conv *) __attribute__ ((regparm (3)));
+  int __stdcall fstat (struct __stat64 *buf, path_conv *) __attribute__ ((regparm (3)));
   int dup (fhandler_base *child);
 
-  HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, __off32_t off);
+  HANDLE mmap (caddr_t *addr, size_t len, DWORD access, int flags, __off64_t off);
   int munmap (HANDLE h, caddr_t addr, size_t len);
   int msync (HANDLE h, caddr_t addr, size_t len, int flags);
   BOOL fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
@@ -969,7 +969,7 @@ class fhandler_dev_clipboard: public fhandler_base
   int open (path_conv *, int flags, mode_t mode = 0);
   int write (const void *ptr, size_t len);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
-  __off32_t lseek (__off32_t offset, int whence);
+  __off64_t lseek (__off64_t offset, int whence);
   int close (void);
 
   int dup (fhandler_base *child);
@@ -977,7 +977,7 @@ class fhandler_dev_clipboard: public fhandler_base
   void dump ();
 
  private:
-  __off32_t pos;
+  __off64_t pos;
   void *membuffer;
   size_t msize;
   bool eof;
@@ -995,7 +995,7 @@ class fhandler_windows: public fhandler_base
   int write (const void *ptr, size_t len);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
   int ioctl (unsigned int cmd, void *);
-  __off32_t lseek (__off32_t, int) { return 0; }
+  __off64_t lseek (__off64_t, int) { return 0; }
   int close (void) { return 0; }
 
   void set_close_on_exec (int val);
@@ -1021,7 +1021,7 @@ class fhandler_dev_dsp : public fhandler_base
   int write (const void *ptr, size_t len);
   int __stdcall read (void *ptr, size_t len) __attribute__ ((regparm (3)));
   int ioctl (unsigned int cmd, void *);
-  __off32_t lseek (__off32_t, int);
+  __off64_t lseek (__off64_t, int);
   int close (void);
   int dup (fhandler_base * child);
   void dump (void);
index b095107..266114f 100644 (file)
@@ -246,8 +246,8 @@ fhandler_dev_clipboard::read (void *ptr, size_t len)
     }
 }
 
-__off32_t
-fhandler_dev_clipboard::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_dev_clipboard::lseek (__off64_t offset, int whence)
 {
   /* On reads we check this at read time, not seek time.
    * On writes we use this to decide how to write - empty and write, or open, copy, empty
index 4f14aad..c251ed3 100644 (file)
@@ -61,7 +61,7 @@ num_entries (const char *win32_name)
 }
 
 int
-fhandler_disk_file::fstat (struct stat *buf, path_conv *pc)
+fhandler_disk_file::fstat (struct __stat64 *buf, path_conv *pc)
 {
   int res = -1;
   int oret;
@@ -132,17 +132,17 @@ fhandler_disk_file::fstat (struct stat *buf, path_conv *pc)
        buf->st_mode = S_IFREG;
       if (!pc->has_acls ()
          || get_file_attribute (TRUE, pc->get_win32 (),
-                                &buf->st_mode,
-                                &buf->st_uid, &buf->st_gid))
+                                &buf->st_mode, &uid, &gid))
        {
          buf->st_mode |= STD_RBITS | STD_XBITS;
          if (!(pc->has_attribute (FILE_ATTRIBUTE_READONLY)))
            buf->st_mode |= STD_WBITS;
          if (pc->issymlink ())
            buf->st_mode |= S_IRWXU | S_IRWXG | S_IRWXO;
-         get_file_attribute (FALSE, pc->get_win32 (),
-                             NULL, &buf->st_uid, &buf->st_gid);
+         get_file_attribute (FALSE, pc->get_win32 (), NULL, &uid, &gid);
        }
+      buf->st_uid = uid;
+      buf->st_gid = gid;
       if ((handle = FindFirstFile (pc->get_win32 (), &wfd))
          != INVALID_HANDLE_VALUE)
        {
@@ -158,9 +158,10 @@ fhandler_disk_file::fstat (struct stat *buf, path_conv *pc)
          buf->st_mtime   = to_time_t (&wfd.ftLastWriteTime);
          buf->st_ctime   = to_time_t (&wfd.ftCreationTime);
          buf->st_size    = wfd.nFileSizeLow;
+         buf->st_size    = ((__off64_t)wfd.nFileSizeHigh << 32)
+                           + wfd.nFileSizeLow;
          buf->st_blksize = S_BLKSIZE;
-         buf->st_blocks  = ((unsigned long) buf->st_size +
-                           S_BLKSIZE-1) / S_BLKSIZE;
+         buf->st_blocks  = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
          FindClose (handle);
        }
       res = 0;
@@ -170,7 +171,7 @@ fhandler_disk_file::fstat (struct stat *buf, path_conv *pc)
 }
 
 int
-fhandler_disk_file::fstat_helper (struct stat *buf)
+fhandler_disk_file::fstat_helper (struct __stat64 *buf)
 {
   int res = 0; // avoid a compiler warning
   BY_HANDLE_FILE_INFORMATION local;
@@ -200,7 +201,7 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
       if (lsize == 0xffffffff && GetLastError () != NO_ERROR)
        buf->st_mode = S_IFCHR;
       else
-       buf->st_size = lsize;
+       buf->st_size = ((__off64_t)hsize << 32) + lsize;
       /* We expect these to fail! */
       buf->st_mode |= STD_RBITS | STD_WBITS;
       buf->st_blksize = S_BLKSIZE;
@@ -228,7 +229,8 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
   buf->st_ctime   = to_time_t (&local.ftCreationTime);
   buf->st_nlink   = local.nNumberOfLinks;
   buf->st_dev     = local.dwVolumeSerialNumber;
-  buf->st_size    = local.nFileSizeLow;
+  buf->st_size    = ((__off64_t)local.nFileSizeHigh << 32)
+                   + local.nFileSizeLow;
 
   /* Allocate some place to determine the root directory. Need to allocate
      enough so that rootdir can add a trailing slash if path starts with \\. */
@@ -256,7 +258,7 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
     }
 
   buf->st_blksize = S_BLKSIZE;
-  buf->st_blocks  = ((unsigned long) buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
+  buf->st_blocks  = (buf->st_size + S_BLKSIZE-1) / S_BLKSIZE;
 
   buf->st_mode = 0;
   /* Using a side effect: get_file_attibutes checks for
@@ -267,8 +269,10 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
     buf->st_mode = S_IFLNK;
   else if (get_socket_p ())
     buf->st_mode = S_IFSOCK;
+  __uid16_t uid;
+  __gid16_t gid;
   if (get_file_attribute (has_acls (), get_win32_name (), &buf->st_mode,
-                         &buf->st_uid, &buf->st_gid) == 0)
+                         &uid, &gid) == 0)
     {
       /* If read-only attribute is set, modify ntsec return value */
       if ((local.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
@@ -277,6 +281,9 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
 
       if (!(buf->st_mode & S_IFMT))
        buf->st_mode |= S_IFREG;
+
+      buf->st_uid = uid;
+      buf->st_gid = gid;
     }
   else
     {
@@ -331,7 +338,7 @@ fhandler_disk_file::fstat_helper (struct stat *buf)
          }
     }
 
-  syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%d, st_mode=%p, st_ino=%d, sizeof=%d",
+  syscall_printf ("0 = fstat (, %p) st_atime=%x st_size=%D, st_mode=%p, st_ino=%d, sizeof=%d",
                 buf, buf->st_atime, buf->st_size, buf->st_mode,
                 (int) buf->st_ino, sizeof (*buf));
 
@@ -429,10 +436,10 @@ fhandler_disk_file::close ()
 int
 fhandler_disk_file::lock (int cmd, struct flock *fl)
 {
-  int win32_start;
+  __off64_t win32_start;
   int win32_len;
   DWORD win32_upper;
-  DWORD startpos;
+  __off64_t startpos;
 
   /*
    * We don't do getlck calls yet.
@@ -455,7 +462,7 @@ fhandler_disk_file::lock (int cmd, struct flock *fl)
        startpos = 0;
        break;
       case SEEK_CUR:
-       if ((__off32_t) (startpos = lseek (0, SEEK_CUR)) == ILLEGAL_SEEK)
+       if ((startpos = lseek (0, SEEK_CUR)) == ILLEGAL_SEEK)
          return -1;
        break;
       case SEEK_END:
@@ -466,7 +473,8 @@ fhandler_disk_file::lock (int cmd, struct flock *fl)
              __seterrno ();
              return -1;
            }
-         startpos = finfo.nFileSizeLow; /* Nowhere to keep high word */
+         startpos = ((__off64_t)finfo.nFileSizeHigh << 32)
+                    + finfo.nFileSizeLow;
          break;
        }
       default:
@@ -714,14 +722,14 @@ fhandler_disk_file::readdir (DIR *dir)
   return res;
 }
 
-__off32_t
+__off64_t
 fhandler_disk_file::telldir (DIR *dir)
 {
   return dir->__d_position;
 }
 
 void
-fhandler_disk_file::seekdir (DIR *dir, __off32_t loc)
+fhandler_disk_file::seekdir (DIR *dir, __off64_t loc)
 {
     rewinddir (dir);
     while (loc > dir->__d_position)
@@ -771,7 +779,7 @@ fhandler_cygdrive::set_drives ()
 }
 
 int
-fhandler_cygdrive::fstat (struct stat *buf, path_conv *pc)
+fhandler_cygdrive::fstat (struct __stat64 *buf, path_conv *pc)
 {
   if (!iscygdrive_root ())
     return fhandler_disk_file::fstat (buf, pc);
@@ -818,14 +826,14 @@ fhandler_cygdrive::readdir (DIR *dir)
   return dir->__d_dirent;
 }
 
-__off32_t
+__off64_t
 fhandler_cygdrive::telldir (DIR *dir)
 {
   return fhandler_disk_file::telldir (dir);
 }
 
 void
-fhandler_cygdrive::seekdir (DIR *dir, __off32_t loc)
+fhandler_cygdrive::seekdir (DIR *dir, __off64_t loc)
 {
   if (!iscygdrive_root ())
     return fhandler_disk_file::seekdir (dir, loc);
index baa9989..6ea8f3c 100644 (file)
@@ -482,8 +482,8 @@ fhandler_dev_dsp::read (void *ptr, size_t len)
   return len;
 }
 
-__off32_t
-fhandler_dev_dsp::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_dev_dsp::lseek (__off64_t offset, int whence)
 {
   return 0;
 }
index f03de02..43daf9d 100644 (file)
@@ -77,16 +77,16 @@ fhandler_dev_floppy::close (void)
   return fhandler_dev_raw::close ();
 }
 
-__off32_t
-fhandler_dev_floppy::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_dev_floppy::lseek (__off64_t offset, int whence)
 {
   int ret;
   char buf[512];
-  long long drive_size = 0;
-  long long lloffset = offset;
-  long long current_position;
-  __off32_t sector_aligned_offset;
-  __off32_t bytes_left;
+  __off64_t drive_size = 0;
+  __off64_t lloffset = offset;
+  __off64_t current_position;
+  __off64_t sector_aligned_offset;
+  __off64_t bytes_left;
   DWORD low;
   LONG high = 0;
 
@@ -117,11 +117,11 @@ fhandler_dev_floppy::lseek (__off32_t offset, int whence)
       debug_printf ("partition info: %ld (%ld)",
                      pi.StartingOffset.LowPart,
                      pi.PartitionLength.LowPart);
-      drive_size = (long long) pi.PartitionLength.QuadPart;
+      drive_size = pi.PartitionLength.QuadPart;
     }
   else
     {
-      drive_size = (long long) di.Cylinders.QuadPart * di.TracksPerCylinder *
+      drive_size = di.Cylinders.QuadPart * di.TracksPerCylinder *
                   di.SectorsPerTrack * di.BytesPerSector;
     }
   debug_printf ("drive size: %ld", drive_size);
@@ -140,7 +140,7 @@ fhandler_dev_floppy::lseek (__off32_t offset, int whence)
          __seterrno ();
          return -1;
        }
-      current_position = (long long) low + ((long long) high << 32);
+      current_position = low + ((__off64_t) high << 32);
       if (is_writing)
        current_position += devbufend - devbufstart;
       else
@@ -156,18 +156,10 @@ fhandler_dev_floppy::lseek (__off32_t offset, int whence)
       set_errno (EINVAL);
       return -1;
     }
-  high = lloffset >> 32;
-  low = lloffset & 0xffffffff;
-  if (high || (__off32_t) low < 0)
-    {
-      set_errno (EFBIG);
-      return -1;
-    }
-  offset = (__off32_t) low;
 
   /* FIXME: sector can possibly be not 512 bytes long */
-  sector_aligned_offset = (offset / 512) * 512;
-  bytes_left = offset - sector_aligned_offset;
+  sector_aligned_offset = (lloffset / 512) * 512;
+  bytes_left = lloffset - sector_aligned_offset;
 
   if (whence == SEEK_SET)
     {
@@ -177,8 +169,10 @@ fhandler_dev_floppy::lseek (__off32_t offset, int whence)
        return ret;
       devbufstart = devbufend = 0;
 
-      if (SetFilePointer (get_handle (), sector_aligned_offset, NULL, FILE_BEGIN)
-         == INVALID_SET_FILE_POINTER)
+      low = sector_aligned_offset & 0xffffffff;
+      high = sector_aligned_offset >> 32;
+      if (SetFilePointer (get_handle (), low, &high, FILE_BEGIN)
+         == INVALID_SET_FILE_POINTER && GetLastError ())
        {
          __seterrno ();
          return -1;
index 03fbec9..e5b9952 100644 (file)
@@ -231,8 +231,8 @@ fhandler_dev_mem::close (void)
   return fhandler_base::close ();
 }
 
-__off32_t
-fhandler_dev_mem::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_dev_mem::lseek (__off64_t offset, int whence)
 {
   switch (whence)
     {
@@ -265,11 +265,11 @@ fhandler_dev_mem::lseek (__off32_t offset, int whence)
 
 HANDLE
 fhandler_dev_mem::mmap (caddr_t *addr, size_t len, DWORD access,
-                       int flags, __off32_t off)
+                       int flags, __off64_t off)
 {
-  if ((DWORD) off >= mem_size
+  if (off >= mem_size
       || (DWORD) len >= mem_size
-      || (DWORD) off + len >= mem_size)
+      || off + len >= mem_size)
     {
       set_errno (EINVAL);
       syscall_printf ("-1 = mmap(): illegal parameter, set EINVAL");
@@ -402,7 +402,7 @@ fhandler_dev_mem::fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
 }
 
 int
-fhandler_dev_mem::fstat (struct stat *buf, path_conv *pc)
+fhandler_dev_mem::fstat (struct __stat64 *buf, path_conv *pc)
 {
   this->fhandler_base::fstat (buf, pc);
   buf->st_mode = S_IFCHR;
index 91355c3..33ccadd 100644 (file)
@@ -132,8 +132,8 @@ fhandler_dev_random::read (void *ptr, size_t len)
   return -1;
 }
 
-__off32_t
-fhandler_dev_random::lseek (__off32_t, int)
+__off64_t
+fhandler_dev_random::lseek (__off64_t, int)
 {
   return 0;
 }
index c2af990..cf8ec1c 100644 (file)
@@ -245,7 +245,7 @@ fhandler_socket::dup (fhandler_base *child)
 }
 
 int __stdcall
-fhandler_socket::fstat (struct stat *buf, path_conv *pc)
+fhandler_socket::fstat (struct __stat64 *buf, path_conv *pc)
 {
   fhandler_disk_file fh;
   fh.set_name (get_name (), get_win32_name ());
index b4f6d5d..6b9bd1f 100644 (file)
@@ -147,7 +147,7 @@ fhandler_dev_tape::close (void)
 }
 
 int
-fhandler_dev_tape::fstat (struct stat *buf, path_conv *pc)
+fhandler_dev_tape::fstat (struct __stat64 *buf, path_conv *pc)
 {
   int ret;
 
@@ -164,8 +164,8 @@ fhandler_dev_tape::fstat (struct stat *buf, path_conv *pc)
   return ret;
 }
 
-__off32_t
-fhandler_dev_tape::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_dev_tape::lseek (__off64_t offset, int whence)
 {
   struct mtop op;
   struct mtpos pos;
index 4c018c9..50b34ab 100644 (file)
@@ -41,8 +41,8 @@ fhandler_dev_zero::read (void *ptr, size_t len)
   return len;
 }
 
-__off32_t
-fhandler_dev_zero::lseek (__off32_t, int)
+__off64_t
+fhandler_dev_zero::lseek (__off64_t, int)
 {
   return 0;
 }
index c8a6ffb..cdb30a8 100644 (file)
@@ -94,8 +94,12 @@ __weak_alias(__globfree13,___globfree13);
 #ifdef __LIBC12_SOURCE__
 #define        STAT    stat12
 #else
+#if defined (__INSIDE_CYGWIN__)
+#define STAT   __stat64
+#else
 #define        STAT    stat
 #endif
+#endif
 
 #define        DOLLAR          '$'
 #define        DOT             '.'
@@ -814,7 +818,11 @@ g_lstat(fn, sb, pglob)
        g_Ctoc(fn, buf);
        if (pglob->gl_flags & GLOB_ALTDIRFUNC)
                return((*pglob->gl_lstat)(buf, sb));
+#ifdef __INSIDE_CYGWIN__
+       return(lstat64(buf, sb));
+#else
        return(lstat(buf, sb));
+#endif
 }
 
 static int
@@ -828,7 +836,11 @@ g_stat(fn, sb, pglob)
        g_Ctoc(fn, buf);
        if (pglob->gl_flags & GLOB_ALTDIRFUNC)
                return((*pglob->gl_stat)(buf, sb));
+#ifdef __INSIDE_CYGWIN__
+       return(stat64(buf, sb));
+#else
        return(stat(buf, sb));
+#endif
 }
 
 static Char *
index 7385ebc..90abc39 100644 (file)
@@ -16,36 +16,75 @@ details. */
 extern "C" {
 #endif
 
-struct  stat
-{ 
-  dev_t     st_dev;
-  ino_t     st_ino;
-  mode_t    st_mode;
-  nlink_t   st_nlink;
-  __uid16_t __st_uid16;
-  __gid16_t __st_gid16;
-  dev_t     st_rdev;
-  __off32_t __st_size32;
-  time_t    st_atime;
-  __uid32_t __st_uid32;
-  time_t    st_mtime;
-  __uid32_t __st_gid32;
-  time_t    st_ctime;
-  long      st_spare3;
-  long      st_blksize;
-  long      st_blocks;
-  __off64_t __st_size64;
+#ifdef __INSIDE_CYGWIN__
+struct __stat32
+{
+  dev_t         st_dev;
+  ino_t         st_ino;
+  mode_t        st_mode;
+  nlink_t       st_nlink;
+  __uid16_t     st_uid;
+  __gid16_t     st_gid;
+  dev_t         st_rdev;
+  __off32_t     st_size;
+  time_t        st_atime;
+  long          st_spare1;
+  time_t        st_mtime;
+  long          st_spare2;
+  time_t        st_ctime;
+  long          st_spare3;
+  blksize_t     st_blksize;
+  __blkcnt32_t  st_blocks;
+  long          st_spare4[2];
+};
+
+struct __stat64
+{
+  dev_t         st_dev;
+  ino_t         st_ino;
+  mode_t        st_mode;
+  nlink_t       st_nlink;
+  __uid32_t     st_uid;
+  __gid32_t     st_gid;
+  dev_t         st_rdev;
+  __off64_t     st_size;
+  time_t        st_atime;
+  long          st_spare1;
+  time_t        st_mtime;
+  long          st_spare2;
+  time_t        st_ctime;
+  long          st_spare3;
+  blksize_t     st_blksize;
+  __blkcnt64_t  st_blocks;
+  long          st_spare4[2];
 };
 
-#ifdef __CYGWIN_USE_BIG_TYPES__
-#define st_uid  __st_uid32
-#define st_gid  __st_gid32
-#define st_size __st_size64
-#else
-#define st_uid  __st_uid16
-#define st_gid  __st_gid16
-#define st_size __st_size32
-#endif /* __CYGWIN_USE_BIG_TYPES__ */
+extern int fstat64 (int fd, struct __stat64 *buf);
+extern int stat64 (const char *file_name, struct __stat64 *buf);
+extern int lstat64 (const char *file_name, struct __stat64 *buf);
+
+#endif
+
+struct stat
+{ 
+  dev_t         st_dev;
+  ino_t         st_ino;
+  mode_t        st_mode;
+  nlink_t       st_nlink;
+  uid_t         st_uid;
+  gid_t         st_gid;
+  dev_t         st_rdev;
+  off_t         st_size;
+  time_t        st_atime;
+  long          st_spare1;
+  time_t        st_mtime;
+  long          st_spare2;
+  time_t        st_ctime;
+  long          st_spare3;
+  blksize_t     st_blksize;
+  blkcnt_t      st_blocks;
+  long          st_spare4[2];
+};
 
 #ifdef __cplusplus
 }
index 585225f..296a11a 100644 (file)
@@ -25,6 +25,16 @@ typedef __off64_t off_t;
 typedef __off32_t off_t;
 #endif
 
+typedef long blksize_t;
+
+typedef long __blkcnt32_t;
+typedef long long __blkcnt64_t;
+#ifdef __CYGWIN_USE_BIG_TYPES__
+typedef __blkcnt64_t  blkcnt_t;
+#else
+typedef __blkcnt32_t  blkcnt_t;
+#endif
+
 typedef unsigned short __uid16_t;
 typedef unsigned short __gid16_t;
 typedef unsigned long  __uid32_t;
index c532727..57bd827 100644 (file)
@@ -47,13 +47,13 @@ class mmap_record
     HANDLE mapping_handle_;
     int devtype_;
     DWORD access_mode_;
-    DWORD offset_;
+    __off64_t offset_;
     DWORD size_to_map_;
     caddr_t base_address_;
     DWORD *map_map_;
 
   public:
-    mmap_record (int fd, HANDLE h, DWORD ac, DWORD o, DWORD s, caddr_t b) :
+    mmap_record (int fd, HANDLE h, DWORD ac, __off64_t o, DWORD s, caddr_t b) :
        fdesc_ (fd),
        mapping_handle_ (h),
        devtype_ (0),
@@ -95,7 +95,7 @@ class mmap_record
     void free_map () { if (map_map_) free (map_map_); }
 
     DWORD find_empty (DWORD pages);
-    DWORD map_map (DWORD off, DWORD len);
+    __off64_t map_map (__off64_t off, DWORD len);
     BOOL unmap_map (caddr_t addr, DWORD len);
     void fixup_map (void);
 
@@ -124,8 +124,8 @@ mmap_record::find_empty (DWORD pages)
   return (DWORD)-1;
 }
 
-DWORD
-mmap_record::map_map (DWORD off, DWORD len)
+__off64_t
+mmap_record::map_map (__off64_t off, DWORD len)
 {
   DWORD prot, old_prot;
   switch (access_mode_)
@@ -255,8 +255,8 @@ public:
   ~list ();
   mmap_record *add_record (mmap_record r);
   void erase (int i);
-  mmap_record *match (DWORD off, DWORD len);
-  __off32_t match (caddr_t addr, DWORD len, __off32_t start);
+  mmap_record *match (__off64_t off, DWORD len);
+  long match (caddr_t addr, DWORD len, long start);
 };
 
 list::list ()
@@ -287,7 +287,7 @@ list::add_record (mmap_record r)
 
 /* Used in mmap() */
 mmap_record *
-list::match (DWORD off, DWORD len)
+list::match (__off64_t off, DWORD len)
 {
   if (fd == -1 && !off)
     {
@@ -307,14 +307,14 @@ list::match (DWORD off, DWORD len)
 }
 
 /* Used in munmap() */
-__off32_t
+long
 list::match (caddr_t addr, DWORD len, __off32_t start)
 {
   for (int i = start + 1; i < nrecs; ++i)
     if (addr >= recs[i].get_address ()
        && addr + len <= recs[i].get_address () + recs[i].get_size ())
       return i;
-  return ILLEGAL_SEEK;
+  return -1;
 }
 
 void
@@ -400,9 +400,9 @@ static map *mmapped_areas;
 
 extern "C"
 caddr_t
-mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
+mmap64 (caddr_t addr, size_t len, int prot, int flags, int fd, __off64_t off)
 {
-  syscall_printf ("addr %x, len %d, prot %x, flags %x, fd %d, off %d",
+  syscall_printf ("addr %x, len %d, prot %x, flags %x, fd %d, off %D",
                  addr, len, prot, flags, fd, off);
 
   static DWORD granularity;
@@ -444,7 +444,7 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
     fd = -1;
 
   /* Map always in multipliers of `granularity'-sized chunks. */
-  DWORD gran_off = off & ~(granularity - 1);
+  __off64_t gran_off = off & ~(granularity - 1);
   DWORD gran_len = howmany (len, granularity) * granularity;
 
   fhandler_base *fh;
@@ -464,7 +464,9 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
       fh = cfd;
       if (fh->get_device () == FH_DISK)
        {
-         DWORD fsiz = GetFileSize (fh->get_handle (), NULL);
+         DWORD high;
+         DWORD low = GetFileSize (fh->get_handle (), &high);
+         __off64_t fsiz = ((__off64_t)high << 32) + low;
          fsiz -= gran_off;
          if (gran_len > fsiz)
            gran_len = fsiz;
@@ -554,6 +556,13 @@ mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
   return ret;
 }
 
+extern "C"
+caddr_t
+mmap (caddr_t addr, size_t len, int prot, int flags, int fd, __off32_t off)
+{
+  return mmap64 (addr, len, prot, flags, fd, (__off64_t)off);
+}
+
 /* munmap () removes an mmapped area.  It insists that base area
    requested is the same as that mmapped, error if not. */
 
@@ -589,7 +598,7 @@ munmap (caddr_t addr, size_t len)
       list *l = mmapped_areas->lists[it];
       if (l)
        {
-         __off32_t li = ILLEGAL_SEEK;
+         long li = -1;
          if ((li = l->match(addr, len, li)) >= 0)
            {
              mmap_record *rec = l->recs + li;
@@ -695,7 +704,7 @@ msync (caddr_t addr, size_t len, int flags)
 */
 HANDLE
 fhandler_base::mmap (caddr_t *addr, size_t len, DWORD access,
-                    int flags, __off32_t off)
+                    int flags, __off64_t off)
 {
   set_errno (ENODEV);
   return INVALID_HANDLE_VALUE;
@@ -726,7 +735,7 @@ fhandler_base::fixup_mmap_after_fork (HANDLE h, DWORD access, DWORD offset,
 /* Implementation for disk files. */
 HANDLE
 fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access,
-                         int flags, __off32_t off)
+                         int flags, __off64_t off)
 {
   DWORD protect;
 
@@ -769,9 +778,10 @@ fhandler_disk_file::mmap (caddr_t *addr, size_t len, DWORD access,
       return INVALID_HANDLE_VALUE;
     }
 
-  void *base = MapViewOfFileEx (h, access, 0, off, len,
+  DWORD high = off >> 32, low = off & 0xffffffff;
+  void *base = MapViewOfFileEx (h, access, high, low, len,
                               (flags & MAP_FIXED) ? *addr : NULL);
-  debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%d, len:%d, addr:%x)", base, h, access, off, len, (flags & MAP_FIXED) ? *addr : NULL);
+  debug_printf ("%x = MapViewOfFileEx (h:%x, access:%x, 0, off:%D, len:%d, addr:%x)", base, h, access, off, len, (flags & MAP_FIXED) ? *addr : NULL);
   if (!base || ((flags & MAP_FIXED) && base != *addr))
     {
       if (!base)
index d5cb59a..b870807 100644 (file)
@@ -31,8 +31,8 @@ fhandler_pipe::fhandler_pipe (DWORD devtype)
 {
 }
 
-__off32_t
-fhandler_pipe::lseek (__off32_t offset, int whence)
+__off64_t
+fhandler_pipe::lseek (__off64_t offset, int whence)
 {
   debug_printf ("(%d, %d)", offset, whence);
   set_errno (ESPIPE);
index 7c5bc63..36c31a8 100644 (file)
@@ -476,7 +476,7 @@ acl_worker (const char *path, int cmd, int nentries, __aclent16_t *aclbufp,
     }
   if (!real_path.has_acls ())
     {
-      struct stat st;
+      struct __stat64 st;
       int ret = -1;
 
       switch (cmd)
@@ -487,8 +487,8 @@ acl_worker (const char *path, int cmd, int nentries, __aclent16_t *aclbufp,
        case GETACL:
          if (nentries < 1)
            set_errno (EINVAL);
-         else if ((nofollow && !lstat (path, &st))
-                  || (!nofollow && !stat (path, &st)))
+         else if ((nofollow && !lstat64 (path, &st))
+                  || (!nofollow && !stat64 (path, &st)))
            {
              __aclent16_t lacl[4];
              if (nentries > 0)
index 743dcbc..7c0672e 100644 (file)
@@ -527,10 +527,10 @@ _open (const char *unix_path, int flags, ...)
   return res;
 }
 
-extern "C" __off32_t
-_lseek (int fd, __off32_t pos, int dir)
+extern "C" __off64_t
+lseek64 (int fd, __off64_t pos, int dir)
 {
-  __off32_t res;
+  __off64_t res;
   sigframe thisframe (mainthread);
 
   if (dir != SEEK_SET && dir != SEEK_CUR && dir != SEEK_END)
@@ -546,11 +546,17 @@ _lseek (int fd, __off32_t pos, int dir)
       else
        res = -1;
     }
-  syscall_printf ("%d = lseek (%d, %d, %d)", res, fd, pos, dir);
+  syscall_printf ("%d = lseek (%d, %D, %d)", res, fd, pos, dir);
 
   return res;
 }
 
+extern "C" __off32_t
+_lseek (int fd, __off32_t pos, int dir)
+{
+  return lseek64 (fd, (__off64_t) pos, dir);
+}
+
 extern "C" int
 _close (int fd)
 {
@@ -956,8 +962,26 @@ fchmod (int fd, mode_t mode)
   return chmod (path, mode);
 }
 
+static void
+stat64_to_stat32 (struct __stat64 *src, struct __stat32 *dst)
+{
+  dst->st_dev = src->st_dev;
+  dst->st_ino = src->st_ino;
+  dst->st_mode = src->st_mode;
+  dst->st_nlink = src->st_nlink;
+  dst->st_uid = src->st_uid;
+  dst->st_gid = src->st_gid;
+  dst->st_rdev = src->st_rdev;
+  dst->st_size = src->st_size;
+  dst->st_atime = src->st_atime;
+  dst->st_mtime = src->st_mtime;
+  dst->st_ctime = src->st_ctime;
+  dst->st_blksize = src->st_blksize;
+  dst->st_blocks = src->st_blocks;
+}
+
 extern "C" int
-_fstat (int fd, struct stat *buf)
+fstat64 (int fd, struct __stat64 *buf)
 {
   int res;
   sigframe thisframe (mainthread);
@@ -967,7 +991,7 @@ _fstat (int fd, struct stat *buf)
     res = -1;
   else
     {
-      memset (buf, 0, sizeof (struct stat));
+      memset (buf, 0, sizeof (struct __stat64));
       res = cfd->fstat (buf, NULL);
     }
 
@@ -975,6 +999,16 @@ _fstat (int fd, struct stat *buf)
   return res;
 }
 
+extern "C" int
+_fstat (int fd, struct __stat32 *buf)
+{
+  struct __stat64 buf64;
+  int ret = fstat64 (fd, &buf64);
+  if (!ret)
+    stat64_to_stat32 (&buf64, buf);
+  return ret;
+}
+
 /* fsync: P96 6.6.1.1 */
 extern "C" int
 fsync (int fd)
@@ -1011,7 +1045,8 @@ suffix_info stat_suffixes[] =
 
 /* Cygwin internal */
 int __stdcall
-stat_worker (const char *name, struct stat *buf, int nofollow, path_conv *pc)
+stat_worker (const char *name, struct __stat64 *buf, int nofollow,
+            path_conv *pc)
 {
   int res = -1;
   path_conv real_path;
@@ -1038,7 +1073,7 @@ stat_worker (const char *name, struct stat *buf, int nofollow, path_conv *pc)
     {
       debug_printf ("(%s, %p, %d, %p), file_attributes %d", name, buf, nofollow,
                    pc, (DWORD) real_path);
-      memset (buf, 0, sizeof (struct stat));
+      memset (buf, 0, sizeof (struct __stat64));
       res = fh->fstat (buf, pc);
     }
 
@@ -1051,22 +1086,43 @@ stat_worker (const char *name, struct stat *buf, int nofollow, path_conv *pc)
 }
 
 extern "C" int
-_stat (const char *name, struct stat *buf)
+stat64 (const char *name, struct __stat64 *buf)
 {
   sigframe thisframe (mainthread);
   syscall_printf ("entering");
   return stat_worker (name, buf, 0);
 }
 
+extern "C" int
+_stat (const char *name, struct __stat32 *buf)
+{
+  struct __stat64 buf64;
+  int ret = stat64 (name, &buf64);
+  if (!ret)
+    stat64_to_stat32 (&buf64, buf);
+  return ret;
+}
+
 /* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
 extern "C" int
-lstat (const char *name, struct stat *buf)
+lstat64 (const char *name, struct __stat64 *buf)
 {
   sigframe thisframe (mainthread);
   syscall_printf ("entering");
   return stat_worker (name, buf, 1);
 }
 
+/* lstat: Provided by SVR4 and 4.3+BSD, POSIX? */
+extern "C" int
+cygwin_lstat (const char *name, struct __stat32 *buf)
+{
+  struct __stat64 buf64;
+  int ret = lstat64 (name, &buf64);
+  if (!ret)
+    stat64_to_stat32 (&buf64, buf);
+  return ret;
+}
+
 extern int acl_access (const char *, int);
 
 extern "C" int
@@ -1083,7 +1139,7 @@ access (const char *fn, int flags)
   if (allow_ntsec)
     return acl_access (fn, flags);
 
-  struct stat st;
+  struct __stat64 st;
   int r = stat_worker (fn, &st, 0);
   if (r)
     return -1;
@@ -1607,9 +1663,8 @@ setmode (int fd, int mode)
   return res;
 }
 
-/* ftruncate: P96 5.6.7.1 */
 extern "C" int
-ftruncate (int fd, __off32_t length)
+ftruncate64 (int fd, __off64_t length)
 {
   sigframe thisframe (mainthread);
   int res = -1;
@@ -1626,7 +1681,7 @@ ftruncate (int fd, __off32_t length)
          if (cfd->get_handle ())
            {
              /* remember curr file pointer location */
-             __off32_t prev_loc = cfd->lseek (0, SEEK_CUR);
+             __off64_t prev_loc = cfd->lseek (0, SEEK_CUR);
 
              cfd->lseek (length, SEEK_SET);
              if (!SetEndOfFile (h))
@@ -1635,7 +1690,7 @@ ftruncate (int fd, __off32_t length)
                res = 0;
 
              /* restore original file pointer location */
-             cfd->lseek (prev_loc, 0);
+             cfd->lseek (prev_loc, SEEK_SET);
            }
        }
     }
@@ -1644,9 +1699,16 @@ ftruncate (int fd, __off32_t length)
   return res;
 }
 
+/* ftruncate: P96 5.6.7.1 */
+extern "C" int
+ftruncate (int fd, __off32_t length)
+{
+  return ftruncate64 (fd, (__off64_t)length);
+}
+
 /* truncate: Provided by SVR4 and 4.3+BSD.  Not part of POSIX.1 or XPG3 */
 extern "C" int
-truncate (const char *pathname, __off32_t length)
+truncate64 (const char *pathname, __off64_t length)
 {
   sigframe thisframe (mainthread);
   int fd;
@@ -1666,6 +1728,13 @@ truncate (const char *pathname, __off32_t length)
   return res;
 }
 
+/* truncate: Provided by SVR4 and 4.3+BSD.  Not part of POSIX.1 or XPG3 */
+extern "C" int
+truncate (const char *pathname, __off32_t length)
+{
+  return truncate64 (pathname, (__off64_t)length);
+}
+
 extern "C" long
 get_osfhandle (int fd)
 {
@@ -2377,6 +2446,7 @@ logout (char *line)
     {
       struct utmp *ut;
       struct utmp ut_buf[100];
+      /* FIXME: utmp file access is not 64 bit clean for now. */
       __off32_t pos = 0;               /* Position in file */
       DWORD rd;
 
index dc4a8d2..09e95fb 100644 (file)
@@ -45,6 +45,7 @@ static NO_COPY wincaps wincap_unknown = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:false,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_95 = {
@@ -81,6 +82,7 @@ static NO_COPY wincaps wincap_95 = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:false,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_95osr2 = {
@@ -117,6 +119,7 @@ static NO_COPY wincaps wincap_95osr2 = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:false,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_98 = {
@@ -153,6 +156,7 @@ static NO_COPY wincaps wincap_98 = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:true,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_98se = {
@@ -189,6 +193,7 @@ static NO_COPY wincaps wincap_98se = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:true,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_me = {
@@ -225,6 +230,7 @@ static NO_COPY wincaps wincap_me = {
   has_try_enter_critical_section:false,
   has_raw_devices:false,
   has_valid_processorlevel:true,
+  has_64bit_file_access:false,
 };
 
 static NO_COPY wincaps wincap_nt3 = {
@@ -261,6 +267,7 @@ static NO_COPY wincaps wincap_nt3 = {
   has_try_enter_critical_section:false,
   has_raw_devices:true,
   has_valid_processorlevel:true,
+  has_64bit_file_access:true,
 };
 
 static NO_COPY wincaps wincap_nt4 = {
@@ -297,6 +304,7 @@ static NO_COPY wincaps wincap_nt4 = {
   has_try_enter_critical_section:true,
   has_raw_devices:true,
   has_valid_processorlevel:true,
+  has_64bit_file_access:true,
 };
 
 static NO_COPY wincaps wincap_nt4sp4 = {
@@ -333,6 +341,7 @@ static NO_COPY wincaps wincap_nt4sp4 = {
   has_try_enter_critical_section:true,
   has_raw_devices:true,
   has_valid_processorlevel:true,
+  has_64bit_file_access:true,
 };
 
 static NO_COPY wincaps wincap_2000 = {
@@ -369,6 +378,7 @@ static NO_COPY wincaps wincap_2000 = {
   has_try_enter_critical_section:true,
   has_raw_devices:true,
   has_valid_processorlevel:true,
+  has_64bit_file_access:true,
 };
 
 static NO_COPY wincaps wincap_xp = {
@@ -405,6 +415,7 @@ static NO_COPY wincaps wincap_xp = {
   has_try_enter_critical_section:true,
   has_raw_devices:true,
   has_valid_processorlevel:true,
+  has_64bit_file_access:true,
 };
 
 wincapc NO_COPY wincap;
index ad92386..088907a 100644 (file)
@@ -46,6 +46,7 @@ struct wincaps
   unsigned has_try_enter_critical_section              : 1;
   unsigned has_raw_devices                             : 1;
   unsigned has_valid_processorlevel                    : 1;
+  unsigned has_64bit_file_access                       : 1;
 };
 
 class wincapc
@@ -97,6 +98,7 @@ public:
   bool  IMPLEMENT (has_try_enter_critical_section)
   bool  IMPLEMENT (has_raw_devices)
   bool  IMPLEMENT (has_valid_processorlevel)
+  bool  IMPLEMENT (has_64bit_file_access)
 
 #undef IMPLEMENT
 };
index 0adbb73..d3daec2 100644 (file)
@@ -147,7 +147,7 @@ void uinfo_init (void);
 
 #define ILLEGAL_UID ((__uid16_t)-1)
 #define ILLEGAL_GID ((__gid16_t)-1)
-#define ILLEGAL_SEEK ((__off32_t)-1)
+#define ILLEGAL_SEEK ((__off64_t)-1)
 
 /* various events */
 void events_init (void);
@@ -179,7 +179,7 @@ extern int cygwin_finished_initializing;
 
 void __stdcall set_std_handle (int);
 int __stdcall writable_directory (const char *file);
-int __stdcall stat_dev (DWORD, int, unsigned long, struct stat *);
+int __stdcall stat_dev (DWORD, int, unsigned long, struct __stat64 *);
 extern BOOL allow_ntsec;
 
 unsigned long __stdcall hash_path_name (unsigned long hash, const char *name) __attribute__ ((regparm(2)));
@@ -230,7 +230,7 @@ extern "C" void __malloc_lock (struct _reent *);
 extern "C" void __malloc_unlock (struct _reent *);
 
 class path_conv;
-int __stdcall stat_worker (const char *name, struct stat *buf, int nofollow,
+int __stdcall stat_worker (const char *name, struct __stat64 *buf, int nofollow,
                           path_conv *pc = NULL) __attribute__ ((regparm (3)));
 
 /**************************** Exports ******************************/