Diffstat (limited to 'kmicromail/libetpan/tests/fetch-attachment.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kmicromail/libetpan/tests/fetch-attachment.c | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/kmicromail/libetpan/tests/fetch-attachment.c b/kmicromail/libetpan/tests/fetch-attachment.c new file mode 100644 index 0000000..a79ef8b --- a/dev/null +++ b/kmicromail/libetpan/tests/fetch-attachment.c @@ -0,0 +1,274 @@ +#include <unistd.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include <libetpan/libetpan.h> + +#include "option-parser.h" +#include "readmsg-common.h" + +/* write content to the given filename */ + +static int etpan_write_data(char * filename, char * data, size_t len) +{ + size_t write_len; + FILE * f; + int res; + mode_t old_umask; + + old_umask = umask(0077); + f = fopen(filename, "w"); + umask(old_umask); + if (f == NULL) { + res = ERROR_FILE; + goto err; + } + + write_len = fwrite(data, 1, len, f); + if (write_len < len) { + res = ERROR_FILE; + goto close; + } + + fclose(f); + + return NO_ERROR; + + close: + fclose(f); + err: + return res; +} + + +/* save attachment */ + +static int save_mime_content(mailmessage * msg_info, + struct mailmime * mime_part) +{ + char * body; + size_t body_len; + int r; + char * filename; + struct mailmime_single_fields fields; + int res; + + memset(&fields, 0, sizeof(struct mailmime_single_fields)); + if (mime_part->mm_mime_fields != NULL) + mailmime_single_fields_init(&fields, mime_part->mm_mime_fields, + mime_part->mm_content_type); + + filename = fields.fld_disposition_filename; + + if (filename == NULL) + filename = fields.fld_content_name; + + if (filename == NULL) + return ERROR_INVAL; + + r = etpan_fetch_message(msg_info, mime_part, &fields, &body, &body_len); + if (r != NO_ERROR) { + res = r; + goto err; + } + + printf("writing %s, %i bytes\n", filename, body_len); + + r = etpan_write_data(filename, body, body_len); + if (r != NO_ERROR) { + res = r; + goto free; + } + + mailmime_decoded_part_free(body); + + return NO_ERROR; + + free: + mailmime_decoded_part_free(body); + err: + return res; +} + + + +/* fetch attachments */ + +static int etpan_fetch_mime(FILE * f, mailmessage * msg_info, + struct mailmime * mime) +{ + int r; + clistiter * cur; + struct mailmime_single_fields fields; + int res; + + memset(&fields, 0, sizeof(struct mailmime_single_fields)); + if (mime->mm_mime_fields != NULL) + mailmime_single_fields_init(&fields, mime->mm_mime_fields, + mime->mm_content_type); + + switch(mime->mm_type) { + case MAILMIME_SINGLE: + save_mime_content(msg_info, mime); + + break; + + case MAILMIME_MULTIPLE: + + for(cur = clist_begin(mime->mm_data.mm_multipart.mm_mp_list) ; + cur != NULL ; cur = clist_next(cur)) { + + r = etpan_fetch_mime(f, msg_info, clist_content(cur)); + if (r != NO_ERROR) { + res = r; + goto err; + } + } + + break; + + case MAILMIME_MESSAGE: + + if (mime->mm_data.mm_message.mm_msg_mime != NULL) { + r = etpan_fetch_mime(f, msg_info, mime->mm_data.mm_message.mm_msg_mime); + if (r != NO_ERROR) { + res = r; + goto err; + } + } + + break; + } + + return NO_ERROR; + + err: + return res; +} + + +int main(int argc, char ** argv) +{ + int r; + int driver; + char * server; + int port; + int connection_type; + char * user; + char * password; + int auth_type; + char * path; + char * cache_directory; + char * flags_directory; + struct mailstorage * storage; + int cached; + struct mailfolder * folder; + + /* get options */ + + r = parse_options(argc, argv, + &driver, &server, &port, &connection_type, + &user, &password, &auth_type, + &path, &cache_directory, &flags_directory); + + cached = (cache_directory != NULL); + + /* build the storage structure */ + + storage = mailstorage_new(NULL); + if (storage == NULL) { + printf("error initializing storage\n"); + goto free_opt; + } + + r = init_storage(storage, driver, server, port, connection_type, + user, password, auth_type, path, cache_directory, flags_directory); + if (r != MAIL_NO_ERROR) { + printf("error initializing storage\n"); + goto free_opt; + } + + /* get the folder structure */ + + folder = mailfolder_new(storage, path, NULL); + if (folder == NULL) { + printf("error initializing folder\n"); + goto free_storage; + } + + r = mailfolder_connect(folder); + if (r != MAIL_NO_ERROR) { + printf("error initializing folder\n"); + goto free_folder; + } + + while (optind < argc) { + mailmessage * msg; + uint32_t msg_num; + struct mailmime * mime; + + msg_num = strtoul(argv[optind], NULL, 10); + + r = mailsession_get_message(folder->fld_session, msg_num, &msg); + if (r != MAIL_NO_ERROR) { + printf("** message %i not found ** - %s\n", msg_num, + maildriver_strerror(r)); + optind ++; + continue; + } + + r = mailmessage_get_bodystructure(msg, &mime); + if (r != MAIL_NO_ERROR) { + printf("** message %i not found - %s **\n", msg_num, + maildriver_strerror(r)); + mailmessage_free(msg); + optind ++; + continue; + } + + r = etpan_fetch_mime(stdout, msg, mime); + + mailmessage_free(msg); + + optind ++; + } + + mailfolder_free(folder); + mailstorage_free(storage); + + if (server != NULL) + free(server); + if (user != NULL) + free(user); + if (password != NULL) + free(password); + if (path != NULL) + free(path); + if (cache_directory != NULL) + free(cache_directory); + if (flags_directory != NULL) + free(flags_directory); + + return 0; + + free_folder: + mailfolder_free(folder); + free_storage: + mailstorage_free(storage); + free_opt: + if (server != NULL) + free(server); + if (user != NULL) + free(user); + if (password != NULL) + free(password); + if (path != NULL) + free(path); + if (cache_directory != NULL) + free(cache_directory); + if (flags_directory != NULL) + free(flags_directory); + return -1; +} |