* 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.
This commit is contained in:
Corinna Vinschen 2002-02-25 17:47:51 +00:00
parent 5a909729b1
commit acb5617538
24 changed files with 433 additions and 238 deletions

View 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

View 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

View 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)

View 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;

View 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);

View 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

View 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);

View 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;
}

View 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;

View 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;

View 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;
}

View 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 ());

View 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;

View 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;
}

View 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 *

View 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];
};
#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__ */
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];
};
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
}

View 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;

View 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)

View 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);

View 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)

View 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;

View 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;

View 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
};

View 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 ******************************/