Обсуждение: Fix for /dev/tty on Win32

Поиск
Список
Период
Сортировка

Fix for /dev/tty on Win32

От
Bruce Momjian
Дата:
I found a better solution to the /dev/tty on Win32.  I used 'con' which
works fine on Win32 except using the Msys 1.0.10 console, but it is
probably the best solution.  Can someone test if newer Msys consoles
work with this?

Added DEVTTY macro for simplicity.

Applied to 8.0.X, 8.1.X, and HEAD.

--
  Bruce Momjian   http://candle.pha.pa.us
  SRA OSS, Inc.   http://www.sraoss.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/bin/psql/command.c
===================================================================
RCS file: /cvsroot/pgsql/src/bin/psql/command.c,v
retrieving revision 1.162
diff -c -c -r1.162 command.c
*** src/bin/psql/command.c    3 Mar 2006 23:49:12 -0000    1.162
--- src/bin/psql/command.c    4 Mar 2006 04:29:53 -0000
***************
*** 753,763 ****

          expand_tilde(&fname);
          /* This scrolls off the screen when using /dev/tty */
! #ifndef WIN32
!         success = saveHistory(fname ? fname : "/dev/tty");
! #else
!         success = saveHistory(fname ? fname : stderr);
! #endif
          if (success && !quiet && fname)
              printf(gettext("Wrote history to file \"%s/%s\".\n"),
                     pset.dirname ? pset.dirname : ".", fname);
--- 753,759 ----

          expand_tilde(&fname);
          /* This scrolls off the screen when using /dev/tty */
!         success = saveHistory(fname ? fname : DEVTTY);
          if (success && !quiet && fname)
              printf(gettext("Wrote history to file \"%s/%s\".\n"),
                     pset.dirname ? pset.dirname : ".", fname);
Index: src/include/port.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/port.h,v
retrieving revision 1.87
diff -c -c -r1.87 port.h
*** src/include/port.h    6 Dec 2005 18:35:10 -0000    1.87
--- src/include/port.h    4 Mar 2006 04:29:54 -0000
***************
*** 84,91 ****
--- 84,94 ----

  #if defined(WIN32) && !defined(__CYGWIN__)
  #define DEVNULL "nul"
+ /* "con" does not work from the MinGW 1.0.10 console. */
+ #define DEVTTY    "con"
  #else
  #define DEVNULL "/dev/null"
+ #define DEVTTY "/dev/tty"
  #endif

  /*
Index: src/port/sprompt.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/sprompt.c,v
retrieving revision 1.13
diff -c -c -r1.13 sprompt.c
*** src/port/sprompt.c    3 Mar 2006 23:49:12 -0000    1.13
--- src/port/sprompt.c    4 Mar 2006 04:29:54 -0000
***************
*** 40,47 ****
  {
      int            length;
      char       *destination;
!     FILE       *termin = NULL,
!                *termout = NULL;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
--- 40,47 ----
  {
      int            length;
      char       *destination;
!     FILE       *termin,
!                *termout;

  #ifdef HAVE_TERMIOS_H
      struct termios t_orig,
***************
*** 63,76 ****
       * Do not try to collapse these into one "w+" mode file. Doesn't work on
       * some platforms (eg, HPUX 10.20).
       */
! #ifndef WIN32
!     /*
!      *    Some win32 platforms actually have a /dev/tty file, but it isn't
!      *    a device file, and it doesn't work as expected, so we avoid trying.
!      */
!     termin = fopen("/dev/tty", "r");
!     termout = fopen("/dev/tty", "w");
! #endif
      if (!termin || !termout)
      {
          if (termin)
--- 63,70 ----
       * Do not try to collapse these into one "w+" mode file. Doesn't work on
       * some platforms (eg, HPUX 10.20).
       */
!     termin = fopen(DEVTTY, "r");
!     termout = fopen(DEVTTY, "w");
      if (!termin || !termout)
      {
          if (termin)

Re: Fix for /dev/tty on Win32

От
Bruce Momjian
Дата:
Bruce Momjian wrote:
> I found a better solution to the /dev/tty on Win32.  I used 'con' which
> works fine on Win32 except using the Msys 1.0.10 console, but it is
> probably the best solution.  Can someone test if newer Msys consoles
> work with this?
>
> Added DEVTTY macro for simplicity.
>
> Applied to 8.0.X, 8.1.X, and HEAD.

I am attaching a new applied patch that reverts "msys" so it doesn't use
'con'.  This means we now actually prompt from the terminal on Win32
(except for msys consoles).

--
  Bruce Momjian   http://candle.pha.pa.us
  SRA OSS, Inc.   http://www.sraoss.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/include/port.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/port.h,v
retrieving revision 1.88
diff -c -c -r1.88 port.h
*** src/include/port.h    4 Mar 2006 04:30:40 -0000    1.88
--- src/include/port.h    5 Mar 2006 05:29:09 -0000
***************
*** 84,90 ****

  #if defined(WIN32) && !defined(__CYGWIN__)
  #define DEVNULL "nul"
! /* "con" does not work from the MinGW 1.0.10 console. */
  #define DEVTTY    "con"
  #else
  #define DEVNULL "/dev/null"
--- 84,90 ----

  #if defined(WIN32) && !defined(__CYGWIN__)
  #define DEVNULL "nul"
! /* "con" does not work from the Msys 1.0.10 console (part of MinGW). */
  #define DEVTTY    "con"
  #else
  #define DEVNULL "/dev/null"
Index: src/port/sprompt.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/sprompt.c,v
retrieving revision 1.14
diff -c -c -r1.14 sprompt.c
*** src/port/sprompt.c    4 Mar 2006 04:30:41 -0000    1.14
--- src/port/sprompt.c    5 Mar 2006 05:29:10 -0000
***************
*** 65,71 ****
       */
      termin = fopen(DEVTTY, "r");
      termout = fopen(DEVTTY, "w");
!     if (!termin || !termout)
      {
          if (termin)
              fclose(termin);
--- 65,76 ----
       */
      termin = fopen(DEVTTY, "r");
      termout = fopen(DEVTTY, "w");
!     if (!termin || !termout
! #ifdef WIN32
!         /* See DEVTTY comment for msys */
!         || (getenv("OSTYPE") && strcmp(getenv("OSTYPE"), "msys") == 0)
! #endif
!         )
      {
          if (termin)
              fclose(termin);