VM: fix so that errno is set if MoveFileEx fails, should fix #1490

db4
Björn Lindqvist 2015-10-12 12:19:21 +02:00
parent 37cd54cfbb
commit 575da3e478
2 changed files with 14 additions and 5 deletions

View File

@ -1,8 +1,8 @@
! Copyright (C) 2010 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: combinators continuations io.backend io.directories io.files
io.files.temp io.files.windows io.pathnames kernel memory sequences
splitting tools.test windows.kernel32 ;
io.files.temp io.files.windows io.pathnames kernel kernel.private libc
literals memory sequences splitting tools.test windows.kernel32 ;
IN: io.files.windows.tests
[ f ] [ "\\foo" absolute-path? ] unit-test
@ -68,7 +68,7 @@ IN: io.files.windows.tests
] unit-test
! set-file-attributes & save-image
{ { "kernel-error" 1 13 f } } [
{ ${ "kernel-error" ERROR-IO EIO f } } [
[
"read-only.image" temp-file {
[ ?delete-file ]

View File

@ -137,9 +137,18 @@ long getpagesize() {
return g_pagesize;
}
// MoveFileEx returns FALSE on fail
bool move_file(const vm_char* path1, const vm_char* path2) {
return !(MoveFileEx((path1), (path2), MOVEFILE_REPLACE_EXISTING) == FALSE);
/* MoveFileEx returns FALSE on fail. */
BOOL val = MoveFileEx((path1), (path2), MOVEFILE_REPLACE_EXISTING);
if (val == FALSE) {
/* MoveFileEx doesn't set errno, which primitive_save_image()
reads the error code from. Instead of converting from
GetLastError() to errno values, we ust set it to the generic
EIO value. */
errno = EIO;
}
return val == TRUE;
}
void factor_vm::init_signals() {}