libt2n: (gerd) small improvements, resolve doxygen conflicts
[libt2n] / src / socket_server.cpp
index 6ef9317..e9bdde0 100644 (file)
@@ -201,7 +201,79 @@ socket_server::~socket_server()
 
 void socket_server::new_connection()
 {
+    struct sockaddr_un clientname;
 
+    unsigned int size = sizeof (clientname);
+    int newsock = accept (sock,(struct sockaddr *) &clientname,&size);
+    if (newsock < 0)
+    {
+        if (errno == EAGAIN)
+        {
+            log(error, "accept error (EAGAIN): no connection waiting");
+            return;
+        }
+
+        /* default: break */
+        string err="error accepting connection: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+
+    FD_SET (newsock, &connection_set);
+
+    int i=1;
+
+    /* keepalive enable */
+    if (setsockopt(newsock,SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i)) < 0)
+    {
+        string err="error setting socket option: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+
+    /* close on exec */
+    int fdflags;
+    fdflags=fcntl(newsock,F_GETFD, 0);
+    if (fdflags < 0)
+    {
+        string err="fcntl error on socket: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+    fdflags |= FD_CLOEXEC;
+    if (fcntl(newsock,F_SETFD,fdflags) < 0)
+    {
+        string err="fcntl error on socket: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+
+    /* non-blocking mode */
+    int flflags;
+    flflags=fcntl(newsock,F_GETFL,0);
+    if (flflags < 0)
+    {
+        string err="fcntl error on socket: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+    flflags |= O_NONBLOCK;
+    if (fcntl(newsock,F_SETFL,flflags) < 0)
+    {
+        string err="fcntl error on socket: ";
+        err+=strerror(errno);
+        log(error, err);
+        throw t2n_server_error(err);
+    }
+
+    add_connection(new socket_connection(newsock, get_default_timeout()));
+
+    return;
 }
 
 void socket_server::fill_buffer(long long usec_timeout)
@@ -258,10 +330,10 @@ void socket_server::fill_buffer(long long usec_timeout)
     return;
 }
 
-socket_connection::socket_connection(int _socket, int _timeout)
+socket_connection::socket_connection(int _sock, int _timeout)
     : connection(_timeout)
 {
-
+    sock=_sock;
 }
 
 void socket_connection::close()