Cygwin: AF_LOCAL: set appropriate errno on system calls
If an AF_LOCAL socket is opened with O_PATH, all socket system calls that take a file descriptor argument fail on the resulting descriptor. Make sure that errno is set as on Linux for those calls that are implemented on Linux. In almost all cases it is ENOTSOCK. There are two exceptions: - sockatatmark(3); errno is EBADF. - bindresvport(3); errno is EAFNOSUPPORT if the second argument sin (of type struct sockaddr_in *) is non-NULL and satisfies sin->sin_family == AF_INET. Finally, there are two BSD socket system calls implemented on Cygwin but not Linux: getpeereid(3) and bindresvport_sa(3). Set errno to ENOTSOCK for these for consistency with the majority of the other calls.
This commit is contained in:
parent
3a2191653a
commit
141437d374
|
@ -65,8 +65,11 @@ get (const int fd)
|
|||
|
||||
fhandler_socket *const fh = cfd->is_socket ();
|
||||
|
||||
if (!fh)
|
||||
set_errno (ENOTSOCK);
|
||||
if (!fh || (fh->get_flags () & O_PATH))
|
||||
{
|
||||
set_errno (ENOTSOCK);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return fh;
|
||||
}
|
||||
|
@ -641,9 +644,17 @@ extern "C" int
|
|||
sockatmark (int fd)
|
||||
{
|
||||
int ret;
|
||||
cygheap_fdget cfd (fd);
|
||||
|
||||
fhandler_socket *fh = get (fd);
|
||||
if (fh && fh->ioctl (SIOCATMARK, &ret) != -1)
|
||||
if (cfd < 0)
|
||||
return -1;
|
||||
|
||||
fhandler_socket *const fh = cfd->is_socket ();
|
||||
if (!fh)
|
||||
set_errno (ENOTSOCK);
|
||||
else if (fh->get_flags () & O_PATH)
|
||||
set_errno (EBADF);
|
||||
else if (fh->ioctl (SIOCATMARK, &ret) != -1)
|
||||
return ret;
|
||||
return -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue