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");