aboutsummaryrefslogtreecommitdiff
path: root/src/lib/daemon_info.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/daemon_info.c')
-rw-r--r--src/lib/daemon_info.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/src/lib/daemon_info.c b/src/lib/daemon_info.c
index 47009687..770f74b9 100644
--- a/src/lib/daemon_info.c
+++ b/src/lib/daemon_info.c
@@ -46,50 +46,59 @@ MHD_daemon_get_information_sz (struct MHD_Daemon *daemon,
46 union MHD_DaemonInformation *return_value, 46 union MHD_DaemonInformation *return_value,
47 size_t return_value_size) 47 size_t return_value_size)
48{ 48{
49#if OLD 49#define CHECK_SIZE(type) if (sizeof(type) < return_value_size) \
50 if (NULL == daemon) 50 return MHD_NO
51 return NULL; 51
52 switch (info_type) 52 switch (info_type)
53 { 53 {
54 case MHD_DAEMON_INFO_KEY_SIZE: 54 case MHD_DAEMON_INFORMATION_LISTEN_SOCKET:
55 return NULL; /* no longer supported */ 55 CHECK_SIZE (MHD_socket);
56 case MHD_DAEMON_INFO_MAC_KEY_SIZE: 56 return_value->listen_socket
57 return NULL; /* no longer supported */ 57 = daemon->listen_socket;
58 case MHD_DAEMON_INFO_LISTEN_FD: 58 return MHD_YES;
59 return (const union MHD_DaemonInfo *) &daemon->listen_fd;
60#ifdef EPOLL_SUPPORT 59#ifdef EPOLL_SUPPORT
61 case MHD_DAEMON_INFO_EPOLL_FD: 60 case MHD_DAEMON_INFORMATION_EPOLL_FD:
62 return (const union MHD_DaemonInfo *) &daemon->epoll_fd; 61 CHECK_SIZE (int);
62 // FIXME: maybe return MHD_NO if we are not using EPOLL?
63 return_value->epoll_fd = daemon->epoll_fd;
64 return MHD_YES;
63#endif 65#endif
64 case MHD_DAEMON_INFO_CURRENT_CONNECTIONS: 66 case MHD_DAEMON_INFORMATION_CURRENT_CONNECTIONS:
65 if (0 == (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) 67 CHECK_SIZE (unsigned int);
68 if (MHD_TM_EXTERNAL_EVENT_LOOP == daemon->threading_model)
66 { 69 {
67 /* Assume that MHD_run() in not called in other thread 70 /* Assumes that MHD_run() in not called in other thread
68 * at the same time. */ 71 (of the application) at the same time. */
69 MHD_cleanup_connections (daemon); 72 MHD_cleanup_connections (daemon);
73 return_value->num_connections
74 = daemon->connections;
70 } 75 }
71 else if (daemon->worker_pool) 76 else if (daemon->worker_pool)
72 { 77 {
73 unsigned int i; 78 unsigned int i;
74 /* Collect the connection information stored in the workers. */ 79 /* Collect the connection information stored in the workers. */
75 daemon->connections = 0; 80 return_value->num_connections = 0;
76 for (i = 0; i < daemon->worker_pool_size; i++) 81 for (i = 0; i < daemon->worker_pool_size; i++)
77 { 82 {
78 /* FIXME: next line is thread-safe only if read is atomic. */ 83 /* FIXME: next line is thread-safe only if read is atomic. */
79 daemon->connections += daemon->worker_pool[i].connections; 84 return_value->num_connections
85 += daemon->worker_pool[i].connections;
80 } 86 }
81 } 87 }
82 return (const union MHD_DaemonInfo *) &daemon->connections; 88 else
83 case MHD_DAEMON_INFO_FLAGS: 89 return_value->num_connections
84 return (const union MHD_DaemonInfo *) &daemon->options; 90 = daemon->connections;
85 case MHD_DAEMON_INFO_BIND_PORT: 91 return MHD_YES;
86 return (const union MHD_DaemonInfo *) &daemon->port; 92 case MHD_DAEMON_INFORMATION_BIND_PORT:
93 CHECK_SIZE (uint16_t);
94 // FIXME: return MHD_NO if port is not known/UNIX?
95 return_value->port = daemon->listen_port;
96 return MHD_YES;
87 default: 97 default:
88 return NULL; 98 return MHD_NO;
89 } 99 }
90#else 100
91 return MHD_NO; 101#undef CHECK_SIZE
92#endif
93} 102}
94 103
95/* end of daemon_info.c */ 104/* end of daemon_info.c */