Skip to content

Commit

Permalink
mingw_rmdir: set errno=ENOTEMPTY when appropriate
Browse files Browse the repository at this point in the history
On Windows, EACCES overrules ENOTEMPTY when calling rmdir(). But if the
directory is busy, we only want to retry deleting the directory if it
is empty, so test specifically for that case and set ENOTEMPTY rather
than EACCES.

Noticed by Greg Hazel.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Feb 7, 2011
1 parent 4f28810 commit ab1a11b
Showing 1 changed file with 28 additions and 0 deletions.
28 changes: 28 additions & 0 deletions compat/mingw.c
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,30 @@ int mingw_unlink(const char *pathname)
return ret;
}

static int is_dir_empty(const char *path)
{
struct strbuf buf = STRBUF_INIT;
WIN32_FIND_DATAA findbuf;
HANDLE handle;

strbuf_addf(&buf, "%s\\*", path);
handle = FindFirstFileA(buf.buf, &findbuf);
if (handle == INVALID_HANDLE_VALUE) {
strbuf_release(&buf);
return GetLastError() == ERROR_NO_MORE_FILES;
}

while (!strcmp(findbuf.cFileName, ".") ||
!strcmp(findbuf.cFileName, ".."))
if (!FindNextFile(handle, &findbuf)) {
strbuf_release(&buf);
return GetLastError() == ERROR_NO_MORE_FILES;
}
FindClose(handle);
strbuf_release(&buf);
return 0;
}

#undef rmdir
int mingw_rmdir(const char *pathname)
{
Expand All @@ -233,6 +257,10 @@ int mingw_rmdir(const char *pathname)
while ((ret = rmdir(pathname)) == -1 && tries < ARRAY_SIZE(delay)) {
if (!is_file_in_use_error(GetLastError()))
break;
if (!is_dir_empty(pathname)) {
errno = ENOTEMPTY;
break;
}
/*
* We assume that some other process had the source or
* destination file open at the wrong moment and retry.
Expand Down

0 comments on commit ab1a11b

Please sign in to comment.