Added a separate set_handle_cached_fd request instead of abusing
set_handle_info for that.
diff --git a/server/handle.c b/server/handle.c
index 1baa523..e546783 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -425,6 +425,17 @@
return entry->fd;
}
+/* set the cached fd for a handle if not set already, and return the current value */
+static int set_handle_unix_fd( struct process *process, obj_handle_t handle, int fd )
+{
+ struct handle_entry *entry;
+
+ if (!(entry = get_handle( process, handle ))) return -1;
+ /* if no current fd set it, otherwise return current fd */
+ if (entry->fd == -1) entry->fd = fd;
+ return entry->fd;
+}
+
/* remove the cached fd and return it */
int flush_cached_fd( struct process *process, obj_handle_t handle )
{
@@ -460,7 +471,7 @@
/* get/set the handle reserved flags */
/* return the old flags (or -1 on error) */
-int set_handle_info( struct process *process, obj_handle_t handle, int mask, int flags, int *fd )
+static int set_handle_flags( struct process *process, obj_handle_t handle, int mask, int flags )
{
struct handle_entry *entry;
unsigned int old_access;
@@ -476,9 +487,6 @@
mask = (mask << RESERVED_SHIFT) & RESERVED_ALL;
flags = (flags << RESERVED_SHIFT) & mask;
entry->access = (entry->access & ~mask) | flags;
- /* if no current fd set it, otherwise return current fd */
- if (entry->fd == -1) entry->fd = *fd;
- *fd = entry->fd;
return (old_access & RESERVED_ALL) >> RESERVED_SHIFT;
}
@@ -545,12 +553,16 @@
/* set a handle information */
DECL_HANDLER(set_handle_info)
{
+ reply->old_flags = set_handle_flags( current->process, req->handle, req->mask, req->flags );
+}
+
+/* set the cached file descriptor of a handle */
+DECL_HANDLER(set_handle_cached_fd)
+{
int fd = req->fd;
if (handle_is_global(req->handle)) fd = -1; /* no fd cache for global handles */
- reply->old_flags = set_handle_info( current->process, req->handle,
- req->mask, req->flags, &fd );
- reply->cur_fd = fd;
+ reply->cur_fd = set_handle_unix_fd( current->process, req->handle, fd );
}
/* duplicate a handle */
diff --git a/server/handle.h b/server/handle.h
index 9491258..d90a47e 100644
--- a/server/handle.h
+++ b/server/handle.h
@@ -40,7 +40,6 @@
unsigned int access, const struct object_ops *ops );
extern unsigned int get_handle_access( struct process *process, obj_handle_t handle );
extern int get_handle_unix_fd( struct process *process, obj_handle_t handle, unsigned int access );
-extern int set_handle_info( struct process *process, obj_handle_t handle, int mask, int flags, int *fd );
extern obj_handle_t duplicate_handle( struct process *src, obj_handle_t src_handle, struct process *dst,
unsigned int access, int inherit, int options );
extern obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name, size_t len,
diff --git a/server/protocol.def b/server/protocol.def
index d4b52cc..06747cc 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -437,9 +437,16 @@
obj_handle_t handle; /* handle we are interested in */
int flags; /* new handle flags */
int mask; /* mask for flags to set */
- int fd; /* file descriptor or -1 */
@REPLY
int old_flags; /* old flag value */
+@END
+
+
+/* Set the cached file descriptor of a handle */
+@REQ(set_handle_cached_fd)
+ obj_handle_t handle; /* handle we are interested in */
+ int fd; /* file descriptor */
+@REPLY
int cur_fd; /* current file descriptor */
@END
diff --git a/server/request.h b/server/request.h
index 740a417..01dc7f0 100644
--- a/server/request.h
+++ b/server/request.h
@@ -124,6 +124,7 @@
DECL_HANDLER(get_apc);
DECL_HANDLER(close_handle);
DECL_HANDLER(set_handle_info);
+DECL_HANDLER(set_handle_cached_fd);
DECL_HANDLER(dup_handle);
DECL_HANDLER(open_process);
DECL_HANDLER(open_thread);
@@ -334,6 +335,7 @@
(req_handler)req_get_apc,
(req_handler)req_close_handle,
(req_handler)req_set_handle_info,
+ (req_handler)req_set_handle_cached_fd,
(req_handler)req_dup_handle,
(req_handler)req_open_process,
(req_handler)req_open_thread,
diff --git a/server/trace.c b/server/trace.c
index 17b2544..d648cfa 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -828,13 +828,22 @@
{
fprintf( stderr, " handle=%p,", req->handle );
fprintf( stderr, " flags=%d,", req->flags );
- fprintf( stderr, " mask=%d,", req->mask );
- fprintf( stderr, " fd=%d", req->fd );
+ fprintf( stderr, " mask=%d", req->mask );
}
static void dump_set_handle_info_reply( const struct set_handle_info_reply *req )
{
- fprintf( stderr, " old_flags=%d,", req->old_flags );
+ fprintf( stderr, " old_flags=%d", req->old_flags );
+}
+
+static void dump_set_handle_cached_fd_request( const struct set_handle_cached_fd_request *req )
+{
+ fprintf( stderr, " handle=%p,", req->handle );
+ fprintf( stderr, " fd=%d", req->fd );
+}
+
+static void dump_set_handle_cached_fd_reply( const struct set_handle_cached_fd_reply *req )
+{
fprintf( stderr, " cur_fd=%d", req->cur_fd );
}
@@ -3100,6 +3109,7 @@
(dump_func)dump_get_apc_request,
(dump_func)dump_close_handle_request,
(dump_func)dump_set_handle_info_request,
+ (dump_func)dump_set_handle_cached_fd_request,
(dump_func)dump_dup_handle_request,
(dump_func)dump_open_process_request,
(dump_func)dump_open_thread_request,
@@ -3307,6 +3317,7 @@
(dump_func)dump_get_apc_reply,
(dump_func)dump_close_handle_reply,
(dump_func)dump_set_handle_info_reply,
+ (dump_func)dump_set_handle_cached_fd_reply,
(dump_func)dump_dup_handle_reply,
(dump_func)dump_open_process_reply,
(dump_func)dump_open_thread_reply,
@@ -3514,6 +3525,7 @@
"get_apc",
"close_handle",
"set_handle_info",
+ "set_handle_cached_fd",
"dup_handle",
"open_process",
"open_thread",