]> git.sesse.net Git - cubemap/blobdiff - acceptor.cpp
Simplify setting the non-blocking flag when creating HTTP sockets.
[cubemap] / acceptor.cpp
index 7c28ca58038c27b107cad1b8dd82d6dd3b78bd3c..b3cd3c1bd92824d27840ef52a04b95bed22e5c62 100644 (file)
@@ -21,12 +21,13 @@ extern ServerPool *servers;
 
 int create_server_socket(const sockaddr_in6 &addr, SocketType socket_type)
 {
+       // NOTE: We set as non-blocking, so the acceptor thread can notice that we want to shut it down.
        int server_sock;
        if (socket_type == TCP_SOCKET) {
-               server_sock = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
+               server_sock = socket(PF_INET6, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP);
        } else {
                assert(socket_type == UDP_SOCKET);
-               server_sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
+               server_sock = socket(PF_INET6, SOCK_DGRAM | SOCK_NONBLOCK, IPPROTO_UDP);
        }
        if (server_sock == -1) {
                log_perror("socket");
@@ -46,12 +47,6 @@ int create_server_socket(const sockaddr_in6 &addr, SocketType socket_type)
                exit(1);
        }
 
-       // Set as non-blocking, so the acceptor thread can notice that we want to shut it down.
-       if (ioctl(server_sock, FIONBIO, &one) == -1) {
-               log_perror("ioctl(FIONBIO)");
-               exit(1);
-       }
-
        if (bind(server_sock, reinterpret_cast<const sockaddr *>(&addr), sizeof(addr)) == -1) {
                log_perror("bind");
                exit(1);
@@ -91,15 +86,20 @@ sockaddr_in6 extract_address_from_acceptor_proto(const AcceptorProto &proto)
        return sin6;
 }
        
-Acceptor::Acceptor(int server_sock, const sockaddr_in6 &addr)
+Acceptor::Acceptor(int server_sock, const sockaddr_in6 &addr,
+                   const string &certificate_chain, const string &private_key)
        : server_sock(server_sock),
-         addr(addr)
+         addr(addr),
+         certificate_chain(certificate_chain),
+         private_key(private_key)
 {
 }
 
 Acceptor::Acceptor(const AcceptorProto &serialized)
        : server_sock(serialized.server_sock()),
-         addr(extract_address_from_acceptor_proto(serialized))
+         addr(extract_address_from_acceptor_proto(serialized)),
+         certificate_chain(serialized.certificate_chain()),
+         private_key(serialized.private_key())
 {
 }
 
@@ -112,6 +112,8 @@ AcceptorProto Acceptor::serialize() const
        serialized.set_server_sock(server_sock);
        serialized.set_addr(buf);
        serialized.set_port(ntohs(addr.sin6_port));
+       serialized.set_certificate_chain(certificate_chain);
+       serialized.set_private_key(private_key);
        return serialized;
 }
 
@@ -123,7 +125,7 @@ void Acceptor::close_socket()
 void Acceptor::do_work()
 {
        while (!should_stop()) {
-               if (!wait_for_activity(server_sock, POLLIN, NULL)) {
+               if (!wait_for_activity(server_sock, POLLIN, nullptr)) {
                        continue;
                }
 
@@ -151,6 +153,6 @@ void Acceptor::do_work()
                }
 
                // Pick a server, round-robin, and hand over the socket to it.
-               servers->add_client(sock);
+               servers->add_client(sock, this);
        }
 }