static void client_destroy(struct client *client) { char **app; i_set_failure_prefix("imap-urlauth[%s](%s): ", my_pid, client->access_user); if (client->url != NULL) { /* deinitialize url */ i_stream_close(client->input); o_stream_close(client->output); (void)client_run_url(client); i_assert(client->url == NULL); } imap_urlauth_worker_client_count--; DLLIST_REMOVE(&imap_urlauth_worker_clients, client); if (client->urlauth_ctx != NULL) imap_urlauth_deinit(&client->urlauth_ctx); if (client->mail_user != NULL) mail_user_unref(&client->mail_user); if (client->io != NULL) io_remove(&client->io); if (client->ctrl_io != NULL) io_remove(&client->ctrl_io); if (client->to_idle != NULL) timeout_remove(&client->to_idle); if (client->input != NULL) i_stream_destroy(&client->input); if (client->output != NULL) o_stream_destroy(&client->output); if (client->ctrl_input != NULL) i_stream_destroy(&client->ctrl_input); if (client->ctrl_output != NULL) o_stream_destroy(&client->ctrl_output); if (client->fd_in >= 0) net_disconnect(client->fd_in); if (client->fd_out >= 0 && client->fd_in != client->fd_out) net_disconnect(client->fd_out); if (client->fd_ctrl >= 0) net_disconnect(client->fd_ctrl); if (client->service_user != NULL) mail_storage_service_user_free(&client->service_user); i_free(client->access_user); array_foreach_modifiable(&client->access_apps, app) i_free(*app); array_free(&client->access_apps); i_free(client); imap_urlauth_worker_refresh_proctitle(); master_service_client_connection_destroyed(master_service); }
void client_search_updates_free(struct client *client) { struct imap_search_update *update; if (!array_is_created(&client->search_updates)) return; array_foreach_modifiable(&client->search_updates, update) imap_search_update_free(update); array_clear(&client->search_updates); }
static int pop3_map_read(struct mail_storage *storage) { struct pop3_migration_mail_storage *mstorage = POP3_MIGRATION_CONTEXT(storage); struct mailbox *pop3_box = mstorage->pop3_box; struct mailbox_transaction_context *t; struct mail_search_args *search_args; struct mail_search_context *ctx; struct mail *mail; struct pop3_uidl_map *map; const char *uidl; uoff_t size; int ret = 0; if (array_is_created(&mstorage->pop3_uidl_map)) { /* already read these, just reset the imap_uids */ array_foreach_modifiable(&mstorage->pop3_uidl_map, map) map->imap_uid = 0; return 0; } i_array_init(&mstorage->pop3_uidl_map, 128); if (mailbox_sync(pop3_box, 0) < 0) { i_error("pop3_migration: Couldn't sync mailbox %s: %s", pop3_box->vname, mailbox_get_last_error(pop3_box, NULL)); return -1; } t = mailbox_transaction_begin(pop3_box, 0); search_args = mail_search_build_init(); mail_search_build_add_all(search_args); ctx = mailbox_search_init(t, search_args, NULL, MAIL_FETCH_VIRTUAL_SIZE, NULL); mail_search_args_unref(&search_args); while (mailbox_search_next(ctx, &mail)) { if (mail_get_virtual_size(mail, &size) < 0) { i_error("pop3_migration: Failed to get size for msg %u: %s", mail->seq, mailbox_get_last_error(pop3_box, NULL)); ret = -1; break; } if (mail_get_special(mail, MAIL_FETCH_UIDL_BACKEND, &uidl) < 0) { i_error("pop3_migration: Failed to get UIDL for msg %u: %s", mail->seq, mailbox_get_last_error(pop3_box, NULL)); ret = -1; break; } if (*uidl == '\0') { i_warning("pop3_migration: UIDL for msg %u is empty", mail->seq); continue; } map = array_append_space(&mstorage->pop3_uidl_map); map->pop3_seq = mail->seq; map->pop3_uidl = p_strdup(storage->pool, uidl); map->size = size; } if (mailbox_search_deinit(&ctx) < 0) ret = -1; (void)mailbox_transaction_commit(&t); return ret; }