Date: Fri, 3 Mar 2017 08:11:37 -0600 From: ss griffon <ssgriffonuser@gmail.com> To: freebsd-hackers@freebsd.org Subject: Discrepancy between kevent error codes with socketpair fds Message-ID: <CAFYJ9ehKNWsLtG4FxzGM9p%2BPKM_ebVbU%2BynJRCrtT%2Bw0dxVgsg@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFYJ9ehKNWsLtG4FxzGM9p%2BPKM_ebVbU%2BynJRCrtT%2Bw0dxVgsg>