// FDSET List
fd_set readfds;
-
-struct sockaddr_in serverAddrV4;
-struct sockaddr_in6 serverAddrV6;
FILE *fchanlog = NULL;
-SOCKET create_listen_sock(int af, struct sockaddr *addr, size_t len)
+SOCKET create_listen_sock(const char *ip, const char *port)
{
+ struct addrinfo hints, *res;
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
+ int err = getaddrinfo(ip, port, &hints, &res);
+ if (err) {
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
+ exit(EXIT_FAILURE);
+ }
+
SOCKET sock;
// Create socket
- sock = socket(af, SOCK_STREAM, 0);
+ sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if(sock == (SOCKET)INVALID_SOCKET) {
net_perror("ERROR SOCKET");
+ freeaddrinfo(res);
exit(EXIT_FAILURE);
}
// Set socket options
#ifndef _WIN32
if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*)&opt, sizeof(opt)) == -1) {
net_perror("ERROR SOCKET");
+ freeaddrinfo(res);
exit(EXIT_FAILURE);
}
#endif
- if(af == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&opt, sizeof(opt)) == -1) {
+ if(res->ai_family == AF_INET6 && setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&opt, sizeof(opt)) == -1) {
net_perror("ERROR SOCKET IPV6");
+ freeaddrinfo(res);
exit(EXIT_FAILURE);
}
- // Set nonblock
- net_nonblock(sock);
// Bind to socket
- if(bind(sock, addr, len) == -1) {
+ if (bind(sock, res->ai_addr, res->ai_addrlen) == -1) {
net_perror("ERROR BIND");
+ freeaddrinfo(res);
exit(EXIT_FAILURE);
}
+ freeaddrinfo(res);
// Listen to socket
- if(listen(sock, LISTENING_BACKLOG) == -1) {
+ if(listen(sock, SOMAXCONN) == -1) {
net_perror("ERROR LISTEN");
exit(EXIT_FAILURE);
}
// Zero stuff out
memset(clients, 0, sizeof(clients));
- // Setup structs
- memset(&serverAddrV4, 0, sizeof(struct sockaddr_in));
- serverAddrV4.sin_addr.s_addr = INADDR_ANY;
- serverAddrV4.sin_port = htons(LISTENING_PORT);
- serverAddrV4.sin_family = AF_INET;
- listeners_tls[listener_count] = NULL;
- listeners[listener_count++] = create_listen_sock(AF_INET, (struct sockaddr*)&serverAddrV4, sizeof(struct sockaddr_in));
- memset(&serverAddrV6, 0, sizeof(struct sockaddr_in6));
- serverAddrV6.sin6_addr = in6addr_any;
- serverAddrV6.sin6_port = htons(LISTENING_PORT);
- serverAddrV6.sin6_family = AF_INET6;
- listeners_tls[listener_count] = NULL;
- listeners[listener_count++] = create_listen_sock(AF_INET6, (struct sockaddr*)&serverAddrV6, sizeof(struct sockaddr_in6));
#ifdef HAS_TLS
struct tls_config *tls_cfg;
struct tls *tls_ctx;
if (tls_configure(tls_ctx, tls_cfg) == -1)
return fprintf(stderr, "tls_configure: %s\n", tls_error(tls_ctx)), 1;
tls_config_free(tls_cfg);
+#endif
- serverAddrV4.sin_port = htons(LISTENING_PORT_TLS);
+ listeners_tls[listener_count] = NULL;
+ listeners[listener_count++] = create_listen_sock("0", "6667");
+ listeners_tls[listener_count] = NULL;
+ listeners[listener_count++] = create_listen_sock("::", "6667");
+#ifdef HAS_TLS
listeners_tls[listener_count] = tls_ctx;
- listeners[listener_count++] = create_listen_sock(AF_INET, (struct sockaddr*)&serverAddrV4, sizeof(struct sockaddr_in));
- serverAddrV6.sin6_port = htons(LISTENING_PORT_TLS);
+ listeners[listener_count++] = create_listen_sock("0", "6697");
listeners_tls[listener_count] = tls_ctx;
- listeners[listener_count++] = create_listen_sock(AF_INET6, (struct sockaddr*)&serverAddrV6, sizeof(struct sockaddr_in6));
+ listeners[listener_count++] = create_listen_sock("::", "6697");
#endif
+ for (int i = 0; i < listener_count; i++)
+ net_nonblock(listeners[i]);
+
FILE *f = fopen("init.txt", "rb");
if (f) {
struct client_data *fake = allocClient();