X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=main.cpp;h=dc52bdc29a17ab85f1ad1d5c8f23ef34a54c0604;hp=1300508f314dc7b5909e6567c80832ac01432345;hb=3b2b74d6be17096c2fe830bfa07fbcecb4460b81;hpb=462cb16514a2b691ae4d4b76125b42fda83df712 diff --git a/main.cpp b/main.cpp index 1300508..dc52bdc 100644 --- a/main.cpp +++ b/main.cpp @@ -18,6 +18,7 @@ #include #include +#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(&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(&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, MarkPool *> *mark_pools, int from, i mark_pools->insert(make_pair(mark_range, mark_pool)); return mark_pool; } + +MarkPool *parse_mark_pool(map, 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); } }