diff options
-rw-r--r-- | nanohttp/nanohttp-common.h | 6 | ||||
-rw-r--r-- | nanohttp/nanohttp-server.c | 55 | ||||
-rw-r--r-- | nanohttp/nanohttp-socket.c | 3 |
3 files changed, 56 insertions, 8 deletions
diff --git a/nanohttp/nanohttp-common.h b/nanohttp/nanohttp-common.h index ef70b0f..455e9ed 100644 --- a/nanohttp/nanohttp-common.h +++ b/nanohttp/nanohttp-common.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-common.h,v 1.9 2004/09/14 13:23:10 snowdrop Exp $ + * $Id: nanohttp-common.h,v 1.10 2004/09/14 15:31:24 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -148,7 +148,9 @@ log_level_t log_get_level(); #ifdef WIN32 - #define __FUNCTION__ "***" + #ifndef __MINGW32__ + #define __FUNCTION__ "***" + #endif #endif #define log_verbose1(a1) log_verbose(__FUNCTION__, a1) diff --git a/nanohttp/nanohttp-server.c b/nanohttp/nanohttp-server.c index 9e81a76..8d86b86 100644 --- a/nanohttp/nanohttp-server.c +++ b/nanohttp/nanohttp-server.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-server.c,v 1.21 2004/09/14 13:23:10 snowdrop Exp $ +* $Id: nanohttp-server.c,v 1.22 2004/09/14 15:31:24 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -457,12 +457,12 @@ void _httpd_register_signal_handler() FUNCTION: _httpd_wait_for_empty_conn ----------------------------------------------------*/ static -conndata_t *_httpd_wait_for_empty_conn(int *term_flag) +conndata_t *_httpd_wait_for_empty_conn() { int i; for (i = 0;; i++) { - if (!*term_flag) + if (!_httpd_run) return NULL; if (i >= _httpd_max_connections) @@ -510,6 +510,37 @@ void _httpd_start_thread(conndata_t* conn) /* * ----------------------------------------------------- + * FUNCTION: _httpd_select + * Returns 0 if success != otherwise + * ----------------------------------------------------- + */ +static +int _httpd_select(fd_set *pfds) +{ + int err; + struct timeval timeout; + + timeout.tv_sec = 1; + timeout.tv_usec = 0; + + FD_ZERO (pfds); + FD_SET (_httpd_socket, pfds); + +#ifndef WIN32 + select (1, pfds, NULL, NULL, &timeout); +#else + if (select (1, pfds, NULL, NULL, &timeout) == SOCKET_ERROR) + { + err = WSAGetLastError (); + log_error1 ("select error"); + return 1; + } +#endif + return 0; +} + +/* + * ----------------------------------------------------- * FUNCTION: httpd_run * ----------------------------------------------------- */ @@ -519,6 +550,7 @@ httpd_run () { int err; conndata_t *conn; + fd_set fds; log_verbose1 ("starting run routine"); @@ -546,8 +578,21 @@ httpd_run () while (_httpd_run) { /* Get an empty connection struct */ - conn = _httpd_wait_for_empty_conn(&_httpd_run); - if (conn == NULL) break; + conn = _httpd_wait_for_empty_conn(); + if (!_httpd_run) break; + + /* Select file descriptor */ + if (_httpd_select(&fds)) + { + log_error1("Can not select!"); + return -1; /* this is hard core! */ + } + + /* Wait for a socket to accept */ + while (_httpd_run && (FD_ISSET (_httpd_socket, &fds))); + + if (!_httpd_run) + break; /* Accept a socket */ err = hsocket_accept(_httpd_socket, &(conn->sock)); diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index fc83221..1770a21 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@ /******************************************************************
-* $Id: nanohttp-socket.c,v 1.19 2004/09/14 13:25:50 snowdrop Exp $
+* $Id: nanohttp-socket.c,v 1.20 2004/09/14 15:31:24 snowdrop Exp $
*
* CSOAP Project: A http client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -203,6 +203,7 @@ int hsocket_accept(hsocket_t sock, hsocket_t *dest) #ifdef WIN32
while(1)
{
+ log_debug1("accept()");
sockfd = accept(sock, (struct sockaddr *)&addr, &asize);
if (sockfd == INVALID_SOCKET)
{
|