summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2005-07-29 17:04:46 +0000
committerChristopher Faylor <me@cgf.cx>2005-07-29 17:04:46 +0000
commit7d7d09aee8fa09aab03d14b0b672a34805ce50b9 (patch)
tree1cb66c9528cb38296d698e2bbd03ad2dd68632e1 /winsup
parent728b9af5c9abb690e0510916b38caf26360d4af9 (diff)
downloadcygnal-7d7d09aee8fa09aab03d14b0b672a34805ce50b9.tar.gz
cygnal-7d7d09aee8fa09aab03d14b0b672a34805ce50b9.tar.bz2
cygnal-7d7d09aee8fa09aab03d14b0b672a34805ce50b9.zip
* 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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog17
-rw-r--r--winsup/cygwin/cygwin.din2
-rw-r--r--winsup/cygwin/fhandler.cc14
-rw-r--r--winsup/cygwin/fhandler.h5
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc24
-rw-r--r--winsup/cygwin/include/cygwin/version.h3
-rw-r--r--winsup/cygwin/include/sys/ioctl.h54
-rw-r--r--winsup/cygwin/syscalls.cc34
8 files changed, 128 insertions, 25 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 7cfb16af2..93eaaf721 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,22 @@
2005-07-29 Christopher Faylor <cgf@timesys.com>
+ * 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 <cgf@timesys.com>
+
* include/sys/ioctl.h: Add some linux defines.
2005-07-29 Christopher Faylor <cgf@timesys.com>
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 <sys/stat.h>
@@ -46,6 +48,8 @@ details. */
#undef fstat
#undef lstat
#undef stat
+#undef pread
+#undef pwrite
#include <cygwin/version.h>
#include <sys/cygwin.h>
@@ -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