Andrey Turkin : server: Connect named pipe synchronously when overlapped param is NULL.
Alexandre Julliard
julliard at winehq.org
Mon May 24 11:30:50 CDT 2010
Module: wine
Branch: master
Commit: 85cc2c13f6f4309993b0daf5a51942228fbac0db
URL: http://source.winehq.org/git/wine.git/?a=commit;h=85cc2c13f6f4309993b0daf5a51942228fbac0db
Author: Andrey Turkin <andrey.turkin at gmail.com>
Date: Sat May 22 22:00:59 2010 +0400
server: Connect named pipe synchronously when overlapped param is NULL.
---
dlls/kernel32/tests/pipe.c | 48 +++++++++++++++++++++++++------------------
dlls/ntdll/file.c | 2 +-
server/named_pipe.c | 2 +-
3 files changed, 30 insertions(+), 22 deletions(-)
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index b48ceec..5abfd85 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -547,28 +547,36 @@ static DWORD CALLBACK serverThreadMain3(LPVOID arg)
oOverlap.hEvent = hEvent;
/* Wait for client to connect */
- trace("Server calling overlapped ConnectNamedPipe...\n");
- success = ConnectNamedPipe(hnp, &oOverlap);
- err = GetLastError();
- ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), "overlapped ConnectNamedPipe\n");
- trace("overlapped ConnectNamedPipe returned.\n");
- if (!success && (err == ERROR_IO_PENDING)) {
- if (letWFSOEwait)
- {
- DWORD ret;
- do {
- ret = WaitForSingleObjectEx(hEvent, INFINITE, TRUE);
- } while (ret == WAIT_IO_COMPLETION);
- ok(ret == 0, "wait ConnectNamedPipe returned %x\n", ret);
- }
- success = GetOverlappedResult(hnp, &oOverlap, &dummy, letGORwait);
- if (!letGORwait && !letWFSOEwait && !success) {
- ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n");
- success = GetOverlappedResult(hnp, &oOverlap, &dummy, TRUE);
+ if (i == 0) {
+ trace("Server calling non-overlapped ConnectNamedPipe on overlapped pipe...\n");
+ success = ConnectNamedPipe(hnp, NULL);
+ err = GetLastError();
+ ok(success || (err == ERROR_PIPE_CONNECTED), "ConnectNamedPipe failed: %d\n", err);
+ trace("ConnectNamedPipe operation complete.\n");
+ } else {
+ trace("Server calling overlapped ConnectNamedPipe...\n");
+ success = ConnectNamedPipe(hnp, &oOverlap);
+ err = GetLastError();
+ ok(!success && (err == ERROR_IO_PENDING || err == ERROR_PIPE_CONNECTED), "overlapped ConnectNamedPipe\n");
+ trace("overlapped ConnectNamedPipe returned.\n");
+ if (!success && (err == ERROR_IO_PENDING)) {
+ if (letWFSOEwait)
+ {
+ DWORD ret;
+ do {
+ ret = WaitForSingleObjectEx(hEvent, INFINITE, TRUE);
+ } while (ret == WAIT_IO_COMPLETION);
+ ok(ret == 0, "wait ConnectNamedPipe returned %x\n", ret);
+ }
+ success = GetOverlappedResult(hnp, &oOverlap, &dummy, letGORwait);
+ if (!letGORwait && !letWFSOEwait && !success) {
+ ok(GetLastError() == ERROR_IO_INCOMPLETE, "GetOverlappedResult\n");
+ success = GetOverlappedResult(hnp, &oOverlap, &dummy, TRUE);
+ }
}
+ ok(success || (err == ERROR_PIPE_CONNECTED), "GetOverlappedResult ConnectNamedPipe\n");
+ trace("overlapped ConnectNamedPipe operation complete.\n");
}
- ok(success || (err == ERROR_PIPE_CONNECTED), "GetOverlappedResult ConnectNamedPipe\n");
- trace("overlapped ConnectNamedPipe operation complete.\n");
/* Echo bytes once */
memset(buf, 0, sizeof(buf));
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index 741395d..b5d1c14 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -1227,7 +1227,7 @@ static NTSTATUS server_ioctl_file( HANDLE handle, HANDLE event,
SERVER_START_REQ( ioctl )
{
req->code = code;
- req->blocking = !apc && !event;
+ req->blocking = !apc && !event && !cvalue;
req->async.handle = wine_server_obj_handle( handle );
req->async.callback = wine_server_client_ptr( ioctl_completion );
req->async.iosb = wine_server_client_ptr( io );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 54ce823..95f06b9 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -613,7 +613,7 @@ static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const a
{
case ps_idle_server:
case ps_wait_connect:
- if (blocking && !is_overlapped( get_fd_options(fd) ))
+ if (blocking)
{
async_data_t new_data = *async_data;
if (!(wait_handle = alloc_wait_event( current->process ))) break;
More information about the wine-cvs
mailing list