Implement win32_isatty()
Jan Dubois [Thu, 17 Dec 2009 19:15:38 +0000 (11:15 -0800)]
Commit 827da6a38 added a custom isatty() implementation
in win32/perlhost.h, but that code will only be used when
perl is compiled with -DPERL_IMPLICIT_SYS.  This change
makes sure that the custom implementation will be used
on Windows for all choices of build options.

makedef.pl
win32/perlhost.h
win32/win32.c
win32/win32iop.h

index 9e261e5..6409431 100644 (file)
@@ -1284,6 +1284,7 @@ if ($PLATFORM =~ /^win(?:32|ce)$/) {
                            win32_open
                            win32_close
                            win32_eof
+                           win32_isatty
                            win32_read
                            win32_write
                            win32_spawnvp
index 36a716a..be7d61d 100644 (file)
@@ -1004,22 +1004,7 @@ PerlLIOIOCtl(struct IPerlLIO* piPerl, int i, unsigned int u, char *data)
 int
 PerlLIOIsatty(struct IPerlLIO* piPerl, int fd)
 {
-    /* The Microsoft isatty() function returns true for *all*
-     * character mode devices, including "nul".  Our implementation
-     * should only return true if the handle has a console buffer.
-     */
-    DWORD mode;
-    HANDLE fh = (HANDLE)_get_osfhandle(fd);
-    if (fh == (HANDLE)-1) {
-        /* errno is already set to EBADF */
-        return 0;
-    }
-
-    if (GetConsoleMode(fh, &mode))
-        return 1;
-
-    errno = ENOTTY;
-    return 0;
+    return win32_isatty(fd);
 }
 
 int
index b9eea70..b33f732 100644 (file)
@@ -3509,6 +3509,27 @@ win32_eof(int fd)
 }
 
 DllExport int
+win32_isatty(int fd)
+{
+    /* The Microsoft isatty() function returns true for *all*
+     * character mode devices, including "nul".  Our implementation
+     * should only return true if the handle has a console buffer.
+     */
+    DWORD mode;
+    HANDLE fh = (HANDLE)_get_osfhandle(fd);
+    if (fh == (HANDLE)-1) {
+        /* errno is already set to EBADF */
+        return 0;
+    }
+
+    if (GetConsoleMode(fh, &mode))
+        return 1;
+
+    errno = ENOTTY;
+    return 0;
+}
+
+DllExport int
 win32_dup(int fd)
 {
     return dup(fd);
index 7507408..9c59037 100644 (file)
@@ -86,6 +86,7 @@ DllExport  int                win32_dup2(int h1, int h2);
 DllExport  int         win32_open(const char *path, int oflag,...);
 DllExport  int         win32_close(int fd);
 DllExport  int         win32_eof(int fd);
+DllExport  int         win32_isatty(int fd);
 DllExport  int         win32_read(int fd, void *buf, unsigned int cnt);
 DllExport  int         win32_write(int fd, const void *buf, unsigned int cnt);
 DllExport  int         win32_spawnvp(int mode, const char *cmdname,
@@ -252,6 +253,7 @@ END_EXTERN_C
 #define open                   win32_open
 #define close(fd)              win32_close(fd)
 #define eof(fd)                        win32_eof(fd)
+#define isatty(fd)             win32_isatty(fd)
 #define read(fd,b,s)           win32_read(fd,b,s)
 #define write(fd,b,s)          win32_write(fd,b,s)
 #define _open_osfhandle                win32_open_osfhandle