commit - 36be13389e7fcc3f30455463b2e7564a4b5ad616
commit + ea47f1c48ce3352300e26bd65b5424319f61f303
blob - 65c3734b9135dca24bd58d90deeb0f56c762951a
blob + c7ea204b43835b2d687498f8a3dc7d4f7119c3ed
--- check_tcp.c
+++ check_tcp.c
-/* $OpenBSD: check_tcp.c,v 1.37 2010/05/26 13:56:08 nicm Exp $ */
+/* $OpenBSD: check_tcp.c,v 1.38 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
socklen_t len;
struct timeval tv;
struct linger lng;
- int he = HCE_TCP_CONNECT_ERROR;
+ int he = HCE_TCP_SOCKET_OPTION;
switch (cte->host->conf.ss.ss_family) {
case AF_INET:
len = ((struct sockaddr *)&cte->host->conf.ss)->sa_len;
- if ((s = socket(cte->host->conf.ss.ss_family, SOCK_STREAM, 0)) == -1)
+ if ((s = socket(cte->host->conf.ss.ss_family, SOCK_STREAM, 0)) == -1) {
+ if (errno == EMFILE || errno == ENFILE)
+ he = HCE_TCP_SOCKET_LIMIT;
+ else
+ he = HCE_TCP_SOCKET_ERROR;
goto bad;
+ }
bzero(&lng, sizeof(lng));
if (setsockopt(s, SOL_SOCKET, SO_LINGER, &lng, sizeof(lng)) == -1)
blob - 2eb5601d160de5fc3ed09cadaa0c15a45bbfe7f9
blob + 0b4fd042d64c57a7112fafee92b495a92ffb5226
--- hce.c
+++ hce.c
-/* $OpenBSD: hce.c,v 1.55 2010/05/14 11:13:36 reyk Exp $ */
+/* $OpenBSD: hce.c,v 1.56 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2006 Pierre-Yves Ritschard <pyr@openbsd.org>
event_init();
+ /* Allow maximum available sockets for TCP checks */
+ socket_rlimit(-1);
+
if ((iev_pfe = calloc(1, sizeof(struct imsgev))) == NULL ||
(iev_main = calloc(1, sizeof(struct imsgev))) == NULL)
fatal("hce");
blob - d19895a113ae37a0623a4ce325e35a5c523f3ae6
blob + 4da021fb0fad1a6721578acdba9363f49e39294b
--- log.c
+++ log.c
-/* $OpenBSD: log.c,v 1.15 2010/01/11 06:40:14 jsg Exp $ */
+/* $OpenBSD: log.c,v 1.16 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
case HCE_ICMP_WRITE_TIMEOUT:
return ("icmp write timeout");
break;
- case HCE_TCP_CONNECT_ERROR:
- return ("tcp connect error");
+ case HCE_TCP_SOCKET_ERROR:
+ return ("tcp socket error");
break;
+ case HCE_TCP_SOCKET_LIMIT:
+ return ("tcp socket limit");
+ break;
+ case HCE_TCP_SOCKET_OPTION:
+ return ("tcp socket option");
+ break;
case HCE_TCP_CONNECT_FAIL:
return ("tcp connect failed");
break;
blob - a9d9caff74bd64865c9e45f0aa212561b67601de
blob + a5825d5b2811a5de50a54a2646399a8128724f71
--- relay.c
+++ relay.c
-/* $OpenBSD: relay.c,v 1.125 2010/11/24 13:57:05 jsg Exp $ */
+/* $OpenBSD: relay.c,v 1.126 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2006, 2007, 2008 Reyk Floeter <reyk@openbsd.org>
#include <sys/un.h>
#include <sys/tree.h>
#include <sys/hash.h>
-#include <sys/resource.h>
#include <net/if.h>
#include <netinet/in_systm.h>
struct relay *rlay;
struct host *host;
struct timeval tv;
- struct rlimit rl;
- if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
- fatal("relay_init: failed to get resource limit");
- log_debug("relay_init: max open files %d", rl.rlim_max);
+ /* Unlimited file descriptors (use system limits) */
+ socket_rlimit(-1);
- /*
- * Allow the maximum number of open file descriptors for this
- * login class (which should be the class "daemon" by default).
- */
- rl.rlim_cur = rl.rlim_max;
- if (setrlimit(RLIMIT_NOFILE, &rl) == -1)
- fatal("relay_init: failed to set resource limit");
-
TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
if ((rlay->rl_conf.flags & (F_SSL|F_SSLCLIENT)) &&
(rlay->rl_ssl_ctx = relay_ssl_ctx_create(rlay)) == NULL)
blob - 2e148297bcde20b001ae4fd10ee5927ce59fd3ae
blob + 46ac4f7e4a256a85d1d2de7bdb544ce9111a896b
--- relayd.c
+++ relayd.c
-/* $OpenBSD: relayd.c,v 1.98 2010/09/02 14:03:22 sobrado Exp $ */
+/* $OpenBSD: relayd.c,v 1.99 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2007, 2008 Reyk Floeter <reyk@openbsd.org>
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/wait.h>
+#include <sys/resource.h>
#include <net/if.h>
#include <netinet/in.h>
return (0);
}
+
+void
+socket_rlimit(int maxfd)
+{
+ struct rlimit rl;
+
+ if (getrlimit(RLIMIT_NOFILE, &rl) == -1)
+ fatal("socket_rlimit: failed to get resource limit");
+ log_debug("socket_rlimit: max open files %d", rl.rlim_max);
+
+ /*
+ * Allow the maximum number of open file descriptors for this
+ * login class (which should be the class "daemon" by default).
+ */
+ if (maxfd == -1)
+ rl.rlim_cur = rl.rlim_max;
+ else
+ rl.rlim_cur = MAX(rl.rlim_max, (rlim_t)maxfd);
+ if (setrlimit(RLIMIT_NOFILE, &rl) == -1)
+ fatal("socket_rlimit: failed to set resource limit");
+}
blob - d2d2369324ad84962f16325cc0bfa663f97d0ff3
blob + bb8616b4cbd368fb4389aefddd66b953e360845a
--- relayd.h
+++ relayd.h
-/* $OpenBSD: relayd.h,v 1.138 2010/10/26 15:04:37 reyk Exp $ */
+/* $OpenBSD: relayd.h,v 1.139 2010/11/30 14:38:45 reyk Exp $ */
/*
* Copyright (c) 2006, 2007 Pierre-Yves Ritschard <pyr@openbsd.org>
HCE_ICMP_OK,
HCE_ICMP_READ_TIMEOUT,
HCE_ICMP_WRITE_TIMEOUT,
- HCE_TCP_CONNECT_ERROR,
+ HCE_TCP_SOCKET_ERROR,
+ HCE_TCP_SOCKET_LIMIT,
+ HCE_TCP_SOCKET_OPTION,
HCE_TCP_CONNECT_FAIL,
HCE_TCP_CONNECT_TIMEOUT,
HCE_TCP_CONNECT_OK,
void imsg_event_add(struct imsgev *);
int imsg_compose_event(struct imsgev *, u_int16_t, u_int32_t,
pid_t, int, void *, u_int16_t);
+void socket_rlimit(int);
/* carp.c */
int carp_demote_init(char *, int);