X-Git-Url: https://secure.softndesign.org/git/?a=blobdiff_plain;f=server.c;h=b2a564d9767a23cb73921fa3c51c204125c24ecb;hb=refs%2Fheads%2Fmaster;hp=4ead290052798a3d3aa746b3fcabefe4e0f6aa7e;hpb=7d4815a19c66771a0b8bc969ab1c2555b192e9f9;p=webserver.git diff --git a/server.c b/server.c index 4ead290..b2a564d 100644 --- a/server.c +++ b/server.c @@ -72,8 +72,9 @@ void init_network_context (void) assert (SOCKET_ERROR == -1); #endif +#ifndef _WIN32 /* Posix */ signal (SIGINT, &stop_server); - signal (SIGQUIT, &stop_server); +#endif signal (SIGABRT, &stop_server); signal (SIGSEGV, &stop_server); signal (SIGTERM, &stop_server); @@ -81,10 +82,20 @@ void init_network_context (void) /* terminate network context */ +void _closesocket (socket_t sock) +{ + if (sock != INVALID_SOCKET) { + int rc = closesocket (sock); + if (rc == SOCKET_ERROR) { + VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); + } + } +} + void terminate_network_context (void) { - closesocket (sock); - closesocket (conn); + _closesocket (sock); + _closesocket (conn); #ifdef _WIN32 /* Windows */ WSACleanup (); #endif @@ -98,15 +109,9 @@ int open_listening_socket (int port) VERBOSE (DEBUG, PRINT ("Opening socket\n")); //socket_t sock = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (sock != INVALID_SOCKET) { - int rc = closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; - } - sock = socket (AF_INET, SOCK_STREAM, 0); - if (sock == INVALID_SOCKET) { + _closesocket (sock); + socket_t _sock = socket (AF_INET, SOCK_STREAM, 0); + if (_sock == INVALID_SOCKET) { return 0; } @@ -118,44 +123,34 @@ int open_listening_socket (int port) addr.sin_addr.s_addr = htonl (INADDR_ANY); VERBOSE (DEBUG, PRINT ("Binding socket\n")); - //setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val)); - int rc = bind (sock, (struct sockaddr *)&addr, sizeof (addr)); + //setsockopt (_sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof (val)); + int rc = bind (_sock, (struct sockaddr *)&addr, sizeof (addr)); if (rc == SOCKET_ERROR) { VERBOSE (ERROR, PERROR ("error: bind %d\n", ERRNO)); - rc = closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } VERBOSE (DEBUG, PRINT ("Configuring socket\n")); #ifndef _WIN32 /* Posix */ - fcntl (sock, F_SETFL, O_NONBLOCK); + fcntl (_sock, F_SETFL, O_NONBLOCK); #endif - rc = setsockopt (sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); + rc = setsockopt (_sock, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY")); - closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } - rc = listen (sock, BACKLOG); + rc = listen (_sock, BACKLOG); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "listen")); - closesocket (sock); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - sock = INVALID_SOCKET; + _closesocket (_sock); return 0; } + sock = _sock; + return 1; } @@ -169,32 +164,27 @@ int accept_incoming_connection (void) } if (conn != INVALID_SOCKET) { - int rc = closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } + _closesocket (conn); conn = INVALID_SOCKET; } - conn = accept (sock, NULL, 0); - if (conn == INVALID_SOCKET) { + socket_t _conn = accept (sock, NULL, 0); + if (_conn == INVALID_SOCKET) { return 0; } #ifndef _WIN32 /* POSIX */ - fcntl (conn, F_SETFL, O_NONBLOCK); + fcntl (_conn, F_SETFL, O_NONBLOCK); #endif int val = 1; - int rc = setsockopt (conn, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); + int rc = setsockopt (_conn, IPPROTO_TCP, TCP_NODELAY, (char *)&val, sizeof (val)); if (rc < 0) { VERBOSE (ERROR, PERROR ("error: %s\n", "setsockopt/TCP_NODELAY")); - closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: close %d\n", ERRNO)); - } - conn = INVALID_SOCKET; + _closesocket (_conn); return 0; } + conn = _conn; + return 1; } @@ -202,19 +192,16 @@ int accept_incoming_connection (void) void close_connection (void) { - int rc = closesocket (conn); - if (rc == SOCKET_ERROR) { - VERBOSE (ERROR, PERROR ("error: %d\n", ERRNO)); - } + _closesocket (conn); conn = INVALID_SOCKET; } /* receive data from socket */ -int receive_data (unsigned char **pdata) +int receive_data (char **pdata) { - unsigned char buffer[BUFFER_SIZE] = {0}; - unsigned char *data = NULL; + char buffer[BUFFER_SIZE] = {0}; + char *data = NULL; int len = 0; if (conn == INVALID_SOCKET) { @@ -236,22 +223,15 @@ int receive_data (unsigned char **pdata) } /* read from socket */ - int rc = read (conn, buffer, BUFFER_SIZE); + int rc = recv (conn, buffer, BUFFER_SIZE, 0); + VERBOSE (DEBUG, PRINT ("rc: %d\nerrno: %d\n", rc, ERRNO)); - if (rc == 0) { /* sock closed */ + if (rc == 0) { /* sock closed or error */ if (data) { free (data); data = NULL; - len = 0; } - break; - - } else if ((rc < 0) && (ERRNO != EAGAIN)) { /* error */ - if (data) { - free (data); - data = NULL; - } - len = -1; + len = (rc < 0) ? -1 : 0; break; } else if (rc > 0) { @@ -269,7 +249,7 @@ int receive_data (unsigned char **pdata) /* send data onto socket */ -int send_data (unsigned char *data, int len) +int send_data (char *data, int len) { int index = 0; @@ -279,13 +259,10 @@ int send_data (unsigned char *data, int len) } while (index < len) { - int rc = write (conn, data + index, len - index); + int rc = send (conn, data + index, len - index, 0); - if (rc == 0) { /* sock closed */ - index = 0; - break; - } else if ((rc < 0) && (ERRNO != EAGAIN)) { /* error */ - index = -1; + if (rc <= 0) { /* sock closed or error */ + index = (rc < 0) ? -1 : 0; break; } else if (rc > 0) { index += rc;