diff --git a/config.h.W32.template b/config.h.W32.template
index 849a8550..07bb626c 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 1d852f5f..946f16b2 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$";
+}