diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-04-14 06:57:27 +0200 |
---|---|---|
committer | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2010-09-10 19:28:27 +1000 |
commit | f630faee2045fa28c61a3cea760ab8a9b65c1bb3 (patch) | |
tree | 18d8ddef8d0ba0f5055294a3401d6ca3a674ae16 | |
parent | cd506ae1ad813efcfa89b6373fe3e76e3c4dd9a4 (diff) | |
download | busybox-w32-f630faee2045fa28c61a3cea760ab8a9b65c1bb3.tar.gz busybox-w32-f630faee2045fa28c61a3cea760ab8a9b65c1bb3.tar.bz2 busybox-w32-f630faee2045fa28c61a3cea760ab8a9b65c1bb3.zip |
win32: Replace rename() (WHY?)
-rw-r--r-- | include/mingw.h | 2 | ||||
-rw-r--r-- | win32/mingw.c | 34 |
2 files changed, 36 insertions, 0 deletions
diff --git a/include/mingw.h b/include/mingw.h index ed718fb5d..c2953c390 100644 --- a/include/mingw.h +++ b/include/mingw.h | |||
@@ -121,7 +121,9 @@ NOIMPL(sigfillset,int *mask UNUSED_PARAM); | |||
121 | 121 | ||
122 | int fdprintf(int fd, const char *format, ...); | 122 | int fdprintf(int fd, const char *format, ...); |
123 | FILE* mingw_fopen(const char *filename, const char *mode); | 123 | FILE* mingw_fopen(const char *filename, const char *mode); |
124 | int mingw_rename(const char*, const char*); | ||
124 | #define fopen mingw_fopen | 125 | #define fopen mingw_fopen |
126 | #define rename mingw_rename | ||
125 | 127 | ||
126 | /* | 128 | /* |
127 | * ANSI emulation wrappers | 129 | * ANSI emulation wrappers |
diff --git a/win32/mingw.c b/win32/mingw.c index 61f786287..eeb96db83 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
@@ -476,6 +476,40 @@ char *mingw_getcwd(char *pointer, int len) | |||
476 | return ret; | 476 | return ret; |
477 | } | 477 | } |
478 | 478 | ||
479 | #undef rename | ||
480 | int mingw_rename(const char *pold, const char *pnew) | ||
481 | { | ||
482 | DWORD attrs; | ||
483 | |||
484 | /* | ||
485 | * Try native rename() first to get errno right. | ||
486 | * It is based on MoveFile(), which cannot overwrite existing files. | ||
487 | */ | ||
488 | if (!rename(pold, pnew)) | ||
489 | return 0; | ||
490 | if (errno != EEXIST) | ||
491 | return -1; | ||
492 | if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) | ||
493 | return 0; | ||
494 | /* TODO: translate more errors */ | ||
495 | if (GetLastError() == ERROR_ACCESS_DENIED && | ||
496 | (attrs = GetFileAttributes(pnew)) != INVALID_FILE_ATTRIBUTES) { | ||
497 | if (attrs & FILE_ATTRIBUTE_DIRECTORY) { | ||
498 | errno = EISDIR; | ||
499 | return -1; | ||
500 | } | ||
501 | if ((attrs & FILE_ATTRIBUTE_READONLY) && | ||
502 | SetFileAttributes(pnew, attrs & ~FILE_ATTRIBUTE_READONLY)) { | ||
503 | if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) | ||
504 | return 0; | ||
505 | /* revert file attributes on failure */ | ||
506 | SetFileAttributes(pnew, attrs); | ||
507 | } | ||
508 | } | ||
509 | errno = EACCES; | ||
510 | return -1; | ||
511 | } | ||
512 | |||
479 | struct passwd *getpwuid(int uid) | 513 | struct passwd *getpwuid(int uid) |
480 | { | 514 | { |
481 | static char user_name[100]; | 515 | static char user_name[100]; |