summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h.W32.template3
-rw-r--r--w32/compat/posixfcn.c30
2 files changed, 32 insertions, 1 deletions
diff --git a/config.h.W32.template b/config.h.W32.template
index 849a855..07bb626 100644
--- a/config.h.W32.template
+++ b/config.h.W32.template
@@ -296,7 +296,8 @@ this program. If not, see <http://www.gnu.org/licenses/>. */
#define HAVE_ISATTY 1
/* Define to 1 if you have the `ttyname' function. */
-/* #undef HAVE_TTYNAME */
+#define HAVE_TTYNAME 1
+char *ttyname (int);
/* Define to 1 if 'n_un.n_name' is a member of 'struct nlist'. */
/* #undef HAVE_STRUCT_NLIST_N_UN_N_NAME */
diff --git a/w32/compat/posixfcn.c b/w32/compat/posixfcn.c
index 1d852f5..946f16b 100644
--- a/w32/compat/posixfcn.c
+++ b/w32/compat/posixfcn.c
@@ -454,3 +454,33 @@ dlclose (void *handle)
#endif /* MAKE_LOAD */
+
+/* MS runtime's isatty returns non-zero for any character device,
+ including the null device, which is not what we want. */
+int
+isatty (int fd)
+{
+ HANDLE fh = (HANDLE) _get_osfhandle (fd);
+ DWORD con_mode;
+
+ if (fh == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return 0;
+ }
+ if (GetConsoleMode (fh, &con_mode))
+ return 1;
+
+ errno = ENOTTY;
+ return 0;
+}
+
+char *
+ttyname (int fd)
+{
+ /* This "knows" that Make only asks about stdout and stderr. A more
+ sophisticated implementation should test whether FD is open for
+ input or output. We can do that by looking at the mode returned
+ by GetConsoleMode. */
+ return "CONOUT$";
+}