diff options
Diffstat (limited to 'src/lib/daemon_info.c')
-rw-r--r-- | src/lib/daemon_info.c | 63 |
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 */ |