summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-07-17 21:12:10 +0200
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2008-07-17 21:12:10 +0200
commit5408e20d80b87731e90840b5cc983a6717c851a5 (patch)
treeb2ff80efb498b938c7a00d6cc8dd6aa7a510c265
parent71c0affa382b4995e36906e34da648f50bfa7c6f (diff)
copy instead of rename - in case /tmp is another filesystem
-rw-r--r--src/ImageMetaData.cxx28
-rw-r--r--src/gipfel.cxx3
2 files changed, 26 insertions, 5 deletions
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 <errno.h>
#include <math.h>
#include <string.h>
+#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
@@ -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;
}
diff --git a/src/gipfel.cxx b/src/gipfel.cxx
index bcf4816..788d22b 100644
--- a/src/gipfel.cxx
+++ b/src/gipfel.cxx
@@ -118,7 +118,8 @@ void track_cb() {
void save_cb() {
char *file = fl_file_chooser("Save Image As?", NULL, img_file);
if (file)
- gipf->save_image(file);
+ if (gipf->save_image(file))
+ fl_message("ERROR: Saving image %s failed.", file);
}
void focal_length_cb(Fl_Slider* o, void*) {