/* ce-createpipe.c - Test the W32CE CreatePipe implementation. Copyright (C) 2010 Free Software Foundation, Inc. This file is part of Assuan. Assuan is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. Assuan is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #define WIN32_LEAN_AND_MEAN #include #include "common.h" #include "../src/assuan.h" /* We need the CreatePipe prototype. */ static DWORD reader_thread (void *arg) { HANDLE hd = arg; DWORD nread; char buffer[16]; for (;;) { if (!ReadFile (hd, buffer, sizeof buffer, &nread, FALSE)) { log_error ("reader: ReadFile failed: rc=%d\n", (int)GetLastError ()); break; } log_info ("reader: read %d bytes\n", (int)nread); log_printhex ("got: ", buffer, nread); } log_info ("reader: finished\n"); CloseHandle (hd); return 0; } static DWORD writer_thread (void *arg) { HANDLE hd = arg; DWORD nwritten; int i = 0; int j; char buffer[20]; int count; for (count=0; count < 30; count++) { for (j=0; j < sizeof buffer; j++) buffer[j] = i++; if (!WriteFile (hd, buffer, sizeof buffer, &nwritten, NULL)) { log_error ("writer: WriteFile failed: rc=%d\n", (int)GetLastError ()); break; } if (nwritten != sizeof buffer) log_info ("writer: wrote only %d bytes\n", (int)nwritten); } log_info ("writer: finished\n"); CloseHandle (hd); return 0; } static void run_test (void) { HANDLE hd[2]; HANDLE threads[2]; if (!CreatePipe (&hd[0], &hd[1], NULL, 0)) { log_error ("CreatePipe failed: rc=%d\n", (int)GetLastError ()); return; } log_info ("pipe created read=%p write=%p\n", hd[0], hd[1]); threads[0] = CreateThread (NULL, 0, reader_thread, hd[0], 0, NULL); if (!threads[0]) log_fatal ("error creating reader thread: rc=%d\n", (int)GetLastError ()); else log_info ("reader thread created\n"); threads[1] = CreateThread (NULL, 0, writer_thread, hd[1], 0, NULL); if (!threads[0]) log_fatal ("error creating writer thread: rc=%d\n", (int)GetLastError ()); else log_info ("writer thread created\n"); switch (WaitForMultipleObjects (2, threads, FALSE, INFINITE)) { case WAIT_OBJECT_0: log_info ("reader thread finished first\n"); break; case WAIT_OBJECT_0 + 1: log_info ("writer thread finished first\n"); break; default: log_error ("WFMO failed: rc=%d\n", (int)GetLastError ()); break; } CloseHandle (threads[0]); CloseHandle (threads[1]); } /* M A I N */ int main (int argc, char **argv) { int last_argc = -1; if (argc) { log_set_prefix (*argv); argc--; argv++; } while (argc && last_argc != argc ) { last_argc = argc; if (!strcmp (*argv, "--help")) { printf ("usage: %s [options]\n" "\n" "Options:\n" " --verbose Show what is going on\n", log_get_prefix ()); exit (0); } if (!strcmp (*argv, "--verbose")) { verbose = 1; argc--; argv++; } else if (!strcmp (*argv, "--debug")) { verbose = debug = 1; argc--; argv++; } } run_test (); return errorcount ? 1 : 0; }