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.)
This commit is contained in:
parent
23cb58af62
commit
477121317d
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user