diff options
author | Alin Serdean <aserdean@cloudbasesolutions.com> | 2017-06-20 16:31:12 +0000 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2017-07-06 08:32:34 -0700 |
commit | add49d45bb7e87ad2ad8ccef8d6447ca8a57c89c (patch) | |
tree | 35b29e8a0b5851bb24298a6a0db36b813611b6ff | |
parent | 822a3d8831563bea9e8a9b32a43721cd3221054d (diff) | |
download | openvswitch-add49d45bb7e87ad2ad8ccef8d6447ca8a57c89c.tar.gz |
Fix nonstandard isatty on Windows
A lot of tests are failing, due to the open flow ports being outputted using
names instead of numbers.
i.e.: http://64.119.130.115/ovs/beb75a40fdc295bfd6521b0068b4cd12f6de507c/testsuite.dir/0464/testsuite.log.gz
The issues encountered above is because 'monitor' with 'detach' arguments are
specified, that in turn will call 'close_standard_fds'
(https://github.com/openvswitch/ovs/blob/master/lib/daemon-unix.c#L472)
which will create a duplicate fd over '/dev/null' on Linux and 'nul' on Windows.
'isatty' will be called on those FDs.
What POSIX standard says:
http://pubs.opengroup.org/onlinepubs/009695399/functions/isatty.html
'The isatty() function shall test whether fildes, an open file descriptor,
is associated with a terminal device.'
What MSDN says:
https://msdn.microsoft.com/en-us/library/f4s0ddew(VS.80).aspx
'The _isatty function determines whether fd is associated with a character
device (a terminal, console, printer, or serial port).'
This patch adds another check using 'GetConsoleMode'
https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx
which will fail if the handle pointing to the file descriptor is not associated
to a console.
Signed-off-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Co-authored-by: Ben Pfaff <blp@ovn.org>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Acked-by: Anand Kumar <kumaranand@vmware.com>
-rw-r--r-- | include/windows/unistd.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/include/windows/unistd.h b/include/windows/unistd.h index 2e9f0aef1..21cc56ff1 100644 --- a/include/windows/unistd.h +++ b/include/windows/unistd.h @@ -85,4 +85,20 @@ __inline long sysconf(int type) return value; } +/* On Windows, a console is a specialized character device, and isatty() only + * reports whether a file description is a character device and thus reports + * that devices such as /dev/null are ttys. This replacement avoids that + * problem. */ +#undef isatty +#define isatty(fd) rpl_isatty(fd) +static __inline int +rpl_isatty(int fd) +{ + HANDLE h = (HANDLE) _get_osfhandle(fd); + DWORD st; + return (_isatty(STDOUT_FILENO) + && h != INVALID_HANDLE_VALUE + && GetConsoleMode(h, &st)); +} + #endif /* unistd.h */ |