aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/daemon.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-07-29 19:23:35 +0200
committerChristian Grothoff <christian@grothoff.org>2019-07-29 19:30:27 +0200
commit40bf201dc53465be1d2805039ef5963a21e44c08 (patch)
treec3cb5639c71dc8d30739c3770d8c7646259a0bc5 /src/microhttpd/daemon.c
parent1aaff72582b6093f0dcf8c187d125e5fca2d2e8b (diff)
downloadlibmicrohttpd-40bf201dc53465be1d2805039ef5963a21e44c08.tar.gz
libmicrohttpd-40bf201dc53465be1d2805039ef5963a21e44c08.zip
indentation fixes, adding test_upgrade_large.c test for issue reported by Viet
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r--src/microhttpd/daemon.c167
1 files changed, 84 insertions, 83 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index b312c305..3fc992de 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -4178,28 +4178,29 @@ run_epoll_for_upgrade (struct MHD_Daemon *daemon)
4178 struct MHD_UpgradeResponseHandle * prev; 4178 struct MHD_UpgradeResponseHandle * prev;
4179 4179
4180 num_events = MAX_EVENTS; 4180 num_events = MAX_EVENTS;
4181 while (MAX_EVENTS == num_events) 4181 while (0 != num_events)
4182 { 4182 {
4183 unsigned int i; 4183 unsigned int i;
4184 /* update event masks */ 4184 /* update event masks */
4185 num_events = epoll_wait (daemon->epoll_upgrade_fd, 4185 num_events = epoll_wait (daemon->epoll_upgrade_fd,
4186 events, 4186 events,
4187 MAX_EVENTS, 4187 MAX_EVENTS,
4188 0); 4188 0);
4189 if (-1 == num_events) 4189 if (-1 == num_events)
4190 { 4190 {
4191 const int err = MHD_socket_get_error_ (); 4191 const int err = MHD_socket_get_error_ ();
4192
4192 if (MHD_SCKT_ERR_IS_EINTR_ (err)) 4193 if (MHD_SCKT_ERR_IS_EINTR_ (err))
4193 return MHD_YES; 4194 return MHD_YES;
4194#ifdef HAVE_MESSAGES 4195#ifdef HAVE_MESSAGES
4195 MHD_DLOG (daemon, 4196 MHD_DLOG (daemon,
4196 _("Call to epoll_wait failed: %s\n"), 4197 _("Call to epoll_wait failed: %s\n"),
4197 MHD_socket_strerr_ (err)); 4198 MHD_socket_strerr_ (err));
4198#endif 4199#endif
4199 return MHD_NO; 4200 return MHD_NO;
4200 } 4201 }
4201 for (i = 0; i < (unsigned int) num_events; i++) 4202 for (i = 0; i < (unsigned int) num_events; i++)
4202 { 4203 {
4203 struct UpgradeEpollHandle * const ueh = events[i].data.ptr; 4204 struct UpgradeEpollHandle * const ueh = events[i].data.ptr;
4204 struct MHD_UpgradeResponseHandle * const urh = ueh->urh; 4205 struct MHD_UpgradeResponseHandle * const urh = ueh->urh;
4205 bool new_err_state = false; 4206 bool new_err_state = false;
@@ -4217,24 +4218,24 @@ run_epoll_for_upgrade (struct MHD_Daemon *daemon)
4217 4218
4218 if ( (0 == (ueh->celi & MHD_EPOLL_STATE_ERROR)) && 4219 if ( (0 == (ueh->celi & MHD_EPOLL_STATE_ERROR)) &&
4219 (0 != (events[i].events & (EPOLLERR | EPOLLPRI))) ) 4220 (0 != (events[i].events & (EPOLLERR | EPOLLPRI))) )
4220 { 4221 {
4221 /* Process new error state only one time 4222 /* Process new error state only one time
4222 * and avoid continuously marking this connection 4223 * and avoid continuously marking this connection
4223 * as 'ready'. */ 4224 * as 'ready'. */
4224 ueh->celi |= MHD_EPOLL_STATE_ERROR; 4225 ueh->celi |= MHD_EPOLL_STATE_ERROR;
4225 new_err_state = true; 4226 new_err_state = true;
4226 } 4227 }
4227 4228
4228 if (! urh->in_eready_list) 4229 if (! urh->in_eready_list)
4229 { 4230 {
4230 if (new_err_state || 4231 if (new_err_state ||
4231 is_urh_ready(urh)) 4232 is_urh_ready(urh))
4232 { 4233 {
4233 EDLL_insert (daemon->eready_urh_head, 4234 EDLL_insert (daemon->eready_urh_head,
4234 daemon->eready_urh_tail, 4235 daemon->eready_urh_tail,
4235 urh); 4236 urh);
4236 urh->in_eready_list = true; 4237 urh->in_eready_list = true;
4237 } 4238 }
4238 } 4239 }
4239 } 4240 }
4240 } 4241 }
@@ -4246,8 +4247,8 @@ run_epoll_for_upgrade (struct MHD_Daemon *daemon)
4246 if (! is_urh_ready(pos)) 4247 if (! is_urh_ready(pos))
4247 { 4248 {
4248 EDLL_remove (daemon->eready_urh_head, 4249 EDLL_remove (daemon->eready_urh_head,
4249 daemon->eready_urh_tail, 4250 daemon->eready_urh_tail,
4250 pos); 4251 pos);
4251 pos->in_eready_list = false; 4252 pos->in_eready_list = false;
4252 } 4253 }
4253 /* Finished forwarding? */ 4254 /* Finished forwarding? */
@@ -4287,7 +4288,7 @@ static const char * const epoll_itc_marker = "itc_marker";
4287 */ 4288 */
4288static int 4289static int
4289MHD_epoll (struct MHD_Daemon *daemon, 4290MHD_epoll (struct MHD_Daemon *daemon,
4290 int may_block) 4291 int may_block)
4291{ 4292{
4292#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 4293#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
4293 static const char * const upgrade_marker = "upgrade_ptr"; 4294 static const char * const upgrade_marker = "upgrade_ptr";
@@ -4302,7 +4303,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
4302 unsigned int i; 4303 unsigned int i;
4303 MHD_socket ls; 4304 MHD_socket ls;
4304#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 4305#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
4305 int run_upgraded = MHD_NO; 4306 bool run_upgraded = false;
4306#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ 4307#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
4307 4308
4308 if (-1 == daemon->epoll_fd) 4309 if (-1 == daemon->epoll_fd)
@@ -4318,31 +4319,31 @@ MHD_epoll (struct MHD_Daemon *daemon,
4318 event.events = EPOLLIN; 4319 event.events = EPOLLIN;
4319 event.data.ptr = daemon; 4320 event.data.ptr = daemon;
4320 if (0 != epoll_ctl (daemon->epoll_fd, 4321 if (0 != epoll_ctl (daemon->epoll_fd,
4321 EPOLL_CTL_ADD, 4322 EPOLL_CTL_ADD,
4322 ls, 4323 ls,
4323 &event)) 4324 &event))
4324 { 4325 {
4325#ifdef HAVE_MESSAGES 4326#ifdef HAVE_MESSAGES
4326 MHD_DLOG (daemon, 4327 MHD_DLOG (daemon,
4327 _("Call to epoll_ctl failed: %s\n"), 4328 _("Call to epoll_ctl failed: %s\n"),
4328 MHD_socket_last_strerr_ ()); 4329 MHD_socket_last_strerr_ ());
4329#endif 4330#endif
4330 return MHD_NO; 4331 return MHD_NO;
4331 } 4332 }
4332 daemon->listen_socket_in_epoll = true; 4333 daemon->listen_socket_in_epoll = true;
4333 } 4334 }
4334 if ( (daemon->was_quiesced) && 4335 if ( (daemon->was_quiesced) &&
4335 (daemon->listen_socket_in_epoll) ) 4336 (daemon->listen_socket_in_epoll) )
4336 { 4337 {
4337 if ( (0 != epoll_ctl (daemon->epoll_fd, 4338 if ( (0 != epoll_ctl (daemon->epoll_fd,
4338 EPOLL_CTL_DEL, 4339 EPOLL_CTL_DEL,
4339 ls, 4340 ls,
4340 NULL)) && 4341 NULL)) &&
4341 (ENOENT != errno) ) /* ENOENT can happen due to race with 4342 (ENOENT != errno) ) /* ENOENT can happen due to race with
4342 #MHD_quiesce_daemon() */ 4343 #MHD_quiesce_daemon() */
4343 MHD_PANIC ("Failed to remove listen FD from epoll set\n"); 4344 MHD_PANIC ("Failed to remove listen FD from epoll set\n");
4344 daemon->listen_socket_in_epoll = false; 4345 daemon->listen_socket_in_epoll = false;
4345 } 4346 }
4346 4347
4347#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 4348#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
4348 if ( (! daemon->upgrade_fd_in_epoll) && 4349 if ( (! daemon->upgrade_fd_in_epoll) &&
@@ -4351,17 +4352,17 @@ MHD_epoll (struct MHD_Daemon *daemon,
4351 event.events = EPOLLIN | EPOLLOUT; 4352 event.events = EPOLLIN | EPOLLOUT;
4352 event.data.ptr = (void *) upgrade_marker; 4353 event.data.ptr = (void *) upgrade_marker;
4353 if (0 != epoll_ctl (daemon->epoll_fd, 4354 if (0 != epoll_ctl (daemon->epoll_fd,
4354 EPOLL_CTL_ADD, 4355 EPOLL_CTL_ADD,
4355 daemon->epoll_upgrade_fd, 4356 daemon->epoll_upgrade_fd,
4356 &event)) 4357 &event))
4357 { 4358 {
4358#ifdef HAVE_MESSAGES 4359#ifdef HAVE_MESSAGES
4359 MHD_DLOG (daemon, 4360 MHD_DLOG (daemon,
4360 _("Call to epoll_ctl failed: %s\n"), 4361 _("Call to epoll_ctl failed: %s\n"),
4361 MHD_socket_last_strerr_ ()); 4362 MHD_socket_last_strerr_ ());
4362#endif 4363#endif
4363 return MHD_NO; 4364 return MHD_NO;
4364 } 4365 }
4365 daemon->upgrade_fd_in_epoll = true; 4366 daemon->upgrade_fd_in_epoll = true;
4366 } 4367 }
4367#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ 4368#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
@@ -4373,10 +4374,10 @@ MHD_epoll (struct MHD_Daemon *daemon,
4373 /* we're at the connection limit, disable listen socket 4374 /* we're at the connection limit, disable listen socket
4374 for event loop for now */ 4375 for event loop for now */
4375 if (0 != epoll_ctl (daemon->epoll_fd, 4376 if (0 != epoll_ctl (daemon->epoll_fd,
4376 EPOLL_CTL_DEL, 4377 EPOLL_CTL_DEL,
4377 ls, 4378 ls,
4378 NULL)) 4379 NULL))
4379 MHD_PANIC (_("Failed to remove listen FD from epoll set\n")); 4380 MHD_PANIC (_("Failed to remove listen FD from epoll set\n"));
4380 daemon->listen_socket_in_epoll = false; 4381 daemon->listen_socket_in_epoll = false;
4381 } 4382 }
4382 4383
@@ -4388,14 +4389,14 @@ MHD_epoll (struct MHD_Daemon *daemon,
4388 { 4389 {
4389 if (MHD_YES == MHD_get_timeout (daemon, 4390 if (MHD_YES == MHD_get_timeout (daemon,
4390 &timeout_ll)) 4391 &timeout_ll))
4391 { 4392 {
4392 if (timeout_ll >= (MHD_UNSIGNED_LONG_LONG) INT_MAX) 4393 if (timeout_ll >= (MHD_UNSIGNED_LONG_LONG) INT_MAX)
4393 timeout_ms = INT_MAX; 4394 timeout_ms = INT_MAX;
4394 else 4395 else
4395 timeout_ms = (int) timeout_ll; 4396 timeout_ms = (int) timeout_ll;
4396 } 4397 }
4397 else 4398 else
4398 timeout_ms = -1; 4399 timeout_ms = -1;
4399 } 4400 }
4400 else 4401 else
4401 timeout_ms = 0; 4402 timeout_ms = 0;
@@ -4414,33 +4415,33 @@ MHD_epoll (struct MHD_Daemon *daemon,
4414 { 4415 {
4415 /* update event masks */ 4416 /* update event masks */
4416 num_events = epoll_wait (daemon->epoll_fd, 4417 num_events = epoll_wait (daemon->epoll_fd,
4417 events, 4418 events,
4418 MAX_EVENTS, 4419 MAX_EVENTS,
4419 timeout_ms); 4420 timeout_ms);
4420 if (-1 == num_events) 4421 if (-1 == num_events)
4421 { 4422 {
4422 const int err = MHD_socket_get_error_ (); 4423 const int err = MHD_socket_get_error_ ();
4423 if (MHD_SCKT_ERR_IS_EINTR_ (err)) 4424 if (MHD_SCKT_ERR_IS_EINTR_ (err))
4424 return MHD_YES; 4425 return MHD_YES;
4425#ifdef HAVE_MESSAGES 4426#ifdef HAVE_MESSAGES
4426 MHD_DLOG (daemon, 4427 MHD_DLOG (daemon,
4427 _("Call to epoll_wait failed: %s\n"), 4428 _("Call to epoll_wait failed: %s\n"),
4428 MHD_socket_strerr_ (err)); 4429 MHD_socket_strerr_ (err));
4429#endif 4430#endif
4430 return MHD_NO; 4431 return MHD_NO;
4431 } 4432 }
4432 for (i=0;i<(unsigned int) num_events;i++) 4433 for (i=0;i<(unsigned int) num_events;i++)
4433 { 4434 {
4434 /* First, check for the values of `ptr` that would indicate 4435 /* First, check for the values of `ptr` that would indicate
4435 that this event is not about a normal connection. */ 4436 that this event is not about a normal connection. */
4436 if (NULL == events[i].data.ptr) 4437 if (NULL == events[i].data.ptr)
4437 continue; /* shutdown signal! */ 4438 continue; /* shutdown signal! */
4438#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 4439#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
4439 if (upgrade_marker == events[i].data.ptr) 4440 if (upgrade_marker == events[i].data.ptr)
4440 { 4441 {
4441 /* activity on an upgraded connection, we process 4442 /* activity on an upgraded connection, we process
4442 those in a separate epoll() */ 4443 those in a separate epoll() */
4443 run_upgraded = MHD_YES; 4444 run_upgraded = true;
4444 continue; 4445 continue;
4445 } 4446 }
4446#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ 4447#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
@@ -4451,8 +4452,8 @@ MHD_epoll (struct MHD_Daemon *daemon,
4451 MHD_itc_clear_ (daemon->itc); 4452 MHD_itc_clear_ (daemon->itc);
4452 continue; 4453 continue;
4453 } 4454 }
4454 if (daemon == events[i].data.ptr) 4455 if (daemon == events[i].data.ptr)
4455 { 4456 {
4456 /* Check for error conditions on listen socket. */ 4457 /* Check for error conditions on listen socket. */
4457 /* FIXME: Initiate MHD_quiesce_daemon() to prevent busy waiting? */ 4458 /* FIXME: Initiate MHD_quiesce_daemon() to prevent busy waiting? */
4458 if (0 == (events[i].events & (EPOLLERR | EPOLLHUP))) 4459 if (0 == (events[i].events & (EPOLLERR | EPOLLHUP)))
@@ -4467,9 +4468,9 @@ MHD_epoll (struct MHD_Daemon *daemon,
4467 (daemon->connections < daemon->connection_limit) && 4468 (daemon->connections < daemon->connection_limit) &&
4468 (! daemon->at_limit) ) 4469 (! daemon->at_limit) )
4469 series_length++; 4470 series_length++;
4470 } 4471 }
4471 continue; 4472 continue;
4472 } 4473 }
4473 /* this is an event relating to a 'normal' connection, 4474 /* this is an event relating to a 'normal' connection,
4474 remember the event and if appropriate mark the 4475 remember the event and if appropriate mark the
4475 connection as 'eready'. */ 4476 connection as 'eready'. */
@@ -4518,7 +4519,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
4518 } 4519 }
4519 4520
4520#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 4521#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
4521 if (MHD_YES == run_upgraded) 4522 if (run_upgraded)
4522 run_epoll_for_upgrade (daemon); 4523 run_epoll_for_upgrade (daemon);
4523#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ 4524#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
4524 4525
@@ -4606,22 +4607,22 @@ MHD_run (struct MHD_Daemon *daemon)
4606 (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) ) 4607 (0 != (daemon->options & MHD_USE_INTERNAL_POLLING_THREAD)) )
4607 return MHD_NO; 4608 return MHD_NO;
4608 if (0 != (daemon->options & MHD_USE_POLL)) 4609 if (0 != (daemon->options & MHD_USE_POLL))
4609 { 4610 {
4610 MHD_poll (daemon, MHD_NO); 4611 MHD_poll (daemon, MHD_NO);
4611 MHD_cleanup_connections (daemon); 4612 MHD_cleanup_connections (daemon);
4612 } 4613 }
4613#ifdef EPOLL_SUPPORT 4614#ifdef EPOLL_SUPPORT
4614 else if (0 != (daemon->options & MHD_USE_EPOLL)) 4615 else if (0 != (daemon->options & MHD_USE_EPOLL))
4615 { 4616 {
4616 MHD_epoll (daemon, MHD_NO); 4617 MHD_epoll (daemon, MHD_NO);
4617 MHD_cleanup_connections (daemon); 4618 MHD_cleanup_connections (daemon);
4618 } 4619 }
4619#endif 4620#endif
4620 else 4621 else
4621 { 4622 {
4622 MHD_select (daemon, MHD_NO); 4623 MHD_select (daemon, MHD_NO);
4623 /* MHD_select does MHD_cleanup_connections already */ 4624 /* MHD_select does MHD_cleanup_connections already */
4624 } 4625 }
4625 return MHD_YES; 4626 return MHD_YES;
4626} 4627}
4627 4628
@@ -6494,10 +6495,10 @@ thread_failed:
6494 if (daemon->upgrade_fd_in_epoll) 6495 if (daemon->upgrade_fd_in_epoll)
6495 { 6496 {
6496 if (0 != epoll_ctl (daemon->epoll_fd, 6497 if (0 != epoll_ctl (daemon->epoll_fd,
6497 EPOLL_CTL_DEL, 6498 EPOLL_CTL_DEL,
6498 daemon->epoll_upgrade_fd, 6499 daemon->epoll_upgrade_fd,
6499 NULL)) 6500 NULL))
6500 MHD_PANIC (_("Failed to remove FD from epoll set\n")); 6501 MHD_PANIC (_("Failed to remove FD from epoll set\n"));
6501 daemon->upgrade_fd_in_epoll = false; 6502 daemon->upgrade_fd_in_epoll = false;
6502 } 6503 }
6503#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */ 6504#endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */