198
201
static void cmd_select_finish(struct imap_select_context *ctx, int ret)
203
const char *resp_code;
204
struct timeval end_time;
201
208
if (ctx->box != NULL)
202
209
mailbox_free(&ctx->box);
203
210
ctx->cmd->client->mailbox = NULL;
205
client_send_tagline(ctx->cmd, mailbox_is_readonly(ctx->box) ?
206
"OK [READ-ONLY] Select completed." :
207
"OK [READ-WRITE] Select completed.");
212
resp_code = mailbox_is_readonly(ctx->box) ?
213
"READ-ONLY" : "READ-WRITE";
214
if (gettimeofday(&end_time, NULL) < 0)
215
memset(&end_time, 0, sizeof(end_time));
216
time_msecs = timeval_diff_msecs(&end_time, &ctx->start_time);
217
client_send_tagline(ctx->cmd, t_strdup_printf(
218
"OK [%s] %s completed (%d.%03d secs).", resp_code,
219
ctx->cmd->client->mailbox_examined ? "Examine" : "Select",
220
time_msecs/1000, time_msecs%1000));
209
222
select_context_free(ctx);
214
227
struct imap_select_context *ctx = cmd->context;
217
if (imap_fetch_more(ctx->fetch_ctx) == 0) {
230
if (imap_fetch_more(ctx->fetch_ctx, cmd) == 0) {
222
ret = imap_fetch_deinit(ctx->fetch_ctx);
235
ret = imap_fetch_end(ctx->fetch_ctx);
224
237
client_send_storage_error(ctx->cmd,
225
238
mailbox_get_storage(ctx->box));
240
imap_fetch_free(&ctx->fetch_ctx);
227
241
cmd_select_finish(ctx, ret);
233
247
struct imap_fetch_context *fetch_ctx;
234
248
struct mail_search_args *search_args;
249
struct imap_fetch_qresync_args qresync_args;
236
251
search_args = mail_search_build_init();
237
252
search_args->args = p_new(search_args->pool, struct mail_search_arg, 1);
238
253
search_args->args->type = SEARCH_UIDSET;
239
254
search_args->args->value.seqset = ctx->qresync_known_uids;
241
fetch_ctx = imap_fetch_init(ctx->cmd, ctx->box);
242
if (fetch_ctx == NULL)
245
fetch_ctx->search_args = search_args;
246
fetch_ctx->send_vanished = TRUE;
247
fetch_ctx->qresync_sample_seqset = &ctx->qresync_sample_seqset;
248
fetch_ctx->qresync_sample_uidset = &ctx->qresync_sample_uidset;
250
if (!imap_fetch_add_changed_since(fetch_ctx, ctx->qresync_modseq) ||
251
!imap_fetch_init_handler(fetch_ctx, "UID", NULL) ||
252
!imap_fetch_init_handler(fetch_ctx, "FLAGS", NULL) ||
253
!imap_fetch_init_handler(fetch_ctx, "MODSEQ", NULL)) {
254
(void)imap_fetch_deinit(fetch_ctx);
258
if (imap_fetch_begin(fetch_ctx) == 0) {
259
if (imap_fetch_more(fetch_ctx) == 0) {
261
ctx->fetch_ctx = fetch_ctx;
262
ctx->cmd->state = CLIENT_COMMAND_STATE_WAIT_OUTPUT;
264
ctx->cmd->func = cmd_select_continue;
265
ctx->cmd->context = ctx;
270
return imap_fetch_deinit(fetch_ctx) < 0 ? -1 : 1;
255
imap_search_add_changed_since(search_args, ctx->qresync_modseq);
257
memset(&qresync_args, 0, sizeof(qresync_args));
258
qresync_args.qresync_sample_seqset = &ctx->qresync_sample_seqset;
259
qresync_args.qresync_sample_uidset = &ctx->qresync_sample_uidset;
261
if (imap_fetch_send_vanished(ctx->cmd->client, ctx->box,
262
search_args, &qresync_args) < 0) {
263
mail_search_args_unref(&search_args);
267
fetch_ctx = imap_fetch_alloc(ctx->cmd->client, ctx->cmd->pool);
269
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_uid_init);
270
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_flags_init);
271
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_modseq_init);
273
imap_fetch_begin(fetch_ctx, ctx->box, search_args);
274
mail_search_args_unref(&search_args);
276
if (imap_fetch_more(fetch_ctx, ctx->cmd) == 0) {
278
ctx->fetch_ctx = fetch_ctx;
279
ctx->cmd->state = CLIENT_COMMAND_STATE_WAIT_OUTPUT;
281
ctx->cmd->func = cmd_select_continue;
282
ctx->cmd->context = ctx;
285
if (imap_fetch_end(fetch_ctx) < 0)
287
imap_fetch_free(&fetch_ctx);
304
322
STATUS_HIGHESTMODSEQ, &status);
306
324
client->mailbox = ctx->box;
307
client->select_counter++;
308
325
client->mailbox_examined = readonly;
309
326
client->messages_count = status.messages;
310
327
client->recent_count = status.recent;
311
328
client->uidvalidity = status.uidvalidity;
329
client->notify_uidnext = status.uidnext;
313
331
client_update_mailbox_flags(client, status.keywords);
314
332
client_send_mailbox_flags(client, TRUE);
386
404
if (!imap_arg_get_astring(args, &mailbox)) {
405
close_selected_mailbox(client);
387
406
client_send_command_error(cmd, "Invalid arguments.");
388
close_selected_mailbox(client);
392
410
ctx = p_new(cmd->pool, struct imap_select_context, 1);
394
ctx->ns = client_find_namespace(cmd, &mailbox);
412
ctx->ns = client_find_namespace_full(cmd->client, &mailbox, &error);
395
413
if (ctx->ns == NULL) {
396
414
close_selected_mailbox(client);
415
client_send_tagline(cmd, error);
418
(void)gettimeofday(&ctx->start_time, NULL);
400
420
if (imap_arg_get_list(&args[1], &list_args)) {
401
421
if (!select_parse_options(ctx, list_args)) {