This is the mail archive of the
cygwin-apps@cygwin.com
mailing list for the Cygwin project.
Preliminary patch for symlink problem in setup.exe
- From: Corinna Vinschen <vinschen at redhat dot com>
- To: cygapp <cygwin-apps at cygwin dot com>
- Date: Mon, 14 Jan 2002 22:16:50 +0100
- Subject: Preliminary patch for symlink problem in setup.exe
- Reply-to: cygwin-apps at cygwin dot com
I've found a problem in setup.exe which potentially results in
two symlinks with the same name.
As you know, the default setting for symlinks in Cygwin is using
Windows shortcuts while setup.exe always creates symlinks as
the old-style system files.
Now imagine the following simple situation
- Delete /usr/bin/slogin by mistake.
- Recreate /usr/sbin/slogin with ln(1) creates a Windows shortcut
/usr/sbin/slogin.lnk.
- A new OpenSSH package is downloaded using setup.exe.
Now look into the /usr/bin directory. You will find two files,
`slogin' and `slogin.lnk'.
The following patch is a quick hack which I'd like to get reviewed
by the active setup contributors (not me).
The additional advantage of that patch is that it alleviates the
problem that setup complains when a file couldn't be installed
because the file already exists and couldn't be unlinked before.
That happens mostly when the R/O file attribute is set since
DeleteFile() fails then.
Oh, and I'm using the new INVALID_FILE_ATTRIBUTES define which
I found in the latest MSDN (surprise, surprise) and which
substitutes all prior ((DWORD) -1) or 0xffffffff constants
to mark the return code of GetFileAttributes() for ... yeah, you
guessed it, invalid file attributes.
Corinna
2002-01-14 Corinna Vinschen <corinna@vinschen.de>
* package_meta.cc (packagemeta::uninstall): Uninstall a file
even with trailing ".lnk". Unset R/O file attribute before
trying to delete file.
Index: package_meta.cc
===================================================================
RCS file: /cvs/src/src/winsup/cinstall/package_meta.cc,v
retrieving revision 2.11
diff -u -p -r2.11 package_meta.cc
--- package_meta.cc 2002/01/06 11:31:47 2.11
+++ package_meta.cc 2002/01/14 21:08:44
@@ -120,11 +120,22 @@ packagemeta::uninstall ()
{
dirs.add_subdirs (line);
+ char buf[512];
char *d = cygpath ("/", line, NULL);
+
DWORD dw = GetFileAttributes (d);
- if (dw != 0xffffffff && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ if (dw == INVALID_FILE_ATTRIBUTES)
{
+ /* Check for Windows shortcut. */
+ strcpy (buf, d);
+ strcat (buf, ".lnk");
+ d = buf;
+ dw = GetFileAttributes (d);
+ }
+ if (dw != INVALID_FILE_ATTRIBUTES && !(dw & FILE_ATTRIBUTE_DIRECTORY))
+ {
log (LOG_BABBLE, "unlink %s", d);
+ SetFileAttributes (d, dw & ~FILE_ATTRIBUTE_READONLY);
DeleteFile (d);
}
line = installed->getnextfile ();
--
Corinna Vinschen Please, send mails regarding Cygwin to
Cygwin Developer mailto:cygwin@cygwin.com
Red Hat, Inc.