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)
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()