From 8beac4427c0bdef63cca268a1edd9fb82e95d68f Mon Sep 17 00:00:00 2001 From: hiro Date: Thu, 8 Sep 2005 06:07:26 +0000 Subject: moved mbox.[ch] into libsylph. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@557 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 4 + ChangeLog.ja | 4 + libsylph/Makefile.am | 1 + libsylph/mbox.c | 465 +++++++++++++++++++++++++++++++++++++++++++++++++++ libsylph/mbox.h | 47 ++++++ src/Makefile.am | 1 - src/mbox.c | 465 --------------------------------------------------- src/mbox.h | 47 ------ 8 files changed, 521 insertions(+), 513 deletions(-) create mode 100644 libsylph/mbox.c create mode 100644 libsylph/mbox.h delete mode 100644 src/mbox.c delete mode 100644 src/mbox.h diff --git a/ChangeLog b/ChangeLog index aae2b533..b1a1e870 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-09-08 + + * libsylph/mbox.[ch]: moved into libsylph. + 2005-09-07 * libsylph/imap.c: limit number of messages to be copied at a time diff --git a/ChangeLog.ja b/ChangeLog.ja index ea12f24e..930b8926 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,7 @@ +2005-09-08 + + * libsylph/mbox.[ch]: libsylph に移動。 + 2005-09-07 * libsylph/imap.c: ネットワークのタイムアウトを避けるため、 diff --git a/libsylph/Makefile.am b/libsylph/Makefile.am index 31771946..0fb8dbdd 100644 --- a/libsylph/Makefile.am +++ b/libsylph/Makefile.am @@ -19,6 +19,7 @@ libsylph_la_SOURCES = \ folder.c folder.h \ html.c html.h \ imap.c imap.h \ + mbox.c mbox.h \ md5.c md5.h \ mh.c mh.h \ news.c news.h \ diff --git a/libsylph/mbox.c b/libsylph/mbox.c new file mode 100644 index 00000000..7c98996e --- /dev/null +++ b/libsylph/mbox.c @@ -0,0 +1,465 @@ +/* + * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client + * Copyright (C) 1999-2001 Hiroyuki Yamamoto + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "defs.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mbox.h" +#include "procmsg.h" +#include "folder.h" +#include "filter.h" +#include "prefs_common.h" +#include "prefs_account.h" +#include "account.h" +#include "utils.h" + +#define MSGBUFSIZE 8192 + +#define FPUTS_TO_TMP_ABORT_IF_FAIL(s) \ +{ \ + if (fputs(s, tmp_fp) == EOF) { \ + g_warning(_("can't write to temporary file\n")); \ + fclose(tmp_fp); \ + fclose(mbox_fp); \ + g_unlink(tmp_file); \ + g_free(tmp_file); \ + return -1; \ + } \ +} + +gint proc_mbox(FolderItem *dest, const gchar *mbox, GHashTable *folder_table) +{ + FILE *mbox_fp; + gchar buf[MSGBUFSIZE], from_line[MSGBUFSIZE]; + gchar *tmp_file; + gint msgs = 0; + + g_return_val_if_fail(dest != NULL, -1); + g_return_val_if_fail(mbox != NULL, -1); + + debug_print(_("Getting messages from %s into %s...\n"), mbox, dest->path); + + if ((mbox_fp = g_fopen(mbox, "rb")) == NULL) { + FILE_OP_ERROR(mbox, "fopen"); + return -1; + } + + /* ignore empty lines on the head */ + do { + if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { + g_warning(_("can't read mbox file.\n")); + fclose(mbox_fp); + return -1; + } + } while (buf[0] == '\n' || buf[0] == '\r'); + + if (strncmp(buf, "From ", 5) != 0) { + g_warning(_("invalid mbox format: %s\n"), mbox); + fclose(mbox_fp); + return -1; + } + + strcpy(from_line, buf); + if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { + g_warning(_("malformed mbox: %s\n"), mbox); + fclose(mbox_fp); + return -1; + } + + tmp_file = get_tmp_file(); + + do { + FILE *tmp_fp; + GSList *cur; + gchar *startp, *endp, *rpath; + gint empty_line; + gboolean is_next_msg = FALSE; + FilterInfo *fltinfo; + + if ((tmp_fp = g_fopen(tmp_file, "wb")) == NULL) { + FILE_OP_ERROR(tmp_file, "fopen"); + g_warning(_("can't open temporary file\n")); + g_free(tmp_file); + fclose(mbox_fp); + return -1; + } + if (change_file_mode_rw(tmp_fp, tmp_file) < 0) + FILE_OP_ERROR(tmp_file, "chmod"); + + /* convert unix From into Return-Path */ + startp = from_line + 5; + endp = strchr(startp, ' '); + if (endp == NULL) + rpath = g_strdup(startp); + else + rpath = g_strndup(startp, endp - startp); + g_strstrip(rpath); + g_snprintf(from_line, sizeof(from_line), + "Return-Path: %s\n", rpath); + g_free(rpath); + + FPUTS_TO_TMP_ABORT_IF_FAIL(from_line); + FPUTS_TO_TMP_ABORT_IF_FAIL(buf); + from_line[0] = '\0'; + + empty_line = 0; + + while (fgets(buf, sizeof(buf), mbox_fp) != NULL) { + if (buf[0] == '\n' || buf[0] == '\r') { + empty_line++; + buf[0] = '\0'; + continue; + } + + /* From separator */ + while (!strncmp(buf, "From ", 5)) { + strcpy(from_line, buf); + if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { + buf[0] = '\0'; + break; + } + + if (is_header_line(buf)) { + is_next_msg = TRUE; + break; + } else if (!strncmp(buf, "From ", 5)) { + continue; + } else if (!strncmp(buf, ">From ", 6)) { + g_memmove(buf, buf + 1, strlen(buf)); + is_next_msg = TRUE; + break; + } else { + g_warning(_("unescaped From found:\n%s"), + from_line); + break; + } + } + if (is_next_msg) break; + + if (empty_line > 0) { + while (empty_line--) + FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); + empty_line = 0; + } + + if (from_line[0] != '\0') { + FPUTS_TO_TMP_ABORT_IF_FAIL(from_line); + from_line[0] = '\0'; + } + + if (buf[0] != '\0') { + if (!strncmp(buf, ">From ", 6)) { + FPUTS_TO_TMP_ABORT_IF_FAIL(buf + 1); + } else + FPUTS_TO_TMP_ABORT_IF_FAIL(buf); + + buf[0] = '\0'; + } + } + + if (empty_line > 0) { + while (--empty_line) + FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); + } + + if (fclose(tmp_fp) == EOF) { + FILE_OP_ERROR(tmp_file, "fclose"); + g_warning(_("can't write to temporary file\n")); + g_unlink(tmp_file); + g_free(tmp_file); + fclose(mbox_fp); + return -1; + } + + fltinfo = filter_info_new(); + fltinfo->flags.perm_flags = MSG_NEW|MSG_UNREAD; + fltinfo->flags.tmp_flags = MSG_RECEIVED; + + if (folder_table) + filter_apply(prefs_common.fltlist, tmp_file, fltinfo); + + if (fltinfo->actions[FLT_ACTION_MOVE] == FALSE && + fltinfo->actions[FLT_ACTION_DELETE] == FALSE) { + if (folder_item_add_msg(dest, tmp_file, &fltinfo->flags, + FALSE) < 0) { + filter_info_free(fltinfo); + g_unlink(tmp_file); + g_free(tmp_file); + fclose(mbox_fp); + return -1; + } + fltinfo->dest_list = g_slist_append(fltinfo->dest_list, + dest); + } + + for (cur = fltinfo->dest_list; cur != NULL; cur = cur->next) { + FolderItem *drop_folder = (FolderItem *)cur->data; + gint val = 0; + + if (folder_table) { + val = GPOINTER_TO_INT(g_hash_table_lookup + (folder_table, + drop_folder)); + } + if (val == 0) { + /* force updating */ + if (FOLDER_IS_LOCAL(drop_folder->folder)) + drop_folder->mtime = 0; + if (folder_table) { + g_hash_table_insert(folder_table, + drop_folder, + GINT_TO_POINTER(1)); + } + } + } + + filter_info_free(fltinfo); + g_unlink(tmp_file); + + msgs++; + } while (from_line[0] != '\0'); + + g_free(tmp_file); + fclose(mbox_fp); + debug_print(_("%d messages found.\n"), msgs); + + return msgs; +} + +gint lock_mbox(const gchar *base, LockType type) +{ +#ifdef G_OS_UNIX + gint retval = 0; + + if (type == LOCK_FILE) { + gchar *lockfile, *locklink; + gint retry = 0; + FILE *lockfp; + + lockfile = g_strdup_printf("%s.%d", base, getpid()); + if ((lockfp = g_fopen(lockfile, "wb")) == NULL) { + FILE_OP_ERROR(lockfile, "fopen"); + g_warning(_("can't create lock file %s\n"), lockfile); + g_warning(_("use 'flock' instead of 'file' if possible.\n")); + g_free(lockfile); + return -1; + } + + fprintf(lockfp, "%d\n", getpid()); + fclose(lockfp); + + locklink = g_strconcat(base, ".lock", NULL); + while (link(lockfile, locklink) < 0) { + FILE_OP_ERROR(lockfile, "link"); + if (retry >= 5) { + g_warning(_("can't create %s\n"), lockfile); + g_unlink(lockfile); + g_free(lockfile); + return -1; + } + if (retry == 0) + g_warning(_("mailbox is owned by another" + " process, waiting...\n")); + retry++; + sleep(5); + } + g_unlink(lockfile); + g_free(lockfile); + } else if (type == LOCK_FLOCK) { + gint lockfd; + +#if HAVE_FLOCK + if ((lockfd = open(base, O_RDONLY)) < 0) { +#else + if ((lockfd = open(base, O_RDWR)) < 0) { +#endif + FILE_OP_ERROR(base, "open"); + return -1; + } +#if HAVE_FLOCK + if (flock(lockfd, LOCK_EX|LOCK_NB) < 0) { + perror("flock"); +#else +#if HAVE_LOCKF + if (lockf(lockfd, F_TLOCK, 0) < 0) { + perror("lockf"); +#else + { +#endif +#endif /* HAVE_FLOCK */ + g_warning(_("can't lock %s\n"), base); + if (close(lockfd) < 0) + perror("close"); + return -1; + } + retval = lockfd; + } else { + g_warning(_("invalid lock type\n")); + return -1; + } + + return retval; +#else + return -1; +#endif /* G_OS_UNIX */ +} + +gint unlock_mbox(const gchar *base, gint fd, LockType type) +{ + if (type == LOCK_FILE) { + gchar *lockfile; + + lockfile = g_strconcat(base, ".lock", NULL); + if (g_unlink(lockfile) < 0) { + FILE_OP_ERROR(lockfile, "unlink"); + g_free(lockfile); + return -1; + } + g_free(lockfile); + + return 0; + } else if (type == LOCK_FLOCK) { +#if HAVE_FLOCK + if (flock(fd, LOCK_UN) < 0) { + perror("flock"); +#else +#if HAVE_LOCKF + if (lockf(fd, F_ULOCK, 0) < 0) { + perror("lockf"); +#else + { +#endif +#endif /* HAVE_FLOCK */ + g_warning(_("can't unlock %s\n"), base); + if (close(fd) < 0) + perror("close"); + return -1; + } + + if (close(fd) < 0) { + perror("close"); + return -1; + } + + return 0; + } + + g_warning(_("invalid lock type\n")); + return -1; +} + +gint copy_mbox(const gchar *src, const gchar *dest) +{ + return copy_file(src, dest, TRUE); +} + +void empty_mbox(const gchar *mbox) +{ +#if HAVE_TRUNCATE + if (truncate(mbox, 0) < 0) { +#endif + FILE *fp; + +#if HAVE_TRUNCATE + FILE_OP_ERROR(mbox, "truncate"); +#endif + if ((fp = g_fopen(mbox, "wb")) == NULL) { + FILE_OP_ERROR(mbox, "fopen"); + g_warning(_("can't truncate mailbox to zero.\n")); + return; + } + fclose(fp); +#if HAVE_TRUNCATE + } +#endif +} + +/* read all messages in SRC, and store them into one MBOX file. */ +gint export_to_mbox(FolderItem *src, const gchar *mbox) +{ + GSList *mlist; + GSList *cur; + MsgInfo *msginfo; + FILE *msg_fp; + FILE *mbox_fp; + gchar buf[BUFFSIZE]; + + g_return_val_if_fail(src != NULL, -1); + g_return_val_if_fail(src->folder != NULL, -1); + g_return_val_if_fail(mbox != NULL, -1); + + debug_print(_("Exporting messages from %s into %s...\n"), + src->path, mbox); + + if ((mbox_fp = g_fopen(mbox, "wb")) == NULL) { + FILE_OP_ERROR(mbox, "fopen"); + return -1; + } + + mlist = folder_item_get_msg_list(src, TRUE); + + for (cur = mlist; cur != NULL; cur = cur->next) { + msginfo = (MsgInfo *)cur->data; + + msg_fp = procmsg_open_message(msginfo); + if (!msg_fp) { + procmsg_msginfo_free(msginfo); + continue; + } + + strncpy2(buf, + msginfo->from ? msginfo->from : + cur_account && cur_account->address ? + cur_account->address : "unknown", + sizeof(buf)); + extract_address(buf); + + fprintf(mbox_fp, "From %s %s", + buf, ctime(&msginfo->date_t)); + + while (fgets(buf, sizeof(buf), msg_fp) != NULL) { + if (!strncmp(buf, "From ", 5)) + fputc('>', mbox_fp); + fputs(buf, mbox_fp); + } + fputc('\n', mbox_fp); + + fclose(msg_fp); + procmsg_msginfo_free(msginfo); + } + + g_slist_free(mlist); + + fclose(mbox_fp); + + return 0; +} diff --git a/libsylph/mbox.h b/libsylph/mbox.h new file mode 100644 index 00000000..3b210f0a --- /dev/null +++ b/libsylph/mbox.h @@ -0,0 +1,47 @@ +/* + * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client + * Copyright (C) 1999,2000 Hiroyuki Yamamoto + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __MBOX_H__ +#define __MBOX_H__ + +#include + +#include "folder.h" + +typedef enum { + LOCK_FILE, + LOCK_FLOCK +} LockType; + +gint proc_mbox (FolderItem *dest, + const gchar *mbox, + GHashTable *folder_table); +gint lock_mbox (const gchar *base, + LockType type); +gint unlock_mbox (const gchar *base, + gint fd, + LockType type); +gint copy_mbox (const gchar *src, + const gchar *dest); +void empty_mbox (const gchar *mbox); + +gint export_to_mbox (FolderItem *src, + const gchar *mbox); + +#endif /* __MBOX_H__ */ diff --git a/src/Makefile.am b/src/Makefile.am index ae8991a2..57966f3e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -70,7 +70,6 @@ sylpheed_SOURCES = \ about.c about.h \ setup.c setup.h \ gtkutils.c gtkutils.h \ - mbox.c mbox.h \ send_message.c send_message.h \ inc.c inc.h \ import.c import.h \ diff --git a/src/mbox.c b/src/mbox.c deleted file mode 100644 index 7c98996e..00000000 --- a/src/mbox.c +++ /dev/null @@ -1,465 +0,0 @@ -/* - * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2001 Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include "defs.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "mbox.h" -#include "procmsg.h" -#include "folder.h" -#include "filter.h" -#include "prefs_common.h" -#include "prefs_account.h" -#include "account.h" -#include "utils.h" - -#define MSGBUFSIZE 8192 - -#define FPUTS_TO_TMP_ABORT_IF_FAIL(s) \ -{ \ - if (fputs(s, tmp_fp) == EOF) { \ - g_warning(_("can't write to temporary file\n")); \ - fclose(tmp_fp); \ - fclose(mbox_fp); \ - g_unlink(tmp_file); \ - g_free(tmp_file); \ - return -1; \ - } \ -} - -gint proc_mbox(FolderItem *dest, const gchar *mbox, GHashTable *folder_table) -{ - FILE *mbox_fp; - gchar buf[MSGBUFSIZE], from_line[MSGBUFSIZE]; - gchar *tmp_file; - gint msgs = 0; - - g_return_val_if_fail(dest != NULL, -1); - g_return_val_if_fail(mbox != NULL, -1); - - debug_print(_("Getting messages from %s into %s...\n"), mbox, dest->path); - - if ((mbox_fp = g_fopen(mbox, "rb")) == NULL) { - FILE_OP_ERROR(mbox, "fopen"); - return -1; - } - - /* ignore empty lines on the head */ - do { - if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { - g_warning(_("can't read mbox file.\n")); - fclose(mbox_fp); - return -1; - } - } while (buf[0] == '\n' || buf[0] == '\r'); - - if (strncmp(buf, "From ", 5) != 0) { - g_warning(_("invalid mbox format: %s\n"), mbox); - fclose(mbox_fp); - return -1; - } - - strcpy(from_line, buf); - if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { - g_warning(_("malformed mbox: %s\n"), mbox); - fclose(mbox_fp); - return -1; - } - - tmp_file = get_tmp_file(); - - do { - FILE *tmp_fp; - GSList *cur; - gchar *startp, *endp, *rpath; - gint empty_line; - gboolean is_next_msg = FALSE; - FilterInfo *fltinfo; - - if ((tmp_fp = g_fopen(tmp_file, "wb")) == NULL) { - FILE_OP_ERROR(tmp_file, "fopen"); - g_warning(_("can't open temporary file\n")); - g_free(tmp_file); - fclose(mbox_fp); - return -1; - } - if (change_file_mode_rw(tmp_fp, tmp_file) < 0) - FILE_OP_ERROR(tmp_file, "chmod"); - - /* convert unix From into Return-Path */ - startp = from_line + 5; - endp = strchr(startp, ' '); - if (endp == NULL) - rpath = g_strdup(startp); - else - rpath = g_strndup(startp, endp - startp); - g_strstrip(rpath); - g_snprintf(from_line, sizeof(from_line), - "Return-Path: %s\n", rpath); - g_free(rpath); - - FPUTS_TO_TMP_ABORT_IF_FAIL(from_line); - FPUTS_TO_TMP_ABORT_IF_FAIL(buf); - from_line[0] = '\0'; - - empty_line = 0; - - while (fgets(buf, sizeof(buf), mbox_fp) != NULL) { - if (buf[0] == '\n' || buf[0] == '\r') { - empty_line++; - buf[0] = '\0'; - continue; - } - - /* From separator */ - while (!strncmp(buf, "From ", 5)) { - strcpy(from_line, buf); - if (fgets(buf, sizeof(buf), mbox_fp) == NULL) { - buf[0] = '\0'; - break; - } - - if (is_header_line(buf)) { - is_next_msg = TRUE; - break; - } else if (!strncmp(buf, "From ", 5)) { - continue; - } else if (!strncmp(buf, ">From ", 6)) { - g_memmove(buf, buf + 1, strlen(buf)); - is_next_msg = TRUE; - break; - } else { - g_warning(_("unescaped From found:\n%s"), - from_line); - break; - } - } - if (is_next_msg) break; - - if (empty_line > 0) { - while (empty_line--) - FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); - empty_line = 0; - } - - if (from_line[0] != '\0') { - FPUTS_TO_TMP_ABORT_IF_FAIL(from_line); - from_line[0] = '\0'; - } - - if (buf[0] != '\0') { - if (!strncmp(buf, ">From ", 6)) { - FPUTS_TO_TMP_ABORT_IF_FAIL(buf + 1); - } else - FPUTS_TO_TMP_ABORT_IF_FAIL(buf); - - buf[0] = '\0'; - } - } - - if (empty_line > 0) { - while (--empty_line) - FPUTS_TO_TMP_ABORT_IF_FAIL("\n"); - } - - if (fclose(tmp_fp) == EOF) { - FILE_OP_ERROR(tmp_file, "fclose"); - g_warning(_("can't write to temporary file\n")); - g_unlink(tmp_file); - g_free(tmp_file); - fclose(mbox_fp); - return -1; - } - - fltinfo = filter_info_new(); - fltinfo->flags.perm_flags = MSG_NEW|MSG_UNREAD; - fltinfo->flags.tmp_flags = MSG_RECEIVED; - - if (folder_table) - filter_apply(prefs_common.fltlist, tmp_file, fltinfo); - - if (fltinfo->actions[FLT_ACTION_MOVE] == FALSE && - fltinfo->actions[FLT_ACTION_DELETE] == FALSE) { - if (folder_item_add_msg(dest, tmp_file, &fltinfo->flags, - FALSE) < 0) { - filter_info_free(fltinfo); - g_unlink(tmp_file); - g_free(tmp_file); - fclose(mbox_fp); - return -1; - } - fltinfo->dest_list = g_slist_append(fltinfo->dest_list, - dest); - } - - for (cur = fltinfo->dest_list; cur != NULL; cur = cur->next) { - FolderItem *drop_folder = (FolderItem *)cur->data; - gint val = 0; - - if (folder_table) { - val = GPOINTER_TO_INT(g_hash_table_lookup - (folder_table, - drop_folder)); - } - if (val == 0) { - /* force updating */ - if (FOLDER_IS_LOCAL(drop_folder->folder)) - drop_folder->mtime = 0; - if (folder_table) { - g_hash_table_insert(folder_table, - drop_folder, - GINT_TO_POINTER(1)); - } - } - } - - filter_info_free(fltinfo); - g_unlink(tmp_file); - - msgs++; - } while (from_line[0] != '\0'); - - g_free(tmp_file); - fclose(mbox_fp); - debug_print(_("%d messages found.\n"), msgs); - - return msgs; -} - -gint lock_mbox(const gchar *base, LockType type) -{ -#ifdef G_OS_UNIX - gint retval = 0; - - if (type == LOCK_FILE) { - gchar *lockfile, *locklink; - gint retry = 0; - FILE *lockfp; - - lockfile = g_strdup_printf("%s.%d", base, getpid()); - if ((lockfp = g_fopen(lockfile, "wb")) == NULL) { - FILE_OP_ERROR(lockfile, "fopen"); - g_warning(_("can't create lock file %s\n"), lockfile); - g_warning(_("use 'flock' instead of 'file' if possible.\n")); - g_free(lockfile); - return -1; - } - - fprintf(lockfp, "%d\n", getpid()); - fclose(lockfp); - - locklink = g_strconcat(base, ".lock", NULL); - while (link(lockfile, locklink) < 0) { - FILE_OP_ERROR(lockfile, "link"); - if (retry >= 5) { - g_warning(_("can't create %s\n"), lockfile); - g_unlink(lockfile); - g_free(lockfile); - return -1; - } - if (retry == 0) - g_warning(_("mailbox is owned by another" - " process, waiting...\n")); - retry++; - sleep(5); - } - g_unlink(lockfile); - g_free(lockfile); - } else if (type == LOCK_FLOCK) { - gint lockfd; - -#if HAVE_FLOCK - if ((lockfd = open(base, O_RDONLY)) < 0) { -#else - if ((lockfd = open(base, O_RDWR)) < 0) { -#endif - FILE_OP_ERROR(base, "open"); - return -1; - } -#if HAVE_FLOCK - if (flock(lockfd, LOCK_EX|LOCK_NB) < 0) { - perror("flock"); -#else -#if HAVE_LOCKF - if (lockf(lockfd, F_TLOCK, 0) < 0) { - perror("lockf"); -#else - { -#endif -#endif /* HAVE_FLOCK */ - g_warning(_("can't lock %s\n"), base); - if (close(lockfd) < 0) - perror("close"); - return -1; - } - retval = lockfd; - } else { - g_warning(_("invalid lock type\n")); - return -1; - } - - return retval; -#else - return -1; -#endif /* G_OS_UNIX */ -} - -gint unlock_mbox(const gchar *base, gint fd, LockType type) -{ - if (type == LOCK_FILE) { - gchar *lockfile; - - lockfile = g_strconcat(base, ".lock", NULL); - if (g_unlink(lockfile) < 0) { - FILE_OP_ERROR(lockfile, "unlink"); - g_free(lockfile); - return -1; - } - g_free(lockfile); - - return 0; - } else if (type == LOCK_FLOCK) { -#if HAVE_FLOCK - if (flock(fd, LOCK_UN) < 0) { - perror("flock"); -#else -#if HAVE_LOCKF - if (lockf(fd, F_ULOCK, 0) < 0) { - perror("lockf"); -#else - { -#endif -#endif /* HAVE_FLOCK */ - g_warning(_("can't unlock %s\n"), base); - if (close(fd) < 0) - perror("close"); - return -1; - } - - if (close(fd) < 0) { - perror("close"); - return -1; - } - - return 0; - } - - g_warning(_("invalid lock type\n")); - return -1; -} - -gint copy_mbox(const gchar *src, const gchar *dest) -{ - return copy_file(src, dest, TRUE); -} - -void empty_mbox(const gchar *mbox) -{ -#if HAVE_TRUNCATE - if (truncate(mbox, 0) < 0) { -#endif - FILE *fp; - -#if HAVE_TRUNCATE - FILE_OP_ERROR(mbox, "truncate"); -#endif - if ((fp = g_fopen(mbox, "wb")) == NULL) { - FILE_OP_ERROR(mbox, "fopen"); - g_warning(_("can't truncate mailbox to zero.\n")); - return; - } - fclose(fp); -#if HAVE_TRUNCATE - } -#endif -} - -/* read all messages in SRC, and store them into one MBOX file. */ -gint export_to_mbox(FolderItem *src, const gchar *mbox) -{ - GSList *mlist; - GSList *cur; - MsgInfo *msginfo; - FILE *msg_fp; - FILE *mbox_fp; - gchar buf[BUFFSIZE]; - - g_return_val_if_fail(src != NULL, -1); - g_return_val_if_fail(src->folder != NULL, -1); - g_return_val_if_fail(mbox != NULL, -1); - - debug_print(_("Exporting messages from %s into %s...\n"), - src->path, mbox); - - if ((mbox_fp = g_fopen(mbox, "wb")) == NULL) { - FILE_OP_ERROR(mbox, "fopen"); - return -1; - } - - mlist = folder_item_get_msg_list(src, TRUE); - - for (cur = mlist; cur != NULL; cur = cur->next) { - msginfo = (MsgInfo *)cur->data; - - msg_fp = procmsg_open_message(msginfo); - if (!msg_fp) { - procmsg_msginfo_free(msginfo); - continue; - } - - strncpy2(buf, - msginfo->from ? msginfo->from : - cur_account && cur_account->address ? - cur_account->address : "unknown", - sizeof(buf)); - extract_address(buf); - - fprintf(mbox_fp, "From %s %s", - buf, ctime(&msginfo->date_t)); - - while (fgets(buf, sizeof(buf), msg_fp) != NULL) { - if (!strncmp(buf, "From ", 5)) - fputc('>', mbox_fp); - fputs(buf, mbox_fp); - } - fputc('\n', mbox_fp); - - fclose(msg_fp); - procmsg_msginfo_free(msginfo); - } - - g_slist_free(mlist); - - fclose(mbox_fp); - - return 0; -} diff --git a/src/mbox.h b/src/mbox.h deleted file mode 100644 index 3b210f0a..00000000 --- a/src/mbox.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999,2000 Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __MBOX_H__ -#define __MBOX_H__ - -#include - -#include "folder.h" - -typedef enum { - LOCK_FILE, - LOCK_FLOCK -} LockType; - -gint proc_mbox (FolderItem *dest, - const gchar *mbox, - GHashTable *folder_table); -gint lock_mbox (const gchar *base, - LockType type); -gint unlock_mbox (const gchar *base, - gint fd, - LockType type); -gint copy_mbox (const gchar *src, - const gchar *dest); -void empty_mbox (const gchar *mbox); - -gint export_to_mbox (FolderItem *src, - const gchar *mbox); - -#endif /* __MBOX_H__ */ -- cgit v1.2.3