12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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
|