indexer-client.c revision a8c5a86d183db25a57bf193c06b41e092ec2e151
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen/* Copyright (c) 2011-2014 Dovecot authors, see the included COPYING file */
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen#define INDEXER_CLIENT_PROTOCOL_MAJOR_VERSION 1
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainen#define INDEXER_CLIENT_PROTOCOL_MINOR_VERSION 0
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen unsigned int tag;
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenstatic unsigned int clients_count = 0;
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenstatic void indexer_client_destroy(struct indexer_client *client);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenstatic void indexer_client_ref(struct indexer_client *client);
0371406d952fe51367c7be91703e5634b7d9d225Timo Sirainenstatic void indexer_client_unref(struct indexer_client *client);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenstatic const char *const*
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenindexer_client_next_line(struct indexer_client *client)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen unsigned int i;
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen args = p_strsplit(pool_datastack_create(), line, "\t");
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return (void *)args;
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainenindexer_client_request_queue(struct indexer_client *client, bool append,
a0b89f3b1df99b3a32f44623f13ad1893118825bTimo Sirainen const char *const *args, const char **error_r)
24ce0c343cefe54af841871fa39dbc3464028b06Timo Sirainen /* <tag> <user> <mailbox> [<max_recent_msgs>] */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen else if (str_to_uint(args[3], &max_recent_msgs) < 0) {
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen ctx = i_new(struct indexer_client_request, 1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen indexer_queue_append(client->queue, append, args[1], args[2],
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen o_stream_nsend_str(client->output, t_strdup_printf("%u\tOK\n", tag));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenindexer_client_request_optimize(struct indexer_client *client,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *const *args, const char **error_r)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen unsigned int tag;
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen /* <tag> <user> <mailbox> */
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen ctx = i_new(struct indexer_client_request, 1);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen indexer_queue_append_optimize(client->queue, args[1], args[2], ctx);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen o_stream_nsend_str(client->output, t_strdup_printf("%u\tOK\n", tag));
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenindexer_client_request(struct indexer_client *client,
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen const char *const *args, const char **error_r)
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen return indexer_client_request_queue(client, TRUE, args, error_r);
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen return indexer_client_request_queue(client, FALSE, args, error_r);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen return indexer_client_request_optimize(client, args, error_r);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen *error_r = t_strconcat("Unknown command: ", cmd, NULL);
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainenstatic void indexer_client_input(struct indexer_client *client)
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen i_error("BUG: Client connection sent too much data");
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if ((line = i_stream_next_line(client->input)) == NULL)
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen i_error("Client not compatible with this server "
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainen "(mixed old and new binaries?)");
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen while ((args = indexer_client_next_line(client)) != NULL) {
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen if (indexer_client_request(client, args, &error) < 0) {
dc9de21d4375faeedbe5b7e941502ac578650da9Timo Sirainenvoid indexer_client_status_callback(int percentage, void *context)
6c2c5f20760b06bfb4a40b0ee2ef5ab016bc41f0Timo Sirainen t_strdup_printf("%u\t%d\n", ctx->tag, percentage));
struct indexer_client *
return client;
unsigned int indexer_clients_get_count(void)
return clients_count;
void indexer_clients_destroy_all(void)