summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarc Hoersken <info@marc-hoersken.de>2013-04-04 22:50:01 +0200
committerMarc Hoersken <info@marc-hoersken.de>2013-04-04 22:50:01 +0200
commite5d25b6c68de86c4a7182e883f5b473f3b14bbd9 (patch)
tree9bcae89f0325aa519d5759815e9dbd102bffe3b7 /tests
parenta6eade56ca0296ecca1a8476e1176e29f9fd0d3e (diff)
downloadcurl-e5d25b6c68de86c4a7182e883f5b473f3b14bbd9.tar.gz
sockfilt.c: Added wrapper functions to fix Windows console issues
The new read and write wrapper functions support reading from stdin and writing to stdout/stderr on Windows by using the appropriate Windows API functions and data types.
Diffstat (limited to 'tests')
-rw-r--r--tests/server/sockfilt.c71
1 files changed, 69 insertions, 2 deletions
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c
index 12fc6afbc..807a2808f 100644
--- a/tests/server/sockfilt.c
+++ b/tests/server/sockfilt.c
@@ -270,6 +270,73 @@ static void restore_signal_handlers(void)
#endif
}
+#ifdef WIN32
+/*
+ * read-wrapper to support reading from stdin on Windows.
+ */
+static ssize_t read_wincon(int fd, void *buf, size_t count)
+{
+ HANDLE handle = NULL;
+ DWORD mode, rcount = 0;
+ BOOL success;
+
+ if(fd == fileno(stdin)) {
+ handle = GetStdHandle(STD_INPUT_HANDLE);
+ }
+ else {
+ return read(fd, buf, count);
+ }
+
+ if(GetConsoleMode(handle, &mode)) {
+ success = ReadConsole(handle, buf, count, &rcount, NULL);
+ }
+ else {
+ success = ReadFile(handle, buf, count, &rcount, NULL);
+ }
+ if(success) {
+ return rcount;
+ }
+
+ errno = GetLastError();
+ return -1;
+}
+#define read(a,b,c) read_wincon(a,b,c)
+
+/*
+ * write-wrapper to support writing to stdout and stderr on Windows.
+ */
+static ssize_t write_wincon(int fd, const void *buf, size_t count)
+{
+ HANDLE handle = NULL;
+ DWORD mode, wcount = 0;
+ BOOL success;
+
+ if(fd == fileno(stdout)) {
+ handle = GetStdHandle(STD_OUTPUT_HANDLE);
+ }
+ else if(fd == fileno(stderr)) {
+ handle = GetStdHandle(STD_ERROR_HANDLE);
+ }
+ else {
+ return write(fd, buf, count);
+ }
+
+ if(GetConsoleMode(handle, &mode)) {
+ success = WriteConsole(handle, buf, count, &wcount, NULL);
+ }
+ else {
+ success = WriteFile(handle, buf, count, &wcount, NULL);
+ }
+ if(success) {
+ return wcount;
+ }
+
+ errno = GetLastError();
+ return -1;
+}
+#define write(a,b,c) write_wincon(a,b,c)
+#endif
+
/*
* fullread is a wrapper around the read() function. This will repeat the call
* to read() until it actually has read the complete number of bytes indicated
@@ -451,7 +518,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout)
{
long networkevents;
- DWORD milliseconds, wait, idx, avail, events, inputs;
+ DWORD milliseconds, wait, idx, mode, avail, events, inputs;
WSAEVENT wsaevent, *wsaevents;
WSANETWORKEVENTS wsanetevents;
INPUT_RECORD *inputrecords;
@@ -572,7 +639,7 @@ static int select_ws(int nfds, fd_set *readfds, fd_set *writefds,
/* check if there is no data in the input buffer */
if(!stdin->_cnt) {
/* check if we are getting data from a PIPE */
- if(!GetConsoleMode(handle, &avail)) {
+ if(!GetConsoleMode(handle, &mode)) {
/* check if there is no data from PIPE input */
if(!PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL))
avail = 0;