Discrepancy between kevent error codes with socketpair fds
ss griffon
ssgriffonuser at gmail.com
Fri Mar 3 14:11:40 UTC 2017
I'm hoping somebody can explain the following behavior to me. It's not
causing me any issues but I find it curious:
1. open a socketpair (int sv[2])
2. close both ends
3. attempt to add sv[0] to kevent and "Invalid Argument" is returned
(EINVAL)
4. attempt to add sv[1] to kevent instead of sv[0] and "Bad Descriptor" is
returned (EBADF).
It doesn't seem to matter the order of closing the sockets. Sample code is
below. Thanks in advance.
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/event.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstddef>
int main(int argc, char** argv)
{
int sv[2];
int err = socketpair(AF_LOCAL, SOCK_SEQPACKET, 0, sv);
if(err == -1)
{
perror("socketpair");
exit(1);
}
err = close(sv[0]);
if(err == -1)
{
perror("close1");
exit(1);
}
err = close(sv[1]);
if(err == -1)
{
perror("close2");
exit(1);
}
int kqfd = kqueue();
if(kqfd == -1)
{
perror("kqueue");
exit(1);
}
struct kevent event;
EV_SET(&event, sv[0], EVFILT_READ, EV_ADD, 0, 0, 0); //Change to sv[1]
to get EBADF
int events = kevent(kqfd, &event, 1,
nullptr, 0, nullptr); //Returns EINVAL
if(events == -1)
{
perror("kevent");
exit(1);
}
return 0;
}
More information about the freebsd-hackers
mailing list