summaryrefslogtreecommitdiff
path: root/spec/ffi/fixtures/PipeHelperWindows.c
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ffi/fixtures/PipeHelperWindows.c')
-rw-r--r--spec/ffi/fixtures/PipeHelperWindows.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/spec/ffi/fixtures/PipeHelperWindows.c b/spec/ffi/fixtures/PipeHelperWindows.c
new file mode 100644
index 0000000..470bacc
--- /dev/null
+++ b/spec/ffi/fixtures/PipeHelperWindows.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2007 Wayne Meissner. All rights reserved.
+ *
+ * For licensing, see LICENSE.SPECS
+ */
+
+#ifdef _WIN32
+#include <windows.h>
+#include "PipeHelper.h"
+
+int pipeHelperCreatePipe(FD_TYPE pipefd[2])
+{
+ char name[ MAX_PATH ];
+ static int pipe_idx = 0;
+ sprintf( name, "\\\\.\\Pipe\\pipeHelper-%u-%i",
+ (unsigned int)GetCurrentProcessId(), pipe_idx++ );
+
+ pipefd[0] = CreateNamedPipe( name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
+ PIPE_TYPE_BYTE | PIPE_WAIT,
+ 1, // Number of pipes
+ 5, // Out buffer size
+ 5, // In buffer size
+ 60 * 1000, // Timeout in ms
+ NULL );
+ if(pipefd[0] == INVALID_HANDLE_VALUE)
+ return -1;
+
+ pipefd[1] = CreateFile( name, GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if(pipefd[1] == INVALID_HANDLE_VALUE) {
+ CloseHandle( pipefd[0] );
+ return -1;
+ }
+ return 0;
+}
+
+char pipeHelperReadChar(FD_TYPE fd, int timeout)
+{
+ char d;
+ OVERLAPPED ovl;
+ ZeroMemory(&ovl, sizeof(ovl));
+ ovl.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if( ReadFile(fd, &d, 1, NULL, &ovl) == 0) {
+ DWORD recvd = 0;;
+ DWORD res = WaitForSingleObject(ovl.hEvent, timeout * 1000);
+ if( res != WAIT_OBJECT_0 ) {
+ CloseHandle(ovl.hEvent);
+ return 0;
+ }
+ if( GetOverlappedResult(fd, &ovl, &recvd, FALSE) == 0 ) {
+ CloseHandle(ovl.hEvent);
+ return 0;
+ }
+ }
+ CloseHandle(ovl.hEvent);
+ return d;
+}
+
+int pipeHelperWriteChar(FD_TYPE fd, char c)
+{
+ DWORD written;
+ return WriteFile(fd, &c, 1, &written, NULL) == 0 ? 0 : 1;
+}
+
+void pipeHelperClosePipe(FD_TYPE fd) {
+ CloseHandle(fd);
+}
+
+#endif