/* 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/connection_info.c * @brief implementation of MHD_connection_get_information_sz() * @author Christian Grothoff */ #include "internal.h" /** * Obtain information about the given connection. * Use wrapper macro #MHD_connection_get_information() instead of direct use * of this function. * * @param connection what connection 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_ConnectionInformation 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_connection_get_information_sz (struct MHD_Connection *connection, enum MHD_ConnectionInformationType info_type, union MHD_ConnectionInformation *return_value, size_t return_value_size) { #define CHECK_SIZE(type) if (sizeof(type) < return_value_size) \ return MHD_NO switch (info_type) { #ifdef HTTPS_SUPPORT case MHD_CONNECTION_INFORMATION_CIPHER_ALGO: CHECK_SIZE (int); if (NULL == connection->tls_cs) return MHD_NO; // return_value->cipher_algorithm // = gnutls_cipher_get (connection->tls_session); return MHD_NO; // FIXME: to be implemented case MHD_CONNECTION_INFORMATION_PROTOCOL: CHECK_SIZE (int); if (NULL == connection->tls_cs) return MHD_NO; //return_value->protocol // = gnutls_protocol_get_version (connection->tls_session); return MHD_NO; // FIXME: to be implemented case MHD_CONNECTION_INFORMATION_GNUTLS_SESSION: CHECK_SIZE (void *); if (NULL == connection->tls_cs) return MHD_NO; // return_value->tls_session = connection->tls_session; return MHD_NO; // FIXME: to be implemented #endif /* HTTPS_SUPPORT */ case MHD_CONNECTION_INFORMATION_CLIENT_ADDRESS: CHECK_SIZE (struct sockaddr *); return_value->client_addr = (const struct sockaddr *) &connection->addr; return MHD_YES; case MHD_CONNECTION_INFORMATION_DAEMON: CHECK_SIZE (struct MHD_Daemon *); return_value->daemon = connection->daemon; return MHD_YES; case MHD_CONNECTION_INFORMATION_CONNECTION_FD: CHECK_SIZE (MHD_socket); return_value->connect_fd = connection->socket_fd; return MHD_YES; case MHD_CONNECTION_INFORMATION_SOCKET_CONTEXT: CHECK_SIZE (void **); return_value->socket_context = &connection->socket_context; return MHD_YES; case MHD_CONNECTION_INFORMATION_CONNECTION_SUSPENDED: CHECK_SIZE (enum MHD_Bool); return_value->suspended = connection->suspended ? MHD_YES : MHD_NO; return MHD_YES; case MHD_CONNECTION_INFORMATION_CONNECTION_TIMEOUT: CHECK_SIZE (unsigned int); return_value->connection_timeout = (unsigned int) connection->connection_timeout; return MHD_YES; default: return MHD_NO; } #undef CHECK_SIZE } /* end of connection_info.c */