From 50d57be485905e44a712ad92904c13cba166e5e3 Mon Sep 17 00:00:00 2001 From: cgf Date: Thu, 8 Nov 2007 14:36:47 +0000 Subject: [PATCH] * dllfixdbg: Eliminate extra objcopy step. --- winsup/cygwin/ChangeLog | 4 +++ winsup/cygwin/dllfixdbg | 3 +- winsup/cygwin/dtable.cc | 81 +++++++++++++++++++++++++++++++++++------------ winsup/cygwin/fhandler.cc | 3 ++ winsup/cygwin/fhandler.h | 2 ++ winsup/cygwin/path.cc | 2 +- winsup/cygwin/pipe.cc | 53 ++++++++++++++++++++++++++++--- winsup/cygwin/syscalls.cc | 3 -- 8 files changed, 121 insertions(+), 30 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 05f0f114f8..1e5c7cd4f3 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2007-11-08 Christopher Faylor + + * dllfixdbg: Eliminate extra objcopy step. + 2007-11-07 Pedro Alves * dllfixdbg: Pass --only-keep-debug to objcopy, instead of diff --git a/winsup/cygwin/dllfixdbg b/winsup/cygwin/dllfixdbg index 47ec271695..f97be0ca6b 100755 --- a/winsup/cygwin/dllfixdbg +++ b/winsup/cygwin/dllfixdbg @@ -16,8 +16,7 @@ my $objdump = shift; my @objcopy = ((shift)); my $dll = shift; my $dbg = shift; -xit 0, @objcopy, '--only-keep-debug', $dll, $dbg; -xit 0, @objcopy, '-R', '.gnu_debuglink_overlay', $dbg; +xit 0, @objcopy, '-R', '.gnu_debuglink_overlay', '--only-keep-debug', $dll, $dbg; xit 0, @objcopy, '-g', '--add-gnu-debuglink=' . $dbg, $dll; open(OBJDUMP, '-|', "$objdump --headers $dll"); my %section; diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index f130a2ef7c..019f8a1a68 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -41,6 +41,17 @@ static const NO_COPY DWORD std_consts[] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, static const char *handle_to_fn (HANDLE, char *); +#define DEVICE_PREFIX "\\device\\" +#define DEVICE_PREFIX_LEN sizeof (DEVICE_PREFIX) - 1 +#define REMOTE "\\Device\\LanmanRedirector\\" +#define REMOTE_LEN sizeof (REMOTE) - 1 +#define REMOTE1 "\\Device\\WinDfs\\Root\\" +#define REMOTE1_LEN sizeof (REMOTE1) - 1 +#define NAMED_PIPE "\\Device\\NamedPipe\\" +#define NAMED_PIPE_LEN sizeof (NAMED_PIPE) - 1 +#define POSIX_NAMED_PIPE "/Device/NamedPipe/" +#define POSIX_NAMED_PIPE_LEN sizeof (POSIX_NAMED_PIPE) - 1 + /* Set aside space for the table of fds */ void dtable_init () @@ -283,7 +294,7 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle) else dev = *console_dev; } - else if (ft == FILE_TYPE_PIPE) + else if (0 && ft == FILE_TYPE_PIPE) { if (fd == 0) dev = *piper_dev; @@ -297,7 +308,12 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle) else { name = handle_to_fn (handle, (char *) alloca (CYG_MAX_PATH + 100)); - bin = 0; + if (!strncasematch (name, POSIX_NAMED_PIPE, POSIX_NAMED_PIPE_LEN)) + /* nothing */; + else if (fd == 0) + dev = *piper_dev; + else + dev = *pipew_dev; } } @@ -308,25 +324,31 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle) fhandler_base *fh; if (dev) - fh = build_fh_dev (dev); + fh = build_fh_dev (dev, name); else fh = build_fh_name (name); if (fh) cygheap->fdtab[fd] = fh; - if (!bin) + if (name) { - bin = fh->get_default_fmode (O_RDWR); - if (bin) - /* nothing */; - else if (dev) - bin = O_BINARY; - else if (name != unknown_file) - bin = fh->pc_binmode (); + bin = fh->pc_binmode (); + if (!bin) + { + bin = fh->get_default_fmode (O_RDWR); + if (!bin && dev) + bin = O_BINARY; + } } - fh->init (handle, GENERIC_READ | GENERIC_WRITE, bin); + DWORD access; + if (fd == 0) + access = GENERIC_READ; + else + access = GENERIC_WRITE; /* Should be rdwr for stderr but not sure that's + possible for some versions of handles */ + fh->init (handle, access, bin); set_std_handle (fd); paranoid_printf ("fd %d, handle %p", fd, handle); } @@ -825,11 +847,6 @@ dtable::vfork_child_fixup () } #endif /*NEWVFORK*/ -#define DEVICE_PREFIX "\\device\\" -#define DEVICE_PREFIX_LEN sizeof (DEVICE_PREFIX) - 1 -#define REMOTE "\\Device\\LanmanRedirector\\" -#define REMOTE_LEN sizeof (REMOTE) - 1 - static const char * handle_to_fn (HANDLE h, char *posix_fn) { @@ -844,7 +861,7 @@ handle_to_fn (HANDLE h, char *posix_fn) NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf), NULL); - if (NT_SUCCESS (res)) + if (!NT_SUCCESS (res)) { strcpy (posix_fn, unknown_file); debug_printf ("NtQueryObject failed"); @@ -901,6 +918,7 @@ handle_to_fn (HANDLE h, char *posix_fn) } char *w32 = win32_fn; + bool justslash = false; if (maxmatchlen) { n = strlen (maxmatchdos); @@ -910,15 +928,38 @@ handle_to_fn (HANDLE h, char *posix_fn) memcpy (w32, maxmatchdos, n); w32[n] = '\\'; } + else if (strncasematch (w32, NAMED_PIPE, NAMED_PIPE_LEN)) + { + debug_printf ("pipe"); + justslash = true; + } else if (strncasematch (w32, REMOTE, REMOTE_LEN)) { w32 += REMOTE_LEN - 2; *w32 = '\\'; debug_printf ("remote drive"); + justslash = true; + } + else if (strncasematch (w32, REMOTE1, REMOTE1_LEN)) + { + w32 += REMOTE1_LEN - 2; + *w32 = '\\'; + debug_printf ("remote drive"); + justslash = true; } + if (!justslash) + cygwin_conv_to_full_posix_path (w32, posix_fn); + else + { + char *s, *d; + for (s = w32, d = posix_fn; *s; s++, d++) + if (*s == '\\') + *d = '/'; + else + *d = *s; + } - debug_printf ("derived path '%s'", w32); - cygwin_conv_to_full_posix_path (w32, posix_fn); + debug_printf ("derived path '%s', posix '%s'", w32, posix_fn); return posix_fn; } diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc index bc30a396cd..a479d1b28e 100644 --- a/winsup/cygwin/fhandler.cc +++ b/winsup/cygwin/fhandler.cc @@ -1639,6 +1639,7 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes) switch (WaitForMultipleObjects (n, w4, false, INFINITE)) { case WAIT_OBJECT_0: + debug_printf ("normal read"); if (!bytes || GetOverlappedResult (h, get_overlapped (), bytes, false)) res = 1; @@ -1649,12 +1650,14 @@ fhandler_base::wait_overlapped (bool& res, bool writing, DWORD *bytes) } break; case WAIT_OBJECT_0 + 1: + debug_printf ("got a signal"); CancelIo (h); set_errno (EINTR); res = 0; break; default: err = GetLastError (); + debug_printf ("WFMO error, %E"); goto err; break; } diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 665dd51e1f..45588fef90 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -149,6 +149,7 @@ class fhandler_base path_conv pc; virtual void set_name (path_conv &pc); + virtual void set_name (const char *s) {pc.set_normalized_path (s, false);} int error () const {return pc.error;} void set_error (int error) {pc.error = error;} bool exists () const {return pc.exists ();} @@ -546,6 +547,7 @@ public: int __stdcall fadvise (_off64_t, _off64_t, int) __attribute__ ((regparm (3))); int __stdcall ftruncate (_off64_t, bool) __attribute__ ((regparm (3))); int ready_for_read (int fd, DWORD howlong); + void init (HANDLE, DWORD, mode_t); static int create (fhandler_pipe *[2], unsigned, int); static int create_selectable (LPSECURITY_ATTRIBUTES, HANDLE&, HANDLE&, DWORD); }; diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index a10a29339c..d0de90ec31 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -543,7 +543,7 @@ path_conv::set_normalized_path (const char *path_copy, bool strip_tail) } PUNICODE_STRING -get_nt_native_path (const char *path, UNICODE_STRING &upath) +get_nt_native_path (const char *path, UNICODE_STRING& upath) { upath.Length = 0; if (path[0] == '/') /* special path w/o NT path representation. */ diff --git a/winsup/cygwin/pipe.cc b/winsup/cygwin/pipe.cc index b9314aa4f8..4bf1d32d13 100644 --- a/winsup/cygwin/pipe.cc +++ b/winsup/cygwin/pipe.cc @@ -34,6 +34,53 @@ fhandler_pipe::fhandler_pipe () need_fork_fixup (true); } +void +fhandler_pipe::init (HANDLE f, DWORD a, mode_t bin) +{ + // FIXME: Have to clean this up someday + if (!*get_win32_name () && get_name ()) + { + char *hold_normalized_name = (char *) alloca (strlen (get_name ()) + 1); + strcpy (hold_normalized_name, get_name ()); + char *s, *d; + for (s = hold_normalized_name, d = (char *) get_win32_name (); *s; s++, d++) + if (*s == '/') + *d = '\\'; + else + *d = *s; + set_name (hold_normalized_name); + } + + bool opened_properly = a & FILE_CREATE_PIPE_INSTANCE; + a &= ~FILE_CREATE_PIPE_INSTANCE; + if (!opened_properly) + { + NTSTATUS status; + IO_STATUS_BLOCK io; + HANDLE h = NULL; + DWORD access = SYNCHRONIZE; + if (a & GENERIC_READ) + access |= FILE_READ_DATA | FILE_READ_ATTRIBUTES; + if (a & GENERIC_WRITE) + access |= FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES; + OBJECT_ATTRIBUTES attr; + static UNICODE_STRING fname; + InitializeObjectAttributes (&attr, &fname, OBJ_CASE_INSENSITIVE, f, NULL); +small_printf ("f %p, h %p\n", f, h); + status = NtOpenFile (&h, a | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SEQUENTIAL_ONLY | FILE_SYNCHRONOUS_IO_ALERT); + if (!NT_SUCCESS (status)) + system_printf ("Unable to reopen pipe %s, attributes %p, NT error: %p win32: %lu", + get_win32_name (), access, status, RtlNtStatusToDosError (status)); +small_printf ("f %p, h %p\n", f, h); + CloseHandle (f); + f = h; + } + + fhandler_base::init (f, a, bin); + setup_overlapped (); +} + extern "C" int sscanf (const char *, const char *, ...); int @@ -284,16 +331,14 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode) fhs[1] = (fhandler_pipe *) build_fh_dev (*pipew_dev); int binmode = mode & O_TEXT ?: O_BINARY; - fhs[0]->init (r, GENERIC_READ, binmode); - fhs[1]->init (w, GENERIC_WRITE, binmode); + fhs[0]->init (r, FILE_CREATE_PIPE_INSTANCE | GENERIC_READ, binmode); + fhs[1]->init (w, FILE_CREATE_PIPE_INSTANCE | GENERIC_WRITE, binmode); if (mode & O_NOINHERIT) { fhs[0]->close_on_exec (true); fhs[1]->close_on_exec (true); } - fhs[0]->setup_overlapped (); - fhs[1]->setup_overlapped (); res = 0; } diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index f3fa10d267..899745f605 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -743,8 +743,6 @@ readv (int fd, const struct iovec *const iov, const int iovcnt) while (1) { - sig_dispatch_pending (); - cygheap_fdget cfd (fd); if (cfd < 0) break; @@ -814,7 +812,6 @@ extern "C" ssize_t writev (const int fd, const struct iovec *const iov, const int iovcnt) { int res = -1; - sig_dispatch_pending (); const ssize_t tot = check_iovec_for_write (iov, iovcnt); cygheap_fdget cfd (fd); -- 2.11.0