mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 17:59:20 -04:00
- add patch to modify apr1 poll() emulation to match behavior expected by serf
serf depends on the poll emulation in apr returning a POLLERR event if a non-blocking connect() attempt fails in order to trigger an IPv6 -> IPv4 fallback, or a fallback to another address for a multi-homed host. On FreeBSD, the poll emulation is done using kqueue, and the result returned by the poll() emulation is POLLIN + POLLHUP. - upstream apache PR: https://bz.apache.org/bugzilla/show_bug.cgi?id=59914 PR: 211430 Submitted by: Don Lewis (truckman@) MFH: 2016Q3
This commit is contained in:
parent
06719e2885
commit
1bec1395d9
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=419646
2 changed files with 78 additions and 0 deletions
|
@ -3,6 +3,7 @@
|
|||
|
||||
PORTNAME= apr
|
||||
PORTVERSION= ${APR_VERSION}.${APU_VERSION}
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= devel
|
||||
MASTER_SITES= APACHE/apr
|
||||
DISTFILES= apr-${APR_VERSION}.tar.gz \
|
||||
|
|
77
devel/apr1/files/patch-apr_poll_unix_kqueue.c
Normal file
77
devel/apr1/files/patch-apr_poll_unix_kqueue.c
Normal file
|
@ -0,0 +1,77 @@
|
|||
# upstram PR: https://bz.apache.org/bugzilla/show_bug.cgi?id=59914
|
||||
# FreeBSD PR: 211430
|
||||
========================================================================
|
||||
--- apr-1.5.2/poll/unix/kqueue.c.orig 2015-03-20 01:34:07 UTC
|
||||
+++ apr-1.5.2/poll/unix/kqueue.c
|
||||
@@ -25,21 +25,40 @@
|
||||
|
||||
#ifdef HAVE_KQUEUE
|
||||
|
||||
-static apr_int16_t get_kqueue_revent(apr_int16_t event, apr_int16_t flags)
|
||||
+static apr_int16_t get_kqueue_revent(apr_int16_t event, apr_int16_t flags,
|
||||
+ int fflags, intptr_t data)
|
||||
{
|
||||
apr_int16_t rv = 0;
|
||||
|
||||
- if (event == EVFILT_READ)
|
||||
- rv |= APR_POLLIN;
|
||||
- else if (event == EVFILT_WRITE)
|
||||
- rv |= APR_POLLOUT;
|
||||
- if (flags & EV_EOF)
|
||||
- rv |= APR_POLLHUP;
|
||||
- /* APR_POLLPRI, APR_POLLERR, and APR_POLLNVAL are not handled by this
|
||||
- * implementation.
|
||||
+ /* APR_POLLPRI and APR_POLLNVAL are not handled by this implementation.
|
||||
* TODO: See if EV_ERROR + certain system errors in the returned data field
|
||||
* should map to APR_POLLNVAL.
|
||||
*/
|
||||
+ if (event == EVFILT_READ) {
|
||||
+ if (data > 0 || fflags == 0)
|
||||
+ rv |= APR_POLLIN;
|
||||
+ else
|
||||
+ rv |= APR_POLLERR;
|
||||
+ /*
|
||||
+ * Don't return POLLHUP if connect fails. Apparently Linux
|
||||
+ * does not, and this is expected by serf in order for IPv6 to
|
||||
+ * IPv4 or multihomed host fallback to work.
|
||||
+ *
|
||||
+ * ETIMEDOUT is ambiguous here since we don't know if a
|
||||
+ * connection was established. We don't want to return
|
||||
+ * POLLHUP here if the connection attempt timed out, but
|
||||
+ * we do if the connection was successful but later dropped.
|
||||
+ * For now, favor the latter.
|
||||
+ */
|
||||
+ if ((flags & EV_EOF) != 0 && fflags != ECONNREFUSED &&
|
||||
+ fflags != ENETUNREACH && fflags != EHOSTUNREACH)
|
||||
+ rv |= APR_POLLHUP;
|
||||
+ } else if (event == EVFILT_WRITE) {
|
||||
+ if (data > 0 || fflags == 0)
|
||||
+ rv |= APR_POLLOUT;
|
||||
+ else
|
||||
+ rv |= APR_POLLERR;
|
||||
+ }
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -290,7 +309,9 @@ static apr_status_t impl_pollset_poll(ap
|
||||
pollset->p->result_set[j] = fd;
|
||||
pollset->p->result_set[j].rtnevents =
|
||||
get_kqueue_revent(pollset->p->ke_set[i].filter,
|
||||
- pollset->p->ke_set[i].flags);
|
||||
+ pollset->p->ke_set[i].flags,
|
||||
+ pollset->p->ke_set[i].fflags,
|
||||
+ pollset->p->ke_set[i].data);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
@@ -471,7 +492,9 @@ static apr_status_t impl_pollcb_poll(apr
|
||||
apr_pollfd_t *pollfd = (apr_pollfd_t *)(pollcb->pollset.ke[i].udata);
|
||||
|
||||
pollfd->rtnevents = get_kqueue_revent(pollcb->pollset.ke[i].filter,
|
||||
- pollcb->pollset.ke[i].flags);
|
||||
+ pollcb->pollset.ke[i].flags,
|
||||
+ pollcb->pollset.ke[i].fflags,
|
||||
+ pollcb->pollset.ke[i].data);
|
||||
|
||||
rv = func(baton, pollfd);
|
||||
|
Loading…
Add table
Reference in a new issue