diff options
| author | Johannes Schindelin <johannes.schindelin@gmx.de> | 2021-02-22 23:13:15 +0100 |
|---|---|---|
| committer | Ron Yorston <rmy@pobox.com> | 2021-03-01 09:35:31 +0000 |
| commit | 89fc5eaae6d0e8b348fdd1933d9df60cf3e5011b (patch) | |
| tree | 69b3343fb8d333ef1a569992b48a37a7ec4895d2 | |
| parent | 3c44f5cae158ff4ffd03a4c319777ae88a60bcb9 (diff) | |
| download | busybox-w32-89fc5eaae6d0e8b348fdd1933d9df60cf3e5011b.tar.gz busybox-w32-89fc5eaae6d0e8b348fdd1933d9df60cf3e5011b.tar.bz2 busybox-w32-89fc5eaae6d0e8b348fdd1933d9df60cf3e5011b.zip | |
Do not use `rename()` for symlinks
That function would rename the _target_, not the link.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
| -rw-r--r-- | win32/mingw.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/win32/mingw.c b/win32/mingw.c index 50ab92f0d..443566a60 100644 --- a/win32/mingw.c +++ b/win32/mingw.c | |||
| @@ -829,16 +829,19 @@ char *mingw_getcwd(char *pointer, int len) | |||
| 829 | #undef rename | 829 | #undef rename |
| 830 | int mingw_rename(const char *pold, const char *pnew) | 830 | int mingw_rename(const char *pold, const char *pnew) |
| 831 | { | 831 | { |
| 832 | struct mingw_stat st; | ||
| 832 | DWORD attrs; | 833 | DWORD attrs; |
| 833 | 834 | ||
| 834 | /* | 835 | /* |
| 835 | * Try native rename() first to get errno right. | 836 | * For non-symlinks, try native rename() first to get errno right. |
| 836 | * It is based on MoveFile(), which cannot overwrite existing files. | 837 | * It is based on MoveFile(), which cannot overwrite existing files. |
| 837 | */ | 838 | */ |
| 838 | if (!rename(pold, pnew)) | 839 | if (mingw_lstat(pold, &st) || !S_ISLNK(st.st_mode)) { |
| 839 | return 0; | 840 | if (!rename(pold, pnew)) |
| 840 | if (errno != EEXIST) | 841 | return 0; |
| 841 | return -1; | 842 | if (errno != EEXIST) |
| 843 | return -1; | ||
| 844 | } | ||
| 842 | if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) | 845 | if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) |
| 843 | return 0; | 846 | return 0; |
| 844 | /* TODO: translate more errors */ | 847 | /* TODO: translate more errors */ |
