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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 };