diff options
Diffstat (limited to 'src/daemon/daemon.c')
-rw-r--r-- | src/daemon/daemon.c | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c index e971c9b2..971196f8 100644 --- a/src/daemon/daemon.c +++ b/src/daemon/daemon.c | |||
@@ -172,7 +172,7 @@ MHD_handle_connection (void *data) | |||
172 | static int | 172 | static int |
173 | MHD_accept_connection (struct MHD_Daemon *daemon) | 173 | MHD_accept_connection (struct MHD_Daemon *daemon) |
174 | { | 174 | { |
175 | struct MHD_Connection *pos; | 175 | struct MHD_Connection *pos; |
176 | struct MHD_Connection *connection; | 176 | struct MHD_Connection *connection; |
177 | struct sockaddr_in6 addr6; | 177 | struct sockaddr_in6 addr6; |
178 | struct sockaddr *addr = (struct sockaddr *) &addr6; | 178 | struct sockaddr *addr = (struct sockaddr *) &addr6; |
@@ -204,42 +204,44 @@ MHD_accept_connection (struct MHD_Daemon *daemon) | |||
204 | #if DEBUG_CONNECT | 204 | #if DEBUG_CONNECT |
205 | MHD_DLOG (daemon, "Accepted connection on socket %d\n", s); | 205 | MHD_DLOG (daemon, "Accepted connection on socket %d\n", s); |
206 | #endif | 206 | #endif |
207 | have = 0; | 207 | have = 0; |
208 | if ( (daemon->per_ip_connection_limit != 0) && | 208 | if ((daemon->per_ip_connection_limit != 0) && (daemon->max_connections > 0)) |
209 | (daemon->max_connections > 0) ) | ||
210 | { | 209 | { |
211 | pos = daemon->connections; | 210 | pos = daemon->connections; |
212 | while (pos != NULL) | 211 | while (pos != NULL) |
213 | { | 212 | { |
214 | if ( (pos->addr != NULL) && | 213 | if ((pos->addr != NULL) && (pos->addr_len == addrlen)) |
215 | (pos->addr_len == addrlen) ) | 214 | { |
216 | { | 215 | if (addrlen == sizeof (struct sockaddr_in)) |
217 | if (addrlen == sizeof(struct sockaddr_in)) | 216 | { |
218 | { | 217 | const struct sockaddr_in *a1 = |
219 | const struct sockaddr_in * a1 = (const struct sockaddr_in *) &addr; | 218 | (const struct sockaddr_in *) &addr; |
220 | const struct sockaddr_in * a2 = (const struct sockaddr_in *) pos->addr; | 219 | const struct sockaddr_in *a2 = |
221 | if (0 == memcmp(&a1->sin_addr, | 220 | (const struct sockaddr_in *) pos->addr; |
222 | &a2->sin_addr, | 221 | if (0 == |
223 | sizeof(struct in_addr))) | 222 | memcmp (&a1->sin_addr, &a2->sin_addr, |
224 | have++; | 223 | sizeof (struct in_addr))) |
225 | } | 224 | have++; |
226 | if (addrlen == sizeof(struct sockaddr_in6)) | 225 | } |
227 | { | 226 | if (addrlen == sizeof (struct sockaddr_in6)) |
228 | const struct sockaddr_in6 * a1 = (const struct sockaddr_in6 *) &addr; | 227 | { |
229 | const struct sockaddr_in6 * a2 = (const struct sockaddr_in6 *) pos->addr; | 228 | const struct sockaddr_in6 *a1 = |
230 | if (0 == memcmp(&a1->sin6_addr, | 229 | (const struct sockaddr_in6 *) &addr; |
231 | &a2->sin6_addr, | 230 | const struct sockaddr_in6 *a2 = |
232 | sizeof(struct in6_addr))) | 231 | (const struct sockaddr_in6 *) pos->addr; |
233 | have++; | 232 | if (0 == |
234 | } | 233 | memcmp (&a1->sin6_addr, &a2->sin6_addr, |
235 | } | 234 | sizeof (struct in6_addr))) |
236 | pos = pos->next; | 235 | have++; |
237 | } | 236 | } |
237 | } | ||
238 | pos = pos->next; | ||
239 | } | ||
238 | } | 240 | } |
239 | 241 | ||
240 | if ( (daemon->max_connections == 0) || | 242 | if ((daemon->max_connections == 0) || |
241 | ( (daemon->per_ip_connection_limit != 0) && | 243 | ((daemon->per_ip_connection_limit != 0) && |
242 | (daemon->per_ip_connection_limit <= have) ) ) | 244 | (daemon->per_ip_connection_limit <= have))) |
243 | { | 245 | { |
244 | /* above connection limit - reject */ | 246 | /* above connection limit - reject */ |
245 | #if HAVE_MESSAGES | 247 | #if HAVE_MESSAGES |
@@ -635,7 +637,7 @@ MHD_start_daemon (unsigned int options, | |||
635 | retVal = malloc (sizeof (struct MHD_Daemon)); | 637 | retVal = malloc (sizeof (struct MHD_Daemon)); |
636 | if (retVal == NULL) | 638 | if (retVal == NULL) |
637 | { | 639 | { |
638 | CLOSE(socket_fd); | 640 | CLOSE (socket_fd); |
639 | return NULL; | 641 | return NULL; |
640 | } | 642 | } |
641 | memset (retVal, 0, sizeof (struct MHD_Daemon)); | 643 | memset (retVal, 0, sizeof (struct MHD_Daemon)); |
@@ -668,10 +670,9 @@ MHD_start_daemon (unsigned int options, | |||
668 | va_arg (ap, MHD_RequestCompletedCallback); | 670 | va_arg (ap, MHD_RequestCompletedCallback); |
669 | retVal->notify_completed_cls = va_arg (ap, void *); | 671 | retVal->notify_completed_cls = va_arg (ap, void *); |
670 | break; | 672 | break; |
671 | case MHD_OPTION_PER_IP_CONNECTION_LIMIT: | 673 | case MHD_OPTION_PER_IP_CONNECTION_LIMIT: |
672 | retVal->per_ip_connection_limit | 674 | retVal->per_ip_connection_limit = va_arg (ap, unsigned int); |
673 | = va_arg (ap, unsigned int); | 675 | break; |
674 | break; | ||
675 | default: | 676 | default: |
676 | #if HAVE_MESSAGES | 677 | #if HAVE_MESSAGES |
677 | fprintf (stderr, | 678 | fprintf (stderr, |