X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mbox.c;h=bafb7f3db0f6a55b2770a632eaf5d6d8a7073200;hp=64d86b8e240323600c308f64b13484b61bb76ad9;hb=b2a6a9673e124c222f921650a6f0025b64ab2145;hpb=df70e07e24add1869bcc9b7af2277d9d0c09a281 diff --git a/mbox.c b/mbox.c index 64d86b8..bafb7f3 100644 --- a/mbox.c +++ b/mbox.c @@ -1,19 +1,10 @@ /* + * Copyright notice from original mutt: * Copyright (C) 1996-2002 Michael R. Elkins - * - * 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, USA. + * + * This file is part of mutt-ng, see http://www.muttng.org/. + * It's licensed under the GNU General Public License, + * please see the file GPL in the top level source directory. */ /* This file contains code to parse ``mbox'' and ``mmdf'' style mailboxes */ @@ -23,8 +14,8 @@ #endif #include "mutt.h" -#include "mailbox.h" #include "mx.h" +#include "mbox.h" #include "sort.h" #include "copy.h" @@ -32,6 +23,10 @@ #include "compress.h" #endif +#include "lib/mem.h" +#include "lib/intl.h" +#include "lib/str.h" + #include #include #include @@ -50,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? @@ -119,7 +121,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx) if (fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL) break; - if (mutt_strcmp (buf, MMDF_SEP) == 0) { + if (safe_strcmp (buf, MMDF_SEP) == 0) { loc = ftell (ctx->fp); count++; @@ -163,7 +165,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx) if (0 < tmploc && tmploc < ctx->size) { if (fseek (ctx->fp, tmploc, SEEK_SET) != 0 || fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL || - mutt_strcmp (MMDF_SEP, buf) != 0) { + safe_strcmp (MMDF_SEP, buf) != 0) { if (fseek (ctx->fp, loc, SEEK_SET) != 0) dprint (1, (debugfile, "mmdf_parse_mailbox: fseek() failed\n")); hdr->content->length = -1; @@ -182,7 +184,7 @@ int mmdf_parse_mailbox (CONTEXT * ctx) if (fgets (buf, sizeof (buf) - 1, ctx->fp) == NULL) break; lines++; - } while (mutt_strcmp (buf, MMDF_SEP) != 0); + } while (safe_strcmp (buf, MMDF_SEP) != 0); hdr->lines = lines; hdr->content->length = loc - hdr->content->offset; @@ -303,7 +305,7 @@ int mbox_parse_mailbox (CONTEXT * ctx) */ if (fseek (ctx->fp, tmploc, SEEK_SET) != 0 || fgets (buf, sizeof (buf), ctx->fp) == NULL || - mutt_strncmp ("From ", buf, 5) != 0) { + safe_strncmp ("From ", buf, 5) != 0) { dprint (1, (debugfile, "mbox_parse_mailbox: bad content-length in message %d (cl=%ld)\n", @@ -416,8 +418,8 @@ int mbox_open_mailbox (CONTEXT * ctx) static int strict_addrcmp (const ADDRESS * a, const ADDRESS * b) { while (a && b) { - if (mutt_strcmp (a->mailbox, b->mailbox) || - mutt_strcmp (a->personal, b->personal)) + if (safe_strcmp (a->mailbox, b->mailbox) || + safe_strcmp (a->personal, b->personal)) return (0); a = a->next; @@ -432,7 +434,7 @@ static int strict_addrcmp (const ADDRESS * a, const ADDRESS * b) static int strict_cmp_lists (const LIST * a, const LIST * b) { while (a && b) { - if (mutt_strcmp (a->data, b->data)) + if (safe_strcmp (a->data, b->data)) return (0); a = a->next; @@ -447,8 +449,8 @@ static int strict_cmp_lists (const LIST * a, const LIST * b) static int strict_cmp_envelopes (const ENVELOPE * e1, const ENVELOPE * e2) { if (e1 && e2) { - if (mutt_strcmp (e1->message_id, e2->message_id) || - mutt_strcmp (e1->subject, e2->subject) || + if (safe_strcmp (e1->message_id, e2->message_id) || + safe_strcmp (e1->subject, e2->subject) || !strict_cmp_lists (e1->references, e2->references) || !strict_addrcmp (e1->from, e2->from) || !strict_addrcmp (e1->sender, e2->sender) || @@ -471,8 +473,8 @@ static int strict_cmp_envelopes (const ENVELOPE * e1, const ENVELOPE * e2) static int strict_cmp_parameters (const PARAMETER * p1, const PARAMETER * p2) { while (p1 && p2) { - if (mutt_strcmp (p1->attribute, p2->attribute) || - mutt_strcmp (p1->value, p2->value)) + if (safe_strcmp (p1->attribute, p2->attribute) || + safe_strcmp (p1->value, p2->value)) return (0); p1 = p1->next; @@ -488,8 +490,8 @@ static int strict_cmp_bodies (const BODY * b1, const BODY * b2) { if (b1->type != b2->type || b1->encoding != b2->encoding || - mutt_strcmp (b1->subtype, b2->subtype) || - mutt_strcmp (b1->description, b2->description) || + safe_strcmp (b1->subtype, b2->subtype) || + safe_strcmp (b1->description, b2->description) || !strict_cmp_parameters (b1->parameter, b2->parameter) || b1->length != b2->length) return (0); @@ -572,8 +574,8 @@ int mbox_check_mailbox (CONTEXT * ctx, int *index_hint) if (fseek (ctx->fp, ctx->size, SEEK_SET) != 0) dprint (1, (debugfile, "mbox_check_mailbox: fseek() failed\n")); if (fgets (buffer, sizeof (buffer), ctx->fp) != NULL) { - if ((ctx->magic == M_MBOX && mutt_strncmp ("From ", buffer, 5) == 0) - || (ctx->magic == M_MMDF && mutt_strcmp (MMDF_SEP, buffer) == 0)) { + if ((ctx->magic == M_MBOX && safe_strncmp ("From ", buffer, 5) == 0) + || (ctx->magic == M_MMDF && safe_strcmp (MMDF_SEP, buffer) == 0)) { if (fseek (ctx->fp, ctx->size, SEEK_SET) != 0) dprint (1, (debugfile, "mbox_check_mailbox: fseek() failed\n")); if (ctx->magic == M_MBOX) @@ -606,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 (); @@ -837,8 +839,8 @@ int mbox_sync_mailbox (CONTEXT * ctx, int *index_hint) if (fseek (ctx->fp, offset, SEEK_SET) != 0 || /* seek the append location */ /* do a sanity check to make sure the mailbox looks ok */ fgets (buf, sizeof (buf), ctx->fp) == NULL || - (ctx->magic == M_MBOX && mutt_strncmp ("From ", buf, 5) != 0) || - (ctx->magic == M_MMDF && mutt_strcmp (MMDF_SEP, buf) != 0)) { + (ctx->magic == M_MBOX && safe_strncmp ("From ", buf, 5) != 0) || + (ctx->magic == M_MMDF && safe_strcmp (MMDF_SEP, buf) != 0)) { dprint (1, (debugfile, "mbox_sync_mailbox: message not in expected position.")); @@ -977,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; @@ -1040,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 { @@ -1152,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); +}