diff options
Diffstat (limited to 'winsup/cygwin')
-rw-r--r-- | winsup/cygwin/ChangeLog | 11 | ||||
-rw-r--r-- | winsup/cygwin/dcrt0.cc | 2 | ||||
-rw-r--r-- | winsup/cygwin/exceptions.cc | 4 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.h | 2 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 22 |
5 files changed, 30 insertions, 11 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index bc70eed7e..d79fd7588 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,14 @@ +2003-03-19 Christopher Faylor <cgf@redhat.com> + + * sigproc.h (signal_fixup_after_exec): Eliminate argument in declaration. + * exceptions.cc (signal_fixup_after_exec): Eliminate argument in + definition. Don't reset signal handlers after spawm. Just treat like + fork/exec. + * dcrt0.cc (dll_crt0_1): Don't pass PROC_SPAWN argument to + signal_fixup_after_exec. + * syscalls.cc (unlink): Don't change attributes of file if not readonly/system. + Ditto for resetting of arguments. + 2003-03-19 Corinna Vinschen <corinna@vinschen.de> * glob.c: Eliminate __INSIDE_CYGWIN__ preprocessor conditionals diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 515745c25..9da8111ec 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -612,7 +612,7 @@ dll_crt0_1 () envp = spawn_info->moreinfo->envp; envc = spawn_info->moreinfo->envc; cygheap->fdtab.fixup_after_exec (spawn_info->parent); - signal_fixup_after_exec (child_proc_info->type == PROC_SPAWN); + signal_fixup_after_exec (); CloseHandle (spawn_info->parent); if (spawn_info->moreinfo->old_title) { diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index e2df0c913..5acbe558d 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -735,13 +735,13 @@ signal_fixup_after_fork () } void __stdcall -signal_fixup_after_exec (bool isspawn) +signal_fixup_after_exec () { /* Set up child's signal handlers */ for (int i = 0; i < NSIG; i++) { myself->getsig (i).sa_mask = 0; - if (myself->getsig (i).sa_handler != SIG_IGN || isspawn) + if (myself->getsig (i).sa_handler != SIG_IGN) myself->getsig (i).sa_handler = SIG_DFL; } } diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index c8c208e13..cda8cad67 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -118,7 +118,7 @@ BOOL __stdcall pid_exists (pid_t) __attribute__ ((regparm(1))); int __stdcall sig_send (_pinfo *, int, DWORD ebp = (DWORD) __builtin_frame_address (0), bool exception = 0) __attribute__ ((regparm(3))); void __stdcall signal_fixup_after_fork (); -void __stdcall signal_fixup_after_exec (bool); +void __stdcall signal_fixup_after_exec (); void __stdcall wait_for_sigthread (); extern char myself_nowait_dummy[]; diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index 61bb08646..7c6d9a703 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -146,8 +146,15 @@ unlink (const char *ourname) goto done; } - /* Allow us to delete even if read-only */ - SetFileAttributes (win32_name, (DWORD) win32_name & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)); + bool setattrs; + if (!((DWORD) win32_name & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) + setattrs = false; + else + { + /* Allow us to delete even if read-only */ + SetFileAttributes (win32_name, (DWORD) win32_name & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)); + setattrs = true; + } /* Attempt to use "delete on close" semantics to handle removing a file which may be open. */ HANDLE h; @@ -155,12 +162,12 @@ unlink (const char *ourname) OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); if (h != INVALID_HANDLE_VALUE) { - (void) SetFileAttributes (win32_name, (DWORD) win32_name); + if (wincap.has_hard_links () && setattrs) + (void) SetFileAttributes (win32_name, (DWORD) win32_name); BOOL res = CloseHandle (h); syscall_printf ("%d = CloseHandle (%p)", res, h); - if (!win32_name.isremote () - || (GetFileAttributes (win32_name) == INVALID_FILE_ATTRIBUTES - || wincap.has_delete_on_close ())) + if (GetFileAttributes (win32_name) == INVALID_FILE_ATTRIBUTES + || !win32_name.isremote ()) { syscall_printf ("CreateFile (FILE_FLAG_DELETE_ON_CLOSE) succeeded"); goto ok; @@ -168,7 +175,8 @@ unlink (const char *ourname) else { syscall_printf ("CreateFile (FILE_FLAG_DELETE_ON_CLOSE) failed"); - SetFileAttributes (win32_name, (DWORD) win32_name & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)); + if (setattrs) + SetFileAttributes (win32_name, (DWORD) win32_name & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)); } } |