doveadm-kick.c revision 678d0463849ba777106eb7875f27db07a5d8e3df
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen bool kick_me; /* true if username and/or ip[/mask] matches.
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ignored when the -f switch is given. */
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainenkick_aggregate_line(struct who_context *_ctx, const struct who_line *line)
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen struct kick_context *ctx = (struct kick_context *)_ctx;
a18335e18aac7fc219b6f18dde083359155cc524Timo Sirainen const bool user_match = who_line_filter_match(line, &ctx->who.filter);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen k_pid = hash_table_lookup(ctx->pids, line->pid);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen k_pid = p_new(ctx->who.pool, struct kick_pid, 1);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen p_array_init(&k_pid->users, ctx->who.pool, 5);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen hash_table_insert(ctx->pids, line->pid, k_pid);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen array_foreach_modifiable(&k_pid->users, user) {
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainen if (strcmp(line->username, user->username) == 0) {
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen new_user.username = p_strdup(ctx->who.pool, line->username);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenkick_pid_want_kicked(struct kick_context *ctx, const struct kick_pid *k_pid,
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen unsigned int kick_count = 0;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (kick_count < array_count(&k_pid->users) &&
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenkick_print_kicked(struct kick_context *ctx, const bool show_warning)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen unsigned int i, count;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen const char *const *users;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen printf("warning: other connections would also be "
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen "kicked from following users:\n");
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen printf("kicked connections from the following users:\n");
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen users = array_get(&ctx->kicked_users, &count);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen printf("Use the '-f' option to enforce the disconnect.\n");
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic void kick_users(struct kick_context *ctx)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen p_array_init(&ctx->kicked_users, ctx->who.pool, 10);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen while (hash_table_iterate(iter, &key, &value)) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (kick_pid_want_kicked(ctx, k_pid, &show_enforce_warning))
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen while (hash_table_iterate(iter, &key, &value)) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen if (kill(k_pid->pid, SIGTERM) < 0 && errno != ESRCH) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen fprintf(stderr, "kill(%s, SIGTERM) failed: %m\n",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx.who.anvil_path = t_strconcat(doveadm_settings->base_dir, "/anvil", NULL);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen ctx.who.pool = pool_alloconly_create("kick pids", 10240);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen hash_table_create_direct(&ctx.pids, ctx.who.pool, 0);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen "user and/or ip[/bits] must be specified.");
074055dadbca01626437cc4724853a374acab6a8Timo Sirainen "[-a <anvil socket path>] [-f] <user mask>[|]<ip/bits>"