diff options
Diffstat (limited to 'src/microhttpd/daemon.c')
-rw-r--r-- | src/microhttpd/daemon.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c index 69203be7..3eed6619 100644 --- a/src/microhttpd/daemon.c +++ b/src/microhttpd/daemon.c | |||
@@ -841,8 +841,10 @@ urh_from_fdset (struct MHD_UpgradeResponseHandle *urh, | |||
841 | const MHD_socket mhd_sckt = urh->mhd.socket; | 841 | const MHD_socket mhd_sckt = urh->mhd.socket; |
842 | 842 | ||
843 | /* Reset read/write ready, preserve error state. */ | 843 | /* Reset read/write ready, preserve error state. */ |
844 | urh->app.celi &= (~MHD_EPOLL_STATE_READ_READY & ~MHD_EPOLL_STATE_WRITE_READY); | 844 | urh->app.celi &= (~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY) |
845 | urh->mhd.celi &= (~MHD_EPOLL_STATE_READ_READY & ~MHD_EPOLL_STATE_WRITE_READY); | 845 | & ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY)); |
846 | urh->mhd.celi &= (~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY) | ||
847 | & ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY)); | ||
846 | 848 | ||
847 | if (MHD_INVALID_SOCKET != conn_sckt) | 849 | if (MHD_INVALID_SOCKET != conn_sckt) |
848 | { | 850 | { |
@@ -937,8 +939,10 @@ urh_from_pollfd (struct MHD_UpgradeResponseHandle *urh, | |||
937 | struct pollfd p[2]) | 939 | struct pollfd p[2]) |
938 | { | 940 | { |
939 | /* Reset read/write ready, preserve error state. */ | 941 | /* Reset read/write ready, preserve error state. */ |
940 | urh->app.celi &= (~MHD_EPOLL_STATE_READ_READY & ~MHD_EPOLL_STATE_WRITE_READY); | 942 | urh->app.celi &= (~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY) |
941 | urh->mhd.celi &= (~MHD_EPOLL_STATE_READ_READY & ~MHD_EPOLL_STATE_WRITE_READY); | 943 | & ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY)); |
944 | urh->mhd.celi &= (~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY) | ||
945 | & ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY)); | ||
942 | 946 | ||
943 | if (0 != (p[0].revents & POLLIN)) | 947 | if (0 != (p[0].revents & POLLIN)) |
944 | urh->app.celi |= MHD_EPOLL_STATE_READ_READY; | 948 | urh->app.celi |= MHD_EPOLL_STATE_READ_READY; |
@@ -1394,10 +1398,10 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1394 | /* Discard any data received form remote. */ | 1398 | /* Discard any data received form remote. */ |
1395 | urh->in_buffer_used = 0; | 1399 | urh->in_buffer_used = 0; |
1396 | /* Do not try to push data to application. */ | 1400 | /* Do not try to push data to application. */ |
1397 | urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1401 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1398 | /* Reading from remote client is not required anymore. */ | 1402 | /* Reading from remote client is not required anymore. */ |
1399 | urh->in_buffer_size = 0; | 1403 | urh->in_buffer_size = 0; |
1400 | urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1404 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1401 | connection->tls_read_ready = false; | 1405 | connection->tls_read_ready = false; |
1402 | } | 1406 | } |
1403 | 1407 | ||
@@ -1435,7 +1439,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1435 | { | 1439 | { |
1436 | if (GNUTLS_E_INTERRUPTED != res) | 1440 | if (GNUTLS_E_INTERRUPTED != res) |
1437 | { | 1441 | { |
1438 | urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1442 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1439 | if (GNUTLS_E_AGAIN != res) | 1443 | if (GNUTLS_E_AGAIN != res) |
1440 | { | 1444 | { |
1441 | /* Unrecoverable error on socket was detected or | 1445 | /* Unrecoverable error on socket was detected or |
@@ -1486,7 +1490,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1486 | ((! MHD_SCKT_ERR_IS_EINTR_ (err)) && | 1490 | ((! MHD_SCKT_ERR_IS_EINTR_ (err)) && |
1487 | (! MHD_SCKT_ERR_IS_LOW_RESOURCES_ (err)))) | 1491 | (! MHD_SCKT_ERR_IS_LOW_RESOURCES_ (err)))) |
1488 | { | 1492 | { |
1489 | urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1493 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1490 | if ((0 == res) || | 1494 | if ((0 == res) || |
1491 | (was_closed) || | 1495 | (was_closed) || |
1492 | (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) || | 1496 | (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) || |
@@ -1504,7 +1508,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1504 | { | 1508 | { |
1505 | urh->out_buffer_used += res; | 1509 | urh->out_buffer_used += res; |
1506 | if (buf_size > (size_t) res) | 1510 | if (buf_size > (size_t) res) |
1507 | urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1511 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1508 | } | 1512 | } |
1509 | if ( (0 == (MHD_EPOLL_STATE_READ_READY & urh->mhd.celi)) && | 1513 | if ( (0 == (MHD_EPOLL_STATE_READ_READY & urh->mhd.celi)) && |
1510 | ( (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) || | 1514 | ( (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) || |
@@ -1537,7 +1541,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1537 | { | 1541 | { |
1538 | if (GNUTLS_E_INTERRUPTED != res) | 1542 | if (GNUTLS_E_INTERRUPTED != res) |
1539 | { | 1543 | { |
1540 | urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1544 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1541 | if (GNUTLS_E_AGAIN != res) | 1545 | if (GNUTLS_E_AGAIN != res) |
1542 | { | 1546 | { |
1543 | /* TLS connection shut down or | 1547 | /* TLS connection shut down or |
@@ -1555,7 +1559,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1555 | urh->out_buffer_used = 0; | 1559 | urh->out_buffer_used = 0; |
1556 | /* Do not try to pull more data from application. */ | 1560 | /* Do not try to pull more data from application. */ |
1557 | urh->out_buffer_size = 0; | 1561 | urh->out_buffer_size = 0; |
1558 | urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1562 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1559 | } | 1563 | } |
1560 | } | 1564 | } |
1561 | } | 1565 | } |
@@ -1568,7 +1572,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1568 | &urh->out_buffer[res], | 1572 | &urh->out_buffer[res], |
1569 | next_out_buffer_used); | 1573 | next_out_buffer_used); |
1570 | if (data_size > (size_t) res) | 1574 | if (data_size > (size_t) res) |
1571 | urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1575 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1572 | } | 1576 | } |
1573 | urh->out_buffer_used = next_out_buffer_used; | 1577 | urh->out_buffer_used = next_out_buffer_used; |
1574 | } | 1578 | } |
@@ -1578,10 +1582,10 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1578 | /* Unrecoverable error on socket was detected and all | 1582 | /* Unrecoverable error on socket was detected and all |
1579 | * pending data was sent to remote. */ | 1583 | * pending data was sent to remote. */ |
1580 | /* Do not try to send to remote anymore. */ | 1584 | /* Do not try to send to remote anymore. */ |
1581 | urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1585 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1582 | /* Do not try to pull more data from application. */ | 1586 | /* Do not try to pull more data from application. */ |
1583 | urh->out_buffer_size = 0; | 1587 | urh->out_buffer_size = 0; |
1584 | urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1588 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1585 | } | 1589 | } |
1586 | } | 1590 | } |
1587 | 1591 | ||
@@ -1607,7 +1611,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1607 | if ( (! MHD_SCKT_ERR_IS_EINTR_ (err)) && | 1611 | if ( (! MHD_SCKT_ERR_IS_EINTR_ (err)) && |
1608 | (! MHD_SCKT_ERR_IS_LOW_RESOURCES_ (err)) ) | 1612 | (! MHD_SCKT_ERR_IS_LOW_RESOURCES_ (err)) ) |
1609 | { | 1613 | { |
1610 | urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1614 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1611 | if (! MHD_SCKT_ERR_IS_EAGAIN_ (err)) | 1615 | if (! MHD_SCKT_ERR_IS_EAGAIN_ (err)) |
1612 | { | 1616 | { |
1613 | /* Socketpair connection shut down or | 1617 | /* Socketpair connection shut down or |
@@ -1625,7 +1629,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1625 | urh->in_buffer_used = 0; | 1629 | urh->in_buffer_used = 0; |
1626 | /* Reading from remote client is not required anymore. */ | 1630 | /* Reading from remote client is not required anymore. */ |
1627 | urh->in_buffer_size = 0; | 1631 | urh->in_buffer_size = 0; |
1628 | urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1632 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1629 | connection->tls_read_ready = false; | 1633 | connection->tls_read_ready = false; |
1630 | } | 1634 | } |
1631 | } | 1635 | } |
@@ -1639,7 +1643,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1639 | &urh->in_buffer[res], | 1643 | &urh->in_buffer[res], |
1640 | next_in_buffer_used); | 1644 | next_in_buffer_used); |
1641 | if (data_size > (size_t) res) | 1645 | if (data_size > (size_t) res) |
1642 | urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1646 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1643 | } | 1647 | } |
1644 | urh->in_buffer_used = next_in_buffer_used; | 1648 | urh->in_buffer_used = next_in_buffer_used; |
1645 | } | 1649 | } |
@@ -1647,10 +1651,10 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1647 | (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) ) | 1651 | (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) ) |
1648 | { | 1652 | { |
1649 | /* Do not try to push data to application. */ | 1653 | /* Do not try to push data to application. */ |
1650 | urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1654 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1651 | /* Reading from remote client is not required anymore. */ | 1655 | /* Reading from remote client is not required anymore. */ |
1652 | urh->in_buffer_size = 0; | 1656 | urh->in_buffer_size = 0; |
1653 | urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1657 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1654 | connection->tls_read_ready = false; | 1658 | connection->tls_read_ready = false; |
1655 | } | 1659 | } |
1656 | } | 1660 | } |
@@ -1679,10 +1683,10 @@ process_urh (struct MHD_UpgradeResponseHandle *urh) | |||
1679 | /* Discard any data unsent to remote. */ | 1683 | /* Discard any data unsent to remote. */ |
1680 | urh->out_buffer_used = 0; | 1684 | urh->out_buffer_used = 0; |
1681 | /* Do not try to sent to remote anymore. */ | 1685 | /* Do not try to sent to remote anymore. */ |
1682 | urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY; | 1686 | urh->app.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_WRITE_READY); |
1683 | /* Do not try to pull more data from application. */ | 1687 | /* Do not try to pull more data from application. */ |
1684 | urh->out_buffer_size = 0; | 1688 | urh->out_buffer_size = 0; |
1685 | urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY; | 1689 | urh->mhd.celi &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_READ_READY); |
1686 | } | 1690 | } |
1687 | } | 1691 | } |
1688 | 1692 | ||
@@ -3099,7 +3103,8 @@ internal_suspend_connection_ (struct MHD_Connection *connection) | |||
3099 | EDLL_remove (daemon->eready_head, | 3103 | EDLL_remove (daemon->eready_head, |
3100 | daemon->eready_tail, | 3104 | daemon->eready_tail, |
3101 | connection); | 3105 | connection); |
3102 | connection->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL; | 3106 | connection->epoll_state &= |
3107 | ~((enum MHD_EpollState) MHD_EPOLL_STATE_IN_EREADY_EDLL); | ||
3103 | } | 3108 | } |
3104 | if (0 != (connection->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET)) | 3109 | if (0 != (connection->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET)) |
3105 | { | 3110 | { |
@@ -3108,7 +3113,8 @@ internal_suspend_connection_ (struct MHD_Connection *connection) | |||
3108 | connection->socket_fd, | 3113 | connection->socket_fd, |
3109 | NULL)) | 3114 | NULL)) |
3110 | MHD_PANIC (_ ("Failed to remove FD from epoll set.\n")); | 3115 | MHD_PANIC (_ ("Failed to remove FD from epoll set.\n")); |
3111 | connection->epoll_state &= ~MHD_EPOLL_STATE_IN_EPOLL_SET; | 3116 | connection->epoll_state &= |
3117 | ~((enum MHD_EpollState) MHD_EPOLL_STATE_IN_EPOLL_SET); | ||
3112 | } | 3118 | } |
3113 | connection->epoll_state |= MHD_EPOLL_STATE_SUSPENDED; | 3119 | connection->epoll_state |= MHD_EPOLL_STATE_SUSPENDED; |
3114 | } | 3120 | } |
@@ -3308,7 +3314,7 @@ resume_suspended_connections (struct MHD_Daemon *daemon) | |||
3308 | pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL \ | 3314 | pos->epoll_state |= MHD_EPOLL_STATE_IN_EREADY_EDLL \ |
3309 | | MHD_EPOLL_STATE_READ_READY | 3315 | | MHD_EPOLL_STATE_READ_READY |
3310 | | MHD_EPOLL_STATE_WRITE_READY; | 3316 | | MHD_EPOLL_STATE_WRITE_READY; |
3311 | pos->epoll_state &= ~MHD_EPOLL_STATE_SUSPENDED; | 3317 | pos->epoll_state &= ~((enum MHD_EpollState) MHD_EPOLL_STATE_SUSPENDED); |
3312 | } | 3318 | } |
3313 | #endif | 3319 | #endif |
3314 | } | 3320 | } |
@@ -3758,7 +3764,8 @@ MHD_cleanup_connections (struct MHD_Daemon *daemon) | |||
3758 | EDLL_remove (daemon->eready_head, | 3764 | EDLL_remove (daemon->eready_head, |
3759 | daemon->eready_tail, | 3765 | daemon->eready_tail, |
3760 | pos); | 3766 | pos); |
3761 | pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL; | 3767 | pos->epoll_state &= |
3768 | ~((enum MHD_EpollState) MHD_EPOLL_STATE_IN_EREADY_EDLL); | ||
3762 | } | 3769 | } |
3763 | if ( (-1 != daemon->epoll_fd) && | 3770 | if ( (-1 != daemon->epoll_fd) && |
3764 | (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET)) ) | 3771 | (0 != (pos->epoll_state & MHD_EPOLL_STATE_IN_EPOLL_SET)) ) |
@@ -3773,8 +3780,11 @@ MHD_cleanup_connections (struct MHD_Daemon *daemon) | |||
3773 | EPOLL_CTL_DEL, | 3780 | EPOLL_CTL_DEL, |
3774 | pos->socket_fd, | 3781 | pos->socket_fd, |
3775 | NULL)) | 3782 | NULL)) |
3776 | MHD_PANIC (_ ("Failed to remove FD from epoll set.\n")); | 3783 | MHD_PANIC (_ ( |
3777 | pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EPOLL_SET; | 3784 | "Failed to remove FD from epoll set.\n")); |
3785 | pos->epoll_state &= | ||
3786 | ~((enum MHD_EpollState) | ||
3787 | MHD_EPOLL_STATE_IN_EPOLL_SET); | ||
3778 | } | 3788 | } |
3779 | } | 3789 | } |
3780 | #endif | 3790 | #endif |
@@ -5125,7 +5135,8 @@ MHD_epoll (struct MHD_Daemon *daemon, | |||
5125 | EDLL_remove (daemon->eready_head, | 5135 | EDLL_remove (daemon->eready_head, |
5126 | daemon->eready_tail, | 5136 | daemon->eready_tail, |
5127 | pos); | 5137 | pos); |
5128 | pos->epoll_state &= ~MHD_EPOLL_STATE_IN_EREADY_EDLL; | 5138 | pos->epoll_state &= |
5139 | ~((enum MHD_EpollState) MHD_EPOLL_STATE_IN_EREADY_EDLL); | ||
5129 | } | 5140 | } |
5130 | } | 5141 | } |
5131 | } | 5142 | } |
@@ -6502,7 +6513,7 @@ MHD_start_daemon_va (unsigned int flags, | |||
6502 | *pflags |= MHD_USE_INTERNAL_POLLING_THREAD; | 6513 | *pflags |= MHD_USE_INTERNAL_POLLING_THREAD; |
6503 | } | 6514 | } |
6504 | if (0 == (*pflags & MHD_USE_INTERNAL_POLLING_THREAD)) | 6515 | if (0 == (*pflags & MHD_USE_INTERNAL_POLLING_THREAD)) |
6505 | *pflags = (*pflags & ((enum MHD_FLAG) ~MHD_USE_ITC)); /* useless if we are using 'external' select */ | 6516 | *pflags = (*pflags & ~((enum MHD_FLAG) MHD_USE_ITC)); /* useless if we are using 'external' select */ |
6506 | else | 6517 | else |
6507 | { | 6518 | { |
6508 | #ifdef HAVE_LISTEN_SHUTDOWN | 6519 | #ifdef HAVE_LISTEN_SHUTDOWN |