summaryrefslogtreecommitdiffstats
path: root/libsparse/append2simg.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsparse/append2simg.c')
-rw-r--r--libsparse/append2simg.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/libsparse/append2simg.c b/libsparse/append2simg.c
index 180584f..65e6cc2 100644
--- a/libsparse/append2simg.c
+++ b/libsparse/append2simg.c
@@ -16,6 +16,7 @@
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE 1
+#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
@@ -56,6 +57,11 @@ int main(int argc, char *argv[])
char *input_path;
off64_t input_len;
+ int tmp_fd;
+ char *tmp_path;
+
+ int ret;
+
if (argc == 3) {
output_path = argv[1];
input_path = argv[2];
@@ -64,6 +70,12 @@ int main(int argc, char *argv[])
exit(-1);
}
+ ret = asprintf(&tmp_path, "%s.append2simg", output_path);
+ if (ret < 0) {
+ fprintf(stderr, "Couldn't allocate filename\n");
+ exit(-1);
+ }
+
output = open(output_path, O_RDWR | O_BINARY);
if (output < 0) {
fprintf(stderr, "Couldn't open output file (%s)\n", strerror(errno));
@@ -99,14 +111,30 @@ int main(int argc, char *argv[])
}
sparse_output->len += input_len;
+ tmp_fd = open(tmp_path, O_WRONLY | O_CREAT | O_BINARY, 0664);
+ if (tmp_fd < 0) {
+ fprintf(stderr, "Couldn't open temporary file (%s)\n", strerror(errno));
+ exit(-1);
+ }
+
lseek64(output, 0, SEEK_SET);
- if (sparse_file_write(sparse_output, output, false, true, false) < 0) {
+ if (sparse_file_write(sparse_output, tmp_fd, false, true, false) < 0) {
fprintf(stderr, "Failed to write sparse file\n");
exit(-1);
}
sparse_file_destroy(sparse_output);
+ close(tmp_fd);
close(output);
close(input);
+
+ ret = rename(tmp_path, output_path);
+ if (ret < 0) {
+ fprintf(stderr, "Failed to rename temporary file (%s)\n", strerror(errno));
+ exit(-1);
+ }
+
+ free(tmp_path);
+
exit(0);
}