xref: /openbsd-src/usr.sbin/smtpd/limit.c (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*	$OpenBSD: limit.c,v 1.5 2016/06/15 19:59:03 gilles Exp $	*/
2 
3 /*
4  * Copyright (c) 2013 Eric Faurot <eric@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/queue.h>
21 #include <sys/tree.h>
22 #include <sys/socket.h>
23 
24 #include <ctype.h>
25 #include <err.h>
26 #include <event.h>
27 #include <fcntl.h>
28 #include <imsg.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <limits.h>
32 #include <string.h>
33 
34 #include "smtpd.h"
35 #include "log.h"
36 
37 void
38 limit_mta_set_defaults(struct mta_limits *limits)
39 {
40 	limits->maxconn_per_host = 10;
41 	limits->maxconn_per_route = 5;
42 	limits->maxconn_per_source = 100;
43 	limits->maxconn_per_connector = 20;
44 	limits->maxconn_per_relay = 100;
45 	limits->maxconn_per_domain = 100;
46 
47 	limits->conndelay_host = 0;
48 	limits->conndelay_route = 5;
49 	limits->conndelay_source = 0;
50 	limits->conndelay_connector = 0;
51 	limits->conndelay_relay = 2;
52 	limits->conndelay_domain = 0;
53 
54 	limits->discdelay_route = 3;
55 
56 	limits->max_mail_per_session = 100;
57 	limits->sessdelay_transaction = 0;
58 	limits->sessdelay_keepalive = 10;
59 
60 	limits->max_failures_per_session = 25;
61 
62 	limits->family = AF_UNSPEC;
63 
64 	limits->task_hiwat = 50;
65 	limits->task_lowat = 30;
66 	limits->task_release = 10;
67 }
68 
69 int
70 limit_mta_set(struct mta_limits *limits, const char *key, int64_t value)
71 {
72 	if (!strcmp(key, "max-conn-per-host"))
73 		limits->maxconn_per_host = value;
74 	else if (!strcmp(key, "max-conn-per-route"))
75 		limits->maxconn_per_route = value;
76 	else if (!strcmp(key, "max-conn-per-source"))
77 		limits->maxconn_per_source = value;
78 	else if (!strcmp(key, "max-conn-per-connector"))
79 		limits->maxconn_per_connector = value;
80 	else if (!strcmp(key, "max-conn-per-relay"))
81 		limits->maxconn_per_relay = value;
82 	else if (!strcmp(key, "max-conn-per-domain"))
83 		limits->maxconn_per_domain = value;
84 
85 	else if (!strcmp(key, "conn-delay-host"))
86 		limits->conndelay_host = value;
87 	else if (!strcmp(key, "conn-delay-route"))
88 		limits->conndelay_route = value;
89 	else if (!strcmp(key, "conn-delay-source"))
90 		limits->conndelay_source = value;
91 	else if (!strcmp(key, "conn-delay-connector"))
92 		limits->conndelay_connector = value;
93 	else if (!strcmp(key, "conn-delay-relay"))
94 		limits->conndelay_relay = value;
95 	else if (!strcmp(key, "conn-delay-domain"))
96 		limits->conndelay_domain = value;
97 
98 	else if (!strcmp(key, "reconn-delay-route"))
99 		limits->discdelay_route = value;
100 
101 	else if (!strcmp(key, "session-mail-max"))
102 		limits->max_mail_per_session = value;
103 	else if (!strcmp(key, "session-transaction-delay"))
104 		limits->sessdelay_transaction = value;
105 	else if (!strcmp(key, "session-keepalive"))
106 		limits->sessdelay_keepalive = value;
107 
108 	else if (!strcmp(key, "max-failures-per-session"))
109 		limits->max_failures_per_session = value;
110 
111 	else if (!strcmp(key, "task-hiwat"))
112 		limits->task_hiwat = value;
113 	else if (!strcmp(key, "task-lowat"))
114 		limits->task_lowat = value;
115 	else if (!strcmp(key, "task-release"))
116 		limits->task_release = value;
117 
118 	else
119 		return (0);
120 
121 	return (1);
122 }
123