--- lbbs/src/net_server.c 2004/10/18 08:44:39 1.1 +++ lbbs/src/net_server.c 2005/05/07 12:08:28 1.12 @@ -1,5 +1,5 @@ /*************************************************************************** - bbsd.c - description + net_server.c - description ------------------- begin : Mon Oct 11 2004 copyright : (C) 2004 by Leaflet @@ -16,23 +16,26 @@ ***************************************************************************/ #include "common.h" +#include "io.h" +#include "tcplib.h" #include #include -#include +#include int net_server (const char *hostaddr, unsigned int port) { - int sock, namelen, seq, netint; + int namelen, seq, netint, result, flags; struct sockaddr_in sin; - char msgsock; - char buf[1024]; + char temp[256]; + fd_set testfds; + struct timeval timeout; - sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); + socket_server = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock < 0) + if (socket_server < 0) { - perror ("socket"); + log_error ("Create socket failed\n"); exit (1); } @@ -41,23 +44,87 @@ net_server (const char *hostaddr, unsign (strlen (hostaddr) > 0 ? inet_addr (hostaddr) : INADDR_ANY); sin.sin_port = htons (port); - if (bind (sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) + if (bind (socket_server, (struct sockaddr *) &sin, sizeof (sin)) < 0) { - perror ("bind"); + log_error ("Bind address %s:%u failed\n", + inet_ntoa (sin.sin_addr), ntohs (sin.sin_port)); exit (2); } - if (listen (sock, 10) < 0) + if (listen (socket_server, 10) < 0) { - perror ("listen"); + log_error ("Socket listen failed\n"); exit (3); } + strcpy (hostaddr_server, inet_ntoa (sin.sin_addr)); + port_server = ntohs (sin.sin_port); + + log_std ("Listening at %s:%d\n", hostaddr_server, port_server); + namelen = sizeof (sin); - if ((msgsock = accept (sock, (struct sockaddr *) &sin, &namelen)) < 0) + while (!SYS_exit) + { + FD_ZERO (&testfds); + FD_SET (socket_server, &testfds); + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + result = SignalSafeSelect (FD_SETSIZE, &testfds, NULL, NULL, &timeout); + if (result < 0) + { + log_error ("Accept connection error\n"); + continue; + } + + if (result == 0) + { + continue; + } + + if (FD_ISSET (socket_server, &testfds)) + { + flags = fcntl (socket_server, F_GETFL, 0); + fcntl (socket_server, F_SETFL, flags | O_NONBLOCK); + while ((socket_client = + accept (socket_server, (struct sockaddr *) &sin, &namelen)) < 0) + { + if (errno != EWOULDBLOCK && errno != ECONNABORTED && errno != EINTR) + { + log_error ("Accept connection error\n"); + break; + } + } + fcntl (socket_server, F_SETFL, flags); + } + + if (socket_client < 0) + { + log_error ("Accept connection error\n"); + continue; + } + + strcpy (hostaddr_client, (const char *) inet_ntoa (sin.sin_addr)); + port_client = ntohs (sin.sin_port); + + log_std ("Accept connection from %s:%d\n", hostaddr_client, + port_client); + + if (fork_server () < 0) + { + log_error ("Fork error\n"); + } + + if (close (socket_client) == -1) + { + log_error ("Close client socket failed\n"); + } + } + + if (close (socket_server) == -1) { - perror ("accept"); - exit (4); + log_error ("Close server socket failed\n"); } return 0;