diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 7cfb16af2..93eaaf721 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,20 @@ +2005-07-29 Christopher Faylor + + * fhandler.h (fhandler_base::pread): Declare new function. + (fhandler_base::pwrite): Ditto. + (fhandler_disk_file::pread): Ditto. + (fhandler_disk_file::pwrite): Ditto. + * fhandler.cc (fhandler_base::pread): Define new function. + (fhandler_base::pwrite): Ditto. + * fhandler_disk_file.cc (fhandler_base::pread): Ditto. + (fhandler_base::pwrite): Ditto. + * syscalls.cc (pread): Define new function. + (pwrite): Ditto. + * cygwin.din: Export pread, pwrite. + + * include/sys/ioctl.h: Guard some _IO* declarations to avoid conflict + with socket.h. + 2005-07-29 Christopher Faylor * include/sys/ioctl.h: Add some linux defines. diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 3e550e23a..c27162e0d 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -348,6 +348,8 @@ rexec = cygwin_rexec SIGFE rresvport = cygwin_rresvport SIGFE _select = cygwin_select SIGFE select = cygwin_select SIGFE +pread SIGFE +pwrite SIGFE pselect SIGFE send = cygwin_send SIGFE sendmsg = cygwin_sendmsg SIGFE diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index e5e14fc92..60ea7a62a 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1116,6 +1116,20 @@ fhandler_base::lseek (_off64_t offset, int whence) return res; } +ssize_t __stdcall +fhandler_base::pread (void *, size_t, _off64_t) +{ + set_errno (ESPIPE); + return -1; +} + +ssize_t __stdcall +fhandler_base::pwrite (void *, size_t, _off64_t) +{ + set_errno (ESPIPE); + return -1; +} + int fhandler_base::close () { diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 7d4f6cee1..9c0c45e20 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -287,6 +287,8 @@ class fhandler_base virtual int write (const void *ptr, size_t len); virtual ssize_t readv (const struct iovec *, int iovcnt, ssize_t tot = -1); virtual ssize_t writev (const struct iovec *, int iovcnt, ssize_t tot = -1); + virtual ssize_t __stdcall pread (void *, size_t, _off64_t) __attribute__ ((regparm (3))); + virtual ssize_t __stdcall pwrite (void *, size_t, _off64_t) __attribute__ ((regparm (3))); virtual _off64_t lseek (_off64_t offset, int whence); virtual int lock (int, struct __flock64 *); virtual int dup (fhandler_base *child); @@ -673,6 +675,9 @@ class fhandler_disk_file: public fhandler_base void seekdir (DIR *, _off64_t); void rewinddir (DIR *); int closedir (DIR *); + + ssize_t __stdcall pread (void *, size_t, _off64_t) __attribute__ ((regparm (3))); + ssize_t __stdcall pwrite (void *, size_t, _off64_t) __attribute__ ((regparm (3))); }; class fhandler_cygdrive: public fhandler_disk_file diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 368df374d..76fe9b393 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -984,6 +984,30 @@ fhandler_base::close_fs () return res; } +ssize_t __stdcall +fhandler_disk_file::pread (void *buf, size_t count, _off64_t offset) +{ + ssize_t res = lseek (offset, SEEK_SET); + if (res >= 0) + { + size_t tmp_count = count; + read (buf, tmp_count); + res = (ssize_t) tmp_count; + } + debug_printf ("%d = pread (%p, %d, %d)\n", res, buf, count, offset); + return res; +} + +ssize_t __stdcall +fhandler_disk_file::pwrite (void *buf, size_t count, _off64_t offset) +{ + ssize_t res = lseek (offset, SEEK_SET); + if (res >= 0) + res = write (buf, count); + debug_printf ("%d = pwrite (%p, %d, %d)\n", res, buf, count, offset); + return res; +} + /* FIXME: The correct way to do this to get POSIX locking semantics is to keep a linked list of posix lock requests and map them into Win32 locks. he problem is that Win32 does not deal correctly with overlapping lock diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index e7f2b454e..477195fe5 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -261,12 +261,13 @@ details. */ 132: Add GLOB_LIMIT flag to glob. 133: Export __getline, __getdelim. 134: Export getline, getdelim. + 135: Export pread, pwrite */ /* Note that we forgot to bump the api for ualarm, strtoll, strtoull */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 134 +#define CYGWIN_VERSION_API_MINOR 135 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/sys/ioctl.h b/winsup/cygwin/include/sys/ioctl.h index 461def6fd..3e498b77a 100644 --- a/winsup/cygwin/include/sys/ioctl.h +++ b/winsup/cygwin/include/sys/ioctl.h @@ -25,38 +25,44 @@ __BEGIN_DECLS /* Some standard linux defines */ -#define _IOC_NRBITS 8 -#define _IOC_TYPEBITS 8 -#define _IOC_SIZEBITS 14 -#define _IOC_DIRBITS 2 +#define _IOC_NRBITS 8 +#define _IOC_TYPEBITS 8 +#define _IOC_SIZEBITS 14 +#define _IOC_DIRBITS 2 -#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) -#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) -#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) -#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) +#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) +#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) +#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) +#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) -#define _IOC_NRSHIFT 0 -#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) -#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) -#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) +#define _IOC_NRSHIFT 0 +#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) +#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) +#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) -#define _IOC_NONE 0U -#define _IOC_WRITE 1U -#define _IOC_READ 2U +#define _IOC_NONE 0U +#define _IOC_WRITE 1U +#define _IOC_READ 2U #define _IOC(dir,type,nr,size) \ - (((dir) << _IOC_DIRSHIFT) | \ - + ((type) << _IOC_TYPESHIFT) | \ - + ((nr) << _IOC_NRSHIFT) | \ - + ((size) << _IOC_SIZESHIFT)) + (((dir) << _IOC_DIRSHIFT) | \ + + ((type) << _IOC_TYPESHIFT) | \ + + ((nr) << _IOC_NRSHIFT) | \ + + ((size) << _IOC_SIZESHIFT)) -#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) -#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) -#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) -#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) +#define _LINUX_IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) +#define _LINUX_IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) +#define _LINUX_IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) +#define _LINUX_IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) + +#ifdef __USE_LINUX_IOCTL_DEFS +#define _IO _LINUX_IO +#define _IOR _LINUX_IOR +#define _IOW _LINUX_IOW +#define _IOWR _LINUX_IOWR +#endif /*__USE_LINUX_IOCTL_DEFS */ int __cdecl ioctl (int __fd, int __cmd, ...); __END_DECLS - #endif diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 37f3b74eb..c359d4689 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -20,6 +20,8 @@ details. */ #define _open64 __FOO_open64__ #define _lseek64 __FOO_lseek64__ #define _fstat64 __FOO_fstat64__ +#define pread __FOO_pread +#define pwrite __FOO_pwrite #include "winsup.h" #include @@ -46,6 +48,8 @@ details. */ #undef fstat #undef lstat #undef stat +#undef pread +#undef pwrite #include #include @@ -388,6 +392,36 @@ read (int fd, void *ptr, size_t len) return readv (fd, &iov, 1); } +extern "C" ssize_t +pread (int fd, void *ptr, size_t len, _off64_t off) +{ + ssize_t res; + cygheap_fdget cfd (fd); + if (cfd < 0) + res = -1; + else + res = cfd->pread (ptr, len, off); + + syscall_printf ("%d = pread (%d, %p, %d, %d), errno %d", + res, fd, ptr, len, off, get_errno ()); + return res; +} + +extern "C" ssize_t +pwrite (int fd, void *ptr, size_t len, _off64_t off) +{ + ssize_t res; + cygheap_fdget cfd (fd); + if (cfd < 0) + res = -1; + else + res = cfd->pwrite (ptr, len, off); + + syscall_printf ("%d = pwrite (%d, %p, %d, %d), errno %d", + res, fd, ptr, len, off, get_errno ()); + return res; +} + EXPORT_ALIAS (read, _read) extern "C" ssize_t