| /* |
| This file is part of libmicrohttpd |
| Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff |
| |
| 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. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| /** |
| * @file lib/daemon_info.c |
| * @brief implementation of MHD_daemon_get_information_sz() |
| * @author Christian Grothoff |
| */ |
| #include "internal.h" |
| #include "connection_cleanup.h" |
| |
| |
| /** |
| * Obtain information about the given daemon. |
| * Use wrapper macro #MHD_daemon_get_information() instead of direct use |
| * of this function. |
| * |
| * @param daemon what daemon to get information about |
| * @param info_type what information is desired? |
| * @param[out] return_value pointer to union where requested information will |
| * be stored |
| * @param return_value_size size of union MHD_DaemonInformation at compile |
| * time |
| * @return #MHD_YES on success, #MHD_NO on error |
| * (@a info_type is unknown, NULL pointer etc.) |
| * @ingroup specialized |
| */ |
| enum MHD_Bool |
| MHD_daemon_get_information_sz (struct MHD_Daemon *daemon, |
| enum MHD_DaemonInformationType info_type, |
| union MHD_DaemonInformation *return_value, |
| size_t return_value_size) |
| { |
| #define CHECK_SIZE(type) if (sizeof(type) < return_value_size) \ |
| return MHD_NO |
| |
| switch (info_type) |
| { |
| case MHD_DAEMON_INFORMATION_LISTEN_SOCKET: |
| CHECK_SIZE (MHD_socket); |
| return_value->listen_socket |
| = daemon->listen_socket; |
| return MHD_YES; |
| #ifdef EPOLL_SUPPORT |
| case MHD_DAEMON_INFORMATION_EPOLL_FD: |
| CHECK_SIZE (int); |
| // FIXME: maybe return MHD_NO if we are not using EPOLL? |
| return_value->epoll_fd = daemon->epoll_fd; |
| return MHD_YES; |
| #endif |
| case MHD_DAEMON_INFORMATION_CURRENT_CONNECTIONS: |
| CHECK_SIZE (unsigned int); |
| if (MHD_TM_EXTERNAL_EVENT_LOOP == daemon->threading_mode) |
| { |
| /* Assumes that MHD_run() in not called in other thread |
| (of the application) at the same time. */ |
| MHD_connection_cleanup_ (daemon); |
| return_value->num_connections |
| = daemon->connections; |
| } |
| else if (daemon->worker_pool) |
| { |
| unsigned int i; |
| /* Collect the connection information stored in the workers. */ |
| return_value->num_connections = 0; |
| for (i = 0; i < daemon->worker_pool_size; i++) |
| { |
| /* FIXME: next line is thread-safe only if read is atomic. */ |
| return_value->num_connections |
| += daemon->worker_pool[i].connections; |
| } |
| } |
| else |
| return_value->num_connections |
| = daemon->connections; |
| return MHD_YES; |
| case MHD_DAEMON_INFORMATION_BIND_PORT: |
| CHECK_SIZE (uint16_t); |
| // FIXME: return MHD_NO if port is not known/UNIX? |
| return_value->port = daemon->listen_port; |
| return MHD_YES; |
| default: |
| return MHD_NO; |
| } |
| |
| #undef CHECK_SIZE |
| } |
| |
| |
| /* end of daemon_info.c */ |