Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Corinna Vinschen <vinschen@redhat.com>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH 1/3] New option --cygwin-tty.
Date: Thu, 25 Jul 2013 07:34:00 -0000	[thread overview]
Message-ID: <20130725073424.GA8823@calimero.vinschen.de> (raw)
In-Reply-To: <1374728963-25187-2-git-send-email-yao@codesourcery.com>

[-- Attachment #1: Type: text/plain, Size: 786 bytes --]

On Jul 25 13:09, Yao Qi wrote:
> Hi,
> This patch is to add a new GDB option '--cygwin-tty', which is useful
> when running/testing mingw32 native GDB in cygwin.  Due the odd TTY
> in Cygwin, the output of mingw32 native GDB behaves differently,
> which causes the testsuite result unusable.  I tried different
> approaches to detect whether GDB is running in cygwin tty, but failed.

Ptys in Cygwin are implemented as named pipes.  Therefore the native
MSVCRT _isatty() call returns 0 when called on a stream connected to a
pty.

Last year I created an isatty replacement implementation for non-Cygwin
applications for demonstration.  It should work with Mingw-w64 as well
as VC++.  I attached it to this mail, maybe it helps.


Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat

[-- Attachment #2: isatty-for-native-apps.c --]
[-- Type: text/plain, Size: 3010 bytes --]

#include <stdio.h>
#include <io.h>

#include <errno.h>
#include <wchar.h>
#include <windows.h>
#include <winternl.h>

#ifndef __MINGW64_VERSION_MAJOR
/* MS winternl.h defines FILE_INFORMATION_CLASS, but with only a
   different single member. */
enum FILE_INFORMATION_CLASSX
{
  FileNameInformation = 9
};

typedef struct _FILE_NAME_INFORMATION
{
  ULONG FileNameLength;
  WCHAR FileName[1];
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;

NTSTATUS (NTAPI *pNtQueryInformationFile) (HANDLE, PIO_STATUS_BLOCK, PVOID,
					  ULONG, FILE_INFORMATION_CLASSX);
#else
NTSTATUS (NTAPI *pNtQueryInformationFile) (HANDLE, PIO_STATUS_BLOCK, PVOID,
					  ULONG, FILE_INFORMATION_CLASS);
#endif

int
isatty (int fd)
{
  HANDLE fh;
  NTSTATUS status;
  IO_STATUS_BLOCK io;
  long buf[66];	/* NAME_MAX + 1 + sizeof ULONG */
  PFILE_NAME_INFORMATION pfni = (PFILE_NAME_INFORMATION) buf;
  PWCHAR cp;

  /* First check using _isatty.
  
     Note that this returns the wrong result for NUL, for instance! 
     Workaround is not to use _isatty at all, but rather GetFileType
     plus object name checking. */
  if (_isatty (fd))
    return 1;

  /* Now fetch the underlying HANDLE. */
  fh = (HANDLE) _get_osfhandle (fd);
  if (!fh || fh == INVALID_HANDLE_VALUE)
    {
      errno = EBADF;
      return 0;
    }

  /* Must be a pipe. */
  if (GetFileType (fh) != FILE_TYPE_PIPE)
    goto no_tty;

  /* Calling the native NT function NtQueryInformationFile is required to
     support pre-Vista systems.  If that's of no concern, Vista introduced
     the GetFileInformationByHandleEx call with the FileNameInfo info class,
     which can be used instead. */
  if (!pNtQueryInformationFile)
    {
      pNtQueryInformationFile = (NTSTATUS (NTAPI *)(HANDLE, PIO_STATUS_BLOCK,
      				PVOID, ULONG, FILE_INFORMATION_CLASS))
			       GetProcAddress (GetModuleHandle ("ntdll.dll"),
					       "NtQueryInformationFile");
      if (!pNtQueryInformationFile)
      	goto no_tty;
    }
  if (!NT_SUCCESS (pNtQueryInformationFile (fh, &io, pfni, sizeof buf,
					   FileNameInformation)))
    goto no_tty;

  /* The filename is not guaranteed to be NUL-terminated. */
  pfni->FileName[pfni->FileNameLength / sizeof (WCHAR)] = L'\0';

  /* Now check the name pattern.  The filename of a Cygwin pseudo tty pipe
     looks like this:

       \cygwin-%16llx-pty%d-{to,from}-master
     
     %16llx is the hash of the Cygwin installation, (to support multiple
     parallel installations), %d id the pseudo tty number, "to" or "from"
     differs the pipe direction. "from" is a stdin, "to" a stdout-like
     pipe. */
  cp = pfni->FileName;
  if (!wcsncmp (cp, L"\\cygwin-", 8)
      && !wcsncmp (cp + 24, L"-pty", 4))
    {
      cp = wcschr (cp + 28, '-');
      if (!cp)
      	goto no_tty;
      if (!wcscmp (cp, L"-from-master") || !wcscmp (cp, L"-to-master"))
      	return 1;
    }
no_tty:
  errno = EINVAL;
  return 0;
}

int
main ()
{
  if (isatty(0))
    printf("tty\n");
  else
    printf("not a tty\n");
  return 0;
}

  reply	other threads:[~2013-07-25  7:34 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-25  5:10 [PATCH 0/3] Test mingw32 GDB in cygwin Yao Qi
2013-07-25  5:10 ` [PATCH 3/3] native mingw32 gdb, eol format Yao Qi
2013-07-25  5:10 ` [PATCH 2/3] Unbuffer stdout and stderr on windows Yao Qi
2013-07-25  5:10 ` [PATCH 1/3] New option --cygwin-tty Yao Qi
2013-07-25  7:34   ` Corinna Vinschen [this message]
2013-07-25  7:37   ` Pierre Muller
2013-07-25  7:55     ` Yao Qi
2013-07-25  8:18       ` Corinna Vinschen
2013-07-25  8:26         ` Corinna Vinschen
2013-07-25  9:05         ` Yao Qi
2013-07-25 10:20           ` Corinna Vinschen
2013-07-25 12:08             ` Yao Qi
2013-07-25 15:21               ` Corinna Vinschen
2013-07-26 19:40       ` Doug Evans
2013-07-25  7:31 ` [PATCH 0/3] Test mingw32 GDB in cygwin Pierre Muller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130725073424.GA8823@calimero.vinschen.de \
    --to=vinschen@redhat.com \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox