summaryrefslogtreecommitdiffstats
path: root/mime-node.c
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2019-03-24 00:32:44 -0300
committerDavid Bremner <david@tethera.net>2019-05-03 07:48:43 -0300
commit103c11822ee0b7645fda6397fb40f8ac7ed9b49b (patch)
treeb79cd49890038023cec5b1ee588f2684ad8b2c10 /mime-node.c
parent852167479f552cd396b1fdcbe9b1cb4db40e5e0a (diff)
cli/notmuch-show: support gzipped files
This drops "file" from mime_node_context and just uses a local variable. It also uses the new gzip aware utility routines recently added to util/gmime-extra.c. The use of gzopen / gzfile in addition is a bit icky, but the choice is between that, and providing yet another readline implimentation that understands GMime streams.
Diffstat (limited to 'mime-node.c')
-rw-r--r--mime-node.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/mime-node.c b/mime-node.c
index cd3db67d..e33336bb 100644
--- a/mime-node.c
+++ b/mime-node.c
@@ -21,13 +21,16 @@
* Austin Clements <aclements@csail.mit.edu>
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include "notmuch-client.h"
/* Context that gets inherited from the root node. */
typedef struct mime_node_context {
/* Per-message resources. These are allocated internally and must
* be destroyed. */
- FILE *file;
GMimeStream *stream;
GMimeParser *parser;
GMimeMessage *mime_message;
@@ -48,9 +51,6 @@ _mime_node_context_free (mime_node_context_t *res)
if (res->stream)
g_object_unref (res->stream);
- if (res->file)
- fclose (res->file);
-
return 0;
}
@@ -62,6 +62,7 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
mime_node_context_t *mctx;
mime_node_t *root;
notmuch_status_t status;
+ int fd;
root = talloc_zero (ctx, mime_node_t);
if (root == NULL) {
@@ -80,8 +81,8 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
talloc_set_destructor (mctx, _mime_node_context_free);
/* Fast path */
- mctx->file = fopen (filename, "r");
- if (! mctx->file) {
+ fd = open (filename, O_RDONLY);
+ if (fd == -1) {
/* Slow path - for some reason the first file in the list is
* not available anymore. This is clearly a problem in the
* database, but we are not going to let this problem be a
@@ -92,13 +93,13 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
notmuch_filenames_move_to_next (filenames))
{
filename = notmuch_filenames_get (filenames);
- mctx->file = fopen (filename, "r");
- if (mctx->file)
+ fd = open (filename, O_RDONLY);
+ if (fd != -1)
break;
}
talloc_free (filenames);
- if (! mctx->file) {
+ if (fd == -1) {
/* Give up */
fprintf (stderr, "Error opening %s: %s\n", filename, strerror (errno));
status = NOTMUCH_STATUS_FILE_ERROR;
@@ -106,13 +107,12 @@ mime_node_open (const void *ctx, notmuch_message_t *message,
}
}
- mctx->stream = g_mime_stream_file_new (mctx->file);
+ mctx->stream = g_mime_stream_gzfile_new (fd);
if (!mctx->stream) {
fprintf (stderr, "Out of memory.\n");
status = NOTMUCH_STATUS_OUT_OF_MEMORY;
goto DONE;
}
- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (mctx->stream), false);
mctx->parser = g_mime_parser_new_with_stream (mctx->stream);
if (!mctx->parser) {