Commit Diff


commit - 36be13389e7fcc3f30455463b2e7564a4b5ad616
commit + ea47f1c48ce3352300e26bd65b5424319f61f303
blob - 65c3734b9135dca24bd58d90deeb0f56c762951a
blob + c7ea204b43835b2d687498f8a3dc7d4f7119c3ed
--- check_tcp.c
+++ check_tcp.c
@@ -1,4 +1,4 @@
-/*	$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>
@@ -54,7 +54,7 @@ check_tcp(struct ctl_tcp_event *cte)
 	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:
@@ -69,8 +69,13 @@ check_tcp(struct ctl_tcp_event *cte)
 
 	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
@@ -1,4 +1,4 @@
-/*	$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>
@@ -120,6 +120,9 @@ hce(struct relayd *x_env, int pipe_parent2pfe[2], int 
 
 	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
@@ -1,4 +1,4 @@
-/*	$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>
@@ -196,9 +196,15 @@ host_error(enum host_error he)
 	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
@@ -1,4 +1,4 @@
-/*	$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>
@@ -24,7 +24,6 @@
 #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>
@@ -460,20 +459,10 @@ relay_init(void)
 	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
@@ -1,4 +1,4 @@
-/*	$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>
@@ -21,6 +21,7 @@
 #include <sys/queue.h>
 #include <sys/socket.h>
 #include <sys/wait.h>
+#include <sys/resource.h>
 
 #include <net/if.h>
 #include <netinet/in.h>
@@ -1359,3 +1360,24 @@ map4to6(struct sockaddr_storage *in4, struct sockaddr_
 
 	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
@@ -1,4 +1,4 @@
-/*	$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>
@@ -289,7 +289,9 @@ enum host_error {
 	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,
@@ -916,6 +918,7 @@ int		 map4to6(struct sockaddr_storage *, struct sockad
 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);