[Patch] unlink

Pierre A. Humblet pierre@phumblet.no-ip.org
Sun Oct 31 15:19:00 GMT 2004


At 11:36 PM 10/30/2004 -0400, Christopher Faylor wrote:
>On Sat, Oct 30, 2004 at 10:30:54PM -0400, Pierre A. Humblet wrote:
>>At 01:39 PM 10/30/2004 -0400, you wrote:
>>>On Fri, Oct 29, 2004 at 06:01:51PM -0400, Pierre A. Humblet wrote:
>>>>Here is a patch that should allow unlink() to handle
>>>>nul etc.. on local disks.
>>>>
>>>>It's a cut and paste of Corinna's open on NT and the
>>>>existing CreateFile.
>>>> 
>>>>It works on normal files. I haven't tested with the
>>>>special names because I forgot how to create them !
>>>>Feedback welcome.
>>>>
>>>>XXXXX This should NOT be applied in 1.5.12 XXXXXX
>>>>
>>>>Pierre
>>>>
>>>>2004-10-29  Pierre Humblet <pierre.humblet@ieee.org>
>>>>
>>>>	* syscalls.cc (nt_delete): New function.
>>>>	(unlink): Call nt_delete instead of CreateFile and remove
>>>>	unreachable code.
>>>
>>>Corinna suggested something similar to me a couple of months ago but I
>>>wanted to wait for things to settle down somewhat after the original
>>>use of NtCreateFile.
>>>
>>>On reflection, however, wouldn't it be a little easier just to prepend
>>>the path being deleted with a: \\.\ so that "rm nul" would eventually
>>>translate to DeleteFile("\\.\c:\foo\null") (I'm not using true C
>>>backslash quoting here)?  I don't know if that would work on Windows 9x,
>>>though.
>>
>>That would work on NT, but then one would need to check if the input
>>path didn't already have the form //./xx, worry about exceeding max 
>>pathlength, etc...
>
>Other than being able to delete special filenames is there any other
>benefit to using NtCreateFile to delete files?

I can only think of speed. But I don't see a downside either, given that
we use it in open().

>If path length was an issue we could use '//?/' instead since the length
>restriction is a lot larger there.  So, it would be something like:
>
>  char *path;
>  char newpath[strlen (win32_name) + 4] = "\\\\?\";
>  if  (win32_name[0] != '\\')
>      path = strcat (newpath, win32_name);
>  else
>      path = win32_name;
>
>and then you'd use path throughout from then on.

Have you tried it? According to MSDN you need to use the Unicode version
if you do that.
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/createfile.asp>
"In the ANSI version of this function, the name is limited to MAX_PATH 
characters. To extend this limit to 32,767 wide characters, call the Unicode 
version of the function and prepend "\\?\" to the path"

Pierre



More information about the Cygwin-patches mailing list