FILE *fchanlog = NULL;
+struct listener {
+ SOCKET sock;
+ struct tls *ctx;
+};
+
SOCKET create_listen_sock(const char *ip, const char *port)
{
struct addrinfo hints, *res;
return sock;
}
-void accept_from_sock(SOCKET serverSocket, struct tls *ctx)
+void accept_from_sock(struct listener *listener)
{
while (true) {
struct sockaddr_storage addr;
socklen_t len = sizeof(addr);
- SOCKET newSocket = accept(serverSocket, (struct sockaddr *)&addr, &len);
+ SOCKET newSocket = accept(listener->sock, (struct sockaddr *)&addr, &len);
if (newSocket == (SOCKET)INVALID_SOCKET) {
if (!net_wouldblock())
net_perror("ERROR newSocket");
fprintf(stderr, "Connection accepted from Socket: %"PRISocket", IP: %s PORT: %d\n", newSocket,
client_addr, port);
struct tls *cctx = NULL;
- if (ctx) {
+ if (listener->ctx) {
#ifdef HAS_TLS
- if (tls_accept_socket(ctx, &cctx, newSocket) == -1) {
+ if (tls_accept_socket(listener->ctx, &cctx, newSocket) == -1) {
close(newSocket);
- fprintf(stderr, "tls_accept_socket: %s\n", tls_error(ctx));
+ fprintf(stderr, "tls_accept_socket: %s\n", tls_error(listener->ctx));
continue;
}
#endif
int main(int argc, char *argv[])
{
#define MAX_LISTENERS 16
- SOCKET listeners[MAX_LISTENERS];
- struct tls *listeners_tls[MAX_LISTENERS];
+ struct listener listeners[MAX_LISTENERS];
int listener_count = 0;
setlocale(LC_ALL, "C");
fprintf(stderr, "[PatchyIRCD]: Starting up...\n");
// Zero stuff out
memset(clients, 0, sizeof(clients));
+ struct tls *tls_ctx = NULL;
#ifdef HAS_TLS
struct tls_config *tls_cfg;
- struct tls *tls_ctx;
if (tls_init() == -1)
return fprintf(stderr, "tls_init error\n"), 1;
if (!(tls_cfg = tls_config_new()))
return fprintf(stderr, "not enough parameters\n"), 1;
if (listener_count == MAX_LISTENERS)
return fprintf(stderr, "too many listeners\n"), 1;
-#ifdef HAS_TLS
- listeners_tls[listener_count] = is_tls ? tls_ctx : NULL;
-#else
- if (is_tls)
- return fprintf(stderr, "not TLS support\n"), 1;
- listeners_tls[listener_count] = NULL;
-#endif
- listeners[listener_count++] = create_listen_sock(argv[i+1], argv[i+2]);
+ if (is_tls && !tls_ctx)
+ return fprintf(stderr, "no TLS support\n"), 1;
+ listeners[listener_count].ctx = is_tls ? tls_ctx : NULL;
+ listeners[listener_count++].sock = create_listen_sock(argv[i+1], argv[i+2]);
i += 2;
} else {
return fprintf(stderr, "unknown flag '%s'\n", argv[i]), 1;
}
if (!listener_count) {
- 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");
+ listeners[listener_count].ctx = NULL;
+ listeners[listener_count++].sock = create_listen_sock("0", "6667");
+ listeners[listener_count].ctx = NULL;
+ listeners[listener_count++].sock = create_listen_sock("::", "6667");
#ifdef HAS_TLS
- listeners_tls[listener_count] = tls_ctx;
- listeners[listener_count++] = create_listen_sock("0", "6697");
- listeners_tls[listener_count] = tls_ctx;
- listeners[listener_count++] = create_listen_sock("::", "6697");
+ listeners[listener_count].ctx = tls_ctx;
+ listeners[listener_count++].sock = create_listen_sock("0", "6697");
+ listeners[listener_count].ctx = tls_ctx;
+ listeners[listener_count++].sock = create_listen_sock("::", "6697");
#endif
}
for (int i = 0; i < listener_count; i++)
- net_nonblock(listeners[i]);
+ net_nonblock(listeners[i].sock);
FILE *f = fopen("init.txt", "rb");
if (f) {
FD_ZERO(&readfds);
// Add listening SOCKETS to FDSET
for (int i = 0; i < listener_count; i++)
- FD_SET(listeners[i], &readfds);
+ FD_SET(listeners[i].sock, &readfds);
#ifdef _WIN32
if (self_sock != INVALID_SOCKET)
FD_SET(self_sock, &readfds);
#else
SOCKET highestFD = -1;
for (int i = 0; i < listener_count; i++)
- if (highestFD < listeners[i])
- highestFD = listeners[i];
+ if (highestFD < listeners[i].sock)
+ highestFD = listeners[i].sock;
for (int i = 0; i < CLIENTS; i++)
if (clients[i] && highestFD < clients[i]->FD)
highestFD = clients[i]->FD;
// Accept new connections
for (int i = 0; i < listener_count; i++)
- if (FD_ISSET(listeners[i], &readfds))
- accept_from_sock(listeners[i], listeners_tls[i]);
+ if (FD_ISSET(listeners[i].sock, &readfds))
+ accept_from_sock(&listeners[i]);
// Respond to already connected clients
for (int i = 0; i < CLIENTS; i++)
if (clients[i] && FD_ISSET(clients[i]->FD, &readfds))