doveadm-mail-server.c revision db4cad7df8f3a1a584b1f72a06995b188871dc5a
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (c) 2010-2011 Dovecot authors, see the included COPYING file */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen (internal_failure || master_service_is_killed(master_service))
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic struct doveadm_mail_cmd_context *cmd_ctx;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void doveadm_mail_server_handle(struct server_connection *conn,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainendoveadm_server_get(struct doveadm_mail_cmd_context *ctx, const char *name)
4ee00532a265bdfb38539d811fcd12d51210ac35Timo Sirainen server_pool = pool_alloconly_create("doveadm servers", 1024*16);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen servers = hash_table_create(default_pool, server_pool, 0,
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen server = p_new(server_pool, struct doveadm_server, 1);
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen server->name = dup_name = p_strdup(server_pool, name);
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainen p_array_init(&server->connections, server_pool,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainendoveadm_server_find_unused_conn(struct doveadm_server *server)
8a0ad174adb1eb5108511b90e97f4e5f9089b0eeTimo Sirainenstatic bool doveadm_server_have_used_connections(struct doveadm_server *server)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void doveadm_cmd_callback(enum server_cmd_reply reply, void *context)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (reply == SERVER_CMD_REPLY_INTERNAL_FAILURE) {
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainen char *const *usernamep = array_idx(&server->queue, 0);
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainen conn = doveadm_server_find_unused_conn(server);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void doveadm_mail_server_handle(struct server_connection *conn,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen unsigned int i;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen /* <flags> <username> <command> [<args>] */
2649b237dd4690575e75a30b2bf3b39ebd37b835Timo Sirainen server_connection_cmd(conn, str_c(cmd), doveadm_cmd_callback, conn);
a24519c36d5f8fa22f58b2c693ba547e8d175a54Timo Sirainenstatic void doveadm_server_flush_one(struct doveadm_server *server)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen unsigned int count = array_count(&server->queue);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen } while (array_count(&server->queue) == count &&
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen doveadm_server_have_used_connections(server) &&
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainendoveadm_mail_server_user_get_host(struct doveadm_mail_cmd_context *ctx,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen const struct mail_storage_service_input *input,
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen unsigned int i;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen /* make sure we have an auth connection */
5214b67a7dabab87da74e04bb8b227f94b95bce4Timo Sirainen mail_storage_service_init_settings(ctx->storage_service, input);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen info.service = master_service_get_name(master_service);
360123b1b41b7aa8af6c4a91c39046be646cd349Timo Sirainen pool = pool_alloconly_create("auth lookup", 1024);
12b4dbf933ee54f7b96968ba150095baa985fdafTimo Sirainen auth_conn = mail_storage_service_get_auth_conn(ctx->storage_service);
12b4dbf933ee54f7b96968ba150095baa985fdafTimo Sirainen ret = auth_master_pass_lookup(auth_conn, input->username, &info,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen } else if (ret == 0) {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen /* user not found from passdb. it could be in userdb though,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen so just continue with the default host */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen (fields[i][5] == '\0' || fields[i][5] == '='))
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen *error_r = "Proxy is missing destination host";
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
db8b0a3f74a20528d66a3c4be7df920e5c4554c2Timo Sirainen const struct mail_storage_service_input *input,
db8b0a3f74a20528d66a3c4be7df920e5c4554c2Timo Sirainen const char **error_r)
adb6413686e52e00dded4932babcc08ff041876bTimo Sirainen ret = doveadm_mail_server_user_get_host(ctx, input, &host, error_r);
0bf25546c91ccafff9e2cc93368d2d25acb5c39eTimo Sirainen (ctx->set->doveadm_worker_count == 0 || doveadm_server)) {
0bf25546c91ccafff9e2cc93368d2d25acb5c39eTimo Sirainen /* run it ourself */
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainen /* server sends the sticky headers for each row as well,
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainen so undo any sticks we might have added already */
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainen conn = doveadm_server_find_unused_conn(server);
b365bd121cdc87f63e1dd47c5085a27091118e00Timo Sirainen doveadm_mail_server_handle(conn, input->username);
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainen doveadm_mail_server_handle(conn, input->username);
02e61e13a8360a9d3ec92c5fa5ae60c0f0181b71Timo Sirainen if (array_count(&server->queue) >= DOVEADM_SERVER_QUEUE_MAX)
c1d19144dd7b1de6822df6ed1d10af0c9cb38840Timo Sirainen array_append(&server->queue, &username_dup, 1);
c1d19144dd7b1de6822df6ed1d10af0c9cb38840Timo Sirainenstatic struct doveadm_server *doveadm_server_find_used(void)
c1d19144dd7b1de6822df6ed1d10af0c9cb38840Timo Sirainen while (hash_table_iterate(iter, &key, &value)) {
c1d19144dd7b1de6822df6ed1d10af0c9cb38840Timo Sirainen if (doveadm_server_have_used_connections(server)) {
94b0ff77495c3ed14bdd4b5d7ae1eb37e8c9efb5Timo Sirainenstatic void doveadm_servers_destroy_all_connections(void)
5214b67a7dabab87da74e04bb8b227f94b95bce4Timo Sirainen while (hash_table_iterate(iter, &key, &value)) {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen while (array_count(&server->connections) > 0) {
adb6413686e52e00dded4932babcc08ff041876bTimo Sirainen struct server_connection *const *connp, *conn;
1c1cecd3dfaf71b0c9499b044023e631841e88aaTimo Sirainen while ((server = doveadm_server_find_used()) != NULL &&