Mercurial > dovecot > core-2.2
annotate src/anvil/connect-limit.c @ 14133:ba770cba5598
Updated copyright notices to include year 2012.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 12 Feb 2012 18:55:28 +0200 |
parents | 447bce266022 |
children | ca37d1577291 |
rev | line source |
---|---|
14133
ba770cba5598
Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
1 /* Copyright (c) 2009-2012 Dovecot authors, see the included COPYING file */ |
9235
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "common.h" |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "hash.h" |
10145
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
5 #include "str.h" |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
6 #include "strescape.h" |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
7 #include "ostream.h" |
9235
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "connect-limit.h" |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 struct ident_pid { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 /* ident string points to ident_hash keys */ |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 const char *ident; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 pid_t pid; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 unsigned int refcount; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 }; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct connect_limit { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 /* ident => refcount */ |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct hash_table *ident_hash; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 /* struct ident_pid => struct ident_pid */ |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct hash_table *ident_pid_hash; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 }; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 static unsigned int ident_pid_hash(const void *p) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 const struct ident_pid *i = p; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 return str_hash(i->ident) ^ i->pid; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 static int ident_pid_cmp(const void *p1, const void *p2) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 const struct ident_pid *i1 = p1, *i2 = p2; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 if (i1->pid < i2->pid) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 return -1; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 else if (i1->pid > i2->pid) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 return 1; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 else |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 return strcmp(i1->ident, i2->ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct connect_limit *connect_limit_init(void) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 struct connect_limit *limit; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 limit = i_new(struct connect_limit, 1); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 limit->ident_hash = |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 hash_table_create(default_pool, default_pool, 0, |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 str_hash, (hash_cmp_callback_t *)strcmp); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 limit->ident_pid_hash = |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 hash_table_create(default_pool, default_pool, 0, |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 ident_pid_hash, ident_pid_cmp); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 return limit; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 void connect_limit_deinit(struct connect_limit **_limit) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 struct connect_limit *limit = *_limit; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 *_limit = NULL; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 hash_table_destroy(&limit->ident_hash); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 hash_table_destroy(&limit->ident_pid_hash); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 i_free(limit); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 unsigned int connect_limit_lookup(struct connect_limit *limit, |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 const char *ident) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 void *value; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 value = hash_table_lookup(limit->ident_hash, ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if (value == NULL) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 return 0; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 return POINTER_CAST_TO(value, unsigned int); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 void connect_limit_connect(struct connect_limit *limit, pid_t pid, |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 const char *ident) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 struct ident_pid *i, lookup_i; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 void *key, *value; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 if (!hash_table_lookup_full(limit->ident_hash, ident, &key, &value)) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 key = i_strdup(ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 value = POINTER_CAST(1); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 hash_table_insert(limit->ident_hash, key, value); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } else { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 value = POINTER_CAST(POINTER_CAST_TO(value, unsigned int) + 1); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 hash_table_update(limit->ident_hash, key, value); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 lookup_i.ident = ident; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 lookup_i.pid = pid; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 i = hash_table_lookup(limit->ident_pid_hash, &lookup_i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 if (i == NULL) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 i = i_new(struct ident_pid, 1); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 i->ident = key; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 i->pid = pid; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 i->refcount = 1; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 hash_table_insert(limit->ident_pid_hash, i, i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 } else { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 i->refcount++; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 static void |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 connect_limit_ident_hash_unref(struct connect_limit *limit, const char *ident) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 void *key, *value; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 unsigned int new_refcount; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 if (!hash_table_lookup_full(limit->ident_hash, ident, &key, &value)) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 i_panic("connect limit hash tables are inconsistent"); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 new_refcount = POINTER_CAST_TO(value, unsigned int) - 1; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 if (new_refcount > 0) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 value = POINTER_CAST(new_refcount); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 hash_table_update(limit->ident_hash, key, value); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 } else { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 hash_table_remove(limit->ident_hash, key); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 i_free(key); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 void connect_limit_disconnect(struct connect_limit *limit, pid_t pid, |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 const char *ident) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 struct ident_pid *i, lookup_i; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 lookup_i.ident = ident; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 lookup_i.pid = pid; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 i = hash_table_lookup(limit->ident_pid_hash, &lookup_i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 if (i == NULL) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 i_error("connect limit: disconnection for unknown " |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 "pid %s + ident %s", dec2str(pid), ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 return; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 if (--i->refcount == 0) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 hash_table_remove(limit->ident_pid_hash, i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 i_free(i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 connect_limit_ident_hash_unref(limit, ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 void connect_limit_disconnect_pid(struct connect_limit *limit, pid_t pid) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 struct hash_iterate_context *iter; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 struct ident_pid *i; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 void *key, *value; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 /* this should happen rarely (or never), so this slow implementation |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 should be fine. */ |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 iter = hash_table_iterate_init(limit->ident_pid_hash); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 while (hash_table_iterate(iter, &key, &value)) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 i = key; |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 if (i->pid == pid) { |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 hash_table_remove(limit->ident_pid_hash, i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 for (; i->refcount > 0; i->refcount--) |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 connect_limit_ident_hash_unref(limit, i->ident); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 i_free(i); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 } |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 hash_table_iterate_deinit(&iter); |
2e2b957f1cca
Implemented anvil service, which is used to implement mail_max_userip_connections.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 } |
10145
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
170 |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
171 void connect_limit_dump(struct connect_limit *limit, struct ostream *output) |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
172 { |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
173 struct hash_iterate_context *iter; |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
174 void *key, *value; |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
175 string_t *str = t_str_new(256); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
176 |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
177 iter = hash_table_iterate_init(limit->ident_pid_hash); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
178 while (hash_table_iterate(iter, &key, &value)) { |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
179 struct ident_pid *i = key; |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
180 |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
181 str_truncate(str, 0); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
182 str_tabescape_write(str, i->ident); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
183 str_printfa(str, "\t%ld\t%u\n", (long)i->pid, i->refcount); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
184 if (o_stream_send(output, str_data(str), str_len(str)) < 0) |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
185 break; |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
186 } |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
187 hash_table_iterate_deinit(&iter); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
188 (void)o_stream_send(output, "\n", 1); |
1110edddec36
anvil: Added CONNECT-DUMP command to dump connect-limit state.
Timo Sirainen <tss@iki.fi>
parents:
9235
diff
changeset
|
189 } |