aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r--src/microhttpd/daemon.c110
1 files changed, 55 insertions, 55 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index 08315c45..d5a1fc43 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -824,17 +824,11 @@ MHD_get_fdset2 (struct MHD_Daemon *daemon,
824 max_fd, 824 max_fd,
825 fd_setsize)) 825 fd_setsize))
826 result = MHD_NO; 826 result = MHD_NO;
827 if ( (pos->read_buffer_size > pos->read_buffer_offset) &&
828 ! MHD_add_to_fd_set_ (pos->socket_fd,
829 read_fd_set,
830 max_fd,
831 fd_setsize))
832 result = MHD_NO;
833 break; 827 break;
834 case MHD_EVENT_LOOP_INFO_BLOCK: 828 case MHD_EVENT_LOOP_INFO_BLOCK:
835 if ( (pos->read_buffer_size > pos->read_buffer_offset) && 829 if ( (NULL == except_fd_set) ||
836 ! MHD_add_to_fd_set_ (pos->socket_fd, 830 ! MHD_add_to_fd_set_ (pos->socket_fd,
837 read_fd_set, 831 except_fd_set,
838 max_fd, 832 max_fd,
839 fd_setsize)) 833 fd_setsize))
840 result = MHD_NO; 834 result = MHD_NO;
@@ -1431,6 +1425,7 @@ thread_main_handle_connection (void *data)
1431 int num_ready; 1425 int num_ready;
1432 fd_set rs; 1426 fd_set rs;
1433 fd_set ws; 1427 fd_set ws;
1428 fd_set es;
1434 MHD_socket maxsock; 1429 MHD_socket maxsock;
1435 struct timeval tv; 1430 struct timeval tv;
1436 struct timeval *tvp; 1431 struct timeval *tvp;
@@ -1568,10 +1563,11 @@ thread_main_handle_connection (void *data)
1568 if (0 == (daemon->options & MHD_USE_POLL)) 1563 if (0 == (daemon->options & MHD_USE_POLL))
1569 { 1564 {
1570 /* use select */ 1565 /* use select */
1571 int err_state = 0; 1566 bool err_state = false;
1572 1567
1573 FD_ZERO (&rs); 1568 FD_ZERO (&rs);
1574 FD_ZERO (&ws); 1569 FD_ZERO (&ws);
1570 FD_ZERO (&es);
1575 maxsock = MHD_INVALID_SOCKET; 1571 maxsock = MHD_INVALID_SOCKET;
1576 switch (con->event_loop_info) 1572 switch (con->event_loop_info)
1577 { 1573 {
@@ -1580,28 +1576,21 @@ thread_main_handle_connection (void *data)
1580 &rs, 1576 &rs,
1581 &maxsock, 1577 &maxsock,
1582 FD_SETSIZE)) 1578 FD_SETSIZE))
1583 err_state = 1; 1579 err_state = true;
1584 break; 1580 break;
1585 case MHD_EVENT_LOOP_INFO_WRITE: 1581 case MHD_EVENT_LOOP_INFO_WRITE:
1586 if (! MHD_add_to_fd_set_ (con->socket_fd, 1582 if (! MHD_add_to_fd_set_ (con->socket_fd,
1587 &ws, 1583 &ws,
1588 &maxsock, 1584 &maxsock,
1589 FD_SETSIZE)) 1585 FD_SETSIZE))
1590 err_state = 1; 1586 err_state = true;
1591 if ( (con->read_buffer_size > con->read_buffer_offset) &&
1592 (! MHD_add_to_fd_set_ (con->socket_fd,
1593 &rs,
1594 &maxsock,
1595 FD_SETSIZE)) )
1596 err_state = 1;
1597 break; 1587 break;
1598 case MHD_EVENT_LOOP_INFO_BLOCK: 1588 case MHD_EVENT_LOOP_INFO_BLOCK:
1599 if ( (con->read_buffer_size > con->read_buffer_offset) && 1589 if (! MHD_add_to_fd_set_ (con->socket_fd,
1600 (! MHD_add_to_fd_set_ (con->socket_fd, 1590 &es,
1601 &rs, 1591 &maxsock,
1602 &maxsock, 1592 FD_SETSIZE))
1603 FD_SETSIZE)) ) 1593 err_state = true;
1604 err_state = 1;
1605 tv.tv_sec = 0; 1594 tv.tv_sec = 0;
1606 tv.tv_usec = 0; 1595 tv.tv_usec = 0;
1607 tvp = &tv; 1596 tvp = &tv;
@@ -1620,7 +1609,7 @@ thread_main_handle_connection (void *data)
1620 err_state = 1; 1609 err_state = 1;
1621 } 1610 }
1622#endif 1611#endif
1623 if (0 != err_state) 1612 if (err_state)
1624 { 1613 {
1625#ifdef HAVE_MESSAGES 1614#ifdef HAVE_MESSAGES
1626 MHD_DLOG (con->daemon, 1615 MHD_DLOG (con->daemon,
@@ -1662,7 +1651,8 @@ thread_main_handle_connection (void *data)
1662 &rs), 1651 &rs),
1663 FD_ISSET (con->socket_fd, 1652 FD_ISSET (con->socket_fd,
1664 &ws), 1653 &ws),
1665 false)) 1654 FD_ISSET (con->socket_fd,
1655 &es)) )
1666 goto exit; 1656 goto exit;
1667 } 1657 }
1668#ifdef HAVE_POLL 1658#ifdef HAVE_POLL
@@ -1676,16 +1666,13 @@ thread_main_handle_connection (void *data)
1676 switch (con->event_loop_info) 1666 switch (con->event_loop_info)
1677 { 1667 {
1678 case MHD_EVENT_LOOP_INFO_READ: 1668 case MHD_EVENT_LOOP_INFO_READ:
1679 p[0].events |= POLLIN; 1669 p[0].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC;
1680 break; 1670 break;
1681 case MHD_EVENT_LOOP_INFO_WRITE: 1671 case MHD_EVENT_LOOP_INFO_WRITE:
1682 p[0].events |= POLLOUT; 1672 p[0].events |= POLLOUT | MHD_POLL_EVENTS_ERR_DISC;
1683 if (con->read_buffer_size > con->read_buffer_offset)
1684 p[0].events |= POLLIN;
1685 break; 1673 break;
1686 case MHD_EVENT_LOOP_INFO_BLOCK: 1674 case MHD_EVENT_LOOP_INFO_BLOCK:
1687 if (con->read_buffer_size > con->read_buffer_offset) 1675 p[0].events |= MHD_POLL_EVENTS_ERR_DISC;
1688 p[0].events |= POLLIN;
1689 tv.tv_sec = 0; 1676 tv.tv_sec = 0;
1690 tv.tv_usec = 0; 1677 tv.tv_usec = 0;
1691 tvp = &tv; 1678 tvp = &tv;
@@ -1732,7 +1719,7 @@ thread_main_handle_connection (void *data)
1732 call_handlers (con, 1719 call_handlers (con,
1733 0 != (p[0].revents & POLLIN), 1720 0 != (p[0].revents & POLLIN),
1734 0 != (p[0].revents & POLLOUT), 1721 0 != (p[0].revents & POLLOUT),
1735 0 != (p[0].revents & (POLLERR | POLLHUP)))) 1722 0 != (p[0].revents & (POLLERR | MHD_POLL_REVENTS_ERR_DISC))))
1736 goto exit; 1723 goto exit;
1737 } 1724 }
1738#endif 1725#endif
@@ -2288,7 +2275,7 @@ internal_add_connection (struct MHD_Daemon *daemon,
2288 { 2275 {
2289 struct epoll_event event; 2276 struct epoll_event event;
2290 2277
2291 event.events = EPOLLIN | EPOLLOUT | EPOLLET; 2278 event.events = EPOLLIN | EPOLLOUT | EPOLLPRI | EPOLLET;
2292 event.data.ptr = connection; 2279 event.data.ptr = connection;
2293 if (0 != epoll_ctl (daemon->epoll_fd, 2280 if (0 != epoll_ctl (daemon->epoll_fd,
2294 EPOLL_CTL_ADD, 2281 EPOLL_CTL_ADD,
@@ -3061,7 +3048,8 @@ MHD_run_from_select (struct MHD_Daemon *daemon,
3061 read_fd_set), 3048 read_fd_set),
3062 FD_ISSET (ds, 3049 FD_ISSET (ds,
3063 write_fd_set), 3050 write_fd_set),
3064 false); 3051 FD_ISSET (ds,
3052 except_fd_set));
3065 } 3053 }
3066 } 3054 }
3067 3055
@@ -3351,16 +3339,14 @@ MHD_poll_all (struct MHD_Daemon *daemon,
3351 switch (pos->event_loop_info) 3339 switch (pos->event_loop_info)
3352 { 3340 {
3353 case MHD_EVENT_LOOP_INFO_READ: 3341 case MHD_EVENT_LOOP_INFO_READ:
3354 p[poll_server+i].events |= POLLIN; 3342 p[poll_server+i].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC;
3355 break; 3343 break;
3356 case MHD_EVENT_LOOP_INFO_WRITE: 3344 case MHD_EVENT_LOOP_INFO_WRITE:
3357 p[poll_server+i].events |= POLLOUT; 3345 p[poll_server+i].events |= POLLOUT | MHD_POLL_EVENTS_ERR_DISC;
3358 if (pos->read_buffer_size > pos->read_buffer_offset)
3359 p[poll_server+i].events |= POLLIN;
3360 break; 3346 break;
3361 case MHD_EVENT_LOOP_INFO_BLOCK: 3347 case MHD_EVENT_LOOP_INFO_BLOCK:
3362 if (pos->read_buffer_size > pos->read_buffer_offset) 3348 p[poll_server+i].events |= MHD_POLL_EVENTS_ERR_DISC;
3363 p[poll_server+i].events |= POLLIN; 3349 timeout = 0;
3364 break; 3350 break;
3365 case MHD_EVENT_LOOP_INFO_CLEANUP: 3351 case MHD_EVENT_LOOP_INFO_CLEANUP:
3366 timeout = 0; /* clean up "pos" immediately */ 3352 timeout = 0; /* clean up "pos" immediately */
@@ -3442,7 +3428,7 @@ MHD_poll_all (struct MHD_Daemon *daemon,
3442 call_handlers (pos, 3428 call_handlers (pos,
3443 0 != (p[poll_server+i].revents & POLLIN), 3429 0 != (p[poll_server+i].revents & POLLIN),
3444 0 != (p[poll_server+i].revents & POLLOUT), 3430 0 != (p[poll_server+i].revents & POLLOUT),
3445 false); 3431 0 != (p[poll_server+i].revents & MHD_POLL_REVENTS_ERR_DISC));
3446 i++; 3432 i++;
3447 } 3433 }
3448#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT) 3434#if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
@@ -3890,12 +3876,10 @@ MHD_epoll (struct MHD_Daemon *daemon,
3890 connection as 'eready'. */ 3876 connection as 'eready'. */
3891 pos = events[i].data.ptr; 3877 pos = events[i].data.ptr;
3892 /* normal processing: update read/write data */ 3878 /* normal processing: update read/write data */
3893 if (0 != (events[i].events & EPOLLIN)) 3879 if (0 != (events[i].events & (EPOLLPRI | EPOLLERR | EPOLLHUP)))
3894 { 3880 {
3895 pos->epoll_state |= MHD_EPOLL_STATE_READ_READY; 3881 pos->epoll_state |= MHD_EPOLL_STATE_ERROR;
3896 if ( ( (MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info) || 3882 if (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL))
3897 (pos->read_buffer_size > pos->read_buffer_offset) ) &&
3898 (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
3899 { 3883 {
3900 EDLL_insert (daemon->eready_head, 3884 EDLL_insert (daemon->eready_head,
3901 daemon->eready_tail, 3885 daemon->eready_tail,
@@ -3903,16 +3887,32 @@ MHD_epoll (struct MHD_Daemon *daemon,
3903 pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL; 3887 pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
3904 } 3888 }
3905 } 3889 }
3906 if (0 != (events[i].events & EPOLLOUT)) 3890 else
3907 { 3891 {
3908 pos->epoll_state |= MHD_EPOLL_STATE_WRITE_READY; 3892 if (0 != (events[i].events & EPOLLIN))
3909 if ( (MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info) &&
3910 (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
3911 { 3893 {
3912 EDLL_insert (daemon->eready_head, 3894 pos->epoll_state |= MHD_EPOLL_STATE_READ_READY;
3913 daemon->eready_tail, 3895 if ( ( (MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info) ||
3914 pos); 3896 (pos->read_buffer_size > pos->read_buffer_offset) ) &&
3915 pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL; 3897 (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
3898 {
3899 EDLL_insert (daemon->eready_head,
3900 daemon->eready_tail,
3901 pos);
3902 pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
3903 }
3904 }
3905 if (0 != (events[i].events & EPOLLOUT))
3906 {
3907 pos->epoll_state |= MHD_EPOLL_STATE_WRITE_READY;
3908 if ( (MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info) &&
3909 (0 == (pos->epoll_state & MHD_EPOLL_STATE_IN_EREADY_EDLL) ) )
3910 {
3911 EDLL_insert (daemon->eready_head,
3912 daemon->eready_tail,
3913 pos);
3914 pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL;
3915 }
3916 } 3916 }
3917 } 3917 }
3918 } 3918 }
@@ -3938,7 +3938,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
3938 call_handlers (pos, 3938 call_handlers (pos,
3939 MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info, 3939 MHD_EVENT_LOOP_INFO_READ == pos->event_loop_info,
3940 MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info, 3940 MHD_EVENT_LOOP_INFO_WRITE == pos->event_loop_info,
3941 false); 3941 0 != (pos->epoll_state & MHD_EPOLL_STATE_ERROR));
3942 if (MHD_EPOLL_STATE_IN_EREADY_EDLL == 3942 if (MHD_EPOLL_STATE_IN_EREADY_EDLL ==
3943 (pos->epoll_state & (MHD_EPOLL_STATE_SUSPENDED | MHD_EPOLL_STATE_IN_EREADY_EDLL))) 3943 (pos->epoll_state & (MHD_EPOLL_STATE_SUSPENDED | MHD_EPOLL_STATE_IN_EREADY_EDLL)))
3944 { 3944 {