X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Mon, 10 Aug 2009 15:11:36 +0200 From: Corinna Vinschen To: cygwin AT cygwin DOT com Subject: Re: tar deletes .exe files on extraction Message-ID: <20090810131136.GO3204@calimero.vinschen.de> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <88A93D0EBE3347F781BD7E3C6774C53F AT multiplay DOT co DOT uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <88A93D0EBE3347F781BD7E3C6774C53F@multiplay.co.uk> User-Agent: Mutt/1.5.19 (2009-02-20) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com On Aug 8 03:16, Steven Hartland wrote: > If you extract a tar.gz file with an executable file and > an excitable file of the same name but with the .exe extension > on extract the .exe file is inexplicably deleted. > > e.g. > tar -xvzf test.tar.gz > mydir/myexe.exe > mydir/myexe > > ls myddir > myexe Yeah, that's to be expected. Cygwin always handled the .exe suffix transparently in terms of stat(2) calls, but Cygwin 1.7 also handles them transparently in terms of open(2) and any other call. Therefore, if a file foo.exe exists, and an application calls stat("foo"), it will get told that, yes, "foo" exists. That's a basic component of being able to call foo.exe from bash by just typing foo. POSIX systems just don't have the .exe suffix for executables. AFAICS from the strace, tar unpacks mydir/myexe.exe, then it goes ahead to unpack mydir/myexe. It tries to open the file with O_CREAT | O_EXCL flags. Since the file exists from Cygwin's POV, open(2) returns -1 with errno set to EEXIST. If that happens tar calls unlink("mydir/myexe") and the unlink() call succeeds, since, as mentioned above, the .exe suffix is transparent to every filesystem call. Therefore, unlink("mydir/myexe") actually deletes "mydir/myexe.exe". Then tar proceeds to unpack "mydir/myexe". Keep in mind that myexe and myexe.exe are for all practical purposes the same file from Cygwin's point of view. On a POSIX system you just don't have a "normal" file called myexe in the same directory as an executable "myexe", since that is the same file anyway, and the .exe suffix is just an annoying Windowism. On Cygwin, you should avoid having a file "foo" and a file "foo.exe" in the same directory at all cost to avoid puzzeling POSIX borderline behaviour like this. What you do is essentially in the "not supported" class of problems. Fortunately for you there's a workaround. If the order of the files in the tar archive is reversed, both files are unpacked. Or, unpack mydir/myexe.exe explicitely afterwards. The reason that this works is that Cygwin does not check for a file "foo", if the name of the file is explicitely given as "foo.exe". Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- 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