X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fhttpd.c;h=0dbc84776caf8b5383ac7e90718ff3055bcb098f;hb=5a746b97186cd50b3c787824ea2290dc88d84ed0;hp=5779c0646e6501c8b012ba815bf547c891bf99d0;hpb=1b4a582b04fc39d9d4d930acb4d0803bdedfb32e;p=deb_shairplay.git diff --git a/src/lib/httpd.c b/src/lib/httpd.c index 5779c06..0dbc847 100644 --- a/src/lib/httpd.c +++ b/src/lib/httpd.c @@ -1,3 +1,17 @@ +/** + * Copyright (C) 2011-2012 Juho Vähä-Herttua + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + */ + #include #include #include @@ -25,6 +39,7 @@ struct httpd_s { int use_rtsp; int max_connections; + int open_connections; http_connection_t *connections; /* These variables only edited mutex locked */ @@ -101,6 +116,7 @@ httpd_add_connection(httpd_t *httpd, int fd, unsigned char *local, int local_len return; } + httpd->open_connections++; httpd->connections[i].socket_fd = fd; httpd->connections[i].connected = 1; httpd->connections[i].user_data = httpd->callbacks.conn_init(httpd->callbacks.opaque, local, local_len, remote, remote_len); @@ -117,6 +133,7 @@ httpd_remove_connection(httpd_t *httpd, http_connection_t *connection) shutdown(connection->socket_fd, SHUT_WR); closesocket(connection->socket_fd); connection->connected = 0; + httpd->open_connections--; } static THREAD_RETVAL @@ -147,8 +164,10 @@ httpd_thread(void *arg) /* Get the correct nfds value and set rfds */ FD_ZERO(&rfds); - FD_SET(httpd->server_fd, &rfds); - nfds = httpd->server_fd+1; + if (httpd->open_connections < httpd->max_connections) { + FD_SET(httpd->server_fd, &rfds); + nfds = httpd->server_fd+1; + } for (i=0; imax_connections; i++) { int socket_fd; if (!httpd->connections[i].connected) { @@ -216,10 +235,10 @@ httpd_thread(void *arg) assert(connection->request); } - logger_log(httpd->logger, LOGGER_DEBUG, "Receiving on socket %d\n", httpd->connections[i].socket_fd); + logger_log(httpd->logger, LOGGER_DEBUG, "Receiving on socket %d\n", connection->socket_fd); ret = recv(connection->socket_fd, buffer, sizeof(buffer), 0); if (ret == 0) { - logger_log(httpd->logger, LOGGER_INFO, "Connection closed\n"); + logger_log(httpd->logger, LOGGER_INFO, "Connection closed for socket %d\n", connection->socket_fd); httpd_remove_connection(httpd, connection); continue; } @@ -274,11 +293,11 @@ httpd_thread(void *arg) if (!connection->connected) { continue; } - logger_log(httpd->logger, LOGGER_INFO, "Removing connection\n"); + logger_log(httpd->logger, LOGGER_INFO, "Removing connection for socket %d\n", connection->socket_fd); httpd_remove_connection(httpd, connection); } - logger_log(httpd->logger, LOGGER_INFO, "Exiting thread\n"); + logger_log(httpd->logger, LOGGER_INFO, "Exiting HTTP thread\n"); return 0; } @@ -317,6 +336,20 @@ httpd_start(httpd_t *httpd, unsigned short *port) return 1; } +int +httpd_is_running(httpd_t *httpd) +{ + int running; + + assert(httpd); + + MUTEX_LOCK(httpd->run_mutex); + running = httpd->running || !httpd->joined; + MUTEX_UNLOCK(httpd->run_mutex); + + return running; +} + void httpd_stop(httpd_t *httpd) {