1 #include <netinet/in.h>
2 #include <openssl/prov_ssl.h>
3 #include <openssl/types.h>
10 #include <sys/socket.h>
11 #include <arpa/inet.h>
12 #include <sys/select.h>
13 #include <openssl/ssl.h>
14 #include <openssl/err.h>
20 client_handler(
int sock, SSL_CTX *ctx,
const char *srv_dir)
24 client_tls = SSL_new(ctx);
25 SSL_set_fd(client_tls, sock);
27 if (SSL_accept(client_tls) <= 0)
29 ERR_print_errors_fp(stderr);
33 gemini_protocol_handler(client_tls, srv_dir);
36 SSL_shutdown(client_tls);
42 create_server(uint16_t port)
44 struct sockaddr_in6 addr;
47 addr.sin6_family = AF_INET6;
48 addr.sin6_port = htons(port);
49 addr.sin6_addr = in6addr_any;
51 sock = socket(AF_INET6, SOCK_STREAM, 0);
57 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &(
int){1},
sizeof(int));
59 if (bind(sock, (
struct sockaddr *)&addr,
sizeof(addr)) < 0)
64 if (listen(sock, 5) < 0)
74 server(
const char *srv_dir, uint16_t port,
75 const char *cert_file,
const char *key_file)
78 struct sockaddr_in6 addr;
84 ctx = create_tls_context(cert_file, key_file);
85 server_sock = create_server(port);
88 client_sock = accept(server_sock, (
struct sockaddr *)&addr, &addrlen);
91 printf(
"Can't accept");
99 client_handler(client_sock, ctx, srv_dir);
108 printf(
"can't fork");