+2007-11-08 Christopher Faylor <me+cygwin@cgf.cx>
+
+ * dllfixdbg: Eliminate extra objcopy step.
+
2007-11-07 Pedro Alves <pedro_alves@portugalmail.pt>
* dllfixdbg: Pass --only-keep-debug to objcopy, instead of
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;
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 ()
else
dev = *console_dev;
}
- else if (ft == FILE_TYPE_PIPE)
+ else if (0 && ft == FILE_TYPE_PIPE)
{
if (fd == 0)
dev = *piper_dev;
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;
}
}
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);
}
}
#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)
{
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");
}
char *w32 = win32_fn;
+ bool justslash = false;
if (maxmatchlen)
{
n = strlen (maxmatchdos);
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;
}
switch (WaitForMultipleObjects (n, w4, false, INFINITE))
{
case WAIT_OBJECT_0:
+ debug_printf ("normal read");
if (!bytes ||
GetOverlappedResult (h, get_overlapped (), bytes, false))
res = 1;
}
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;
}
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 ();}
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);
};
}
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. */
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
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;
}
while (1)
{
- sig_dispatch_pending ();
-
cygheap_fdget cfd (fd);
if (cfd < 0)
break;
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);