diff options
-rw-r--r-- | tools/idevicebackup2.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c index 2405c87..635a5ab 100644 --- a/tools/idevicebackup2.c +++ b/tools/idevicebackup2.c @@ -624,6 +624,20 @@ static int errno_to_device_error(int errno_value) } } +#ifdef WIN32 +static int win32err_to_errno(int err_value) +{ + switch (err_value) { + case ERROR_FILE_NOT_FOUND: + return ENOENT; + case ERROR_ALREADY_EXISTS: + return EEXIST; + default: + return EFAULT; + } +} +#endif + static int mb2_handle_send_file(const char *backup_dir, const char *path, plist_t *errplist) { uint32_t nlen = 0; @@ -1619,7 +1633,15 @@ checkpoint: free(str); char *oldpath = build_path(backup_directory, key, NULL); +#ifdef WIN32 + struct stat st; + if ((stat(newpath, &st) == 0) && S_ISDIR(st.st_mode)) + RemoveDirectory(newpath); + else + DeleteFile(newpath); +#else remove(newpath); +#endif if (rename(oldpath, newpath) < 0) { printf("Renameing '%s' to '%s' failed: %s (%d)\n", oldpath, newpath, strerror(errno), errno); errcode = errno_to_device_error(errno); @@ -1658,11 +1680,26 @@ checkpoint: if (str) { char *newpath = build_path(backup_directory, str, NULL); free(str); +#ifdef WIN32 + struct stat st; + int res = 0; + if ((stat(newpath, &st) == 0) && S_ISDIR(st.st_mode)) + res = RemoveDirectory(newpath); + else + res = DeleteFile(newpath); + if (!res) { + int e = win32err_to_errno(GetLastError()); + printf("Could not remove '%s': %s (%d)\n", newpath, strerror(e), e); + errcode = errno_to_device_error(e); + errdesc = strerror(e); + } +#else if (remove(newpath) < 0) { printf("Could not remove '%s': %s (%d)\n", newpath, strerror(errno), errno); errcode = errno_to_device_error(errno); errdesc = strerror(errno); } +#endif free(newpath); } } |