package: haproxy
- add backported patches for 1.4.22 git-svn-id: svn://svn.openwrt.org/openwrt/packages@36152 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
12829985fd
commit
89cca70763
@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=haproxy
|
PKG_NAME:=haproxy
|
||||||
PKG_VERSION:=1.4.22
|
PKG_VERSION:=1.4.22
|
||||||
PKG_RELEASE:=35
|
PKG_RELEASE:=42
|
||||||
|
|
||||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||||
PKG_SOURCE_URL:=http://haproxy.1wt.eu/download/1.4/src
|
PKG_SOURCE_URL:=http://haproxy.1wt.eu/download/1.4/src
|
||||||
|
@ -0,0 +1,71 @@
|
|||||||
|
From 8a92e409e706e503ba76f8863c87409192e9f082 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yves Lafon <ylafon@w3.org>
|
||||||
|
Date: Mon, 11 Mar 2013 11:06:05 -0400
|
||||||
|
Subject: [PATCH 36/42] MEDIUM: http: implement redirect 307 and 308
|
||||||
|
|
||||||
|
I needed to emit a 307 and noticed it was not available so I did it,
|
||||||
|
as well as 308.
|
||||||
|
(cherry picked from commit 3e8d1ae2d25d3fae659fc560506af2ae9b20da12)
|
||||||
|
---
|
||||||
|
src/cfgparse.c | 6 +++---
|
||||||
|
src/proto_http.c | 20 ++++++++++++++++++++
|
||||||
|
2 files changed, 23 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
||||||
|
index e55d30a..345b415 100644
|
||||||
|
--- a/src/cfgparse.c
|
||||||
|
+++ b/src/cfgparse.c
|
||||||
|
@@ -2215,9 +2215,9 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
|
||||||
|
}
|
||||||
|
cur_arg++;
|
||||||
|
code = atol(args[cur_arg]);
|
||||||
|
- if (code < 301 || code > 303) {
|
||||||
|
- Alert("parsing [%s:%d] : '%s': unsupported HTTP code '%d'.\n",
|
||||||
|
- file, linenum, args[0], code);
|
||||||
|
+ if (code < 301 || code > 308 || (code > 303 && code < 307)) {
|
||||||
|
+ Alert("parsing [%s:%d] : '%s': unsupported HTTP code '%s' (must be one of 301, 302, 303, 307 or 308).\n",
|
||||||
|
+ file, linenum, args[0], args[cur_arg]);
|
||||||
|
err_code |= ERR_ALERT | ERR_FATAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
diff --git a/src/proto_http.c b/src/proto_http.c
|
||||||
|
index 06b3743..8d9d8e8 100644
|
||||||
|
--- a/src/proto_http.c
|
||||||
|
+++ b/src/proto_http.c
|
||||||
|
@@ -90,6 +90,20 @@ const char *HTTP_303 =
|
||||||
|
"Content-length: 0\r\n"
|
||||||
|
"Location: "; /* not terminated since it will be concatenated with the URL */
|
||||||
|
|
||||||
|
+
|
||||||
|
+/* same as 302 except that the browser MUST retry with the same method */
|
||||||
|
+const char *HTTP_307 =
|
||||||
|
+ "HTTP/1.1 307 Temporary Redirect\r\n"
|
||||||
|
+ "Cache-Control: no-cache\r\n"
|
||||||
|
+ "Content-length: 0\r\n"
|
||||||
|
+ "Location: "; /* not terminated since it will be concatenated with the URL */
|
||||||
|
+
|
||||||
|
+/* same as 301 except that the browser MUST retry with the same method */
|
||||||
|
+const char *HTTP_308 =
|
||||||
|
+ "HTTP/1.1 308 Permanent Redirect\r\n"
|
||||||
|
+ "Content-length: 0\r\n"
|
||||||
|
+ "Location: "; /* not terminated since it will be concatenated with the URL */
|
||||||
|
+
|
||||||
|
/* Warning: this one is an sprintf() fmt string, with <realm> as its only argument */
|
||||||
|
const char *HTTP_401_fmt =
|
||||||
|
"HTTP/1.0 401 Unauthorized\r\n"
|
||||||
|
@@ -3355,6 +3369,12 @@ int http_process_req_common(struct session *s, struct buffer *req, int an_bit, s
|
||||||
|
|
||||||
|
/* build redirect message */
|
||||||
|
switch(rule->code) {
|
||||||
|
+ case 308:
|
||||||
|
+ msg_fmt = HTTP_308;
|
||||||
|
+ break;
|
||||||
|
+ case 307:
|
||||||
|
+ msg_fmt = HTTP_307;
|
||||||
|
+ break;
|
||||||
|
case 303:
|
||||||
|
msg_fmt = HTTP_303;
|
||||||
|
break;
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,28 @@
|
|||||||
|
From 6c9ba3562cf57dc033a52c0973962c642b3aaf18 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yves Lafon <ylafon@w3.org>
|
||||||
|
Date: Mon, 11 Mar 2013 11:06:05 -0400
|
||||||
|
Subject: [PATCH 37/42] MINOR: http: status 301 should not be marked
|
||||||
|
non-cacheable
|
||||||
|
|
||||||
|
Also, browsers behaviour is inconsistent regarding the Cache-Control
|
||||||
|
header field on a 301.
|
||||||
|
(cherry picked from commit e267421e93eb35272a104c9c8fa6878880f42be8)
|
||||||
|
---
|
||||||
|
src/proto_http.c | 1 -
|
||||||
|
1 file changed, 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/proto_http.c b/src/proto_http.c
|
||||||
|
index 8d9d8e8..a52c038 100644
|
||||||
|
--- a/src/proto_http.c
|
||||||
|
+++ b/src/proto_http.c
|
||||||
|
@@ -73,7 +73,6 @@ const struct chunk http_100_chunk = {
|
||||||
|
/* Warning: no "connection" header is provided with the 3xx messages below */
|
||||||
|
const char *HTTP_301 =
|
||||||
|
"HTTP/1.1 301 Moved Permanently\r\n"
|
||||||
|
- "Cache-Control: no-cache\r\n"
|
||||||
|
"Content-length: 0\r\n"
|
||||||
|
"Location: "; /* not terminated since it will be concatenated with the URL */
|
||||||
|
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,47 @@
|
|||||||
|
From 89c12b19f9e42976c9c205cd1a42bb2e148b3235 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Willy Tarreau <w@1wt.eu>
|
||||||
|
Date: Fri, 29 Mar 2013 19:28:11 +0100
|
||||||
|
Subject: [PATCH 38/42] DOC: mention the new HTTP 307 and 308 redirect statues
|
||||||
|
(cherry picked from commit b67fdc4cd8bde202f2805d98683ddab929469a05)
|
||||||
|
|
||||||
|
---
|
||||||
|
doc/configuration.txt | 16 ++++++++++------
|
||||||
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/doc/configuration.txt b/doc/configuration.txt
|
||||||
|
index 20b89c2..9a99267 100644
|
||||||
|
--- a/doc/configuration.txt
|
||||||
|
+++ b/doc/configuration.txt
|
||||||
|
@@ -309,6 +309,8 @@ Haproxy may emit the following status codes by itself :
|
||||||
|
301 when performing a redirection, depending on the configured code
|
||||||
|
302 when performing a redirection, depending on the configured code
|
||||||
|
303 when performing a redirection, depending on the configured code
|
||||||
|
+ 307 when performing a redirection, depending on the configured code
|
||||||
|
+ 308 when performing a redirection, depending on the configured code
|
||||||
|
400 for an invalid or too large request
|
||||||
|
401 when an authentication is required to perform the action (when
|
||||||
|
accessing the stats page)
|
||||||
|
@@ -4057,12 +4059,14 @@ redirect prefix <to> [code <code>] <option> [{if | unless} <condition>]
|
||||||
|
URL.
|
||||||
|
|
||||||
|
<code> The code is optional. It indicates which type of HTTP redirection
|
||||||
|
- is desired. Only codes 301, 302 and 303 are supported, and 302 is
|
||||||
|
- used if no code is specified. 301 means "Moved permanently", and
|
||||||
|
- a browser may cache the Location. 302 means "Moved permanently"
|
||||||
|
- and means that the browser should not cache the redirection. 303
|
||||||
|
- is equivalent to 302 except that the browser will fetch the
|
||||||
|
- location with a GET method.
|
||||||
|
+ is desired. Only codes 301, 302, 303, 307 and 308 are supported,
|
||||||
|
+ with 302 used by default if no code is specified. 301 means
|
||||||
|
+ "Moved permanently", and a browser may cache the Location. 302
|
||||||
|
+ means "Moved permanently" and means that the browser should not
|
||||||
|
+ cache the redirection. 303 is equivalent to 302 except that the
|
||||||
|
+ browser will fetch the location with a GET method. 307 is just
|
||||||
|
+ like 302 but makes it clear that the same method must be reused.
|
||||||
|
+ Likewise, 308 replaces 301 if the same method must be used.
|
||||||
|
|
||||||
|
<option> There are several options which can be specified to adjust the
|
||||||
|
expected behaviour of a redirection :
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,193 @@
|
|||||||
|
From d9185dbab66e8ea3bafd1d43660ae44311da7a81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Willy Tarreau <w@1wt.eu>
|
||||||
|
Date: Sun, 31 Mar 2013 14:06:57 +0200
|
||||||
|
Subject: [PATCH 39/42] MEDIUM: poll: do not use FD_* macros anymore
|
||||||
|
|
||||||
|
Some recent glibc updates have added controls on FD_SET/FD_CLR/FD_ISSET
|
||||||
|
that crash the program if it tries to use a file descriptor larger than
|
||||||
|
FD_SETSIZE.
|
||||||
|
|
||||||
|
Do not rely on FD_* macros anymore and replace them with bit fields.
|
||||||
|
(cherry picked from commit 80da05a4cfb881663dc1f38a94d613f37e54552a)
|
||||||
|
---
|
||||||
|
src/ev_poll.c | 87 +++++++++++++++++++++++++++++------------------------------
|
||||||
|
1 file changed, 43 insertions(+), 44 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/ev_poll.c b/src/ev_poll.c
|
||||||
|
index f5d011e..02e89ad 100644
|
||||||
|
--- a/src/ev_poll.c
|
||||||
|
+++ b/src/ev_poll.c
|
||||||
|
@@ -27,12 +27,25 @@
|
||||||
|
#include <proto/task.h>
|
||||||
|
|
||||||
|
|
||||||
|
-static fd_set *fd_evts[2];
|
||||||
|
+static unsigned int *fd_evts[2];
|
||||||
|
|
||||||
|
/* private data */
|
||||||
|
static struct pollfd *poll_events = NULL;
|
||||||
|
|
||||||
|
+static inline unsigned int hap_fd_isset(int fd, unsigned int *evts)
|
||||||
|
+{
|
||||||
|
+ return evts[fd / (8*sizeof(*evts))] & (1U << (fd & (8*sizeof(*evts) - 1)));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline void hap_fd_set(int fd, unsigned int *evts)
|
||||||
|
+{
|
||||||
|
+ evts[fd / (8*sizeof(*evts))] |= 1U << (fd & (8*sizeof(*evts) - 1));
|
||||||
|
+}
|
||||||
|
|
||||||
|
+static inline void hap_fd_clr(int fd, unsigned int *evts)
|
||||||
|
+{
|
||||||
|
+ evts[fd / (8*sizeof(*evts))] &= ~(1U << (fd & (8*sizeof(*evts) - 1)));
|
||||||
|
+}
|
||||||
|
/*
|
||||||
|
* Benchmarks performed on a Pentium-M notebook show that using functions
|
||||||
|
* instead of the usual macros improve the FD_* performance by about 80%,
|
||||||
|
@@ -40,43 +53,43 @@ static struct pollfd *poll_events = NULL;
|
||||||
|
*/
|
||||||
|
REGPRM2 static int __fd_is_set(const int fd, int dir)
|
||||||
|
{
|
||||||
|
- return FD_ISSET(fd, fd_evts[dir]);
|
||||||
|
+ return hap_fd_isset(fd, fd_evts[dir]);
|
||||||
|
}
|
||||||
|
|
||||||
|
REGPRM2 static int __fd_set(const int fd, int dir)
|
||||||
|
{
|
||||||
|
- FD_SET(fd, fd_evts[dir]);
|
||||||
|
+ hap_fd_set(fd, fd_evts[dir]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGPRM2 static int __fd_clr(const int fd, int dir)
|
||||||
|
{
|
||||||
|
- FD_CLR(fd, fd_evts[dir]);
|
||||||
|
+ hap_fd_clr(fd, fd_evts[dir]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGPRM2 static int __fd_cond_s(const int fd, int dir)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
- ret = !FD_ISSET(fd, fd_evts[dir]);
|
||||||
|
+ ret = !hap_fd_isset(fd, fd_evts[dir]);
|
||||||
|
if (ret)
|
||||||
|
- FD_SET(fd, fd_evts[dir]);
|
||||||
|
+ hap_fd_set(fd, fd_evts[dir]);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGPRM2 static int __fd_cond_c(const int fd, int dir)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
- ret = FD_ISSET(fd, fd_evts[dir]);
|
||||||
|
+ ret = hap_fd_isset(fd, fd_evts[dir]);
|
||||||
|
if (ret)
|
||||||
|
- FD_CLR(fd, fd_evts[dir]);
|
||||||
|
+ hap_fd_clr(fd, fd_evts[dir]);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
REGPRM1 static void __fd_rem(const int fd)
|
||||||
|
{
|
||||||
|
- FD_CLR(fd, fd_evts[DIR_RD]);
|
||||||
|
- FD_CLR(fd, fd_evts[DIR_WR]);
|
||||||
|
+ hap_fd_clr(fd, fd_evts[DIR_RD]);
|
||||||
|
+ hap_fd_clr(fd, fd_evts[DIR_WR]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -93,33 +106,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||||
|
unsigned rn, wn; /* read new, write new */
|
||||||
|
|
||||||
|
nbfd = 0;
|
||||||
|
- for (fds = 0; (fds * BITS_PER_INT) < maxfd; fds++) {
|
||||||
|
-
|
||||||
|
- rn = ((int*)fd_evts[DIR_RD])[fds];
|
||||||
|
- wn = ((int*)fd_evts[DIR_WR])[fds];
|
||||||
|
+ for (fds = 0; (fds * 8*sizeof(**fd_evts)) < maxfd; fds++) {
|
||||||
|
+ rn = fd_evts[DIR_RD][fds];
|
||||||
|
+ wn = fd_evts[DIR_WR][fds];
|
||||||
|
|
||||||
|
- if ((rn|wn)) {
|
||||||
|
- for (count = 0, fd = fds * BITS_PER_INT; count < BITS_PER_INT && fd < maxfd; count++, fd++) {
|
||||||
|
-#define FDSETS_ARE_INT_ALIGNED
|
||||||
|
-#ifdef FDSETS_ARE_INT_ALIGNED
|
||||||
|
-
|
||||||
|
-#define WE_REALLY_KNOW_THAT_FDSETS_ARE_INTS
|
||||||
|
-#ifdef WE_REALLY_KNOW_THAT_FDSETS_ARE_INTS
|
||||||
|
- sr = (rn >> count) & 1;
|
||||||
|
- sw = (wn >> count) & 1;
|
||||||
|
-#else
|
||||||
|
- sr = FD_ISSET(fd&(BITS_PER_INT-1), (typeof(fd_set*))&rn);
|
||||||
|
- sw = FD_ISSET(fd&(BITS_PER_INT-1), (typeof(fd_set*))&wn);
|
||||||
|
-#endif
|
||||||
|
-#else
|
||||||
|
- sr = FD_ISSET(fd, fd_evts[DIR_RD]);
|
||||||
|
- sw = FD_ISSET(fd, fd_evts[DIR_WR]);
|
||||||
|
-#endif
|
||||||
|
- if ((sr|sw)) {
|
||||||
|
- poll_events[nbfd].fd = fd;
|
||||||
|
- poll_events[nbfd].events = (sr ? POLLIN : 0) | (sw ? POLLOUT : 0);
|
||||||
|
- nbfd++;
|
||||||
|
- }
|
||||||
|
+ if (!(rn|wn))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ for (count = 0, fd = fds * 8*sizeof(**fd_evts); count < 8*sizeof(**fd_evts) && fd < maxfd; count++, fd++) {
|
||||||
|
+ sr = (rn >> count) & 1;
|
||||||
|
+ sw = (wn >> count) & 1;
|
||||||
|
+ if ((sr|sw)) {
|
||||||
|
+ poll_events[nbfd].fd = fd;
|
||||||
|
+ poll_events[nbfd].events = (sr ? POLLIN : 0) | (sw ? POLLOUT : 0);
|
||||||
|
+ nbfd++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -149,14 +149,14 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||||
|
/* ok, we found one active fd */
|
||||||
|
status--;
|
||||||
|
|
||||||
|
- if (FD_ISSET(fd, fd_evts[DIR_RD])) {
|
||||||
|
+ if (hap_fd_isset(fd, fd_evts[DIR_RD])) {
|
||||||
|
if (fdtab[fd].state == FD_STCLOSE)
|
||||||
|
continue;
|
||||||
|
if (poll_events[count].revents & ( POLLIN | POLLERR | POLLHUP ))
|
||||||
|
fdtab[fd].cb[DIR_RD].f(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (FD_ISSET(fd, fd_evts[DIR_WR])) {
|
||||||
|
+ if (hap_fd_isset(fd, fd_evts[DIR_WR])) {
|
||||||
|
if (fdtab[fd].state == FD_STCLOSE)
|
||||||
|
continue;
|
||||||
|
if (poll_events[count].revents & ( POLLOUT | POLLERR | POLLHUP ))
|
||||||
|
@@ -174,21 +174,20 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||||
|
REGPRM1 static int _do_init(struct poller *p)
|
||||||
|
{
|
||||||
|
__label__ fail_swevt, fail_srevt, fail_pe;
|
||||||
|
- int fd_set_bytes;
|
||||||
|
+ int fd_evts_bytes;
|
||||||
|
|
||||||
|
p->private = NULL;
|
||||||
|
- fd_set_bytes = sizeof(fd_set) * (global.maxsock + FD_SETSIZE - 1) / FD_SETSIZE;
|
||||||
|
+ fd_evts_bytes = (global.maxsock + sizeof(**fd_evts) - 1) / sizeof(**fd_evts) * sizeof(**fd_evts);
|
||||||
|
|
||||||
|
- poll_events = (struct pollfd*)
|
||||||
|
- calloc(1, sizeof(struct pollfd) * global.maxsock);
|
||||||
|
+ poll_events = calloc(1, sizeof(struct pollfd) * global.maxsock);
|
||||||
|
|
||||||
|
if (poll_events == NULL)
|
||||||
|
goto fail_pe;
|
||||||
|
|
||||||
|
- if ((fd_evts[DIR_RD] = (fd_set *)calloc(1, fd_set_bytes)) == NULL)
|
||||||
|
+ if ((fd_evts[DIR_RD] = calloc(1, fd_evts_bytes)) == NULL)
|
||||||
|
goto fail_srevt;
|
||||||
|
|
||||||
|
- if ((fd_evts[DIR_WR] = (fd_set *)calloc(1, fd_set_bytes)) == NULL)
|
||||||
|
+ if ((fd_evts[DIR_WR] = calloc(1, fd_evts_bytes)) == NULL)
|
||||||
|
goto fail_swevt;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,77 @@
|
|||||||
|
From f4096052b9397e29c3638651e7487c047081c00c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Willy Tarreau <w@1wt.eu>
|
||||||
|
Date: Sun, 31 Mar 2013 14:41:15 +0200
|
||||||
|
Subject: [PATCH 40/42] BUG/MAJOR: ev_select: disable the select() poller if
|
||||||
|
maxsock > FD_SETSIZE
|
||||||
|
|
||||||
|
Some recent glibc updates have added controls on FD_SET/FD_CLR/FD_ISSET
|
||||||
|
that crash the program if it tries to use a file descriptor larger than
|
||||||
|
FD_SETSIZE.
|
||||||
|
|
||||||
|
For this reason, we now control the compatibility between global.maxsock
|
||||||
|
and FD_SETSIZE, and refuse to use select() if there too many FDs are
|
||||||
|
expected to be used. Note that on Solaris, FD_SETSIZE is already forced
|
||||||
|
to 65536, and that FreeBSD and OpenBSD allow it to be redefined, though
|
||||||
|
this is not needed thanks to kqueue which is much more efficient.
|
||||||
|
|
||||||
|
In practice, since poll() is enabled on all targets, it should not cause
|
||||||
|
any problem, unless it is explicitly disabled.
|
||||||
|
|
||||||
|
This change must be backported to 1.4 because the crashes caused by glibc
|
||||||
|
have already been reported on this version.
|
||||||
|
(cherry picked from commit 3fa87b1db95bc4d6640999462bdae620bff147c6)
|
||||||
|
---
|
||||||
|
src/ev_select.c | 7 +++++++
|
||||||
|
src/haproxy.c | 11 ++++++++++-
|
||||||
|
2 files changed, 17 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/ev_select.c b/src/ev_select.c
|
||||||
|
index 5a87282..1f35b54 100644
|
||||||
|
--- a/src/ev_select.c
|
||||||
|
+++ b/src/ev_select.c
|
||||||
|
@@ -170,6 +170,10 @@ REGPRM1 static int _do_init(struct poller *p)
|
||||||
|
int fd_set_bytes;
|
||||||
|
|
||||||
|
p->private = NULL;
|
||||||
|
+
|
||||||
|
+ if (global.maxsock > FD_SETSIZE)
|
||||||
|
+ goto fail_revt;
|
||||||
|
+
|
||||||
|
fd_set_bytes = sizeof(fd_set) * (global.maxsock + FD_SETSIZE - 1) / FD_SETSIZE;
|
||||||
|
|
||||||
|
if ((tmp_evts[DIR_RD] = (fd_set *)calloc(1, fd_set_bytes)) == NULL)
|
||||||
|
@@ -217,6 +221,9 @@ REGPRM1 static void _do_term(struct poller *p)
|
||||||
|
*/
|
||||||
|
REGPRM1 static int _do_test(struct poller *p)
|
||||||
|
{
|
||||||
|
+ if (global.maxsock > FD_SETSIZE)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
||||||
|
index c302143..1d588e1 100644
|
||||||
|
--- a/src/haproxy.c
|
||||||
|
+++ b/src/haproxy.c
|
||||||
|
@@ -711,7 +711,16 @@ void init(int argc, char **argv)
|
||||||
|
list_pollers(stderr);
|
||||||
|
|
||||||
|
if (!init_pollers()) {
|
||||||
|
- Alert("No polling mechanism available.\n");
|
||||||
|
+ Alert("No polling mechanism available.\n"
|
||||||
|
+ " It is likely that haproxy was built with TARGET=generic and that FD_SETSIZE\n"
|
||||||
|
+ " is too low on this platform to support maxconn and the number of listeners\n"
|
||||||
|
+ " and servers. You should rebuild haproxy specifying your system using TARGET=\n"
|
||||||
|
+ " in order to support other polling systems (poll, epoll, kqueue) or reduce the\n"
|
||||||
|
+ " global maxconn setting to accomodate the system's limitation. For reference,\n"
|
||||||
|
+ " FD_SETSIZE=%d on this system, global.maxconn=%d resulting in a maximum of\n"
|
||||||
|
+ " %d file descriptors. You should thus reduce global.maxconn by %d. Also,\n"
|
||||||
|
+ " check build settings using 'haproxy -vv'.\n\n",
|
||||||
|
+ FD_SETSIZE, global.maxconn, global.maxsock, (global.maxsock + 1 - FD_SETSIZE) / 2);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (global.mode & (MODE_VERBOSE|MODE_DEBUG)) {
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
From 4c5a09bb3c62070f139159378a8d68897b7ec8d6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Willy Tarreau <w@1wt.eu>
|
||||||
|
Date: Tue, 2 Apr 2013 08:14:29 +0200
|
||||||
|
Subject: [PATCH 41/42] BUILD: enable poll() by default in the makefile
|
||||||
|
|
||||||
|
This allows to build haproxy for unknown targets and still have poll().
|
||||||
|
If for any reason a target does not support it, just passing USE_POLL=""
|
||||||
|
disables it.
|
||||||
|
(cherry picked from commit 32e65ef62570cbace7368ebe7262b48c28b31bb7)
|
||||||
|
---
|
||||||
|
Makefile | 5 ++++-
|
||||||
|
README | 9 ++++++++-
|
||||||
|
2 files changed, 12 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 8d82543..f4dbccd 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -172,7 +172,10 @@ LDFLAGS = $(ARCH_FLAGS) -g
|
||||||
|
# Depending on the target platform, some options are set, as well as some
|
||||||
|
# CFLAGS and LDFLAGS. The USE_* values are set to "implicit" so that they are
|
||||||
|
# not reported in the build options string. You should not have to change
|
||||||
|
-# anything there.
|
||||||
|
+# anything there. poll() is always supported, unless explicitly disabled by
|
||||||
|
+# passing USE_POLL="" on the make command line.
|
||||||
|
+USE_POLL = default
|
||||||
|
+
|
||||||
|
ifeq ($(TARGET),generic)
|
||||||
|
# generic system target has nothing specific
|
||||||
|
USE_POLL = implicit
|
||||||
|
diff --git a/README b/README
|
||||||
|
index aca83f9..c99897e 100644
|
||||||
|
--- a/README
|
||||||
|
+++ b/README
|
||||||
|
@@ -12,7 +12,7 @@
|
||||||
|
To build haproxy, you will need :
|
||||||
|
- GNU make. Neither Solaris nor OpenBSD's make work with the GNU Makefile.
|
||||||
|
However, specific Makefiles for BSD and OSX are provided.
|
||||||
|
- - GCC between 2.91 and 4.5.0. Others may work, but not tested.
|
||||||
|
+ - GCC between 2.91 and 4.7. Others may work, but not tested.
|
||||||
|
- GNU ld
|
||||||
|
|
||||||
|
Also, you might want to build with libpcre support, which will provide a very
|
||||||
|
@@ -100,6 +100,13 @@ otherwise __fd_select() will be used while not being present in the libc.
|
||||||
|
If you get build errors because of strange symbols or section mismatches,
|
||||||
|
simply remove -g from DEBUG_CFLAGS.
|
||||||
|
|
||||||
|
+You can easily define your own target with the GNU Makefile. Unknown targets
|
||||||
|
+are processed with no default option except USE_POLL=default. So you can very
|
||||||
|
+well use that property to define your own set of options. USE_POLL can even be
|
||||||
|
+disabled by setting USE_POLL="". For example :
|
||||||
|
+
|
||||||
|
+ $ gmake TARGET=tiny USE_POLL="" TARGET_CFLAGS=-fomit-frame-pointer
|
||||||
|
+
|
||||||
|
|
||||||
|
2) How to install it
|
||||||
|
--------------------
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
@ -0,0 +1,57 @@
|
|||||||
|
From 2d7b45e7321437c1f9c4d0f2c46a793ef9d059c0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Willy Tarreau <w@1wt.eu>
|
||||||
|
Date: Tue, 2 Apr 2013 08:17:43 +0200
|
||||||
|
Subject: [PATCH 42/42] BUILD: add explicit support for Mac OS/X
|
||||||
|
|
||||||
|
The "osx" target may now be passed in the TARGET variable. It supports
|
||||||
|
the same features as FreeBSD and allows its users to use the GNU makefile
|
||||||
|
instead of the platform-specific makefile which lacks some features.
|
||||||
|
(cherry picked from commit 8624cab29c52db9052bf022683cfd3d11369cc0d)
|
||||||
|
---
|
||||||
|
Makefile | 8 ++++++++
|
||||||
|
README | 3 ++-
|
||||||
|
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index f4dbccd..57692fe 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -245,6 +245,13 @@ ifeq ($(TARGET),freebsd)
|
||||||
|
USE_TPROXY = implicit
|
||||||
|
USE_LIBCRYPT = implicit
|
||||||
|
else
|
||||||
|
+ifeq ($(TARGET),osx)
|
||||||
|
+ # This is for Mac OS/X
|
||||||
|
+ USE_POLL = implicit
|
||||||
|
+ USE_KQUEUE = implicit
|
||||||
|
+ USE_TPROXY = implicit
|
||||||
|
+ USE_LIBCRYPT = implicit
|
||||||
|
+else
|
||||||
|
ifeq ($(TARGET),openbsd)
|
||||||
|
# This is for OpenBSD >= 3.0
|
||||||
|
USE_POLL = implicit
|
||||||
|
@@ -267,6 +274,7 @@ ifeq ($(TARGET),cygwin)
|
||||||
|
endif # cygwin
|
||||||
|
endif # aix52
|
||||||
|
endif # openbsd
|
||||||
|
+endif # osx
|
||||||
|
endif # freebsd
|
||||||
|
endif # solaris
|
||||||
|
endif # linux2628
|
||||||
|
diff --git a/README b/README
|
||||||
|
index c99897e..7897cb3 100644
|
||||||
|
--- a/README
|
||||||
|
+++ b/README
|
||||||
|
@@ -28,7 +28,8 @@ and assign it to the TARGET variable :
|
||||||
|
- linux2628 for Linux 2.6.28 and above (enables splice and tproxy)
|
||||||
|
- solaris for Solaris 8 or 10 (others untested)
|
||||||
|
- freebsd for FreeBSD 5 to 8.0 (others untested)
|
||||||
|
- - openbsd for OpenBSD 3.1 to 4.6 (others untested)
|
||||||
|
+ - osx for Mac OS/X
|
||||||
|
+ - openbsd for OpenBSD 3.1 to 5.2 (others untested)
|
||||||
|
- aix52 for AIX 5.2
|
||||||
|
- cygwin for Cygwin
|
||||||
|
- generic for any other OS.
|
||||||
|
--
|
||||||
|
1.8.1.5
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user