Use threads for TCP listening sockets.
[tinc] / src / net_socket.c
index ca681e8..8a73389 100644 (file)
@@ -464,45 +464,48 @@ void setup_outgoing_connection(outgoing_t *outgoing) {
   accept a new tcp connect and create a
   new connection
 */
-void handle_new_meta_connection(int sock, short events, void *data) {
+void handle_new_meta_connection(void *data) {
+       listen_socket_t *l = data;
        connection_t *c;
        sockaddr_t sa;
        int fd;
        socklen_t len = sizeof sa;
 
-       fd = accept(sock, &sa.sa, &len);
+       while(true) {
+               fd = accept(l->tcp, &sa.sa, &len);
 
-       if(fd < 0) {
-               logger(LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno));
-               return;
-       }
+               if(fd < 0) {
+                       logger(LOG_ERR, "Accepting a new connection failed: %s", sockstrerror(sockerrno));
+                       return;
+               }
 
-       sockaddrunmap(&sa);
+               sockaddrunmap(&sa);
 
-       c = new_connection();
-       c->name = xstrdup("<unknown>");
-       c->outcipher = myself->connection->outcipher;
-       c->outdigest = myself->connection->outdigest;
-       c->outmaclength = myself->connection->outmaclength;
-       c->outcompression = myself->connection->outcompression;
+               c = new_connection();
+               c->name = xstrdup("<unknown>");
+               c->outcipher = myself->connection->outcipher;
+               c->outdigest = myself->connection->outdigest;
+               c->outmaclength = myself->connection->outmaclength;
+               c->outcompression = myself->connection->outcompression;
 
-       c->address = sa;
-       c->hostname = sockaddr2hostname(&sa);
-       c->socket = fd;
-       c->last_ping_time = time(NULL);
+               c->address = sa;
+               c->hostname = sockaddr2hostname(&sa);
+               c->socket = fd;
+               c->last_ping_time = time(NULL);
 
-       ifdebug(CONNECTIONS) logger(LOG_NOTICE, "Connection from %s", c->hostname);
+               ifdebug(CONNECTIONS) logger(LOG_NOTICE, "Connection from %s", c->hostname);
 
-       configure_tcp(c);
+               configure_tcp(c);
 
-       connection_add(c);
+               connection_add(c);
 
-       c->allow_request = ID;
-       send_id(c);
+               c->allow_request = ID;
+               send_id(c);
 
-       if(!thread_create(&c->thread, handle_meta_connection_data, c)) {
-               logger(LOG_ERR, "create_thread() failed: %s", strerror(errno));
-               abort();
+               if(!thread_create(&c->thread, handle_meta_connection_data, c)) {
+                       logger(LOG_ERR, "create_thread() failed: %s", strerror(errno));
+                       abort();
+               }
        }
 }