From bd34e927c740ec7171565abf4dfc7f743179e944 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Wed, 25 Jul 2001 00:16:32 +0000 Subject: Pass the O_TRUNC flag to open so that we don't leave trailing garbage at 2001-07-24 Jeffrey Stedfast * mail-ops.c (save_part_save): Pass the O_TRUNC flag to open so that we don't leave trailing garbage at the end of the file if the new file content is shorter than the old file content. svn path=/trunk/; revision=11373 --- mail/ChangeLog | 4 +++ mail/mail-display.c | 11 ++++---- mail/mail-ops.c | 72 ++++++++++++++++++++++++++++------------------------- 3 files changed, 48 insertions(+), 39 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 1f52782136..d16b628130 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,5 +1,9 @@ 2001-07-24 Jeffrey Stedfast + * mail-ops.c (save_part_save): Pass the O_TRUNC flag to open so + that we don't leave trailing garbage at the end of the file if the + new file content is shorter than the old file content. + * component-factory.c (create_view): Fix for bug #5174. 2001-07-24 Jason Leach diff --git a/mail/mail-display.c b/mail/mail-display.c index ea795fc6d2..a681fdd5cf 100644 --- a/mail/mail-display.c +++ b/mail/mail-display.c @@ -94,7 +94,7 @@ write_data_to_file (CamelMimePart *part, const char *name, gboolean unique) if (fd == -1 && errno == EEXIST && !unique) { GtkWidget *dlg; GtkWidget *text; - + dlg = gnome_dialog_new (_("Overwrite file?"), GNOME_STOCK_BUTTON_YES, GNOME_STOCK_BUTTON_NO, @@ -103,15 +103,16 @@ write_data_to_file (CamelMimePart *part, const char *name, gboolean unique) gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox), text, TRUE, TRUE, 4); gtk_window_set_policy(GTK_WINDOW(dlg), FALSE, TRUE, FALSE); gtk_widget_show (text); - + if (gnome_dialog_run_and_close (GNOME_DIALOG (dlg)) != 0) return FALSE; } + if (fd != -1) - close(fd); - + close (fd); + /* should this have progress of what its doing? */ - mail_msg_wait(mail_save_part(part, name, write_data_written, &ret)); + mail_msg_wait (mail_save_part (part, name, write_data_written, &ret)); return ret; } diff --git a/mail/mail-ops.c b/mail/mail-ops.c index c3b36f5008..3d1b994dae 100644 --- a/mail/mail-ops.c +++ b/mail/mail-ops.c @@ -1987,7 +1987,8 @@ static char *save_part_desc(struct _mail_msg *mm, int done) return g_strdup(_("Saving attachment")); } -static void save_part_save(struct _mail_msg *mm) +static void +save_part_save (struct _mail_msg *mm) { struct _save_part_msg *m = (struct _save_part_msg *)mm; CamelMimeFilterCharset *charsetfilter; @@ -1996,57 +1997,60 @@ static void save_part_save(struct _mail_msg *mm) CamelStream *stream_fs; CamelDataWrapper *data; const char *charset; - - stream_fs = camel_stream_fs_new_with_name(m->path, O_WRONLY|O_CREAT, 0600); + + stream_fs = camel_stream_fs_new_with_name (m->path, O_WRONLY | O_CREAT | O_TRUNC, 0600); if (stream_fs == NULL) { - camel_exception_setv(&mm->ex, 1, _("Cannot create output file: %s:\n %s"), m->path, strerror(errno)); + camel_exception_setv (&mm->ex, 1, _("Cannot create output file: %s:\n %s"), m->path, + g_strerror (errno)); return; } - + /* we only convert text/ parts, and we only convert if we have to null charset param == us-ascii == utf8 always, and utf8 == utf8 obviously */ /* this will also let "us-ascii that isn't really" parts pass out in proper format, without us trying to treat it as what it isn't, which is the same algorithm camel uses */ - data = camel_medium_get_content_object((CamelMedium *)m->part); - content_type = camel_mime_part_get_content_type(m->part); - if (header_content_type_is(content_type, "text", "*") - && (charset = header_content_type_param(content_type, "charset")) - && strcasecmp(charset, "utf-8") != 0) { - charsetfilter = camel_mime_filter_charset_new_convert("utf-8", charset); - filtered_stream = camel_stream_filter_new_with_stream(stream_fs); - camel_stream_filter_add(filtered_stream, CAMEL_MIME_FILTER(charsetfilter)); - camel_object_unref(CAMEL_OBJECT(charsetfilter)); + data = camel_medium_get_content_object (CAMEL_MEDIUM (m->part)); + content_type = camel_mime_part_get_content_type (m->part); + if (header_content_type_is (content_type, "text", "*") + && (charset = header_content_type_param (content_type, "charset")) + && g_strcasecmp (charset, "utf-8") != 0) { + charsetfilter = camel_mime_filter_charset_new_convert ("utf-8", charset); + filtered_stream = camel_stream_filter_new_with_stream (stream_fs); + camel_stream_filter_add (filtered_stream, CAMEL_MIME_FILTER (charsetfilter)); + camel_object_unref (CAMEL_OBJECT (charsetfilter)); } else { /* no we can't use a CAMEL_BLAH() cast here, since its not true, HOWEVER we only treat it as a normal stream from here on, so it is OK */ filtered_stream = (CamelStreamFilter *)stream_fs; - camel_object_ref(CAMEL_OBJECT(stream_fs)); + camel_object_ref (CAMEL_OBJECT (stream_fs)); } - if (camel_data_wrapper_write_to_stream(data, CAMEL_STREAM(filtered_stream)) == -1 - || camel_stream_flush (CAMEL_STREAM(filtered_stream)) == -1) - camel_exception_setv(&mm->ex, 1, _("Could not write data: %s"), strerror(errno)); - + if (camel_data_wrapper_write_to_stream (data, CAMEL_STREAM (filtered_stream)) == -1 + || camel_stream_flush (CAMEL_STREAM (filtered_stream)) == -1) + camel_exception_setv (&mm->ex, 1, _("Could not write data: %s"), g_strerror (errno)); + camel_object_unref (CAMEL_OBJECT (filtered_stream)); camel_object_unref (CAMEL_OBJECT (stream_fs)); } -static void save_part_saved(struct _mail_msg *mm) +static void +save_part_saved (struct _mail_msg *mm) { struct _save_part_msg *m = (struct _save_part_msg *)mm; - + if (m->done) - m->done(m->part, m->path, !camel_exception_is_set(&mm->ex), m->data); + m->done (m->part, m->path, !camel_exception_is_set (&mm->ex), m->data); } -static void save_part_free(struct _mail_msg *mm) +static void +save_part_free (struct _mail_msg *mm) { struct _save_part_msg *m = (struct _save_part_msg *)mm; - camel_object_unref((CamelObject *)m->part); - g_free(m->path); + camel_object_unref (CAMEL_OBJECT (m->part)); + g_free (m->path); } static struct _mail_msg_op save_part_op = { @@ -2057,22 +2061,22 @@ static struct _mail_msg_op save_part_op = { }; int -mail_save_part(CamelMimePart *part, const char *path, - void (*done)(CamelMimePart *part, char *path, int saved, void *data), void *data) +mail_save_part (CamelMimePart *part, const char *path, + void (*done)(CamelMimePart *part, char *path, int saved, void *data), void *data) { struct _save_part_msg *m; int id; - - m = mail_msg_new(&save_part_op, NULL, sizeof(*m)); + + m = mail_msg_new (&save_part_op, NULL, sizeof (*m)); m->part = part; - camel_object_ref((CamelObject *)part); - m->path = g_strdup(path); + camel_object_ref (CAMEL_OBJECT (part)); + m->path = g_strdup (path); m->data = data; m->done = done; - + id = m->msg.seq; - e_thread_put(mail_thread_queued, (EMsg *)m); - + e_thread_put (mail_thread_queued, (EMsg *)m); + return id; } -- cgit