aboutsummaryrefslogtreecommitdiff
path: root/notmuch-show.c
diff options
context:
space:
mode:
authornstraz@redhat.com <nstraz@redhat.com>2010-04-01 09:47:21 -0400
committerCarl Worth <cworth@cworth.org>2010-04-01 14:27:01 -0700
commit685cfcc9e876e9c611d2cb03e8ebd417a7f165b7 (patch)
tree18e1a2c6c8273ed8e4bc39d5c506979e81680b8e /notmuch-show.c
parentb884ab2ef1b9e15b81d119089e64c2c0fa60012e (diff)
Setup the GMimeStream only when needed
I ran into this while looking at the vim plugin. Vim's system() call redirects output to a file and it was missing many of the part{ lines. If stream_stdout is setup too early, it will overwrite the part start when notmuch is redirected to a file. Reviewed-by Carl Worth <cworth@cworth.org>: GMime is calling fseek before every write to reset the FILE* to the position it believes is correct based on the writes it has seen. Our code was getting incorrect results because our GMime writes were interleaved with non-GMime writes via printf. The bug appears when writing to a file because it's seekable, but not when writing to a pipe which is not.
Diffstat (limited to 'notmuch-show.c')
-rw-r--r--notmuch-show.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/notmuch-show.c b/notmuch-show.c
index ff1fecb..96647c1 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -236,9 +236,6 @@ format_part_text (GMimeObject *part, int *part_count)
{
GMimeContentDisposition *disposition;
GMimeContentType *content_type;
- GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
-
- g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
disposition = g_mime_object_get_content_disposition (part);
if (disposition &&
@@ -256,14 +253,14 @@ format_part_text (GMimeObject *part, int *part_count)
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
+ GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+ g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
show_part_content (part, stream_stdout);
+ g_object_unref(stream_stdout);
}
printf ("\fattachment}\n");
- if (stream_stdout)
- g_object_unref(stream_stdout);
-
return;
}
@@ -276,7 +273,10 @@ format_part_text (GMimeObject *part, int *part_count)
if (g_mime_content_type_is_type (content_type, "text", "*") &&
!g_mime_content_type_is_type (content_type, "text", "html"))
{
+ GMimeStream *stream_stdout = g_mime_stream_file_new (stdout);
+ g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);
show_part_content (part, stream_stdout);
+ g_object_unref(stream_stdout);
}
else
{
@@ -285,9 +285,6 @@ format_part_text (GMimeObject *part, int *part_count)
}
printf ("\fpart}\n");
-
- if (stream_stdout)
- g_object_unref(stream_stdout);
}
static void