int wait_connect()

in sample_app/onvif_camera_mock/artifacts/wsdd/src/net_utils.c [294:345]


int wait_connect(int sd, unsigned int timeout_in_ms)
{

    struct epoll_event connect_event;
    int epoll_fd, num_events, error;
    socklen_t err_len;



    if( errno != EINPROGRESS )
        return -1;


    epoll_fd = epoll_create(1);
    if( epoll_fd == -1 )
        return -1;



    connect_event.data.fd = sd;
    connect_event.events  = EPOLLOUT | EPOLLIN | EPOLLERR;

    if( epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sd, &connect_event) == -1 )
    {
        close(epoll_fd);
        return -1;
    }


    memset(&connect_event, 0, sizeof(struct epoll_event));
    num_events = epoll_wait(epoll_fd, &connect_event, 1, timeout_in_ms);

    if(num_events <= 0)
    {
        close(epoll_fd);
        return -1;
    }


    error   = -1;
    err_len = sizeof(error);

    if( (getsockopt(sd, SOL_SOCKET, SO_ERROR, &error, &err_len) != 0) || (error != 0) )
    {
        close(epoll_fd);
        return -1;
    }


    close(epoll_fd);
    return 0;         //good job
}