#include "master-login.h"
#include "master-service-settings.h"
#include "master-interface.h"
+#include "master-admin-client.h"
#include "var-expand.h"
#include "mail-error.h"
#include "mail-user.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 = submission_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 */
login_set.callback = login_client_connected;
login_set.failure_callback = login_client_failed;
+ master_admin_clients_init(&admin_callbacks);
master_service_set_die_callback(master_service, submission_die);
storage_service =
array_push_back(&client->extra_capabilities, &cap);
}
-void clients_destroy_all(void)
+void client_kick(struct client *client)
{
- while (submission_clients != NULL) {
- struct client *client = submission_clients;
+ mail_storage_service_io_activate_user(client->service_user);
+ client_destroy(&client, "4.3.2", "Shutting down");
+}
- mail_storage_service_io_activate_user(client->service_user);
- client_destroy(&client, "4.3.2", "Shutting down");
- }
+void clients_destroy_all(void)
+{
+ while (submission_clients != NULL)
+ client_kick(submission_clients);
}
static const struct smtp_server_callbacks smtp_callbacks = {
bool no_greeting);
void client_destroy(struct client **client, const char *prefix,
const char *reason) ATTR_NULL(2, 3);
+void client_kick(struct client *client);
typedef void (*client_input_callback_t)(struct client *context);