summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
Diffstat (limited to 'libexec')
-rw-r--r--libexec/spamd/spamd.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/libexec/spamd/spamd.c b/libexec/spamd/spamd.c
index 16a339a276e..1457b8a0f45 100644
--- a/libexec/spamd/spamd.c
+++ b/libexec/spamd/spamd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: spamd.c,v 1.95 2007/03/05 21:25:29 beck Exp $ */
+/* $OpenBSD: spamd.c,v 1.96 2007/03/06 01:59:43 beck Exp $ */
/*
* Copyright (c) 2002 Theo de Raadt. All rights reserved.
@@ -28,6 +28,7 @@
#include <sys/file.h>
#include <sys/wait.h>
#include <sys/socket.h>
+#include <sys/sysctl.h>
#include <sys/resource.h>
#include <netinet/in.h>
@@ -127,6 +128,7 @@ size_t cbs, cbu;
time_t t;
#define MAXCON 800
+int maxfiles;
int maxcon = MAXCON;
int maxblack = MAXCON;
int blackcount;
@@ -961,6 +963,24 @@ handled:
}
}
+static int
+get_maxfiles(void)
+{
+ int mib[2], maxfiles;
+ size_t len;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_MAXFILES;
+ len = sizeof(maxfiles);
+ if (sysctl(mib, 2, &maxfiles, &len, NULL, 0) == -1)
+ return(MAXCON);
+ if ((maxfiles - 200) < 10)
+ errx(1, "kern.maxfiles is only %d, can not continue\n",
+ maxfiles);
+ else
+ return(maxfiles - 200);
+}
+
int
main(int argc, char *argv[])
{
@@ -992,7 +1012,11 @@ main(int argc, char *argv[])
if (gethostname(hostname, sizeof hostname) == -1)
err(1, "gethostname");
-
+ maxfiles = get_maxfiles();
+ if (maxcon > maxfiles)
+ maxcon = maxfiles;
+ if (maxblack > maxfiles)
+ maxblack = maxfiles;
while ((ch =
getopt(argc, argv, "45l:c:B:p:bdG:h:r:s:S:n:vw:y:Y:")) != -1) {
switch (ch) {
@@ -1011,8 +1035,12 @@ main(int argc, char *argv[])
break;
case 'c':
i = atoi(optarg);
- if (i > MAXCON)
+ if (i > maxfiles) {
+ fprintf(stderr,
+ "%d > system max of %d connections\n",
+ i, maxfiles);
usage();
+ }
maxcon = i;
break;
case 'p':