server: Infrastructure to return a wait handle for blocking ioctls.
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 801b4d7..9137bf6 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -139,8 +139,8 @@
static void pipe_server_destroy( struct object *obj);
static void pipe_server_flush( struct fd *fd, struct event **event );
static enum server_fd_type pipe_server_get_fd_type( struct fd *fd );
-static void pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
- const void *data, data_size_t size );
+static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
+ const void *data, data_size_t size );
static const struct object_ops pipe_server_ops =
{
@@ -215,8 +215,8 @@
unsigned int sharing, unsigned int options );
static void named_pipe_device_destroy( struct object *obj );
static enum server_fd_type named_pipe_device_get_fd_type( struct fd *fd );
-static void named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
- const void *data, data_size_t size );
+static obj_handle_t named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
+ const void *data, data_size_t size );
static const struct object_ops named_pipe_device_ops =
{
@@ -570,8 +570,8 @@
return FD_TYPE_PIPE;
}
-static void pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
- const void *data, data_size_t size )
+static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
+ const void *data, data_size_t size )
{
struct pipe_server *server = get_fd_user( fd );
struct async *async;
@@ -604,7 +604,7 @@
set_error( STATUS_INVALID_HANDLE );
break;
}
- break;
+ return 0;
case FSCTL_PIPE_DISCONNECT:
switch(server->state)
@@ -634,11 +634,10 @@
set_error( STATUS_PIPE_DISCONNECTED );
break;
}
- break;
+ return 0;
default:
- default_fd_ioctl( fd, code, async_data, data, size );
- break;
+ return default_fd_ioctl( fd, code, async_data, data, size );
}
}
@@ -809,8 +808,8 @@
return &client->obj;
}
-static void named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
- const void *data, data_size_t size )
+static obj_handle_t named_pipe_device_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
+ const void *data, data_size_t size )
{
struct named_pipe_device *device = get_fd_user( fd );
@@ -827,14 +826,14 @@
size < FIELD_OFFSET(FILE_PIPE_WAIT_FOR_BUFFER, Name[buffer->NameLength/sizeof(WCHAR)]))
{
set_error( STATUS_INVALID_PARAMETER );
- break;
+ return 0;
}
name.str = buffer->Name;
name.len = (buffer->NameLength / sizeof(WCHAR)) * sizeof(WCHAR);
if (!(pipe = (struct named_pipe *)find_object( device->pipes, &name, OBJ_CASE_INSENSITIVE )))
{
set_error( STATUS_PIPE_NOT_AVAILABLE );
- break;
+ return 0;
}
if (!(server = find_available_server( pipe )))
{
@@ -843,7 +842,7 @@
if (!pipe->waiters && !(pipe->waiters = create_async_queue( NULL )))
{
release_object( pipe );
- break;
+ return 0;
}
if ((async = create_async( current, pipe->waiters, async_data )))
@@ -857,12 +856,11 @@
else release_object( server );
release_object( pipe );
- break;
+ return 0;
}
default:
- default_fd_ioctl( fd, code, async_data, data, size );
- break;
+ return default_fd_ioctl( fd, code, async_data, data, size );
}
}