From: DINH V. Ho? <ho...@us...> - 2002-02-10 20:03:43
|
Update of /cvsroot/libetpan/libetpan/mbox In directory usw-pr-cvs1:/tmp/cvs-serv25321/mbox Modified Files: mailmbox.c mailmbox.h mailmbox_ops.c mailmbox_ops.h mailmbox_types.c mailmbox_types.h Log Message: various changes before generic layer Index: mailmbox.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mailmbox.c 6 Jan 2002 18:40:05 -0000 1.1 +++ mailmbox.c 10 Feb 2002 20:03:39 -0000 1.2 @@ -28,10 +28,12 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> +#include <stdlib.h> +#include <stdio.h> #include "mailmbox_ops.h" -static gboolean open_file(struct mailmbox_folder * folder); +static gint open_file(struct mailmbox_folder * folder); struct mailmbox_folder * mailmbox_folder_new(gchar * filename, gboolean use_cache, @@ -68,7 +70,7 @@ return folder->cache->tab->len; } -static gboolean close_file(struct mailmbox_folder * folder); +static void close_file(struct mailmbox_folder * folder); void mailmbox_folder_free(struct mailmbox_folder * folder) { @@ -82,19 +84,19 @@ g_free(folder); } -static gboolean read_cache(struct mailmbox_folder * folder); +static gint read_cache(struct mailmbox_folder * folder); -static gboolean open_file(struct mailmbox_folder * folder) +static gint open_file(struct mailmbox_folder * folder) { gint fd; if (folder->fd != -1) - return TRUE; + return MAILMBOX_NO_ERROR; fd = open(folder->filename, O_RDONLY); if (fd < 0) { folder->fd = -1; - return FALSE; + return MAILMBOX_ERROR_FILE_NOT_FOUND; } folder->fd = fd; @@ -105,10 +107,10 @@ mailmbox_file_parse(folder->fd, folder->use_content_length, &folder->cache, &folder->info); - return TRUE; + return MAILMBOX_NO_ERROR; } -static gboolean close_file(struct mailmbox_folder * folder) +static void close_file(struct mailmbox_folder * folder) { if (folder->use_cache) { gchar * cache_filename; @@ -135,21 +137,24 @@ } } -static gboolean read_cache(struct mailmbox_folder * folder) +static gint read_cache(struct mailmbox_folder * folder) { gchar * cache_filename; struct mailmbox_cache * cache; struct mailmbox_info * info; - struct stat buf; - struct stat cache_stat; - gboolean r; + gint r; + gint res; invalidate_cache(folder); cache_filename = g_strconcat(folder->filename, ".cache", NULL); - if (cache_filename == NULL) + if (cache_filename == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto err; - if (!mailmbox_cache_read(cache_filename, &cache, &info)) { + } + + r = mailmbox_cache_read(cache_filename, &cache, &info); + if (r != MAILMBOX_NO_ERROR) { cache = NULL; info = NULL; } @@ -163,13 +168,15 @@ r = mailmbox_file_parse_with_cache(folder->fd, folder->use_content_length, &cache, &info); - if (!r) + if (r != MAILMBOX_NO_ERROR) { + res = MAILMBOX_ERROR_PARSE; goto free_cache; + } folder->cache = cache; folder->info = info; - return TRUE; + return MAILMBOX_NO_ERROR; free_cache: if (cache != NULL) @@ -177,10 +184,10 @@ if (info != NULL) mailmbox_info_free(info); err: - return FALSE; + return res; } -gboolean +gint mailmbox_folder_append_message_list(struct mailmbox_folder * folder, struct mailmbox_append_info_list * append_list) @@ -195,26 +202,26 @@ return mailmbox_append_message_list(folder->fd, append_list); } -gboolean +gint mailmbox_folder_append_message(struct mailmbox_folder * folder, gchar * message, guint32 size) { struct mailmbox_append_info * info; struct mailmbox_append_info_list * info_list; GList * list; - gboolean r; + gint r; info = mailmbox_append_info_new(message, size); if (info == NULL) - return FALSE; + return MAILMBOX_ERROR_MEMORY; list = g_list_append(NULL, info); if (list == NULL) - return FALSE; + return MAILMBOX_ERROR_MEMORY; info_list = mailmbox_append_info_list_new(list); if (info_list == NULL) - return FALSE; + return MAILMBOX_ERROR_MEMORY; r = mailmbox_folder_append_message_list(folder, info_list); @@ -223,89 +230,109 @@ return r; } -gboolean +gint mailmbox_folder_rewrite(struct mailmbox_folder * folder) { gint dest_fd; gchar * new_filename; - gboolean r; + gint r; gchar * cache_filename; + gint res; new_filename = g_strconcat(folder->filename, "XXXXXX", NULL); - if (new_filename == NULL) + if (new_filename == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto err; + } dest_fd = mkstemp(new_filename); - if (dest_fd == -1) + if (dest_fd == -1) { + res = MAILMBOX_ERROR_TEMPORARY_FILE; goto free_filename; + } - if (fchmod(dest_fd, 0600) == -1) + if (fchmod(dest_fd, 0600) == -1) { + res = MAILMBOX_ERROR_TEMPORARY_FILE; goto remove_file; + } if (folder->use_cache) { - if (folder->cache == NULL) - if (!read_cache(folder)) - return FALSE; + if (folder->cache == NULL) { + r = read_cache(folder); + + if (r != MAILMBOX_NO_ERROR) { + res = r; + goto remove_file; + } + } r = mailmbox_fd_from_fd_write_new_with_cache(dest_fd, folder->fd, folder->use_content_length, &folder->cache, &folder->info); - if (!r) + if (r != MAILMBOX_NO_ERROR) { + res = r; goto remove_file; + } cache_filename = g_strconcat(folder->filename, ".cache", NULL); - if (cache_filename == NULL) + if (cache_filename == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto err; + } unlink(cache_filename); g_free(cache_filename); } else { r = mailmbox_fd_from_fd_write_new(dest_fd, folder->fd, folder->use_content_length); - if (!r) + if (r != MAILMBOX_NO_ERROR) { + res = r; goto remove_file; + } } close_file(folder); unlink(folder->filename); - if (rename(new_filename, folder->filename) == -1) + if (rename(new_filename, folder->filename) == -1) { + res = MAILMBOX_ERROR_TEMPORARY_FILE; goto free_filename; + } g_free(new_filename); - return TRUE; + return MAILMBOX_NO_ERROR; remove_file: unlink(new_filename); free_filename: g_free(new_filename); err: - return FALSE; + return res; } -gboolean mailmbox_folder_msg_delete(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_delete(struct mailmbox_folder * folder, gint num) { return mailmbox_msg_delete(folder->info, num); } -gboolean mailmbox_folder_msg_add_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_add_flags(struct mailmbox_folder * folder, gint num, guint32 flags) { return mailmbox_msg_add_flags(folder->info, num, flags); } -gboolean mailmbox_folder_msg_remove_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_remove_flags(struct mailmbox_folder * folder, gint num, guint32 flags) { return mailmbox_msg_remove_flags(folder->info, num, flags); } -gboolean mailmbox_folder_msg_set_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_set_flags(struct mailmbox_folder * folder, gint num, guint32 flags) { return mailmbox_msg_set_flags(folder->info, num, flags); Index: mailmbox.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mailmbox.h 6 Jan 2002 18:40:05 -0000 1.1 +++ mailmbox.h 10 Feb 2002 20:03:39 -0000 1.2 @@ -51,28 +51,28 @@ guint32 mailmbox_folder_count(struct mailmbox_folder * folder); -gboolean +gint mailmbox_folder_append_message_list(struct mailmbox_folder * folder, struct mailmbox_append_info_list * append_list); -gboolean +gint mailmbox_folder_append_message(struct mailmbox_folder * folder, gchar * message, guint32 size); -gboolean +gint mailmbox_folder_rewrite(struct mailmbox_folder * folder); -gboolean mailmbox_folder_msg_delete(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_delete(struct mailmbox_folder * folder, gint num); -gboolean mailmbox_folder_msg_add_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_add_flags(struct mailmbox_folder * folder, gint num, guint32 flags); -gboolean mailmbox_folder_msg_remove_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_remove_flags(struct mailmbox_folder * folder, gint num, guint32 flags); -gboolean mailmbox_folder_msg_set_flags(struct mailmbox_folder * folder, +gint mailmbox_folder_msg_set_flags(struct mailmbox_folder * folder, gint num, guint32 flags); struct mailmbox_msg_info * Index: mailmbox_ops.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox_ops.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mailmbox_ops.c 3 Feb 2002 23:23:38 -0000 1.3 +++ mailmbox_ops.c 10 Feb 2002 20:03:39 -0000 1.4 @@ -24,6 +24,7 @@ #include "mailmbox_ops.h" +#include <sys/file.h> #include <sys/stat.h> #include <unistd.h> #include <sys/mman.h> @@ -165,8 +166,6 @@ guint32 body_size; gchar * msgid; - struct mailmbox_msg_info * msg_info; - struct mailmbox_msg_cache * msg_cache; gint state; struct mailimf_unparsed_fields * fields; @@ -193,6 +192,10 @@ } body = cur_token; + flags = 0; + body_size = 0; + next = length; + msgid = NULL; if (mailimf_unparsed_fields_parse(str, length, &cur_token, &fields)) { GList * cur; @@ -208,8 +211,6 @@ body = cur_token; - flags = 0; - body_size = 0; for(cur = fields->list ; cur != NULL ; cur = cur->next) { struct mailimf_optional_field * field; @@ -415,7 +416,7 @@ } -static gboolean +static gint mailmbox_parse_additionnal(gchar * str, guint32 length, gboolean use_content_length, guint32 * index, @@ -423,11 +424,9 @@ struct mailmbox_info ** result_info) { guint32 cur_token; - gboolean r; - GList * list; - GList * new_list; struct mailmbox_info * info; struct mailmbox_cache * cache; + gint res; guint32 start; guint32 headers; @@ -446,24 +445,28 @@ &start, &headers, &body, &size, &msgid, &flags, &fields)) { if (!mailmbox_cache_add(cache, start, headers, body, - size)) + size)) { + res = MAILMBOX_ERROR_MEMORY; goto err; + } - if (!mailmbox_info_add(info, msgid, flags, fields)) + if (!mailmbox_info_add(info, msgid, flags, fields)) { + res = MAILMBOX_ERROR_MEMORY; goto err; + } } * result_cache = cache; * result_info = info; * index = cur_token; - return TRUE; + return MAILMBOX_NO_ERROR; err: - return FALSE; + return res; } -gboolean mailmbox_parse(gchar * str, guint32 length, +gint mailmbox_parse(gchar * str, guint32 length, gboolean use_content_length, guint32 * index, struct mailmbox_cache ** result_cache, @@ -471,37 +474,44 @@ { struct mailmbox_info * info; struct mailmbox_cache * cache; - gboolean r; + gint r; + gint res; info = mailmbox_info_new(0); - if (info == NULL) + if (info == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto err; + } cache = mailmbox_cache_new(0); - if (info == NULL) + if (info == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto free_info; + } r = mailmbox_parse_additionnal(str, length, use_content_length, index, &cache, &info); - if (!r) + if (r != MAILMBOX_NO_ERROR) { + res = r; goto free_cache; + } * result_cache = cache; * result_info = info; - return TRUE; + return MAILMBOX_NO_ERROR; free_cache: mailmbox_cache_free(cache); free_info: mailmbox_info_free(info); err: - return FALSE; + return res; } -static gboolean +static gint mailmbox_file_part_parse_additionnal(gint fd, guint32 index, gboolean use_content_length, struct mailmbox_cache ** result_cache, @@ -509,40 +519,45 @@ { gchar * str; struct stat buf; - gboolean r; + gint r; guint32 cur_token; + gint res; mailmbox_read_lock(fd); - if (fstat(fd, &buf) < 0) + if (fstat(fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } str = (char *) mmap(0, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (str == MAP_FAILED) + if (str == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } cur_token = index; r = mailmbox_parse_additionnal(str, buf.st_size, use_content_length, &cur_token, result_cache, result_info); - if (r) + if (r == MAILMBOX_NO_ERROR) (* result_cache)->mtime = buf.st_mtime; munmap(str, buf.st_size); mailmbox_read_unlock(fd); - + return r; unlock: mailmbox_read_unlock(fd); - return FALSE; + return res; } -static gboolean +static gint mailmbox_file_part_parse(gint fd, guint32 index, gboolean use_content_length, struct mailmbox_cache ** result_cache, @@ -550,25 +565,30 @@ { gchar * str; struct stat buf; - gboolean r; + gint r; guint32 cur_token; + gint res; mailmbox_read_lock(fd); - if (fstat(fd, &buf) < 0) + if (fstat(fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } str = (char *) mmap(0, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (str == MAP_FAILED) + if (str == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } cur_token = index; r = mailmbox_parse(str, buf.st_size, use_content_length, &cur_token, result_cache, result_info); - if (r) + if (r == MAILMBOX_NO_ERROR) (* result_cache)->mtime = buf.st_mtime; munmap(str, buf.st_size); @@ -580,7 +600,7 @@ return FALSE; } -gboolean mailmbox_file_parse(gint fd, gboolean use_content_length, +gint mailmbox_file_parse(gint fd, gboolean use_content_length, struct mailmbox_cache ** result_cache, struct mailmbox_info ** result_info) { @@ -594,25 +614,31 @@ static int cache_version = CACHE_VERSION; -gboolean mailmbox_cache_write(gchar * filename, struct mailmbox_cache * cache, - struct mailmbox_info * info) +gint mailmbox_cache_write(gchar * filename, struct mailmbox_cache * cache, + struct mailmbox_info * info) { - GList * cur; FILE * f; size_t r; - gint i; + guint i; + gint res; f = fopen(filename, "w"); - if (f == NULL) + if (f == NULL) { + res = MAILMBOX_ERROR_CACHE; goto err; + } r = fwrite(&cache_version, sizeof(time_t), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } r = fwrite(&cache->mtime, sizeof(time_t), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } for(i = 0 ; i < cache->tab->len ; i ++) { struct mailmbox_msg_cache * msg_cache; @@ -623,38 +649,48 @@ if ((msg_info->flags & MAILMBOX_FLAG_DELETED) == 0) { r = fwrite(&msg_cache->start, sizeof(guint32), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } r = fwrite(&msg_cache->headers, sizeof(guint32), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } r = fwrite(&msg_cache->body, sizeof(guint32), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } r = fwrite(&msg_cache->size, sizeof(guint32), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } r = fwrite(&msg_info->flags, sizeof(guint32), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto remove_file; + } } } fclose(f); - return TRUE; + return MAILMBOX_NO_ERROR; remove_file: fclose(f); remove(filename); err: - return FALSE; + return res; } -gboolean mailmbox_cache_read(gchar * filename, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info) +gint mailmbox_cache_read(gchar * filename, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info) { FILE * f; struct mailmbox_cache * cache; @@ -662,28 +698,41 @@ gint r; time_t mtime; gint version; + gint res; f = fopen(filename, "r"); - if (f == NULL) + if (f == NULL) { + res = MAILMBOX_ERROR_CACHE_NOT_FOUND; goto err; + } r = fread(&version, sizeof(time_t), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto close_file; - if (version != CACHE_VERSION) + } + if (version != CACHE_VERSION) { + res = MAILMBOX_ERROR_CACHE; goto close_file; + } r = fread(&mtime, sizeof(time_t), 1, f); - if (r != 1) + if (r != 1) { + res = MAILMBOX_ERROR_CACHE; goto close_file; + } cache = mailmbox_cache_new(mtime); - if (cache == NULL) + if (cache == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto close_file; + } info = mailmbox_info_new(mtime); - if (info == NULL) + if (info == NULL) { + res = MAILMBOX_ERROR_MEMORY; goto free_cache; + } while (1) { guint32 start; @@ -705,22 +754,26 @@ if (r != 1) break; - if (!mailmbox_cache_add(cache, start, headers, body, size)) + if (!mailmbox_cache_add(cache, start, headers, body, size)) { + res = MAILMBOX_ERROR_MEMORY; goto free_info; + } r = fread(&flags, sizeof(guint32), 1, f); if (r != 1) break; - if (!mailmbox_info_add(info, NULL, flags, NULL)) + if (!mailmbox_info_add(info, NULL, flags, NULL)) { + res = MAILMBOX_ERROR_MEMORY; goto free_info; + } } fclose(f); * result_cache = cache; * result_info = info; - return TRUE; + return MAILMBOX_NO_ERROR; free_info: mailmbox_info_free(info); @@ -729,15 +782,13 @@ close_file: fclose(f); err: - return FALSE; + return res; } static void restore_flags(struct mailmbox_info * new_info, struct mailmbox_info * old_info) { - gint i; - - printf("restore flags\n"); + guint i; for(i = 0 ; i < new_info->tab->len ; i ++) { struct mailmbox_msg_info * msg_info; @@ -753,65 +804,60 @@ } } -static gboolean validate_cache(gint fd, gboolean use_content_length, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info) +static gint validate_cache(gint fd, gboolean use_content_length, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info) { struct stat buf; struct mailmbox_info * new_info; if (fstat(fd, &buf) < 0) - return FALSE; + return MAILMBOX_ERROR_FILE; if (buf.st_mtime != (* result_cache)->mtime) { - gboolean r; - - printf("reset cache - mbox\n"); + gint r; mailmbox_cache_free(* result_cache); r = mailmbox_file_parse(fd, use_content_length, result_cache, &new_info); - if (!r) - return FALSE; + if (r != MAILMBOX_NO_ERROR) + return r; restore_flags(new_info, * result_info); mailmbox_info_free(* result_info); * result_info = new_info; - return TRUE; + return MAILMBOX_NO_ERROR; } if (buf.st_mtime != (* result_info)->mtime) { - gboolean r; - - printf("reset flags - mbox %i\n", (* result_info)->mtime); + gint r; r = mailmbox_file_parse_with_cache(fd, use_content_length, result_cache, &new_info); - if (!r) - return FALSE; + if (r != MAILMBOX_NO_ERROR) + return r; restore_flags(new_info, * result_info); mailmbox_info_free(* result_info); * result_info = new_info; - return TRUE; + return MAILMBOX_NO_ERROR; } - return TRUE; + return MAILMBOX_NO_ERROR; } gboolean mailmbox_parse_with_cache(gchar * str, guint32 length, struct mailmbox_cache ** result_cache, struct mailmbox_info ** result_info) { - GList * cur; struct mailimf_unparsed_fields * fields; - gint i; + guint i; for(i = 0 ; i < (* result_cache)->tab->len ; i ++) { struct mailmbox_msg_cache * msg_cache; @@ -823,7 +869,7 @@ cur_token = msg_cache->headers; if (cur_token >= length) - return FALSE; + return MAILMBOX_ERROR_PARSE; msg_info = (struct mailmbox_msg_info *) g_ptr_array_index((* result_info)->tab, i); @@ -832,7 +878,7 @@ msg_info->fields = fields; } - return TRUE; + return MAILMBOX_NO_ERROR; } gboolean mailmbox_file_parse_with_cache(gint fd, @@ -842,20 +888,28 @@ { gchar * str; struct stat buf; - gboolean r; + gint r; + gint res; mailmbox_read_lock(fd); - if (!validate_cache(fd, use_content_length, result_cache, result_info)) + r = validate_cache(fd, use_content_length, result_cache, result_info); + if (r != MAILMBOX_NO_ERROR) { + res = r; goto unlock; + } - if (fstat(fd, &buf) < 0) + if (fstat(fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } str = (char *) mmap(0, buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (str == MAP_FAILED) + if (str == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } r = mailmbox_parse_with_cache(str, buf.st_size, result_cache, result_info); @@ -867,7 +921,7 @@ unlock: mailmbox_read_unlock(fd); - return FALSE; + return res; } @@ -876,7 +930,7 @@ /* ********************************************************************** */ /* append messages */ -gboolean mailmbox_append_message_list(gint fd, +gint mailmbox_append_message_list(gint fd, struct mailmbox_append_info_list * append_list) { @@ -886,7 +940,7 @@ GList * cur; if (fstat(fd, &buf) < 0) - return FALSE; + return MAILMBOX_ERROR_FILE; extra_size = 0; for(cur = append_list->list ; cur != NULL; cur = cur->next) { @@ -897,12 +951,14 @@ } if (ftruncate(fd, extra_size + buf.st_size) != 0) - return FALSE; + return MAILMBOX_ERROR_FILE; str = (char *) mmap(0, extra_size + buf.st_size, PROT_READ, MAP_SHARED, fd, buf.st_size); - if (str == MAP_FAILED) - return FALSE; + if (str == MAP_FAILED) { + ftruncate(fd, buf.st_size); + return MAILMBOX_ERROR_FILE; + } for(cur = append_list->list ; cur != NULL; cur = cur->next) { struct mailmbox_append_info * info; @@ -915,10 +971,10 @@ munmap(str, extra_size); - return TRUE; + return MAILMBOX_NO_ERROR; } -gboolean +gint mailmbox_append_message_list_with_cache(gint fd, gboolean use_content_length, struct mailmbox_append_info_list * @@ -927,39 +983,50 @@ struct mailmbox_info ** result_info) { struct stat buf; - struct mailmbox_cache * add_cache; - struct mailmbox_info * add_info; + gint r; + gint res; mailmbox_write_lock(fd); - if (!validate_cache(fd, use_content_length, result_cache, result_info)) + r = validate_cache(fd, use_content_length, result_cache, result_info); + if (r != MAILMBOX_NO_ERROR) { + res = r; goto unlock; + } - if (fstat(fd, &buf) < 0) + if (fstat(fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } - if (!mailmbox_append_message_list(fd, append_list)) + r = mailmbox_append_message_list(fd, append_list); + if (!r) { + res = r; goto unlock; + } - if (!mailmbox_file_part_parse_additionnal(fd, buf.st_size, - use_content_length, - result_cache, result_info)) + r = mailmbox_file_part_parse_additionnal(fd, buf.st_size, + use_content_length, + result_cache, result_info); + if (r != MAILMBOX_NO_ERROR) { + res = r; goto unlock; + } mailmbox_write_unlock(fd); - return TRUE; + return MAILMBOX_NO_ERROR; unlock: mailmbox_write_unlock(fd); - return FALSE; + return res; } /* ********************************************************************** */ /* write new mailbox */ -gboolean +gint mailmbox_fd_from_str_write_new_with_cache(gint dest_fd, gchar * str, guint32 size, struct mailmbox_cache ** result_cache, @@ -967,11 +1034,11 @@ { gchar * result; guint32 total_size = 0; - GList * cur; gchar * p; - gint i; + guint i; struct mailmbox_cache * cache; struct mailmbox_info * info; + gint res; total_size = 0; cache = * result_cache; @@ -990,13 +1057,17 @@ mailmbox_write_lock(dest_fd); - if (ftruncate(dest_fd, total_size) != 0) + if (ftruncate(dest_fd, total_size) != 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } result = (char *) mmap(0, total_size, PROT_READ, MAP_SHARED, dest_fd, 0); - if (result == MAP_FAILED) + if (result == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } p = result; for(i = 0 ; i < info->tab->len ; i ++) { @@ -1014,15 +1085,15 @@ munmap(result, total_size); - return TRUE; + return MAILMBOX_NO_ERROR; unlock: mailmbox_write_unlock(dest_fd); - return FALSE; + return res; } -gboolean +gint mailmbox_fd_from_fd_write_new_with_cache(gint dest_fd, gint src_fd, gboolean use_content_length, struct mailmbox_cache ** result_cache, @@ -1030,20 +1101,28 @@ { gchar * str; struct stat buf; - gboolean r; + gint r; + gint res; mailmbox_read_lock(src_fd); - if (!validate_cache(src_fd, use_content_length, result_cache, result_info)) + r = validate_cache(src_fd, use_content_length, result_cache, result_info); + if (r != MAILMBOX_NO_ERROR) { + res = r; goto unlock; + } - if (fstat(src_fd, &buf) < 0) + if (fstat(src_fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } str = (char *) mmap(0, buf.st_size, PROT_READ, MAP_PRIVATE, src_fd, 0); - if (str == MAP_FAILED) + if (str == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } r = mailmbox_fd_from_str_write_new_with_cache(dest_fd, str, buf.st_size, @@ -1057,25 +1136,28 @@ unlock: mailmbox_read_unlock(src_fd); - return FALSE; + return res; } -gboolean +gint mailmbox_fd_from_str_write_new(gint dest_fd, gchar * str, guint32 size, gboolean use_content_length) { struct mailmbox_cache * cache; struct mailmbox_info * info; guint32 cur_token; - gboolean r; + gint r; + gint res; mailmbox_write_lock(dest_fd); cur_token = 0; r = mailmbox_parse(str, size, use_content_length, &cur_token, &cache, &info); - if (!r) + if (r != MAILMBOX_NO_ERROR) { + res = r; goto unlock; + } r = mailmbox_fd_from_str_write_new_with_cache(dest_fd, str, size, &cache, &info); @@ -1089,26 +1171,31 @@ unlock: mailmbox_write_unlock(dest_fd); - return FALSE; + return res; } -gboolean +gint mailmbox_fd_from_fd_write_new(gint dest_fd, gint src_fd, gboolean use_content_length) { gchar * str; struct stat buf; - gboolean r; + gint r; + gint res; mailmbox_read_lock(src_fd); - if (fstat(src_fd, &buf) < 0) + if (fstat(src_fd, &buf) < 0) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } str = (char *) mmap(0, buf.st_size, PROT_READ, MAP_PRIVATE, src_fd, 0); - if (str == MAP_FAILED) + if (str == MAP_FAILED) { + res = MAILMBOX_ERROR_FILE; goto unlock; + } r = mailmbox_fd_from_str_write_new(dest_fd, str, buf.st_size, use_content_length); @@ -1121,22 +1208,24 @@ unlock: mailmbox_read_unlock(src_fd); - return FALSE; + return res; } -gboolean mailmbox_msg_delete(struct mailmbox_info * info, gint num) +gint mailmbox_msg_delete(struct mailmbox_info * info, gint num) { struct mailmbox_msg_info * msg_info; msg_info = (struct mailmbox_msg_info *) g_ptr_array_index(info->tab, num); if (msg_info == NULL) - return FALSE; + return MAILMBOX_ERROR_MSG_NOT_FOUND; msg_info->flags |= MAILMBOX_FLAG_DELETED; + + return MAILMBOX_NO_ERROR; } -gboolean mailmbox_msg_add_flags(struct mailmbox_info * info, gint num, +gint mailmbox_msg_add_flags(struct mailmbox_info * info, gint num, guint32 flags) { struct mailmbox_msg_info * msg_info; @@ -1144,12 +1233,14 @@ msg_info = (struct mailmbox_msg_info *) g_ptr_array_index(info->tab, num); if (msg_info == NULL) - return FALSE; + return MAILMBOX_ERROR_MSG_NOT_FOUND; msg_info->flags |= flags; + + return MAILMBOX_NO_ERROR; } -gboolean mailmbox_msg_remove_flags(struct mailmbox_info * info, +gint mailmbox_msg_remove_flags(struct mailmbox_info * info, gint num, guint32 flags) { struct mailmbox_msg_info * msg_info; @@ -1157,12 +1248,14 @@ msg_info = (struct mailmbox_msg_info *) g_ptr_array_index(info->tab, num); if (msg_info == NULL) - return FALSE; + return MAILMBOX_ERROR_MSG_NOT_FOUND; msg_info->flags &= ~flags; + + return MAILMBOX_NO_ERROR; } -gboolean mailmbox_msg_set_flags(struct mailmbox_info * info, gint num, +gint mailmbox_msg_set_flags(struct mailmbox_info * info, gint num, guint32 flags) { struct mailmbox_msg_info * msg_info; @@ -1170,7 +1263,9 @@ msg_info = (struct mailmbox_msg_info *) g_ptr_array_index(info->tab, num); if (msg_info == NULL) - return FALSE; + return MAILMBOX_ERROR_MSG_NOT_FOUND; msg_info->flags = flags; + + return MAILMBOX_NO_ERROR; } Index: mailmbox_ops.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox_ops.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mailmbox_ops.h 6 Jan 2002 18:40:05 -0000 1.1 +++ mailmbox_ops.h 10 Feb 2002 20:03:39 -0000 1.2 @@ -29,37 +29,37 @@ #include "mailmbox_types.h" -gboolean mailmbox_parse(gchar * str, guint32 length, - gboolean use_content_length, - guint32 * index, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info); +gint mailmbox_parse(gchar * str, guint32 length, + gboolean use_content_length, + guint32 * index, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info); -gboolean mailmbox_file_parse(gint fd, gboolean use_content_length, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info); +gint mailmbox_file_parse(gint fd, gboolean use_content_length, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info); -gboolean mailmbox_cache_write(gchar * filename, struct mailmbox_cache * cache, - struct mailmbox_info * info); +gint mailmbox_cache_write(gchar * filename, struct mailmbox_cache * cache, + struct mailmbox_info * info); -gboolean mailmbox_cache_read(gchar * filename, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info); +gint mailmbox_cache_read(gchar * filename, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info); -gboolean mailmbox_parse_with_cache(gchar * str, guint32 length, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info); +gint mailmbox_parse_with_cache(gchar * str, guint32 length, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info); -gboolean mailmbox_file_parse_with_cache(gint fd, - gboolean use_content_length, - struct mailmbox_cache ** result_cache, - struct mailmbox_info ** result_info); +gint mailmbox_file_parse_with_cache(gint fd, + gboolean use_content_length, + struct mailmbox_cache ** result_cache, + struct mailmbox_info ** result_info); -gboolean mailmbox_append_message_list(gint fd, +gint mailmbox_append_message_list(gint fd, struct mailmbox_append_info_list * append_list); -gboolean +gint mailmbox_append_message_list_with_cache(gint fd, gboolean use_content_length, struct mailmbox_append_info_list * @@ -67,35 +67,35 @@ struct mailmbox_cache ** result_cache, struct mailmbox_info ** result_info); -gboolean +gint mailmbox_fd_from_str_write_new_with_cache(gint dest_fd, gchar * str, guint32 size, struct mailmbox_cache ** result_cache, struct mailmbox_info ** result_info); -gboolean +gint mailmbox_fd_from_fd_write_new_with_cache(gint dest_fd, gint src_fd, gboolean use_content_length, struct mailmbox_cache ** result_cache, struct mailmbox_info ** result_info); -gboolean +gint mailmbox_fd_from_str_write_new(gint dest_fd, gchar * str, guint32 size, gboolean use_content_length); -gboolean +gint mailmbox_fd_from_fd_write_new(gint dest_fd, gint src_fd, gboolean use_content_length); -gboolean mailmbox_msg_delete(struct mailmbox_info * info, gint num); +gint mailmbox_msg_delete(struct mailmbox_info * info, gint num); -gboolean mailmbox_msg_add_flags(struct mailmbox_info * info, gint num, - guint32 flags); +gint mailmbox_msg_add_flags(struct mailmbox_info * info, gint num, + guint32 flags); -gboolean mailmbox_msg_remove_flags(struct mailmbox_info * info, - gint num, guint32 flags); +gint mailmbox_msg_remove_flags(struct mailmbox_info * info, + gint num, guint32 flags); -gboolean mailmbox_msg_set_flags(struct mailmbox_info * info, gint num, - guint32 flags); +gint mailmbox_msg_set_flags(struct mailmbox_info * info, gint num, + guint32 flags); #endif Index: mailmbox_types.c =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox_types.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mailmbox_types.c 6 Jan 2002 18:40:05 -0000 1.1 +++ mailmbox_types.c 10 Feb 2002 20:03:39 -0000 1.2 @@ -86,7 +86,7 @@ void mailmbox_cache_free(struct mailmbox_cache * cache) { - gint i; + guint i; for(i = 0 ; i < cache->tab->len ; i ++) mailmbox_msg_cache_free(g_ptr_array_index(cache->tab, i)); @@ -184,7 +184,7 @@ void mailmbox_info_free(struct mailmbox_info * info) { - gint i; + guint i; for(i = 0 ; i < info->tab->len ; i ++) mailmbox_msg_info_free(g_ptr_array_index(info->tab, i)); Index: mailmbox_types.h =================================================================== RCS file: /cvsroot/libetpan/libetpan/mbox/mailmbox_types.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mailmbox_types.h 6 Jan 2002 18:40:05 -0000 1.1 +++ mailmbox_types.h 10 Feb 2002 20:03:39 -0000 1.2 @@ -32,10 +32,25 @@ #include "mailimf.h" enum { + MAILMBOX_NO_ERROR = 0, + MAILMBOX_ERROR_PARSE, + MAILMBOX_ERROR_FILE_NOT_FOUND, + MAILMBOX_ERROR_MEMORY, + MAILMBOX_ERROR_TEMPORARY_FILE, + MAILMBOX_ERROR_FILE, + MAILMBOX_ERROR_CACHE_NOT_FOUND, + MAILMBOX_ERROR_CACHE, + MAILMBOX_ERROR_MSG_NOT_FOUND +}; + + +enum { MAILMBOX_FLAG_DELETED = 1 << 1, MAILMBOX_FLAG_MARKED = 1 << 2, MAILMBOX_FLAG_OLD = 1 << 3, MAILMBOX_FLAG_READ = 1 << 4 + MAILMBOX_FLAG_ANSWERED = 1 << 5, + MAILMBOX_FLAG_FORWARDED = 1 << 6, }; /* cache */ |