| From 524614455554163ec78b27b89ff52bbf7fe96958 Mon Sep 17 00:00:00 2001 |
| From: Glenn Strauss <gstrauss@gluelogic.com> |
| Date: Wed, 24 Apr 2024 03:07:37 -0400 |
| Subject: [PATCH] [core] special value for Linux POLLRDHUP on SPARC (fixes |
| #3251) |
| |
| x-ref: |
| "[1.4.76] buildroot compile error with bootlin-sparc{64-g,-uc}libc" |
| https://redmine.lighttpd.net/issues/3251 |
| |
| Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> |
| Upstream: https://redmine.lighttpd.net/projects/lighttpd/repository/14/revisions/524614455554163ec78b27b89ff52bbf7fe96958 |
| --- |
| src/fdevent.h | 2 ++ |
| src/fdevent_impl.c | 18 ++++++++++++++++++ |
| 2 files changed, 20 insertions(+) |
| |
| diff --git a/src/fdevent.h b/src/fdevent.h |
| index 1b0a062f..556a1445 100644 |
| --- a/src/fdevent.h |
| +++ b/src/fdevent.h |
| @@ -40,6 +40,8 @@ struct fdnode_st { |
| #if (defined(__sun) && defined(__SVR4)) /* Solaris */ \ |
| || defined(__FreeBSD__) |
| #define FDEVENT_RDHUP 0x4000 |
| +#elif (defined(__linux__) && (defined(__sparc__) || defined(__sparc))) |
| +#define FDEVENT_RDHUP 0x2800 /*(0x2000 EPOLLRDHUP | 0x0800 POLLRDHUP)*/ |
| #else |
| #define FDEVENT_RDHUP 0x2000 |
| #endif |
| diff --git a/src/fdevent_impl.c b/src/fdevent_impl.c |
| index 8bfc1cc6..c84c8df5 100644 |
| --- a/src/fdevent_impl.c |
| +++ b/src/fdevent_impl.c |
| @@ -338,6 +338,11 @@ fdevent_linux_sysepoll_event_set (fdevents *ev, fdnode *fdn, int events) |
| struct epoll_event ep; |
| #ifndef EPOLLRDHUP |
| events &= ~FDEVENT_RDHUP; |
| + #elif (defined(__linux__) && (defined(__sparc__) || defined(__sparc))) |
| + if (events & FDEVENT_RDHUP) { |
| + events &= ~FDEVENT_RDHUP; |
| + events |= EPOLLRDHUP; |
| + } |
| #endif |
| ep.events = events | EPOLLERR | EPOLLHUP; |
| ep.data.ptr = fdn; |
| @@ -376,7 +381,11 @@ fdevent_linux_sysepoll_init (fdevents *ev) |
| ck_static_assert(EPOLLERR == FDEVENT_ERR); |
| ck_static_assert(EPOLLHUP == FDEVENT_HUP); |
| #ifdef EPOLLRDHUP |
| + #if (defined(__linux__) && (defined(__sparc__) || defined(__sparc))) |
| + ck_static_assert(EPOLLRDHUP & FDEVENT_RDHUP); |
| + #else |
| ck_static_assert(EPOLLRDHUP == FDEVENT_RDHUP); |
| + #endif |
| #endif |
| |
| ev->type = FDEVENT_HANDLER_LINUX_SYSEPOLL; |
| @@ -770,6 +779,11 @@ fdevent_poll_event_set (fdevents *ev, fdnode *fdn, int events) |
| |
| #ifndef POLLRDHUP |
| events &= ~FDEVENT_RDHUP; |
| + #elif (defined(__linux__) && (defined(__sparc__) || defined(__sparc))) |
| + if (events & FDEVENT_RDHUP) { |
| + events &= ~FDEVENT_RDHUP; |
| + events |= POLLRDHUP; |
| + } |
| #endif |
| |
| if (k >= 0) { |
| @@ -854,7 +868,11 @@ fdevent_poll_init (fdevents *ev) |
| ck_static_assert(POLLHUP == FDEVENT_HUP); |
| ck_static_assert(POLLNVAL == FDEVENT_NVAL); |
| #ifdef POLLRDHUP |
| + #if (defined(__linux__) && (defined(__sparc__) || defined(__sparc))) |
| + ck_static_assert(POLLRDHUP & FDEVENT_RDHUP); |
| + #else |
| ck_static_assert(POLLRDHUP == FDEVENT_RDHUP); |
| + #endif |
| #endif |
| |
| ev->type = FDEVENT_HANDLER_POLL; |
| -- |
| 2.30.2 |
| |