END_TEST START_TEST(test_imap_bodyfetch) { int result; guint64 octet; ImapSession *s = dbmail_imap_session_new(); dbmail_imap_session_bodyfetch_new(s); fail_unless(0 == dbmail_imap_session_bodyfetch_get_last_octetstart(s), "octetstart init value incorrect"); fail_unless(0 == dbmail_imap_session_bodyfetch_get_last_octetcnt(s), "octetcnt init value incorrect"); fail_unless(0 == dbmail_imap_session_bodyfetch_get_last_argstart(s), "argstart init value incorrect"); s->args_idx = 23; dbmail_imap_session_bodyfetch_set_argstart(s); result = dbmail_imap_session_bodyfetch_get_last_argstart(s); fail_unless(result==23, "argstart incorrect"); dbmail_imap_session_bodyfetch_set_octetstart(s,0); octet = dbmail_imap_session_bodyfetch_get_last_octetstart(s); fail_unless(octet==0, "octetstart incorrect"); dbmail_imap_session_bodyfetch_set_octetcnt(s,12288); octet = dbmail_imap_session_bodyfetch_get_last_octetcnt(s); fail_unless(octet==12288, "octetcnt incorrect"); dbmail_imap_session_delete(&s); }
void imap_cleanup_deferred(gpointer data) { int rx; dm_thread_data *D = (dm_thread_data *)data; ImapSession *session = (ImapSession *)D->session; ClientBase_T *ci = session->ci; if (ci->rev) event_del(ci->rev); if (ci_wbuf_len(ci)) { ci_write_cb(ci); dm_queue_push(imap_cleanup_deferred, session, NULL); return; } rx = ci->rx; ci_close(ci); ci = NULL; dbmail_imap_session_delete(&session); if (rx == STDIN_FILENO) exit(0); }
static int mailbox_dump(u64_t mailbox_idnr, const char *dumpfile, const char *search, int delete_after_dump) { FILE *ostream; DbmailMailbox *mb = NULL; ImapSession *s = NULL; int result = 0; /* * For dbmail the usual filesystem semantics don't really * apply. Mailboxes can contain other mailboxes as well as * messages. For now however, this is solved by appending * the mailboxname with .mbox * * TODO: facilitate maildir type exports */ mb = dbmail_mailbox_new(mailbox_idnr); if (search) { s = dbmail_imap_session_new(); s->ci = client_init(NULL); if (! (imap4_tokenizer_main(s, search))) { qerrorf("error parsing search string"); dbmail_imap_session_delete(&s); dbmail_mailbox_free(mb); return 1; } if (dbmail_mailbox_build_imap_search(mb, s->args, &(s->args_idx), SEARCH_UNORDERED) < 0) { qerrorf("invalid search string"); dbmail_imap_session_delete(&s); dbmail_mailbox_free(mb); return 1; } dbmail_mailbox_search(mb); dbmail_imap_session_delete(&s); } if (strcmp(dumpfile, "-") == 0) { ostream = stdout; } else if (! (ostream = fopen(dumpfile, "a"))) { int err = errno; qerrorf("opening [%s] failed [%s]\n", dumpfile, strerror(err)); result = -1; goto cleanup; } if (dbmail_mailbox_dump(mb, ostream) < 0) { qerrorf("Export failed\n"); result = -1; goto cleanup; } if (delete_after_dump) { int deleted_flag[IMAP_NFLAGS]; memset(deleted_flag, 0, IMAP_NFLAGS * sizeof(int)); deleted_flag[IMAP_FLAG_DELETED] = 1; GList *ids = g_tree_keys(MailboxState_getIds(mb->mbstate)); while (ids) { // Flag the selected messages \\Deleted // Following this, dbmail-util -d sets deleted status if (delete_after_dump & 1) { if (db_set_msgflag(*(u64_t *)ids->data, deleted_flag, NULL, IMAPFA_ADD, NULL) < 0) { qerrorf("Error setting flags for message [%llu]\n", *(u64_t *)ids->data); result = -1; } } // Set deleted status on each message // Following this, dbmail-util -p sets purge status if (delete_after_dump & 2) { if (! db_set_message_status(*(u64_t *)ids->data, MESSAGE_STATUS_DELETE)) { qerrorf("Error setting status for message [%llu]\n", *(u64_t *)ids->data); result = -1; } } if (!g_list_next(ids)) break; ids = g_list_next(ids); } g_list_free(g_list_first(ids)); } cleanup: if (mb) dbmail_mailbox_free(mb); if ((ostream) && (ostream != stdout)) fclose(ostream); return result; }