On 3/2/2010 3:58 AM, Corinna Vinschen wrote:
The .exe suffix is added if all of the below is true:

- The file is renamed via the rename(2) function.
- The name does not only change by case on a caseinsensitive mount.
- The file is a binary checked with the Win32 function GetBinaryType,
   and the returned type is SCS_32BIT_BINARY or SCS_64BIT_BINARY.
- The source filename has none of the following suffixes:
     .com
     .dll
     .exe
     .scr
     .sys
- The destination filename has none of the aforementioned suffixes.

All these conditions are true in the svn test case. svn is renaming tst/tempfile.tmp to tst/notepad.xxx using libapr1, which is using rename(2).

It does seem that the ACLs on the directory and file play a role, too. I've attached a reproduction script along with a simple rename(2) driver program. The script explicitly removes the default group ACLs from a directory before doing a rename(2) in that directory. In that case, no .exe suffix is added. If you modify the top of the script to set "SETACLS=set", it will add default group ACLs of rwx and the .exe suffix is added.

I'm not sure if this points to a bug in Cygwin or not. It does explain why Alan and I were seeing different behavior.

Regardless, it doesn't seem like rename(2) will be changed to avoid adding the .exe suffix, so either we live with this behavior in svn or I need to patch libapr1 to do a rename without triggering this behavior. I tried using renameat(2) but that (unsurprisingly) also triggers the behavior.

Is there some sanctioned way to do a rename without triggering the .exe suffix addition?

--
David Rothenberger  ----  daver...@acm.org

Alden's Laws:
        (1)  Giving away baby clothes and furniture is the major cause
             of pregnancy.
        (2)  Always be backlit.
        (3)  Sit down whenever possible.
#include <stdio.h>
#include <string.h>

int main (void)
{
    int retval;
    retval = rename("tst/tempfile.tmp", "tst/notepad.xxx");

    if (retval != 0) {
        fprintf(stderr, "%s\n", strerror(retval));
        return retval;
    }
    return 0;
}
#!/bin/bash

SETACLS=clear
#SETACLS=set

rm -fr tst
mkdir tst

if [ -n "$SETACLS" ]; then
 for g in $(id -G); do
   if [ "$SETACLS" = "clear" ]; then
     setfacl -m d:g:$g:0 tst
   elif [ "$SETACLS" = "set" ]; then
     setfacl -m d:g:$g:rwx tst
   fi
 done
fi

getfacl tst

# Don't copy notepad.exe because that will preserve the file's ACLs
# and will cause the .exe suffix to be added regardless of the
# directory's ACLs.
cat "$(cygpath -Wua)"/notepad.exe > tst/tempfile.tmp

getfacl tst/tempfile.tmp
ls -l tst
./tstren
ls -l tst

--
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

Reply via email to