commit 33756bd2353b645a2c046a0807103c309d6d7215 from: Omar Polo date: Sun Jan 10 22:56:33 2021 UTC accept both ipv4 and ipv6 commit - 709d6e5ead07ce64dd6625eef05deaedadd8f095 commit + 33756bd2353b645a2c046a0807103c309d6d7215 blob - 995b54d11ce59f761349f1a379749539d3c573d3 blob + a36853f7fa086a398c3df98f865536ccd4b0e706 --- ChangeLog +++ ChangeLog @@ -1,6 +1,7 @@ 2021-01-10 Omar Polo * gmid.c (logs): log also the port of the client + (loop): accept both ipv4 and ipv6 2020-12-26 Omar Polo blob - df6c9a70377a6ba209a5682de0ae0be7f490337f blob + e858c7b34fd054f3efd92755a6f5bd61b94a186a --- gmid.c +++ gmid.c @@ -771,7 +771,7 @@ goodbye(struct pollfd *pfd, struct client *c) } void -loop(struct tls *ctx, int sock) +loop(struct tls *ctx, int sock4, int sock6) { int i; struct client clients[MAX_USERS]; @@ -783,7 +783,8 @@ loop(struct tls *ctx, int sock) bzero(&clients[i], sizeof(struct client)); } - fds[0].fd = sock; + fds[0].fd = sock4; + fds[1].fd = sock6; for (;;) { if (poll(fds, MAX_USERS, INFTIM) == -1) { @@ -810,14 +811,14 @@ loop(struct tls *ctx, int sock) goodbye(&fds[i], &clients[i]); continue; } - } - - if (i == 0) { /* new client */ - do_accept(sock, ctx, fds, clients); - continue; } - handle(&fds[i], &clients[i]); + if (fds[i].fd == sock4) + do_accept(sock4, ctx, fds, clients); + else if (fds[i].fd == sock6) + do_accept(sock6, ctx, fds, clients); + else + handle(&fds[i], &clients[i]); } } } @@ -852,7 +853,7 @@ main(int argc, char **argv) const char *cert = "cert.pem", *key = "key.pem"; struct tls *ctx = NULL; struct tls_config *conf; - int sock, ch; + int sock4, sock6, ch; connected_clients = 0; if ((dir = absolutify_path("docs")) == NULL) @@ -944,7 +945,8 @@ main(int argc, char **argv) if (tls_configure(ctx, conf) == -1) errx(1, "tls_configure: %s", tls_error(ctx)); - sock = make_socket(port, AF_INET); + sock4 = make_socket(port, AF_INET); + sock6 = make_socket(port, AF_INET6); if ((dirfd = open(dir, O_RDONLY | O_DIRECTORY)) == -1) err(1, "open: %s", dir); @@ -962,9 +964,10 @@ main(int argc, char **argv) if (cgi == NULL && pledge("stdio rpath inet", NULL) == -1) err(1, "pledge"); - loop(ctx, sock); + loop(ctx, sock4, sock6); - close(sock); + close(sock4); + close(sock6); tls_free(ctx); tls_config_free(conf); } blob - 0df59ed5b33978a62a13e25df7356f3505d5a858 blob + cb6af60776fbb003d5ba2cbd10d6ae1c5efc73db --- gmid.h +++ gmid.h @@ -115,7 +115,7 @@ void mark_nonblock(int); int make_soket(int); void do_accept(int, struct tls*, struct pollfd*, struct client*); void goodbye(struct pollfd*, struct client*); -void loop(struct tls*, int); +void loop(struct tls*, int, int); void usage(const char*);