X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fsocket_server.cpp;fp=src%2Fsocket_server.cpp;h=e9bdde001affb3f0cfef867e9892bea7c901d077;hp=6ef93177413fa0d5324eaf35eeaffb71002bab34;hb=04e6b2712bf0fdfdb6a74cf6d26f02e6a8d37ae2;hpb=59adb9e24e4ac66b2623742c3b9c81a1c20ff9f0 diff --git a/src/socket_server.cpp b/src/socket_server.cpp index 6ef9317..e9bdde0 100644 --- a/src/socket_server.cpp +++ b/src/socket_server.cpp @@ -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()