diff --git a/vm/image.c b/vm/image.c index 5f4492e537..08aae5898c 100755 --- a/vm/image.c +++ b/vm/image.c @@ -112,7 +112,9 @@ bool save_image(const F_CHAR *filename) FILE* file; F_HEADER h; - file = OPEN_WRITE(filename); + F_CHAR temporary_filename[] = "##saving-factor-image##"; + + file = OPEN_WRITE(temporary_filename); if(file == NULL) { print_string("Cannot open image file: "); print_native_string(filename); nl(); @@ -163,6 +165,14 @@ bool save_image(const F_CHAR *filename) return false; } + if(MOVE_FILE_FAILS(temporary_filename, filename)) + { + print_string("Failed to rename tempoarary image file: "); print_string(strerror(errno)); nl(); + if(DELETE_FILE_FAILS(temporary_filename)) + print_string("Failed to clean up temporary image file: "); print_string(strerror(errno)); nl(); + return false; + } + return true; } diff --git a/vm/os-unix.h b/vm/os-unix.h index d2f34b4bc4..9f911acded 100755 --- a/vm/os-unix.h +++ b/vm/os-unix.h @@ -22,6 +22,8 @@ typedef char F_SYMBOL; #define STRCMP strcmp #define STRNCMP strncmp #define STRDUP strdup +#define MOVE_FILE_FAILS(old,new) (rename((old),(new)) < 0) +#define DELETE_FILE_FAILS(old) (unlink((old)) < 0) #define FIXNUM_FORMAT "%ld" #define CELL_FORMAT "%lu" diff --git a/vm/os-windows.h b/vm/os-windows.h index a9c3f6d803..beec7ad37c 100755 --- a/vm/os-windows.h +++ b/vm/os-windows.h @@ -19,6 +19,8 @@ typedef wchar_t F_CHAR; #define STRCMP wcscmp #define STRNCMP wcsncmp #define STRDUP _wcsdup +#define MOVE_FILE_FAILS(old,new) (MoveFile((old),(new)) == 0) +#define DELETE_FILE_FAILS(old) (DeleteFile((old)) == 0) #ifdef WIN64 #define CELL_FORMAT "%Iu"