summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKen Brown <kbrown@cornell.edu>2020-01-25 13:08:00 -0500
committerKen Brown <kbrown@cornell.edu>2020-01-30 09:43:19 -0500
commit477121317d01b37d0f6c84f7724487ecf8a9fbbe (patch)
treef3348fccdfc1274b44df9d0f31ea6edd08b77c0a
parent23cb58af623c457639fdcf97c1990edda0508d5c (diff)
downloadcygnal-477121317d01b37d0f6c84f7724487ecf8a9fbbe.tar.gz
cygnal-477121317d01b37d0f6c84f7724487ecf8a9fbbe.tar.bz2
cygnal-477121317d01b37d0f6c84f7724487ecf8a9fbbe.zip
Cygwin: AF_LOCAL: fix fcntl and dup if O_PATH is set
Make fhandler_socket_local::dup and fhandler_socket_local::fcntl (a new method) call fhandler_base::dup and fhandler_base::fcntl if O_PATH is set. We're viewing the socket as a disk file here, but there's no need to implement the actions of fhandler_disk_file::dup and fhandler_disk_file::fcntl, which do nothing useful in this case beyond what the fhandler_base methods do. (The extra actions are only useful when I/O is going to be done on the file.)
-rw-r--r--winsup/cygwin/fhandler.h1
-rw-r--r--winsup/cygwin/fhandler_socket_local.cc16
2 files changed, 17 insertions, 0 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index c54780ef6..1b477f633 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -836,6 +836,7 @@ class fhandler_socket_local: public fhandler_socket_wsock
int open (int flags, mode_t mode = 0);
int close ();
+ int fcntl (int cmd, intptr_t);
int __reg2 fstat (struct stat *buf);
int __reg2 fstatvfs (struct statvfs *buf);
int __reg1 fchmod (mode_t newmode);
diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc
index 76815a611..8bfba225a 100644
--- a/winsup/cygwin/fhandler_socket_local.cc
+++ b/winsup/cygwin/fhandler_socket_local.cc
@@ -628,6 +628,11 @@ fhandler_socket_local::af_local_set_secret (char *buf)
int
fhandler_socket_local::dup (fhandler_base *child, int flags)
{
+ if (get_flags () & O_PATH)
+ /* We're viewing the socket as a disk file, but fhandler_base::dup
+ suffices here. */
+ return fhandler_base::dup (child, flags);
+
fhandler_socket_local *fhs = (fhandler_socket_local *) child;
fhs->set_sun_path (get_sun_path ());
fhs->set_peer_sun_path (get_peer_sun_path ());
@@ -654,6 +659,17 @@ fhandler_socket_local::close ()
return fhandler_socket_wsock::close ();
}
+int
+fhandler_socket_local::fcntl (int cmd, intptr_t arg)
+{
+ if (get_flags () & O_PATH)
+ /* We're viewing the socket as a disk file, but
+ fhandler_base::fcntl suffices here. */
+ return fhandler_base::fcntl (cmd, arg);
+ else
+ return fhandler_socket_wsock::fcntl (cmd, arg);
+}
+
int __reg2
fhandler_socket_local::fstat (struct stat *buf)
{