Mercurial > dovecot > core-2.2
annotate src/indexer/indexer-client.c @ 13095:268f76a75e51
indexer: Send OK reply to client with the given tag.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 22 Jul 2011 13:09:14 +0300 |
parents | 0faaceb2f83c |
children | af8c5e56d098 |
rev | line source |
---|---|
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2011 Dovecot authors, see the included COPYING file */ |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "llist.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "istream.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "ostream.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "strescape.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "master-service.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "indexer-queue.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "indexer-client.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdlib.h> |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <unistd.h> |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #define MAX_INBUF_SIZE (1024*64) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #define INDEXER_CLIENT_PROTOCOL_MAJOR_VERSION 1 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #define INDEXER_CLIENT_PROTOCOL_MINOR_VERSION 0 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct indexer_client { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 struct indexer_client *prev, *next; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 int refcount; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct indexer_queue *queue; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 int fd; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct istream *input; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct ostream *output; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct io *io; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 unsigned int version_received:1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 unsigned int handshaked:1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 unsigned int destroyed:1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 }; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 struct indexer_client_request { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 struct indexer_client *client; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 unsigned int tag; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 }; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 struct indexer_client *clients = NULL; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 static void indexer_client_destroy(struct indexer_client *client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 static void indexer_client_ref(struct indexer_client *client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 static void indexer_client_unref(struct indexer_client *client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 static const char *const* |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 indexer_client_next_line(struct indexer_client *client) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 const char *line; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 char **args; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 unsigned int i; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 line = i_stream_next_line(client->input); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 if (line == NULL) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 return NULL; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 args = p_strsplit(pool_datastack_create(), line, "\t"); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 for (i = 0; args[i] != NULL; i++) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 args[i] = str_tabunescape(args[i]); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 return (void *)args; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 static int |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 indexer_client_request_queue(struct indexer_client *client, bool append, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 const char *const *args, const char **error_r) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 struct indexer_client_request *ctx = NULL; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 unsigned int tag; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 if (str_array_length(args) != 3) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 *error_r = "Wrong parameter count"; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 return -1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 if (str_to_uint(args[0], &tag) < 0) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 *error_r = "Invalid tag"; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 return -1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 if (tag != 0) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 ctx = i_new(struct indexer_client_request, 1); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 ctx->client = client; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 ctx->tag = tag; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 indexer_client_ref(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 indexer_queue_append(client->queue, append, args[1], args[2], ctx); |
13095
268f76a75e51
indexer: Send OK reply to client with the given tag.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
88 o_stream_send_str(client->output, t_strdup_printf("%u\tOK\n", tag)); |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 return 0; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 static int |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 indexer_client_request(struct indexer_client *client, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 const char *const *args, const char **error_r) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 const char *cmd = args[0]; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 args++; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 if (strcmp(cmd, "APPEND") == 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 return indexer_client_request_queue(client, TRUE, args, error_r); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 else if (strcmp(cmd, "PREPEND") == 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 return indexer_client_request_queue(client, FALSE, args, error_r); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 else { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 *error_r = t_strconcat("Unknown command: ", cmd, NULL); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 return -1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 static void indexer_client_input(void *context) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 struct indexer_client *client = context; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 const char *line, *const *args, *error; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 switch (i_stream_read(client->input)) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 case -2: |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 i_error("BUG: Client connection sent too much data"); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 indexer_client_destroy(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 case -1: |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 indexer_client_destroy(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 if (!client->version_received) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 if ((line = i_stream_next_line(client->input)) == NULL) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 if (!version_string_verify(line, "indexer", |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 INDEXER_CLIENT_PROTOCOL_MAJOR_VERSION)) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 i_error("Client not compatible with this server " |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 "(mixed old and new binaries?)"); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 indexer_client_destroy(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 client->version_received = TRUE; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 while ((args = indexer_client_next_line(client)) != NULL) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 if (args[0] != NULL) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 if (indexer_client_request(client, args, &error) < 0) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 i_error("Client input error: %s", error); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 indexer_client_destroy(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 break; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 void indexer_client_status_callback(int percentage, void *context) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 struct indexer_client_request *ctx = context; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 T_BEGIN { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 o_stream_send_str(ctx->client->output, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 t_strdup_printf("%u\t%d\n", ctx->tag, percentage)); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } T_END; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 if (percentage < 0 || percentage == 100) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 indexer_client_unref(ctx->client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 i_free(ctx); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 struct indexer_client * |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 indexer_client_create(int fd, struct indexer_queue *queue) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 struct indexer_client *client; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 client = i_new(struct indexer_client, 1); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 client->refcount = 1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 client->queue = queue; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 client->fd = fd; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 client->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 client->output = o_stream_create_fd(fd, (size_t)-1, FALSE); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 client->io = io_add(fd, IO_READ, indexer_client_input, client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 DLLIST_PREPEND(&clients, client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 return client; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 static void indexer_client_destroy(struct indexer_client *client) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 if (client->destroyed) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 client->destroyed = TRUE; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 DLLIST_REMOVE(&clients, client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 io_remove(&client->io); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 i_stream_close(client->input); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 o_stream_close(client->output); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 if (close(client->fd) < 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 i_error("close(client) failed: %m"); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 client->fd = -1; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 indexer_client_unref(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 master_service_client_connection_destroyed(master_service); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 static void indexer_client_ref(struct indexer_client *client) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 i_assert(client->refcount > 0); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 client->refcount++; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 static void indexer_client_unref(struct indexer_client *client) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 i_assert(client->refcount > 0); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 if (--client->refcount > 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 return; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 i_stream_destroy(&client->input); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 o_stream_destroy(&client->output); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 i_free(client); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 void indexer_clients_destroy_all(void) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 while (clients != NULL) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 indexer_client_destroy(clients); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 } |