* 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, see http://www.gnu.org/licenses/ .
+ * along with this program. If not, see https://www.gnu.org/licenses/ .
*
* Author: Carl Worth <cworth@cworth.org>
*/
GMimeMessage *message;
};
-static int
-strcase_equal (const void *a, const void *b)
-{
- return strcasecmp (a, b) == 0;
-}
-
-static unsigned int
-strcase_hash (const void *ptr)
-{
- const char *s = ptr;
-
- /* This is the djb2 hash. */
- unsigned int hash = 5381;
- while (s && *s) {
- hash = ((hash << 5) + hash) + tolower (*s);
- s++;
- }
-
- return hash;
-}
-
static int
_notmuch_message_file_destructor (notmuch_message_file_t *message)
{
/* Create a new notmuch_message_file_t for 'filename' with 'ctx' as
* the talloc owner. */
notmuch_message_file_t *
-_notmuch_message_file_open_ctx (void *ctx, const char *filename)
+_notmuch_message_file_open_ctx (notmuch_database_t *notmuch,
+ void *ctx, const char *filename)
{
notmuch_message_file_t *message;
return message;
FAIL:
- fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno));
- notmuch_message_file_close (message);
+ _notmuch_database_log (notmuch, "Error opening %s: %s\n",
+ filename, strerror (errno));
+ _notmuch_message_file_close (message);
return NULL;
}
notmuch_message_file_t *
-notmuch_message_file_open (const char *filename)
+_notmuch_message_file_open (notmuch_database_t *notmuch,
+ const char *filename)
{
- return _notmuch_message_file_open_ctx (NULL, filename);
+ return _notmuch_message_file_open_ctx (notmuch, NULL, filename);
}
void
-notmuch_message_file_close (notmuch_message_file_t *message)
+_notmuch_message_file_close (notmuch_message_file_t *message)
{
talloc_free (message);
}
static notmuch_bool_t
-is_mbox (FILE *file)
+_is_mbox (FILE *file)
{
char from_buf[5];
notmuch_bool_t ret = FALSE;
GMimeParser *parser;
notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
static int initialized = 0;
+ notmuch_bool_t is_mbox;
if (message->message)
return NOTMUCH_STATUS_SUCCESS;
- /* We no longer support mboxes at all. */
- if (is_mbox (message->file))
- return NOTMUCH_STATUS_FILE_NOT_EMAIL;
+ is_mbox = _is_mbox (message->file);
if (! initialized) {
g_mime_init (GMIME_ENABLE_RFC2047_WORKAROUNDS);
g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream), FALSE);
parser = g_mime_parser_new_with_stream (stream);
- g_mime_parser_set_scan_from (parser, FALSE);
+ g_mime_parser_set_scan_from (parser, is_mbox);
message->message = g_mime_parser_construct_message (parser);
if (! message->message) {
goto DONE;
}
+ if (is_mbox && ! g_mime_parser_eos (parser)) {
+ /*
+ * This is a multi-message mbox. (For historical reasons, we
+ * do support single-message mboxes.)
+ */
+ status = NOTMUCH_STATUS_FILE_NOT_EMAIL;
+ }
+
DONE:
g_object_unref (stream);
g_object_unref (parser);
}
const char *
-notmuch_message_file_get_header (notmuch_message_file_t *message,
+_notmuch_message_file_get_header (notmuch_message_file_t *message,
const char *header)
{
const char *value;