From 7dcbb978e046f65c6933b7c0eee6055a0e2bb4fa Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Tue, 22 Oct 2002 20:41:31 +0000 Subject: [PATCH] * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Always consider .exe files and '#!' shell scripts to be executable. --- winsup/cygwin/ChangeLog | 5 +++ winsup/cygwin/fhandler_disk_file.cc | 55 +++++++++++++++-------------- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index dd05d4a8b..b0435288d 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2002-10-22 Christopher Faylor + + * fhandler_disk_file.cc (fhandler_disk_file::fstat_helper): Always + consider .exe files and '#!' shell scripts to be executable. + 2002-10-22 Christopher Faylor * cygthread.cc (cygthread::exiting): New variable. diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index f8a7afca1..85b8b3463 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -300,35 +300,38 @@ fhandler_disk_file::fstat_helper (struct __stat64 *buf, path_conv *pc, else { buf->st_mode |= S_IFREG; - if (pc->exec_state () == dont_know_if_executable) - { - DWORD cur, done; - char magic[3]; - - /* First retrieve current position, set to beginning - of file if not already there. */ - cur = SetFilePointer (get_handle (), 0, NULL, FILE_CURRENT); - if (cur != INVALID_SET_FILE_POINTER && - (!cur || - SetFilePointer (get_handle (), 0, NULL, FILE_BEGIN) - != INVALID_SET_FILE_POINTER)) - { - /* FIXME should we use /etc/magic ? */ - magic[0] = magic[1] = magic[2] = '\0'; - if (ReadFile (get_handle (), magic, 3, &done, NULL) && - has_exec_chars (magic, done)) - { - set_execable_p (); - pc->set_exec (); - } - SetFilePointer (get_handle (), cur, NULL, FILE_BEGIN); - } - } - if (pc->exec_state () == is_executable) - buf->st_mode |= STD_XBITS; } } + if (buf->st_mode & STD_XBITS) + /* already derived */; + else if (pc->exec_state () == is_executable) + buf->st_mode |= STD_XBITS; + else if (pc->exec_state () == dont_know_if_executable) + { + DWORD cur, done; + char magic[3]; + + /* First retrieve current position, set to beginning + of file if not already there. */ + cur = SetFilePointer (get_handle (), 0, NULL, FILE_CURRENT); + if (cur != INVALID_SET_FILE_POINTER + && (!cur || SetFilePointer (get_handle (), 0, NULL, FILE_BEGIN) + != INVALID_SET_FILE_POINTER)) + { + /* FIXME should we use /etc/magic ? */ + magic[0] = magic[1] = magic[2] = '\0'; + if (ReadFile (get_handle (), magic, 3, &done, NULL) && + has_exec_chars (magic, done)) + { + set_execable_p (); + pc->set_exec (); + buf->st_mode |= STD_XBITS; + } + SetFilePointer (get_handle (), cur, NULL, FILE_BEGIN); + } + } + buf->st_uid = uid; buf->st_gid = gid;