Mercurial > dovecot > core-2.2
annotate src/doveadm/doveadm-kick.c @ 19900:6f760a1def9f
doveadm kick: Don't show who command's help on duplicate network/username masks
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Sun, 28 Feb 2016 18:59:35 +0200 |
parents | 0f22db71df7a |
children | fb76c4085b27 |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19191
diff
changeset
|
1 /* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */ |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
2 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
3 #include "lib.h" |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
4 #include "array.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
5 #include "net.h" |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
6 #include "hash.h" |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
7 #include "doveadm.h" |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
8 #include "doveadm-who.h" |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
9 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
10 #include <stdio.h> |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
11 #include <unistd.h> |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
12 #include <sys/types.h> |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
13 #include <signal.h> |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
14 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
15 struct kick_user { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
16 const char *username; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
17 bool kick_me; /* true if username and/or ip[/mask] matches. |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
18 ignored when the -f switch is given. */ |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
19 }; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
20 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
21 struct kick_pid { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
22 pid_t pid; |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
23 ARRAY(struct kick_user) users; |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
24 bool kick; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
25 }; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
26 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
27 struct kick_context { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
28 struct who_context who; |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
29 HASH_TABLE(void *, struct kick_pid *) pids; |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
30 bool force_kick; |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
31 ARRAY(const char *) kicked_users; |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
32 }; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
33 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
34 static void |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
35 kick_aggregate_line(struct who_context *_ctx, const struct who_line *line) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
36 { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
37 struct kick_context *ctx = (struct kick_context *)_ctx; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
38 const bool user_match = who_line_filter_match(line, &ctx->who.filter); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
39 struct kick_pid *k_pid; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
40 struct kick_user new_user, *user; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
41 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
42 memset(&new_user, 0, sizeof(new_user)); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
43 |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
44 k_pid = hash_table_lookup(ctx->pids, POINTER_CAST(line->pid)); |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
45 if (k_pid == NULL) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
46 k_pid = p_new(ctx->who.pool, struct kick_pid, 1); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
47 k_pid->pid = line->pid; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
48 p_array_init(&k_pid->users, ctx->who.pool, 5); |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
49 hash_table_insert(ctx->pids, POINTER_CAST(line->pid), k_pid); |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
50 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
51 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
52 array_foreach_modifiable(&k_pid->users, user) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
53 if (strcmp(line->username, user->username) == 0) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
54 if (user_match) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
55 user->kick_me = TRUE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
56 return; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
57 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
58 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
59 new_user.username = p_strdup(ctx->who.pool, line->username); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
60 new_user.kick_me = user_match; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
61 array_append(&k_pid->users, &new_user, 1); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
62 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
63 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
64 static bool |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
65 kick_pid_want_kicked(struct kick_context *ctx, const struct kick_pid *k_pid, |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
66 bool *show_warning) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
67 { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
68 unsigned int kick_count = 0; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
69 const struct kick_user *user; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
70 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
71 if (array_count(&k_pid->users) == 1) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
72 user = array_idx(&k_pid->users, 0); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
73 if (!user->kick_me) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
74 return FALSE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
75 } else { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
76 array_foreach(&k_pid->users, user) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
77 if (user->kick_me) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
78 kick_count++; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
79 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
80 if (kick_count == 0) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
81 return FALSE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
82 if (kick_count < array_count(&k_pid->users) && |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
83 !ctx->force_kick) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
84 array_foreach(&k_pid->users, user) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
85 if (!user->kick_me) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
86 array_append(&ctx->kicked_users, |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
87 &user->username, 1); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
88 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
89 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
90 *show_warning = TRUE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
91 return FALSE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
92 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
93 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
94 return TRUE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
95 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
96 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
97 static void |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
98 kick_print_kicked(struct kick_context *ctx, const bool show_warning) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
99 { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
100 unsigned int i, count; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
101 const char *const *users; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
102 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
103 if (array_count(&ctx->kicked_users) == 0) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
104 printf("no users kicked\n"); |
14137
0a5951b08478
doveadm: Improved error handling. Failures should now always have non-zero exit code.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
105 doveadm_exit_code = DOVEADM_EX_NOTFOUND; |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
106 return; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
107 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
108 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
109 if (show_warning) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
110 printf("warning: other connections would also be " |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
111 "kicked from following users:\n"); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
112 } else |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
113 printf("kicked connections from the following users:\n"); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
114 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
115 array_sort(&ctx->kicked_users, i_strcmp_p); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
116 users = array_get(&ctx->kicked_users, &count); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
117 printf("%s ", users[0]); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
118 for (i = 1; i < count; i++) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
119 if (strcmp(users[i-1], users[i]) != 0) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
120 printf("%s ", users[i]); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
121 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
122 printf("\n"); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
123 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
124 if (show_warning) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
125 printf("Use the '-f' option to enforce the disconnect.\n"); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
126 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
127 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
128 static void kick_users(struct kick_context *ctx) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
129 { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
130 bool show_enforce_warning = FALSE; |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
131 struct hash_iterate_context *iter; |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
132 void *key; |
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
133 struct kick_pid *k_pid; |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
134 const struct kick_user *user; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
135 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
136 p_array_init(&ctx->kicked_users, ctx->who.pool, 10); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
137 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
138 iter = hash_table_iterate_init(ctx->pids); |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
139 while (hash_table_iterate(iter, ctx->pids, &key, &k_pid)) { |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
140 if (kick_pid_want_kicked(ctx, k_pid, &show_enforce_warning)) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
141 k_pid->kick = TRUE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
142 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
143 hash_table_iterate_deinit(&iter); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
144 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
145 if (show_enforce_warning) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
146 kick_print_kicked(ctx, show_enforce_warning); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
147 return; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
148 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
149 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
150 iter = hash_table_iterate_init(ctx->pids); |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
151 while (hash_table_iterate(iter, ctx->pids, &key, &k_pid)) { |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
152 if (!k_pid->kick) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
153 continue; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
154 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
155 if (kill(k_pid->pid, SIGTERM) < 0 && errno != ESRCH) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
156 fprintf(stderr, "kill(%s, SIGTERM) failed: %m\n", |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
157 dec2str(k_pid->pid)); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
158 } else { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
159 array_foreach(&k_pid->users, user) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
160 array_append(&ctx->kicked_users, |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
161 &user->username, 1); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
162 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
163 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
164 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
165 hash_table_iterate_deinit(&iter); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
166 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
167 kick_print_kicked(ctx, show_enforce_warning); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
168 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
169 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
170 static void cmd_kick(int argc, char *argv[]) |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
171 { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
172 struct kick_context ctx; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
173 int c; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
174 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
175 memset(&ctx, 0, sizeof(ctx)); |
11357
43a5acc09eb8
doveadm: Look up sockets from base_dir rather than hardcoded PKG_RUNDIR.
Timo Sirainen <tss@iki.fi>
parents:
11093
diff
changeset
|
176 ctx.who.anvil_path = t_strconcat(doveadm_settings->base_dir, "/anvil", NULL); |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
177 ctx.force_kick = FALSE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
178 ctx.who.pool = pool_alloconly_create("kick pids", 10240); |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
179 hash_table_create_direct(&ctx.pids, ctx.who.pool, 0); |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
180 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
181 while ((c = getopt(argc, argv, "a:f")) > 0) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
182 switch (c) { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
183 case 'a': |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
184 ctx.who.anvil_path = optarg; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
185 break; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
186 case 'f': |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
187 ctx.force_kick = TRUE; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
188 break; |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
189 default: |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
190 help(&doveadm_cmd_kick); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
191 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
192 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
193 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
194 argv += optind - 1; |
14137
0a5951b08478
doveadm: Improved error handling. Failures should now always have non-zero exit code.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
195 if (argv[1] == NULL) { |
0a5951b08478
doveadm: Improved error handling. Failures should now always have non-zero exit code.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
196 i_fatal_status(EX_USAGE, |
0a5951b08478
doveadm: Improved error handling. Failures should now always have non-zero exit code.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
197 "user and/or ip[/bits] must be specified."); |
0a5951b08478
doveadm: Improved error handling. Failures should now always have non-zero exit code.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
198 } |
19900
6f760a1def9f
doveadm kick: Don't show who command's help on duplicate network/username masks
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
199 if (who_parse_args(&ctx.who, (const char *const *)argv + 1) < 0) |
6f760a1def9f
doveadm kick: Don't show who command's help on duplicate network/username masks
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
200 help(&doveadm_cmd_kick); |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
201 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
202 who_lookup(&ctx.who, kick_aggregate_line); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
203 kick_users(&ctx); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
204 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
205 hash_table_destroy(&ctx.pids); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
206 pool_unref(&ctx.who.pool); |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
207 } |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
208 |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
209 struct doveadm_cmd doveadm_cmd_kick = { |
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
210 cmd_kick, "kick", |
11849
875598cd7e26
doveadm: Removed long usage from doveadm commands.
Pascal Volk <user@localhost.localdomain.org>
parents:
11357
diff
changeset
|
211 "[-a <anvil socket path>] [-f] <user mask>[|]<ip/bits>" |
10945
b13e01d82083
doveadm: Added doveadm kick command.
Pascal Volk <user@localhost.localdomain.org>
parents:
diff
changeset
|
212 }; |