if (ai.err)
ai.perror("getaddrinfo"), exit(1);
- SOCKET sock = socket(ai->ai_family, ai->ai_socktype|SOCK_CLOEXEC, ai->ai_protocol);
+ SOCKET sock = socket(ai->ai_family, ai->ai_socktype | SOCK_CLOEXEC | SOCK_NONBLOCK, ai->ai_protocol);
if(sock == INVALID_SOCKET)
net_perror("socket"), exit(1);
if (net_setsockint(sock, SOL_SOCKET, SO_REUSEADDR, 1) == -1)
for (;;) {
struct sockaddr_storage addr;
socklen_t len = sizeof(addr);
- SOCKET newSocket = accept4(listener->sock, (struct sockaddr *)&addr, &len, SOCK_CLOEXEC);
+ SOCKET newSocket = accept4(listener->sock, (struct sockaddr *)&addr, &len, SOCK_CLOEXEC | SOCK_NONBLOCK);
if (newSocket == INVALID_SOCKET) {
if (!net_wouldblock())
net_perror("accept4");
break;
}
- // Set nonblock
- net_nonblock(newSocket);
{
// enable keepalive
// NOTE: don't push_back to listeners beyond this point
for (listener &listener : listeners) {
- net_nonblock(listener.sock);
netpoll::add(listener.sock, SOCKTYPE_LISTENER, &listener);
netpoll::reg(listener.sock, UV_READABLE);
}
// SPDX-License-Identifier: GPL-2.0-or-later
#include "netsock.h"
-int net_nonblock(SOCKET fd)
-{
- int f = fcntl(fd, F_GETFL);
- if (f == -1)
- return -1;
- return fcntl(fd, F_SETFL, f | O_NONBLOCK);
-}
-
-void net_perror(const char *p)
-{
- if (p && *p)
- fprintf(stderr, "%s: %s\n", p, net_strerror(net_errno()));
- else
- fprintf(stderr, "%s\n", net_strerror(net_errno()));
-}
-
net_addrinfo::net_addrinfo(const char *node, const char *service, int ai_family, int ai_socktype, int ai_protocol, int ai_flags) {
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
typedef int SOCKET;
#define PRISocket "d"
#define INVALID_SOCKET (-1)
-#define net_errno() ((int)errno)
-#define net_strerror(e) strerror((e))
+#define net_perror(p) (perror((p)))
#define net_wouldblock() (errno == EAGAIN || errno == EWOULDBLOCK)
#define closesocket close
#ifndef SOCK_CLOEXEC
#endif
#define FOPEN_CLOEXEC "e"
-void net_perror(const char *p);
-int net_nonblock(SOCKET fd);
struct net_addrinfo {
struct addrinfo *res;
int err;