summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2018-02-22 16:37:12 +0100
committerCorinna Vinschen <corinna@vinschen.de>2018-02-22 16:37:12 +0100
commit9c593d9b39e9ad5bb02a02ace5418c3ef98aa59f (patch)
tree177a4bf5fb46b4fd356a51e1708fd599b1e4b212
parent79598f94f75d9423a382ec108291619ff45f2912 (diff)
downloadcygnal-9c593d9b39e9ad5bb02a02ace5418c3ef98aa59f.tar.gz
cygnal-9c593d9b39e9ad5bb02a02ace5418c3ef98aa59f.tar.bz2
cygnal-9c593d9b39e9ad5bb02a02ace5418c3ef98aa59f.zip
Cygwin: fhandler_socket: Add derived fcntl methods
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/fhandler.h7
-rw-r--r--winsup/cygwin/fhandler_socket.cc12
-rw-r--r--winsup/cygwin/fhandler_socket_inet.cc26
-rw-r--r--winsup/cygwin/fhandler_socket_local.cc26
4 files changed, 57 insertions, 14 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index 18de57c39..bf0666830 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -602,8 +602,9 @@ class fhandler_socket: public fhandler_base
virtual ssize_t __stdcall write (const void *ptr, size_t len) = 0;
virtual ssize_t __stdcall writev (const struct iovec *, int iovcnt, ssize_t tot = -1) = 0;
- int ioctl (unsigned int cmd, void *);
- int fcntl (int cmd, intptr_t);
+ virtual int ioctl (unsigned int cmd, void *);
+ virtual int fcntl (int cmd, intptr_t);
+
off_t lseek (off_t, int)
{
set_errno (ESPIPE);
@@ -671,6 +672,7 @@ class fhandler_socket_inet: public fhandler_socket
ssize_t __stdcall write (const void *ptr, size_t len);
ssize_t __stdcall writev (const struct iovec *, int iovcnt, ssize_t tot = -1);
int ioctl (unsigned int cmd, void *);
+ int fcntl (int cmd, intptr_t);
/* from here on: CLONING */
fhandler_socket_inet (void *) {}
@@ -760,6 +762,7 @@ class fhandler_socket_local: public fhandler_socket
ssize_t __stdcall write (const void *ptr, size_t len);
ssize_t __stdcall writev (const struct iovec *, int iovcnt, ssize_t tot = -1);
int ioctl (unsigned int cmd, void *);
+ int fcntl (int cmd, intptr_t);
int __reg2 fstat (struct stat *buf);
int __reg2 fstatvfs (struct statvfs *buf);
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index dfcb8d490..b1a5136ed 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -911,18 +911,6 @@ fhandler_socket::fcntl (int cmd, intptr_t arg)
switch (cmd)
{
- case F_SETOWN:
- {
- pid_t pid = (pid_t) arg;
- LOCK_EVENTS;
- wsock_events->owner = pid;
- UNLOCK_EVENTS;
- debug_printf ("owner set to %d", pid);
- }
- break;
- case F_GETOWN:
- res = wsock_events->owner;
- break;
case F_SETFL:
{
/* Carefully test for the O_NONBLOCK or deprecated OLD_O_NDELAY flag.
diff --git a/winsup/cygwin/fhandler_socket_inet.cc b/winsup/cygwin/fhandler_socket_inet.cc
index d5fe393de..b2bc1934a 100644
--- a/winsup/cygwin/fhandler_socket_inet.cc
+++ b/winsup/cygwin/fhandler_socket_inet.cc
@@ -1285,3 +1285,29 @@ fhandler_socket_inet::ioctl (unsigned int cmd, void *p)
syscall_printf ("%d = ioctl_socket(%x, %p)", res, cmd, p);
return res;
}
+
+int
+fhandler_socket_inet::fcntl (int cmd, intptr_t arg)
+{
+ int res = 0;
+
+ switch (cmd)
+ {
+ case F_SETOWN:
+ {
+ pid_t pid = (pid_t) arg;
+ LOCK_EVENTS;
+ wsock_events->owner = pid;
+ UNLOCK_EVENTS;
+ debug_printf ("owner set to %d", pid);
+ }
+ break;
+ case F_GETOWN:
+ res = wsock_events->owner;
+ break;
+ default:
+ res = fhandler_socket::fcntl (cmd, arg);
+ break;
+ }
+ return res;
+}
diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc
index bf34377a0..0649fa0a7 100644
--- a/winsup/cygwin/fhandler_socket_local.cc
+++ b/winsup/cygwin/fhandler_socket_local.cc
@@ -1964,3 +1964,29 @@ fhandler_socket_local::ioctl (unsigned int cmd, void *p)
syscall_printf ("%d = ioctl_socket(%x, %p)", res, cmd, p);
return res;
}
+
+int
+fhandler_socket_local::fcntl (int cmd, intptr_t arg)
+{
+ int res = 0;
+
+ switch (cmd)
+ {
+ case F_SETOWN:
+ {
+ pid_t pid = (pid_t) arg;
+ LOCK_EVENTS;
+ wsock_events->owner = pid;
+ UNLOCK_EVENTS;
+ debug_printf ("owner set to %d", pid);
+ }
+ break;
+ case F_GETOWN:
+ res = wsock_events->owner;
+ break;
+ default:
+ res = fhandler_socket::fcntl (cmd, arg);
+ break;
+ }
+ return res;
+}