#include "../error.h"
#include "../log.h"
#include "../qman.h"
#include "../utils.h"
#include <assert.h>
#include <demi/libos.h>
#include <errno.h>
#include <sys/socket.h>
#include <glue.h>
int __accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
if (!queue_man_query_fd(sockfd))
{
errno = EBADF;
return -1;
}
TRACE("sockfd=%d, addr=%p, addrlen=%p", sockfd, (void *)addr, (void *)addrlen);
if (queue_man_query_fd_pollable(sockfd))
{
struct demi_event *ev = NULL;
if ((ev = queue_man_get_accept_result(sockfd)) != NULL)
{
int newqd = -1;
assert(ev->used == 1);
assert(ev->qt == (demi_qtoken_t)-1);
assert(ev->sockqd == sockfd);
newqd = ev->qr.qr_value.ares.qd;
newqd = queue_man_register_fd(newqd);
assert(__demi_accept(&ev->qt, ev->sockqd) == 0);
return (newqd);
}
errno = EWOULDBLOCK;
return (-1);
}
UNIMPLEMETED("accept() currently works only on epoll mode");
return (-1);
}
int __accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
{
if (!queue_man_query_fd(sockfd))
{
errno = EBADF;
return -1;
}
UNUSED(flags);
TRACE("sockfd=%d, addr=%p, addrlen=%p, flags=%d", sockfd, (void *)addr, (void *)addrlen, flags);
return (__accept(sockfd, addr, addrlen));
}