#include <fcntl.h>
#ifdef __linux__
#include "epoll.hpp"
typedef nntpchan::ev::EpollLoop LoopImpl;
#else
#ifdef __freebsd__
#include "kqueue.hpp"
typedef nntpchan::ev::KqueueLoop LoopImpl;
#error "unsupported platform"
#endif
namespace nntpchan
{
namespace ev
bool ev::Loop::BindTCP(const sockaddr * addr, ev::io * handler)
assert(handler->acceptable());
socklen_t slen;
switch(addr->sa_family)
case AF_INET:
slen = sizeof(sockaddr_in);
break;
case AF_INET6:
slen = sizeof(sockaddr_in6);
case AF_UNIX:
slen = sizeof(sockaddr_un);
default:
return false;
}
int fd = socket(addr->sa_family, SOCK_STREAM | SOCK_NONBLOCK, 0);
if(fd == -1)
handler->fd = fd;
if(bind(fd, addr, slen) == -1)
if (listen(fd, 5) == -1)
return TrackConn(handler);
bool Loop::SetNonBlocking(ev::io * handler)
return fcntl(handler->fd, F_SETFL, fcntl(handler->fd, F_GETFL, 0) | O_NONBLOCK) != -1;
ev::Loop * NewMainLoop()
return new LoopImpl;