Utility: winln, a drop-in replacement for ln(1)

Daniel Colascione dan.colascione@gmail.com
Wed Apr 6 20:20:00 GMT 2011


On 4/6/2011 1:26 AM, Andy Koppe wrote:
> On 4 April 2011 21:30, Daniel Colascione wrote:
>> Attached is a small program that behaves very similarly to ln(1), but that
>> works with Windows hard and symbolic links instead of Cygwin ones.
>>   Successful use of this program requires Vista or newer, a user with
>> SeCreateSymbolicLinkPrivilege, and a symlink evaluation policy that allows
>> the kind of symbolic link you'd like to create.  If these conditions are
>> met, however, this program becomes useful because it can create symbolic
>> links that work equally well for Cygwin and non-Cygwin programs.  Because
>> its argument handling is practically identical to that of coreutils ln,
>> winln can be used via a simple shell alias (or PATH prefixing, if you're
>> feeling bold).
>
> Very nice, and much better than faffing about with 'cmd /c mklink' and cygpath.

Thanks for taking a look.

> - Coretools ln also creates native Windows hard links, via Cygwin's
> link() function.

Yes, but I wanted winln to match ln's behavior, and that requires using 
hard links by default.  So yes, there's a bit of overlap.

> - Cygwin link() directly invokes the NT API, which I think avoids some
> filename restrictions at the Win32 level.

That's a good point.  I haven't run into these issues myself, but maybe 
the next version of winln can also use the native API.

> - winln doesn't have the .exe magic where links to .exes automatically
> have .exe appended if it's not already present.

Good point. Thanks.

> - Native symbolic links require administrator privileges and aren't
> available at all before Vista.

They don't require administrator privilege per se: just 
SeCreateSymbolicLinkPrivilege, which can be granted to normal user 
accounts via local security policy.  The easiest way to grant 
SeCreateSymbolicLinkPrivilege is to start gpedit.msc, go down to 
"Windows Settings"->"Security Settings"->"Local Policies"->"User Rights 
Assignment", then find "Create symbolic links" and add whatever users 
and groups you want[1].

> - 'cmd /c mklink /j' allows to create directory junction points
> without administrator privileges. Junction points are more or less
> equivalent with symbolic links, and the 'linkd' utility from the
> Windows Reource Kit Tools even allows to create them on XP. Hence it
> might be useful for winln to fall back to junction points when
> symbolic links aren't available.

That's a possibility, but I'm worried about that issue triggering bugs 
in other programs --- IIRC, many programs would treat the junction point 
as a normal directory and get into unbreakable loops, or recursively 
delete the pointed-to tree.  Maybe that's fixed now.

> - Native symbolic links obviously point at Windows paths, which means
> they end up pointing at the wrong thing if the meaning of their
> original POSIX path changes, in particular due to changing mount
> points or Cygwin symlinks in the original path.

Right. That's an explicit tradeoff we have to make.  I run with an 
identity mapping from / to C:\, however, so the issue never comes up in 
practice.

> - 'winln' always creates a link to the absolute Windows path when
> given a relative path.

No it doesn't.  Relative links work fine --- cmd /c dir reports them as 
relative, anyway.

> This means the link will point at the wrong
> thing if it's moved about. I don't know whether native relative links
> are possible.

They are possible, and at least in my testing, they work fine.  A 
relative symbolic link should be created whenever cygpath -w returns a 
relative path.

> (Some of these points rule out the use of native symbolic links as
> Cygwin symbolic links.)

And that's a shame.  Windows symbolic links are tantalizingly close to 
POSIX links, but not quite there.


[1] I wonder why Windows uses these security rights things instead of 
just using a normal group for each privilege under "User Rights 
Assignment", each with a well-known SID.  That'd have reduced the number 
of moving parts in the system.

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list