Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
a8b8d9c0
Commit
a8b8d9c0
authored
Jan 01, 1999
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added server-side file mapping object support.
parent
56d236f0
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
398 additions
and
177 deletions
+398
-177
server.h
include/server.h
+41
-19
object.h
include/server/object.h
+13
-2
request.h
include/server/request.h
+6
-3
thread.h
include/server/thread.h
+1
-1
Makefile.in
server/Makefile.in
+1
-0
console.c
server/console.c
+11
-4
file.c
server/file.c
+21
-18
main.c
server/main.c
+2
-2
mapping.c
server/mapping.c
+106
-0
object.c
server/object.c
+6
-0
pipe.c
server/pipe.c
+11
-4
request.c
server/request.c
+30
-7
thread.c
server/thread.c
+8
-2
trace.c
server/trace.c
+141
-115
No files found.
include/server.h
View file @
a8b8d9c0
...
...
@@ -162,9 +162,8 @@ struct select_reply
int
signaled
;
/* signaled handle */
};
#define SELECT_ALL 1
#define SELECT_MSG 2
#define SELECT_ALERTABLE 4
#define SELECT_TIMEOUT 8
#define SELECT_ALERTABLE 2
#define SELECT_TIMEOUT 4
/* Create an event */
...
...
@@ -243,7 +242,7 @@ struct open_named_obj_request
int
inherit
;
/* inherit flag */
char
name
[
0
];
/* object name */
};
enum
open_named_obj
{
OPEN_EVENT
,
OPEN_MUTEX
,
OPEN_SEMAPHORE
};
enum
open_named_obj
{
OPEN_EVENT
,
OPEN_MUTEX
,
OPEN_SEMAPHORE
,
OPEN_MAPPING
};
struct
open_named_obj_reply
{
...
...
@@ -263,14 +262,6 @@ struct create_file_reply
};
/* Get a Unix handle to a file */
struct
get_unix_handle_request
{
int
handle
;
/* handle to the file */
unsigned
int
access
;
/* desired access */
};
/* Get a Unix fd to read from a file */
struct
get_read_fd_request
{
...
...
@@ -364,7 +355,7 @@ struct set_console_fd_request
};
/* Create a c
onsole
*/
/* Create a c
hange notification
*/
struct
create_change_notification_request
{
int
subtree
;
/* watch all the subtree */
...
...
@@ -376,6 +367,42 @@ struct create_change_notification_reply
};
/* Create a file mapping */
struct
create_mapping_request
{
int
size_high
;
/* mapping size */
int
size_low
;
/* mapping size */
int
protect
;
/* protection flags (see below) */
int
handle
;
/* file handle */
char
name
[
0
];
/* object name */
};
struct
create_mapping_reply
{
int
handle
;
/* handle to the mapping */
};
/* protection flags */
#define VPROT_READ 0x01
#define VPROT_WRITE 0x02
#define VPROT_EXEC 0x04
#define VPROT_WRITECOPY 0x08
#define VPROT_GUARD 0x10
#define VPROT_NOCACHE 0x20
#define VPROT_COMMITTED 0x40
/* Get information about a file mapping */
struct
get_mapping_info_request
{
int
handle
;
/* handle to the mapping */
};
struct
get_mapping_info_reply
{
int
size_high
;
/* mapping size */
int
size_low
;
/* mapping size */
int
protect
;
/* protection flags */
};
/* client-side functions */
#ifndef __WINE_SERVER__
...
...
@@ -383,14 +410,11 @@ struct create_change_notification_reply
#include "server/request.h"
/* client communication functions */
#define CHECK_LEN(len,wanted) \
if ((len) == (wanted)) ; \
else CLIENT_ProtocolError( __FUNCTION__ ": len %d != %d\n", (len), (wanted) );
extern
void
CLIENT_ProtocolError
(
const
char
*
err
,
...
);
extern
void
CLIENT_SendRequest
(
enum
request
req
,
int
pass_fd
,
int
n
,
...
/* arg_1, len_1, etc. */
);
extern
unsigned
int
CLIENT_WaitReply
(
int
*
len
,
int
*
passed_fd
,
int
n
,
...
/* arg_1, len_1, etc. */
);
extern
unsigned
int
CLIENT_WaitSimpleReply
(
void
*
reply
,
int
len
,
int
*
passed_fd
);
struct
_THDB
;
extern
int
CLIENT_NewThread
(
struct
_THDB
*
thdb
,
int
*
thandle
,
int
*
phandle
);
...
...
@@ -399,8 +423,6 @@ extern int CLIENT_InitThread(void);
extern
int
CLIENT_CloseHandle
(
int
handle
);
extern
int
CLIENT_DuplicateHandle
(
int
src_process
,
int
src_handle
,
int
dst_process
,
int
dst_handle
,
DWORD
access
,
BOOL32
inherit
,
DWORD
options
);
extern
int
CLIENT_GetThreadInfo
(
int
handle
,
struct
get_thread_info_reply
*
reply
);
extern
int
CLIENT_GetProcessInfo
(
int
handle
,
struct
get_process_info_reply
*
reply
);
extern
int
CLIENT_OpenProcess
(
void
*
pid
,
DWORD
access
,
BOOL32
inherit
);
extern
int
CLIENT_Select
(
int
count
,
int
*
handles
,
int
flags
,
int
timeout
);
#endif
/* __WINE_SERVER__ */
...
...
include/server/object.h
View file @
a8b8d9c0
...
...
@@ -20,6 +20,7 @@
struct
object
;
struct
object_name
;
struct
thread
;
struct
file
;
struct
wait_queue_entry
;
struct
object_ops
...
...
@@ -27,7 +28,7 @@ struct object_ops
/* dump the object (for debugging) */
void
(
*
dump
)(
struct
object
*
,
int
);
/* add a thread to the object wait queue */
void
(
*
add_queue
)(
struct
object
*
,
struct
wait_queue_entry
*
);
int
(
*
add_queue
)(
struct
object
*
,
struct
wait_queue_entry
*
);
/* remove a thread from the object wait queue */
void
(
*
remove_queue
)(
struct
object
*
,
struct
wait_queue_entry
*
);
/* is object signaled? */
...
...
@@ -63,6 +64,7 @@ extern int init_object( struct object *obj, const struct object_ops *ops,
extern
struct
object
*
grab_object
(
void
*
obj
);
extern
void
release_object
(
void
*
obj
);
extern
struct
object
*
find_object
(
const
char
*
name
);
extern
int
no_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
extern
int
no_satisfied
(
struct
object
*
obj
,
struct
thread
*
thread
);
extern
int
no_read_fd
(
struct
object
*
obj
);
extern
int
no_write_fd
(
struct
object
*
obj
);
...
...
@@ -171,7 +173,9 @@ extern int release_semaphore( int handle, unsigned int count, unsigned int *prev
/* file functions */
extern
struct
object
*
create_file
(
int
fd
);
extern
int
file_get_unix_handle
(
int
handle
,
unsigned
int
access
);
extern
struct
file
*
get_file_obj
(
struct
process
*
process
,
int
handle
,
unsigned
int
access
);
extern
int
file_get_mmap_fd
(
struct
file
*
file
);
extern
int
set_file_pointer
(
int
handle
,
int
*
low
,
int
*
high
,
int
whence
);
extern
int
truncate_file
(
int
handle
);
extern
int
get_file_info
(
int
handle
,
struct
get_file_info_reply
*
reply
);
...
...
@@ -194,6 +198,13 @@ extern int set_console_fd( int handle, int fd );
extern
struct
object
*
create_change_notification
(
int
subtree
,
int
filter
);
/* file mapping functions */
extern
struct
object
*
create_mapping
(
int
size_high
,
int
size_low
,
int
protect
,
int
handle
,
const
char
*
name
);
extern
int
open_mapping
(
unsigned
int
access
,
int
inherit
,
const
char
*
name
);
extern
int
get_mapping_info
(
int
handle
,
struct
get_mapping_info_reply
*
reply
);
extern
int
debug_level
;
#endif
/* __WINE_SERVER_OBJECT_H */
include/server/request.h
View file @
a8b8d9c0
...
...
@@ -24,7 +24,6 @@ enum request
REQ_RELEASE_SEMAPHORE
,
REQ_OPEN_NAMED_OBJ
,
REQ_CREATE_FILE
,
REQ_GET_UNIX_HANDLE
,
REQ_GET_READ_FD
,
REQ_GET_WRITE_FD
,
REQ_SET_FILE_POINTER
,
...
...
@@ -35,6 +34,8 @@ enum request
REQ_CREATE_CONSOLE
,
REQ_SET_CONSOLE_FD
,
REQ_CREATE_CHANGE_NOTIFICATION
,
REQ_CREATE_MAPPING
,
REQ_GET_MAPPING_INFO
,
REQ_NB_REQUESTS
};
...
...
@@ -62,7 +63,6 @@ DECL_HANDLER(create_semaphore);
DECL_HANDLER
(
release_semaphore
);
DECL_HANDLER
(
open_named_obj
);
DECL_HANDLER
(
create_file
);
DECL_HANDLER
(
get_unix_handle
);
DECL_HANDLER
(
get_read_fd
);
DECL_HANDLER
(
get_write_fd
);
DECL_HANDLER
(
set_file_pointer
);
...
...
@@ -73,6 +73,8 @@ DECL_HANDLER(create_pipe);
DECL_HANDLER
(
create_console
);
DECL_HANDLER
(
set_console_fd
);
DECL_HANDLER
(
create_change_notification
);
DECL_HANDLER
(
create_mapping
);
DECL_HANDLER
(
get_mapping_info
);
static
const
struct
handler
{
void
(
*
handler
)();
...
...
@@ -97,7 +99,6 @@ static const struct handler {
{
(
void
(
*
)())
req_release_semaphore
,
sizeof
(
struct
release_semaphore_request
)
},
{
(
void
(
*
)())
req_open_named_obj
,
sizeof
(
struct
open_named_obj_request
)
},
{
(
void
(
*
)())
req_create_file
,
sizeof
(
struct
create_file_request
)
},
{
(
void
(
*
)())
req_get_unix_handle
,
sizeof
(
struct
get_unix_handle_request
)
},
{
(
void
(
*
)())
req_get_read_fd
,
sizeof
(
struct
get_read_fd_request
)
},
{
(
void
(
*
)())
req_get_write_fd
,
sizeof
(
struct
get_write_fd_request
)
},
{
(
void
(
*
)())
req_set_file_pointer
,
sizeof
(
struct
set_file_pointer_request
)
},
...
...
@@ -108,6 +109,8 @@ static const struct handler {
{
(
void
(
*
)())
req_create_console
,
sizeof
(
struct
create_console_request
)
},
{
(
void
(
*
)())
req_set_console_fd
,
sizeof
(
struct
set_console_fd_request
)
},
{
(
void
(
*
)())
req_create_change_notification
,
sizeof
(
struct
create_change_notification_request
)
},
{
(
void
(
*
)())
req_create_mapping
,
sizeof
(
struct
create_mapping_request
)
},
{
(
void
(
*
)())
req_get_mapping_info
,
sizeof
(
struct
get_mapping_info_request
)
},
};
#endif
/* WANT_REQUEST_HANDLERS */
...
...
include/server/thread.h
View file @
a8b8d9c0
...
...
@@ -52,7 +52,7 @@ extern void get_thread_info( struct thread *thread,
struct
get_thread_info_reply
*
reply
);
extern
int
send_reply
(
struct
thread
*
thread
,
int
pass_fd
,
int
n
,
...
/* arg_1, len_1, ..., arg_n, len_n */
);
extern
void
add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
extern
int
add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
extern
void
remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
extern
void
kill_thread
(
struct
thread
*
thread
,
int
exit_code
);
extern
void
thread_killed
(
struct
thread
*
thread
,
int
exit_code
);
...
...
server/Makefile.in
View file @
a8b8d9c0
...
...
@@ -10,6 +10,7 @@ C_SRCS = \
console.c
\
event.c
\
file.c
\
mapping.c
\
mutex.c
\
object.c
\
pipe.c
\
...
...
server/console.c
View file @
a8b8d9c0
...
...
@@ -30,7 +30,7 @@ struct console
};
static
void
console_dump
(
struct
object
*
obj
,
int
verbose
);
static
void
console_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
console_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
void
console_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
console_signaled
(
struct
object
*
obj
,
struct
thread
*
thread
);
static
int
console_get_read_fd
(
struct
object
*
obj
);
...
...
@@ -124,15 +124,22 @@ static void console_dump( struct object *obj, int verbose )
console
->
is_read
?
"input"
:
"output"
,
console
->
fd
);
}
static
void
console_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
static
int
console_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
{
struct
console
*
console
=
(
struct
console
*
)
obj
;
assert
(
obj
->
ops
==
&
console_ops
);
if
(
!
obj
->
head
)
/* first on the queue */
add_select_user
(
console
->
fd
,
{
if
(
!
add_select_user
(
console
->
fd
,
console
->
is_read
?
READ_EVENT
:
WRITE_EVENT
,
&
select_ops
,
console
);
&
select_ops
,
console
))
{
SET_ERROR
(
ERROR_OUTOFMEMORY
);
return
0
;
}
}
add_queue
(
obj
,
entry
);
return
1
;
}
static
void
console_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
...
...
server/file.c
View file @
a8b8d9c0
...
...
@@ -27,7 +27,7 @@ struct file
};
static
void
file_dump
(
struct
object
*
obj
,
int
verbose
);
static
void
file_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
file_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
void
file_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
file_signaled
(
struct
object
*
obj
,
struct
thread
*
thread
);
static
int
file_get_read_fd
(
struct
object
*
obj
);
...
...
@@ -90,13 +90,20 @@ static void file_dump( struct object *obj, int verbose )
printf
(
"File fd=%d
\n
"
,
file
->
fd
);
}
static
void
file_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
static
int
file_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
{
struct
file
*
file
=
(
struct
file
*
)
obj
;
assert
(
obj
->
ops
==
&
file_ops
);
if
(
!
obj
->
head
)
/* first on the queue */
add_select_user
(
file
->
fd
,
READ_EVENT
|
WRITE_EVENT
,
&
select_ops
,
file
);
{
if
(
!
add_select_user
(
file
->
fd
,
READ_EVENT
|
WRITE_EVENT
,
&
select_ops
,
file
))
{
SET_ERROR
(
ERROR_OUTOFMEMORY
);
return
0
;
}
}
add_queue
(
obj
,
entry
);
return
1
;
}
static
void
file_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
...
...
@@ -195,17 +202,16 @@ void file_set_error(void)
}
}
int
file_get_unix_handle
(
int
handle
,
unsigned
int
access
)
struct
file
*
get_file_obj
(
struct
process
*
process
,
int
handle
,
unsigned
int
access
)
{
struct
file
*
file
;
int
unix_handle
;
return
(
struct
file
*
)
get_handle_obj
(
current
->
process
,
handle
,
access
,
&
file_ops
);
}
if
(
!
(
file
=
(
struct
file
*
)
get_handle_obj
(
current
->
process
,
handle
,
access
,
&
file_ops
)))
return
-
1
;
unix_handle
=
dup
(
file
->
fd
);
release_object
(
file
);
return
unix_handle
;
int
file_get_mmap_fd
(
struct
file
*
file
)
{
return
dup
(
file
->
fd
);
}
int
set_file_pointer
(
int
handle
,
int
*
low
,
int
*
high
,
int
whence
)
...
...
@@ -220,8 +226,7 @@ int set_file_pointer( int handle, int *low, int *high, int whence )
return
0
;
}
if
(
!
(
file
=
(
struct
file
*
)
get_handle_obj
(
current
->
process
,
handle
,
0
,
&
file_ops
)))
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
0
)))
return
0
;
if
((
result
=
lseek
(
file
->
fd
,
*
low
,
whence
))
==
-
1
)
{
...
...
@@ -243,8 +248,7 @@ int truncate_file( int handle )
struct
file
*
file
;
int
result
;
if
(
!
(
file
=
(
struct
file
*
)
get_handle_obj
(
current
->
process
,
handle
,
GENERIC_WRITE
,
&
file_ops
)))
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
GENERIC_WRITE
)))
return
0
;
if
(((
result
=
lseek
(
file
->
fd
,
0
,
SEEK_CUR
))
==
-
1
)
||
(
ftruncate
(
file
->
fd
,
result
)
==
-
1
))
...
...
@@ -263,8 +267,7 @@ int get_file_info( int handle, struct get_file_info_reply *reply )
struct
file
*
file
;
struct
stat
st
;
if
(
!
(
file
=
(
struct
file
*
)
get_handle_obj
(
current
->
process
,
handle
,
0
,
&
file_ops
)))
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
0
)))
return
0
;
if
(
fstat
(
file
->
fd
,
&
st
)
==
-
1
)
{
...
...
server/main.c
View file @
a8b8d9c0
...
...
@@ -25,10 +25,10 @@ int main( int argc, char *argv[] )
debug_level
=
1
;
if
(
debug_level
)
printf
(
"Server: starting (pid=%d)
\n
"
,
getpid
()
);
if
(
debug_level
)
fprintf
(
stderr
,
"Server: starting (pid=%d)
\n
"
,
getpid
()
);
server_init
(
fd
);
select_loop
();
if
(
debug_level
)
printf
(
"Server: exiting (pid=%d)
\n
"
,
getpid
()
);
if
(
debug_level
)
fprintf
(
stderr
,
"Server: exiting (pid=%d)
\n
"
,
getpid
()
);
exit
(
0
);
error:
...
...
server/mapping.c
0 → 100644
View file @
a8b8d9c0
/*
* Server-side file mapping management
*
* Copyright (C) 1999 Alexandre Julliard
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "winerror.h"
#include "winnt.h"
#include "server/thread.h"
struct
mapping
{
struct
object
obj
;
/* object header */
int
size_high
;
/* mapping size */
int
size_low
;
/* mapping size */
int
protect
;
/* protection flags */
struct
file
*
file
;
/* file mapped */
};
static
void
mapping_dump
(
struct
object
*
obj
,
int
verbose
);
static
void
mapping_destroy
(
struct
object
*
obj
);
static
const
struct
object_ops
mapping_ops
=
{
mapping_dump
,
no_add_queue
,
NULL
,
/* should never get called */
NULL
,
/* should never get called */
NULL
,
/* should never get called */
no_read_fd
,
no_write_fd
,
no_flush
,
mapping_destroy
};
struct
object
*
create_mapping
(
int
size_high
,
int
size_low
,
int
protect
,
int
handle
,
const
char
*
name
)
{
struct
mapping
*
mapping
;
if
(
!
(
mapping
=
(
struct
mapping
*
)
create_named_object
(
name
,
&
mapping_ops
,
sizeof
(
*
mapping
)
)))
return
NULL
;
if
(
GET_ERROR
()
==
ERROR_ALREADY_EXISTS
)
return
&
mapping
->
obj
;
/* Nothing else to do */
mapping
->
size_high
=
size_high
;
mapping
->
size_low
=
size_low
;
mapping
->
protect
=
protect
;
if
(
handle
!=
-
1
)
{
int
access
=
0
;
if
(
protect
&
VPROT_READ
)
access
|=
GENERIC_READ
;
if
(
protect
&
VPROT_WRITE
)
access
|=
GENERIC_WRITE
;
if
(
!
(
mapping
->
file
=
get_file_obj
(
current
->
process
,
handle
,
access
)))
{
release_object
(
mapping
);
return
NULL
;
}
}
else
mapping
->
file
=
NULL
;
return
&
mapping
->
obj
;
}
int
open_mapping
(
unsigned
int
access
,
int
inherit
,
const
char
*
name
)
{
return
open_object
(
name
,
&
mapping_ops
,
access
,
inherit
);
}
int
get_mapping_info
(
int
handle
,
struct
get_mapping_info_reply
*
reply
)
{
struct
mapping
*
mapping
;
int
fd
;
if
(
!
(
mapping
=
(
struct
mapping
*
)
get_handle_obj
(
current
->
process
,
handle
,
0
,
&
mapping_ops
)))
return
-
1
;
reply
->
size_high
=
mapping
->
size_high
;
reply
->
size_low
=
mapping
->
size_low
;
reply
->
protect
=
mapping
->
protect
;
if
(
mapping
->
file
)
fd
=
file_get_mmap_fd
(
mapping
->
file
);
else
fd
=
-
1
;
release_object
(
mapping
);
return
fd
;
}
static
void
mapping_dump
(
struct
object
*
obj
,
int
verbose
)
{
struct
mapping
*
mapping
=
(
struct
mapping
*
)
obj
;
assert
(
obj
->
ops
==
&
mapping_ops
);
fprintf
(
stderr
,
"Mapping size=%08x%08x prot=%08x file=%p
\n
"
,
mapping
->
size_high
,
mapping
->
size_low
,
mapping
->
protect
,
mapping
->
file
);
}
static
void
mapping_destroy
(
struct
object
*
obj
)
{
struct
mapping
*
mapping
=
(
struct
mapping
*
)
obj
;
assert
(
obj
->
ops
==
&
mapping_ops
);
if
(
mapping
->
file
)
release_object
(
mapping
->
file
);
free
(
mapping
);
}
server/object.c
View file @
a8b8d9c0
...
...
@@ -147,6 +147,12 @@ struct object *find_object( const char *name )
/* functions for unimplemented object operations */
int
no_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
{
SET_ERROR
(
ERROR_INVALID_HANDLE
);
return
0
;
}
int
no_satisfied
(
struct
object
*
obj
,
struct
thread
*
thread
)
{
return
0
;
/* not abandoned */
...
...
server/pipe.c
View file @
a8b8d9c0
...
...
@@ -30,7 +30,7 @@ struct pipe
};
static
void
pipe_dump
(
struct
object
*
obj
,
int
verbose
);
static
void
pipe_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
pipe_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
void
pipe_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
);
static
int
pipe_signaled
(
struct
object
*
obj
,
struct
thread
*
thread
);
static
int
pipe_get_read_fd
(
struct
object
*
obj
);
...
...
@@ -101,15 +101,22 @@ static void pipe_dump( struct object *obj, int verbose )
(
pipe
->
side
==
READ_SIDE
)
?
"read"
:
"write"
,
pipe
->
fd
);
}
static
void
pipe_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
static
int
pipe_add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
{
struct
pipe
*
pipe
=
(
struct
pipe
*
)
obj
;
assert
(
obj
->
ops
==
&
pipe_ops
);
if
(
!
obj
->
head
)
/* first on the queue */
add_select_user
(
pipe
->
fd
,
{
if
(
!
add_select_user
(
pipe
->
fd
,
(
pipe
->
side
==
READ_SIDE
)
?
READ_EVENT
:
WRITE_EVENT
,
&
select_ops
,
pipe
);
&
select_ops
,
pipe
))
{
SET_ERROR
(
ERROR_OUTOFMEMORY
);
return
0
;
}
}
add_queue
(
obj
,
entry
);
return
1
;
}
static
void
pipe_remove_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
...
...
server/request.c
View file @
a8b8d9c0
...
...
@@ -382,6 +382,9 @@ DECL_HANDLER(open_named_obj)
case
OPEN_SEMAPHORE
:
reply
.
handle
=
open_semaphore
(
req
->
access
,
req
->
inherit
,
name
);
break
;
case
OPEN_MAPPING
:
reply
.
handle
=
open_mapping
(
req
->
access
,
req
->
inherit
,
name
);
break
;
default
:
fatal_protocol_error
(
"open_named_obj: invalid type %d
\n
"
,
req
->
type
);
}
...
...
@@ -409,13 +412,6 @@ DECL_HANDLER(create_file)
send_reply
(
current
,
-
1
,
1
,
&
reply
,
sizeof
(
reply
)
);
}
/* get a Unix handle to a file */
DECL_HANDLER
(
get_unix_handle
)
{
int
handle
=
file_get_unix_handle
(
req
->
handle
,
req
->
access
);
send_reply
(
current
,
handle
,
0
);
}
/* get a Unix fd to read from a file */
DECL_HANDLER
(
get_read_fd
)
{
...
...
@@ -552,3 +548,30 @@ DECL_HANDLER(create_change_notification)
send_reply
(
current
,
-
1
,
1
,
&
reply
,
sizeof
(
reply
)
);
}
/* create a file mapping */
DECL_HANDLER
(
create_mapping
)
{
struct
object
*
obj
;
struct
create_mapping_reply
reply
=
{
-
1
};
char
*
name
=
(
char
*
)
data
;
if
(
!
len
)
name
=
NULL
;
else
CHECK_STRING
(
"create_mapping"
,
name
,
len
);
if
((
obj
=
create_mapping
(
req
->
size_high
,
req
->
size_low
,
req
->
protect
,
req
->
handle
,
name
)))
{
int
access
=
FILE_MAP_ALL_ACCESS
;
if
(
!
(
req
->
protect
&
VPROT_WRITE
))
access
&=
~
FILE_MAP_WRITE
;
reply
.
handle
=
alloc_handle
(
current
->
process
,
obj
,
access
,
0
);
release_object
(
obj
);
}
send_reply
(
current
,
-
1
,
1
,
&
reply
,
sizeof
(
reply
)
);
}
/* get a mapping information */
DECL_HANDLER
(
get_mapping_info
)
{
struct
get_mapping_info_reply
reply
;
int
map_fd
=
get_mapping_info
(
req
->
handle
,
&
reply
);
send_reply
(
current
,
map_fd
,
1
,
&
reply
,
sizeof
(
reply
)
);
}
server/thread.c
View file @
a8b8d9c0
...
...
@@ -199,7 +199,7 @@ int send_reply( struct thread *thread, int pass_fd, int n,
}
/* add a thread to an object wait queue; return 1 if OK, 0 on error */
void
add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
int
add_queue
(
struct
object
*
obj
,
struct
wait_queue_entry
*
entry
)
{
grab_object
(
obj
);
entry
->
obj
=
obj
;
...
...
@@ -208,6 +208,7 @@ void add_queue( struct object *obj, struct wait_queue_entry *entry )
if
(
obj
->
tail
)
obj
->
tail
->
next
=
entry
;
else
obj
->
head
=
entry
;
obj
->
tail
=
entry
;
return
1
;
}
/* remove a thread from an object wait queue */
...
...
@@ -278,7 +279,12 @@ static int wait_on( struct thread *thread, int count,
return
0
;
}
entry
->
thread
=
thread
;
obj
->
ops
->
add_queue
(
obj
,
entry
);
if
(
!
obj
->
ops
->
add_queue
(
obj
,
entry
))
{
wait
->
count
=
i
-
1
;
end_wait
(
thread
);
return
0
;
}
release_object
(
obj
);
}
return
1
;
...
...
server/trace.c
View file @
a8b8d9c0
...
...
@@ -8,331 +8,354 @@
static
int
dump_new_thread_request
(
struct
new_thread_request
*
req
,
int
len
)
{
printf
(
" pid=%p"
,
req
->
pid
);
fprintf
(
stderr
,
" pid=%p"
,
req
->
pid
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_new_thread_reply
(
struct
new_thread_reply
*
req
,
int
len
)
{
printf
(
" tid=%p,"
,
req
->
tid
);
printf
(
" thandle=%d,"
,
req
->
thandle
);
printf
(
" pid=%p,"
,
req
->
pid
);
printf
(
" phandle=%d"
,
req
->
phandle
);
fprintf
(
stderr
,
" tid=%p,"
,
req
->
tid
);
fprintf
(
stderr
,
" thandle=%d,"
,
req
->
thandle
);
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" phandle=%d"
,
req
->
phandle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_set_debug_request
(
struct
set_debug_request
*
req
,
int
len
)
{
printf
(
" level=%d"
,
req
->
level
);
fprintf
(
stderr
,
" level=%d"
,
req
->
level
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_init_thread_request
(
struct
init_thread_request
*
req
,
int
len
)
{
printf
(
" unix_pid=%d,"
,
req
->
unix_pid
);
printf
(
" cmd_line=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
fprintf
(
stderr
,
" unix_pid=%d,"
,
req
->
unix_pid
);
fprintf
(
stderr
,
" cmd_line=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_terminate_process_request
(
struct
terminate_process_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" exit_code=%d"
,
req
->
exit_code
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" exit_code=%d"
,
req
->
exit_code
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_terminate_thread_request
(
struct
terminate_thread_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" exit_code=%d"
,
req
->
exit_code
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" exit_code=%d"
,
req
->
exit_code
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_process_info_request
(
struct
get_process_info_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_process_info_reply
(
struct
get_process_info_reply
*
req
,
int
len
)
{
printf
(
" pid=%p,"
,
req
->
pid
);
printf
(
" exit_code=%d"
,
req
->
exit_code
);
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" exit_code=%d"
,
req
->
exit_code
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_thread_info_request
(
struct
get_thread_info_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_thread_info_reply
(
struct
get_thread_info_reply
*
req
,
int
len
)
{
printf
(
" pid=%p,"
,
req
->
pid
);
printf
(
" exit_code=%d"
,
req
->
exit_code
);
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" exit_code=%d"
,
req
->
exit_code
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_close_handle_request
(
struct
close_handle_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_dup_handle_request
(
struct
dup_handle_request
*
req
,
int
len
)
{
printf
(
" src_process=%d,"
,
req
->
src_process
);
printf
(
" src_handle=%d,"
,
req
->
src_handle
);
printf
(
" dst_process=%d,"
,
req
->
dst_process
);
printf
(
" dst_handle=%d,"
,
req
->
dst_handle
);
printf
(
" access=%08x,"
,
req
->
access
);
printf
(
" inherit=%d,"
,
req
->
inherit
);
printf
(
" options=%d"
,
req
->
options
);
fprintf
(
stderr
,
" src_process=%d,"
,
req
->
src_process
);
fprintf
(
stderr
,
" src_handle=%d,"
,
req
->
src_handle
);
fprintf
(
stderr
,
" dst_process=%d,"
,
req
->
dst_process
);
fprintf
(
stderr
,
" dst_handle=%d,"
,
req
->
dst_handle
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" options=%d"
,
req
->
options
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_dup_handle_reply
(
struct
dup_handle_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_open_process_request
(
struct
open_process_request
*
req
,
int
len
)
{
printf
(
" pid=%p,"
,
req
->
pid
);
printf
(
" access=%08x,"
,
req
->
access
);
printf
(
" inherit=%d"
,
req
->
inherit
);
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d"
,
req
->
inherit
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_open_process_reply
(
struct
open_process_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_select_request
(
struct
select_request
*
req
,
int
len
)
{
printf
(
" count=%d,"
,
req
->
count
);
printf
(
" flags=%d,"
,
req
->
flags
);
printf
(
" timeout=%d"
,
req
->
timeout
);
fprintf
(
stderr
,
" count=%d,"
,
req
->
count
);
fprintf
(
stderr
,
" flags=%d,"
,
req
->
flags
);
fprintf
(
stderr
,
" timeout=%d"
,
req
->
timeout
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_select_reply
(
struct
select_reply
*
req
,
int
len
)
{
printf
(
" signaled=%d"
,
req
->
signaled
);
fprintf
(
stderr
,
" signaled=%d"
,
req
->
signaled
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_event_request
(
struct
create_event_request
*
req
,
int
len
)
{
printf
(
" manual_reset=%d,"
,
req
->
manual_reset
);
printf
(
" initial_state=%d,"
,
req
->
initial_state
);
printf
(
" inherit=%d,"
,
req
->
inherit
);
printf
(
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
fprintf
(
stderr
,
" manual_reset=%d,"
,
req
->
manual_reset
);
fprintf
(
stderr
,
" initial_state=%d,"
,
req
->
initial_state
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_create_event_reply
(
struct
create_event_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_event_op_request
(
struct
event_op_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" op=%d"
,
req
->
op
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" op=%d"
,
req
->
op
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_mutex_request
(
struct
create_mutex_request
*
req
,
int
len
)
{
printf
(
" owned=%d,"
,
req
->
owned
);
printf
(
" inherit=%d,"
,
req
->
inherit
);
printf
(
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
fprintf
(
stderr
,
" owned=%d,"
,
req
->
owned
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_create_mutex_reply
(
struct
create_mutex_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_release_mutex_request
(
struct
release_mutex_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_semaphore_request
(
struct
create_semaphore_request
*
req
,
int
len
)
{
printf
(
" initial=%08x,"
,
req
->
initial
);
printf
(
" max=%08x,"
,
req
->
max
);
printf
(
" inherit=%d,"
,
req
->
inherit
);
printf
(
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
fprintf
(
stderr
,
" initial=%08x,"
,
req
->
initial
);
fprintf
(
stderr
,
" max=%08x,"
,
req
->
max
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_create_semaphore_reply
(
struct
create_semaphore_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_release_semaphore_request
(
struct
release_semaphore_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" count=%08x"
,
req
->
count
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" count=%08x"
,
req
->
count
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_release_semaphore_reply
(
struct
release_semaphore_reply
*
req
,
int
len
)
{
printf
(
" prev_count=%08x"
,
req
->
prev_count
);
fprintf
(
stderr
,
" prev_count=%08x"
,
req
->
prev_count
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_open_named_obj_request
(
struct
open_named_obj_request
*
req
,
int
len
)
{
printf
(
" type=%d,"
,
req
->
type
);
printf
(
" access=%08x,"
,
req
->
access
);
printf
(
" inherit=%d,"
,
req
->
inherit
);
printf
(
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
fprintf
(
stderr
,
" type=%d,"
,
req
->
type
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_open_named_obj_reply
(
struct
open_named_obj_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_file_request
(
struct
create_file_request
*
req
,
int
len
)
{
printf
(
" access=%08x,"
,
req
->
access
);
printf
(
" inherit=%d"
,
req
->
inherit
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d"
,
req
->
inherit
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_file_reply
(
struct
create_file_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_unix_handle_request
(
struct
get_unix_handle_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" access=%08x"
,
req
->
access
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_read_fd_request
(
struct
get_read_fd_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_write_fd_request
(
struct
get_write_fd_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_set_file_pointer_request
(
struct
set_file_pointer_request
*
req
,
int
len
)
{
printf
(
" handle=%d,"
,
req
->
handle
);
printf
(
" low=%d,"
,
req
->
low
);
printf
(
" high=%d,"
,
req
->
high
);
printf
(
" whence=%d"
,
req
->
whence
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" low=%d,"
,
req
->
low
);
fprintf
(
stderr
,
" high=%d,"
,
req
->
high
);
fprintf
(
stderr
,
" whence=%d"
,
req
->
whence
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_set_file_pointer_reply
(
struct
set_file_pointer_reply
*
req
,
int
len
)
{
printf
(
" low=%d,"
,
req
->
low
);
printf
(
" high=%d"
,
req
->
high
);
fprintf
(
stderr
,
" low=%d,"
,
req
->
low
);
fprintf
(
stderr
,
" high=%d"
,
req
->
high
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_truncate_file_request
(
struct
truncate_file_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_flush_file_request
(
struct
flush_file_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_file_info_request
(
struct
get_file_info_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_file_info_reply
(
struct
get_file_info_reply
*
req
,
int
len
)
{
printf
(
" attr=%d,"
,
req
->
attr
);
printf
(
" access_time=%ld,"
,
req
->
access_time
);
printf
(
" write_time=%ld,"
,
req
->
write_time
);
printf
(
" size_high=%d,"
,
req
->
size_high
);
printf
(
" size_low=%d,"
,
req
->
size_low
);
printf
(
" links=%d,"
,
req
->
links
);
printf
(
" index_high=%d,"
,
req
->
index_high
);
printf
(
" index_low=%d,"
,
req
->
index_low
);
printf
(
" serial=%08x"
,
req
->
serial
);
fprintf
(
stderr
,
" attr=%d,"
,
req
->
attr
);
fprintf
(
stderr
,
" access_time=%ld,"
,
req
->
access_time
);
fprintf
(
stderr
,
" write_time=%ld,"
,
req
->
write_time
);
fprintf
(
stderr
,
" size_high=%d,"
,
req
->
size_high
);
fprintf
(
stderr
,
" size_low=%d,"
,
req
->
size_low
);
fprintf
(
stderr
,
" links=%d,"
,
req
->
links
);
fprintf
(
stderr
,
" index_high=%d,"
,
req
->
index_high
);
fprintf
(
stderr
,
" index_low=%d,"
,
req
->
index_low
);
fprintf
(
stderr
,
" serial=%08x"
,
req
->
serial
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_pipe_request
(
struct
create_pipe_request
*
req
,
int
len
)
{
printf
(
" inherit=%d"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d"
,
req
->
inherit
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_pipe_reply
(
struct
create_pipe_reply
*
req
,
int
len
)
{
printf
(
" handle_read=%d,"
,
req
->
handle_read
);
printf
(
" handle_write=%d"
,
req
->
handle_write
);
fprintf
(
stderr
,
" handle_read=%d,"
,
req
->
handle_read
);
fprintf
(
stderr
,
" handle_write=%d"
,
req
->
handle_write
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_console_request
(
struct
create_console_request
*
req
,
int
len
)
{
printf
(
" inherit=%d"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d"
,
req
->
inherit
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_console_reply
(
struct
create_console_reply
*
req
,
int
len
)
{
printf
(
" handle_read=%d,"
,
req
->
handle_read
);
printf
(
" handle_write=%d"
,
req
->
handle_write
);
fprintf
(
stderr
,
" handle_read=%d,"
,
req
->
handle_read
);
fprintf
(
stderr
,
" handle_write=%d"
,
req
->
handle_write
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_set_console_fd_request
(
struct
set_console_fd_request
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_change_notification_request
(
struct
create_change_notification_request
*
req
,
int
len
)
{
printf
(
" subtree=%d,"
,
req
->
subtree
);
printf
(
" filter=%d"
,
req
->
filter
);
fprintf
(
stderr
,
" subtree=%d,"
,
req
->
subtree
);
fprintf
(
stderr
,
" filter=%d"
,
req
->
filter
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_change_notification_reply
(
struct
create_change_notification_reply
*
req
,
int
len
)
{
printf
(
" handle=%d"
,
req
->
handle
);
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_create_mapping_request
(
struct
create_mapping_request
*
req
,
int
len
)
{
fprintf
(
stderr
,
" size_high=%d,"
,
req
->
size_high
);
fprintf
(
stderr
,
" size_low=%d,"
,
req
->
size_low
);
fprintf
(
stderr
,
" protect=%d,"
,
req
->
protect
);
fprintf
(
stderr
,
" handle=%d,"
,
req
->
handle
);
fprintf
(
stderr
,
" name=
\"
%.*s
\"
"
,
len
-
(
int
)
sizeof
(
*
req
),
(
char
*
)(
req
+
1
)
);
return
len
;
}
static
int
dump_create_mapping_reply
(
struct
create_mapping_reply
*
req
,
int
len
)
{
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_mapping_info_request
(
struct
get_mapping_info_request
*
req
,
int
len
)
{
fprintf
(
stderr
,
" handle=%d"
,
req
->
handle
);
return
(
int
)
sizeof
(
*
req
);
}
static
int
dump_get_mapping_info_reply
(
struct
get_mapping_info_reply
*
req
,
int
len
)
{
fprintf
(
stderr
,
" size_high=%d,"
,
req
->
size_high
);
fprintf
(
stderr
,
" size_low=%d,"
,
req
->
size_low
);
fprintf
(
stderr
,
" protect=%d"
,
req
->
protect
);
return
(
int
)
sizeof
(
*
req
);
}
...
...
@@ -382,8 +405,6 @@ static const struct dumper dumpers[REQ_NB_REQUESTS] =
(
void
(
*
)())
dump_open_named_obj_reply
},
{
(
int
(
*
)(
void
*
,
int
))
dump_create_file_request
,
(
void
(
*
)())
dump_create_file_reply
},
{
(
int
(
*
)(
void
*
,
int
))
dump_get_unix_handle_request
,
(
void
(
*
)())
0
},
{
(
int
(
*
)(
void
*
,
int
))
dump_get_read_fd_request
,
(
void
(
*
)())
0
},
{
(
int
(
*
)(
void
*
,
int
))
dump_get_write_fd_request
,
...
...
@@ -404,6 +425,10 @@ static const struct dumper dumpers[REQ_NB_REQUESTS] =
(
void
(
*
)())
0
},
{
(
int
(
*
)(
void
*
,
int
))
dump_create_change_notification_request
,
(
void
(
*
)())
dump_create_change_notification_reply
},
{
(
int
(
*
)(
void
*
,
int
))
dump_create_mapping_request
,
(
void
(
*
)())
dump_create_mapping_reply
},
{
(
int
(
*
)(
void
*
,
int
))
dump_get_mapping_info_request
,
(
void
(
*
)())
dump_get_mapping_info_reply
},
};
static
const
char
*
const
req_names
[
REQ_NB_REQUESTS
]
=
...
...
@@ -427,7 +452,6 @@ static const char * const req_names[REQ_NB_REQUESTS] =
"release_semaphore"
,
"open_named_obj"
,
"create_file"
,
"get_unix_handle"
,
"get_read_fd"
,
"get_write_fd"
,
"set_file_pointer"
,
...
...
@@ -438,31 +462,33 @@ static const char * const req_names[REQ_NB_REQUESTS] =
"create_console"
,
"set_console_fd"
,
"create_change_notification"
,
"create_mapping"
,
"get_mapping_info"
,
};
void
trace_request
(
enum
request
req
,
void
*
data
,
int
len
,
int
fd
)
{
int
size
;
current
->
last_req
=
req
;
printf
(
"%08x: %s("
,
(
unsigned
int
)
current
,
req_names
[
req
]
);
fprintf
(
stderr
,
"%08x: %s("
,
(
unsigned
int
)
current
,
req_names
[
req
]
);
size
=
dumpers
[
req
].
dump_req
(
data
,
len
);
if
((
len
-=
size
)
>
0
)
{
unsigned
char
*
ptr
=
(
unsigned
char
*
)
data
+
size
;
while
(
len
--
)
printf
(
", %02x"
,
*
ptr
++
);
while
(
len
--
)
fprintf
(
stderr
,
", %02x"
,
*
ptr
++
);
}
if
(
fd
!=
-
1
)
printf
(
" ) fd=%d
\n
"
,
fd
);
else
printf
(
" )
\n
"
);
if
(
fd
!=
-
1
)
fprintf
(
stderr
,
" ) fd=%d
\n
"
,
fd
);
else
fprintf
(
stderr
,
" )
\n
"
);
}
void
trace_timeout
(
void
)
{
printf
(
"%08x: *timeout*
\n
"
,
(
unsigned
int
)
current
);
fprintf
(
stderr
,
"%08x: *timeout*
\n
"
,
(
unsigned
int
)
current
);
}
void
trace_kill
(
int
exit_code
)
{
printf
(
"%08x: *killed* exit_code=%d
\n
"
,
fprintf
(
stderr
,
"%08x: *killed* exit_code=%d
\n
"
,
(
unsigned
int
)
current
,
exit_code
);
}
...
...
@@ -470,11 +496,11 @@ void trace_reply( struct thread *thread, int type, int pass_fd,
struct
iovec
*
vec
,
int
veclen
)
{
if
(
!
thread
)
return
;
printf
(
"%08x: %s() = %d"
,
fprintf
(
stderr
,
"%08x: %s() = %d"
,
(
unsigned
int
)
thread
,
req_names
[
thread
->
last_req
],
type
);
if
(
veclen
)
{
printf
(
" {"
);
fprintf
(
stderr
,
" {"
);
if
(
dumpers
[
thread
->
last_req
].
dump_reply
)
{
dumpers
[
thread
->
last_req
].
dump_reply
(
vec
->
iov_base
);
...
...
@@ -485,10 +511,10 @@ void trace_reply( struct thread *thread, int type, int pass_fd,
{
unsigned
char
*
ptr
=
vec
->
iov_base
;
int
len
=
vec
->
iov_len
;
while
(
len
--
)
printf
(
", %02x"
,
*
ptr
++
);
while
(
len
--
)
fprintf
(
stderr
,
", %02x"
,
*
ptr
++
);
}
printf
(
" }"
);
fprintf
(
stderr
,
" }"
);
}
if
(
pass_fd
!=
-
1
)
printf
(
" fd=%d
\n
"
,
pass_fd
);
else
printf
(
"
\n
"
);
if
(
pass_fd
!=
-
1
)
fprintf
(
stderr
,
" fd=%d
\n
"
,
pass_fd
);
else
fprintf
(
stderr
,
"
\n
"
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment