diff options
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r-- | src/microhttpd/daemon.c | 110 |
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 | { |