From 5408e20d80b87731e90840b5cc983a6717c851a5 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Thu, 17 Jul 2008 21:12:10 +0200 Subject: copy instead of rename - in case /tmp is another filesystem --- src/ImageMetaData.cxx | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'src/ImageMetaData.cxx') diff --git a/src/ImageMetaData.cxx b/src/ImageMetaData.cxx index 07a5c1b..e29bd03 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -259,15 +260,34 @@ ImageMetaData::save_image_jpgcom(char *in_img, char *out_img) { err++; } - close(tmp_fd); - if (!err) { - if (rename(tmpname, out_img) != 0) { - perror("rename"); + int out_fd = open(out_img, O_WRONLY|O_TRUNC); + + lseek(tmp_fd, 0, SEEK_SET); + + if (out_fd == -1) { + perror("open"); err++; + } else { + while ((n = read(tmp_fd, buf, sizeof(buf)))) { + if (write(out_fd, buf, n) != n) { + perror("write"); + fprintf(stderr, "ERROR: Image %s might be corrupted. " + "A copy is still available at %s\n", out_img, tmpname); + err++; + break; + } + } + + close(out_fd); } } + close(tmp_fd); + + if (!err) + unlink(tmpname); + return err != 0; } -- cgit v1.2.3