aboutsummaryrefslogtreecommitdiff
path: root/src/lib/daemon_info.c
blob: b0c5ec14ba3e4bcf36ec0d8a9730d46b2bb2870a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
  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 */