X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=mbox.c;h=bafb7f3db0f6a55b2770a632eaf5d6d8a7073200;hb=2f928128cac1c0bc2ce2465671e5abe2a9671d28;hp=e973d3b631abbc8aebb4bbe6d6eec2026ce3c0c3;hpb=0f44dc85fc1280372ffab911d701e703d803fb4b;p=apps%2Fmadmutt.git diff --git a/mbox.c b/mbox.c index e973d3b..bafb7f3 100644 --- a/mbox.c +++ b/mbox.c @@ -14,8 +14,8 @@ #endif #include "mutt.h" -#include "mailbox.h" #include "mx.h" +#include "mbox.h" #include "sort.h" #include "copy.h" @@ -45,6 +45,13 @@ struct m_update_t { long length; }; + +int mbox_open_new_message (MESSAGE * msg, CONTEXT * dest, HEADER * hdr) +{ + msg->fp = dest->fp; + return 0; +} + /* parameters: * ctx - context to lock * excl - exclusive lock? @@ -601,7 +608,7 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint) } if (modified) { - if (mutt_reopen_mailbox (ctx, index_hint) != -1) { + if (mbox_reopen_mailbox (ctx, index_hint) != -1) { if (unlock) { mbox_unlock_mailbox (ctx); mutt_unblock_signals (); @@ -972,7 +979,7 @@ int mbox_close_mailbox (CONTEXT * ctx) return 0; } -int mutt_reopen_mailbox (CONTEXT * ctx, int *index_hint) +int mbox_reopen_mailbox (CONTEXT * ctx, int *index_hint) { int (*cmp_headers) (const HEADER *, const HEADER *) = NULL; HEADER **old_hdrs; @@ -1035,7 +1042,7 @@ int mutt_reopen_mailbox (CONTEXT * ctx, int *index_hint) case M_MBOX: case M_MMDF: if (fseek (ctx->fp, 0, SEEK_SET) != 0) { - dprint (1, (debugfile, "mutt_reopen_mailbox: fseek() failed\n")); + dprint (1, (debugfile, "mbox_reopen_mailbox: fseek() failed\n")); rc = -1; } else { @@ -1147,3 +1154,70 @@ int mbox_check_empty (const char *path) return ((st.st_size == 0)); } + +int mbox_is_magic (const char* path, struct stat* st) { + int magic = -1; + FILE* f; + char tmp[_POSIX_PATH_MAX]; + + if (S_ISDIR(st->st_mode)) + return (-1); + + if (st->st_size == 0) { + /* hard to tell what zero-length files are, so assume the default magic */ + if (DefaultMagic == M_MBOX || DefaultMagic == M_MMDF) + return (DefaultMagic); + else + return (M_MBOX); + } + else if ((f = fopen (path, "r")) != NULL) { +#ifndef BUFFY_SIZE + struct utimbuf times; +#endif + fgets (tmp, sizeof (tmp), f); + if (safe_strncmp ("From ", tmp, 5) == 0) + magic = M_MBOX; + else if (safe_strcmp (MMDF_SEP, tmp) == 0) + magic = M_MMDF; + safe_fclose (&f); +#ifndef BUFFY_SIZE + /* need to restore the times here, the file was not really accessed, + * only the type was accessed. This is important, because detection + * of "new mail" depends on those times set correctly. + */ + times.actime = st->st_atime; + times.modtime = st->st_mtime; + utime (path, ×); +#endif + } else { + mutt_perror (path); + return (-1); /* fopen failed */ + } + +#ifdef USE_COMPRESSED + if (magic == -1 && mutt_can_read_compressed (path)) + return (M_COMPRESSED); +#endif + return (magic); +} + +static mx_t* reg_mx (void) { + mx_t* fmt = safe_calloc (1, sizeof (mx_t)); + fmt->local = 1; + fmt->mx_check_empty = mbox_check_empty; + fmt->mx_is_magic = mbox_is_magic; + fmt->mx_access = access; + fmt->mx_open_mailbox = mbox_open_mailbox; + return (fmt); +} + +mx_t* mbox_reg_mx (void) { + mx_t* fmt = reg_mx (); + fmt->type = M_MBOX; + return (fmt); +} +mx_t* mmdf_reg_mx (void) { + mx_t* fmt = reg_mx (); + fmt->type = M_MMDF; + return (fmt); +}