For fcntl this requires a new method, fhandler_socket_local::fcntl, which calls fhandler_base::fcntl if O_PATH is set and fhandler_socket_wsock::fcntl otherwise. --- winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_socket_local.cc | 12 ++++++++++++ 2 files changed, 13 insertions(+)
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..531f574b0 100644 --- a/winsup/cygwin/fhandler_socket_local.cc +++ b/winsup/cygwin/fhandler_socket_local.cc @@ -628,6 +628,9 @@ fhandler_socket_local::af_local_set_secret (char *buf) int fhandler_socket_local::dup (fhandler_base *child, int flags) { + if (get_flags () & O_PATH) + 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 +657,15 @@ fhandler_socket_local::close () return fhandler_socket_wsock::close (); } +int +fhandler_socket_local::fcntl (int cmd, intptr_t arg) +{ + if (get_flags () & O_PATH) + return fhandler_base::fcntl (cmd, arg); + else + return fhandler_socket_wsock::fcntl (cmd, arg); +} + int __reg2 fhandler_socket_local::fstat (struct stat *buf) { -- 2.21.0