imap_client_enable_qresync);
}
+void client_kick(struct client *client)
+{
+ mail_storage_service_io_activate_user(client->service_user);
+ if (client->output_cmd_lock == NULL)
+ client_send_line(client, "* BYE Server shutting down.");
+ client_destroy(client, "Server shutting down.");
+}
+
void clients_destroy_all(void)
{
- while (imap_clients != NULL) {
- mail_storage_service_io_activate_user(imap_clients->service_user);
- if (imap_clients->output_cmd_lock == NULL)
- client_send_line(imap_clients, "* BYE Server shutting down.");
- client_destroy(imap_clients, "Server shutting down.");
- }
+ while (imap_clients != NULL)
+ client_kick(imap_clients);
}
struct imap_client_vfuncs imap_client_vfuncs = {
void client_disconnect(struct client *client, const char *reason);
void client_disconnect_with_error(struct client *client,
const char *client_error);
+void client_kick(struct client *client);
/* Add the given capability to the CAPABILITY reply. If imap_capability setting
has an explicit capability, nothing is changed. */
#include "master-interface.h"
#include "master-service.h"
#include "master-login.h"
+#include "master-admin-client.h"
#include "mail-user.h"
#include "mail-storage-service.h"
#include "smtp-submit-settings.h"
}
}
+static unsigned int
+master_admin_cmd_kick_user(const char *user, const guid_128_t conn_guid)
+{
+ struct client *client, *next;
+ unsigned int count = 0;
+
+ for (client = imap_clients; client != NULL; client = next) {
+ next = client->next;
+ if (strcmp(client->user->username, user) == 0 &&
+ (guid_128_is_empty(conn_guid) ||
+ guid_128_cmp(client->anvil_conn_guid, conn_guid) == 0))
+ client_kick(client);
+ }
+ return count;
+}
+
+static const struct master_admin_client_callback admin_callbacks = {
+ .cmd_kick_user = master_admin_cmd_kick_user,
+};
+
static void client_connected(struct master_service_connection *conn)
{
/* when running standalone, we shouldn't even get here */
if (strcmp(conn->name, "imap-master") == 0) {
/* restoring existing IMAP connection (e.g. from imap-idle) */
imap_master_client_create(conn->fd);
- } else {
- master_login_add(master_login, conn->fd);
+ return;
}
+ master_login_add(master_login, conn->fd);
}
int main(int argc, char *argv[])
}
}
+ master_admin_clients_init(&admin_callbacks);
master_service_set_die_callback(master_service, imap_die);
/* plugins may want to add commands, so this needs to be called early */