This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: infinite loop in rm


William A. Hoffman wrote:

I saw some mention of this problem here:
http://www.cygwin.com/ml/cygwin/2002-07/msg00147.html

Is there a fix for this that works, or will be incorporated into a future version of cygwin? I looked in the FAQ and
saw nothing about it. I have some nightly scripts that clean
some directories, and if I leave a shell open in one of the
directories, the scripts just run forever trying to remove
the directory.
I am using the following patch to unlink() on a version of Cygwin that
is several months old.  It does nothing unless there is a directory
named .cygdel at the root of the drive holding the file to be deleted.
In that case, it moves the file there before trying to delete it.

Make sure you make the directory mode 777 when you create it...

Works for me -- I think I posted this to the list but may be wrong.

Joe Buehler

Index: src/winsup/cygwin/syscalls.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/syscalls.cc,v
retrieving revision 1.214
diff -u -r1.214 syscalls.cc
--- src/winsup/cygwin/syscalls.cc	2 Jul 2002 03:06:32 -0000	1.214
+++ src/winsup/cygwin/syscalls.cc	8 Aug 2002 16:38:12 -0000
@@ -142,6 +142,23 @@
 	SetFileAttributes (win32_name, (DWORD) win32_name & ~FILE_ATTRIBUTE_READONLY);
     }

+  // attempt to rename before deleting
+  char *basename;
+  basename = strrchr(win32_name, '\\');
+  if (basename && *++basename) {
+    const char *rootdir = win32_name.root_dir();
+    if (rootdir) {
+      const char *s = strrchr(rootdir, '\\');
+      if (s && !s[1]) {
+	char newname[MAX_PATH + 12];
+	__small_sprintf(newname, "%s.cygdel\\%s", rootdir, basename);
+	if (MoveFile(win32_name.get_win32(), newname)) {
+	  win32_name.check(newname, PC_SYM_NOFOLLOW | PC_FULL);
+	}
+      }
+    }
+  }
+
   DWORD lasterr;
   lasterr = 0;
   for (int i = 0; i < 2; i++)




--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]