Small refactoring in main.cpp.
[cubemap] / main.cpp
index 1300508f314dc7b5909e6567c80832ac01432345..dc52bdc29a17ab85f1ad1d5c8f23ef34a54c0604 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -18,6 +18,7 @@
 #include <map>
 #include <set>
 
+#include "acceptor.h"
 #include "markpool.h"
 #include "metacube.h"
 #include "parse.h"
@@ -36,98 +37,6 @@ void hup(int ignored)
        hupped = true;
 }
 
-int create_server_socket(int port)
-{
-       int server_sock = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP);
-       if (server_sock == -1) {
-               perror("socket");
-               exit(1);
-       }
-
-       int one = 1;
-       if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) {
-               perror("setsockopt(SO_REUSEADDR)");
-               exit(1);
-       }
-
-       // We want dual-stack sockets. (Sorry, OpenBSD and Windows XP...)
-       int zero = 0;
-       if (setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &zero, sizeof(zero)) == -1) {
-               perror("setsockopt(IPV6_V6ONLY)");
-               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) {
-               perror("ioctl(FIONBIO)");
-               exit(1);
-       }
-
-       sockaddr_in6 addr;
-       memset(&addr, 0, sizeof(addr));
-       addr.sin6_family = AF_INET6;
-       addr.sin6_port = htons(port);
-
-       if (bind(server_sock, reinterpret_cast<sockaddr *>(&addr), sizeof(addr)) == -1) {
-               perror("bind");
-               exit(1);
-       }
-
-       if (listen(server_sock, 128) == -1) {
-               perror("listen");
-               exit(1);
-       }
-
-       return server_sock;
-}
-
-void *acceptor_thread_run(void *arg)
-{
-       int server_sock = int(intptr_t(arg));
-       while (!hupped) {
-               // Since we are non-blocking, we need to wait for the right state first.
-               // Wait up to 50 ms, then check hupped.
-               pollfd pfd;
-               pfd.fd = server_sock;
-               pfd.events = POLLIN;
-
-               int nfds = poll(&pfd, 1, 50);
-               if (nfds == 0 || (nfds == -1 && errno == EINTR)) {
-                       continue;
-               }
-               if (nfds == -1) {
-                       perror("poll");
-                       usleep(100000);
-                       continue;
-               }
-
-               sockaddr_in6 addr;
-               socklen_t addrlen = sizeof(addr);
-
-               // Get a new socket.
-               int sock = accept(server_sock, reinterpret_cast<sockaddr *>(&addr), &addrlen);
-               if (sock == -1 && errno == EINTR) {
-                       continue;
-               }
-               if (sock == -1) {
-                       perror("accept");
-                       usleep(100000);
-                       continue;
-               }
-
-               // Set the socket as nonblocking.
-               int one = 1;
-               if (ioctl(sock, FIONBIO, &one) == -1) {
-                       perror("FIONBIO");
-                       exit(1);
-               }
-
-               // Pick a server, round-robin, and hand over the socket to it.
-               servers->add_client(sock);
-       }
-       return NULL;
-}
-
 struct StatsThreadParameters {
        string stats_file;
        int stats_interval;
@@ -282,6 +191,29 @@ MarkPool *get_mark_pool(map<pair<int, int>, MarkPool *> *mark_pools, int from, i
        mark_pools->insert(make_pair(mark_range, mark_pool));
        return mark_pool;
 }
+                       
+MarkPool *parse_mark_pool(map<pair<int, int>, MarkPool *> *mark_pools, const string &mark_str)
+{
+       size_t split = mark_str.find_first_of('-');
+       if (split == string::npos) {
+               fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n",
+                       mark_str.c_str());
+               return NULL;
+       }
+
+       string from_str(mark_str.begin(), mark_str.begin() + split);
+       string to_str(mark_str.begin() + split + 1, mark_str.end());
+       int from = atoi(from_str.c_str());
+       int to = atoi(to_str.c_str());
+
+       if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) {
+               fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n",
+                       from, to);
+               return NULL;
+       }
+
+       return get_mark_pool(mark_pools, from, to);
+}
 
 int main(int argc, char **argv)
 {
@@ -351,26 +283,7 @@ int main(int argc, char **argv)
 
                // Set up marks, if so desired.
                if (config[i].parameters.count("mark")) {
-                       string mark_str = config[i].parameters["mark"];
-                       size_t split = mark_str.find_first_of('-');
-                       if (split == string::npos) {
-                               fprintf(stderr, "WARNING: Invalid mark specification '%s' (expected 'X-Y'), ignoring.\n",
-                                       mark_str.c_str());
-                               continue;
-                       }
-
-                       string from_str(mark_str.begin(), mark_str.begin() + split);
-                       string to_str(mark_str.begin() + split + 1, mark_str.end());
-                       int from = atoi(from_str.c_str());
-                       int to = atoi(to_str.c_str());
-
-                       if (from <= 0 || from >= 65536 || to <= 0 || to >= 65536) {
-                               fprintf(stderr, "WARNING: Mark pool range %d-%d is outside legal range [1,65536>, ignoring.\n",
-                                       from, to);
-                               continue;
-                       }
-
-                       MarkPool *mark_pool = get_mark_pool(&mark_pools, from, to);
+                       MarkPool *mark_pool = parse_mark_pool(&mark_pools, config[i].parameters["mark"]);
                        servers->set_mark_pool(stream_id, mark_pool);
                }
        }