From: "H.Yamamoto" Date: 2005-05-15T16:57:16+09:00 Subject: Re: [ ruby-Bugs-1917 ] Pathname#unlink fails on a symlink which points to a directory. >>ENOTDIR is defined by POSIX. > >Yes, but Windows (bcc32 and mswin32) behaves differently.... OK, it's now working on Windows with following patch. Index: win32.c =================================================================== RCS file: /src/ruby/win32/win32.c,v retrieving revision 1.149 diff -u -w -b -p -r1.149 win32.c --- win32.c 15 May 2005 00:57:44 -0000 1.149 +++ win32.c 15 May 2005 07:47:20 -0000 @@ -152,6 +152,7 @@ static struct { { ERROR_NEGATIVE_SEEK, EINVAL }, { ERROR_SEEK_ON_DEVICE, EACCES }, { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, + { ERROR_DIRECTORY, ENOTDIR }, { ERROR_NOT_LOCKED, EACCES }, { ERROR_BAD_PATHNAME, ENOENT }, { ERROR_MAX_THRDS_REACHED, EAGAIN }, @@ -3620,9 +3621,14 @@ rb_w32_rmdir(const char *path) attr &= ~FILE_ATTRIBUTE_READONLY; SetFileAttributes(path, attr); } - ret = rmdir(path); - if (ret < 0 && attr != (DWORD)-1) { + if (RemoveDirectory(path)) { + ret = 0; + } else { + ret = -1; + errno = map_errno(GetLastError()); + if (attr != (DWORD)-1) { SetFileAttributes(path, attr); + } } }); return ret; E:\ruby-cvs\bcc32>irb19 irb(main):001:0> require "pathname" => true irb(main):002:0> Dir.mkdir("tmp") => 0 irb(main):003:0> Pathname.new("tmp").unlink => 0 irb(main):004:0> open("tmp", "w"){|io| io.puts} => nil irb(main):005:0> Pathname.new("tmp").unlink => 1