Skip site navigation (1)Skip section navigation (2)
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>