Added support for dumping variable-size data of server replies.
Added cmd_line and cmd_show in new_process request.
diff --git a/server/process.c b/server/process.c
index c6a8295..f7617f0 100644
--- a/server/process.c
+++ b/server/process.c
@@ -97,7 +97,7 @@
}
/* create a new process */
-static struct process *create_process( struct new_process_request *req )
+static struct process *create_process( struct new_process_request *req, const char *cmd_line )
{
struct process *process = NULL;
struct process *parent = current->process;
@@ -110,8 +110,9 @@
}
init_process( process );
- if (!(process->info = mem_alloc( sizeof(*process->info) ))) goto error;
+ if (!(process->info = mem_alloc( sizeof(*process->info) + strlen(cmd_line) + 1 ))) goto error;
memcpy( process->info, req, sizeof(*req) );
+ strcpy( process->info->cmd_line, cmd_line );
/* set the process console */
if (req->create_flags & CREATE_NEW_CONSOLE)
@@ -202,21 +203,6 @@
access, &process_ops );
}
-/* retrieve the initialization info for a new process */
-static int get_process_init_info( struct process *process, struct init_process_reply *reply )
-{
- struct new_process_request *info;
- if (!(info = process->info)) return 0;
- process->info = NULL;
- reply->start_flags = info->start_flags;
- reply->hstdin = info->hstdin;
- reply->hstdout = info->hstdout;
- reply->hstderr = info->hstderr;
- reply->env_ptr = info->env_ptr;
- free( info );
- return 1;
-}
-
/* a process has been killed (i.e. its last thread died) */
static void process_killed( struct process *process, int exit_code )
{
@@ -377,8 +363,10 @@
{
struct new_process_reply reply;
struct process *process;
+ char *cmd_line = (char *)data;
- if ((process = create_process( req )))
+ CHECK_STRING( "new_process", cmd_line, len );
+ if ((process = create_process( req, cmd_line )))
{
reply.pid = process;
reply.handle = alloc_handle( current->process, process,
@@ -397,17 +385,28 @@
DECL_HANDLER(init_process)
{
struct init_process_reply reply;
+ struct new_process_request *info;
+
if (current->state != RUNNING)
{
fatal_protocol_error( "init_process: init_thread not called yet\n" );
return;
}
- if (!get_process_init_info( current->process, &reply ))
+ if (!(info = current->process->info))
{
fatal_protocol_error( "init_process: called twice\n" );
return;
}
- send_reply( current, -1, 1, &reply, sizeof(reply) );
+ current->process->info = NULL;
+ reply.start_flags = info->start_flags;
+ reply.hstdin = info->hstdin;
+ reply.hstdout = info->hstdout;
+ reply.hstderr = info->hstderr;
+ reply.cmd_show = info->cmd_show;
+ reply.env_ptr = info->env_ptr;
+ send_reply( current, -1, 2, &reply, sizeof(reply),
+ info->cmd_line, strlen(info->cmd_line) + 1 );
+ free( info );
}
/* open a handle to a process */
diff --git a/server/trace.c b/server/trace.c
index 25b7ea1..66b4002 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -6,6 +6,40 @@
#include "server.h"
#include "thread.h"
+static int dump_chars( void *ptr, int len )
+{
+ fprintf( stderr, "\"%.*s\"", len, (char *)ptr );
+ return len;
+}
+
+static int dump_ints( void *ptr, int len )
+{
+ int i;
+ if (!(len /= sizeof(int)))
+ {
+ fprintf( stderr, "{}" );
+ return 0;
+ }
+ for (i = 0; i < len; i++)
+ fprintf( stderr, "%c%d", i ? ',' : '{', *((int *)ptr + i) );
+ fprintf( stderr, "}" );
+ return len * sizeof(int);
+}
+
+static int dump_ptrs( void *ptr, int len )
+{
+ int i;
+ if (!(len /= sizeof(void*)))
+ {
+ fprintf( stderr, "{}" );
+ return 0;
+ }
+ for (i = 0; i < len; i++)
+ fprintf( stderr, "%c%p", i ? ',' : '{', *((void **)ptr + i) );
+ fprintf( stderr, "}" );
+ return len * sizeof(void*);
+}
+
static int dump_new_process_request( struct new_process_request *req, int len )
{
fprintf( stderr, " inherit=%d,", req->inherit );
@@ -15,9 +49,10 @@
fprintf( stderr, " hstdin=%d,", req->hstdin );
fprintf( stderr, " hstdout=%d,", req->hstdout );
fprintf( stderr, " hstderr=%d,", req->hstderr );
+ fprintf( stderr, " cmd_show=%d,", req->cmd_show );
fprintf( stderr, " env_ptr=%p,", req->env_ptr );
- fprintf( stderr, " cmd_line=\"%.*s\"", len - (int)sizeof(*req), (char *)(req+1) );
- return len;
+ fprintf( stderr, " cmd_line=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_new_process_reply( struct new_process_reply *req, int len )
@@ -60,8 +95,10 @@
fprintf( stderr, " hstdin=%d,", req->hstdin );
fprintf( stderr, " hstdout=%d,", req->hstdout );
fprintf( stderr, " hstderr=%d,", req->hstderr );
- fprintf( stderr, " env_ptr=%p", req->env_ptr );
- return (int)sizeof(*req);
+ fprintf( stderr, " cmd_show=%d,", req->cmd_show );
+ fprintf( stderr, " env_ptr=%p,", req->env_ptr );
+ fprintf( stderr, " cmdline=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_init_thread_request( struct init_thread_request *req, int len )
@@ -239,14 +276,16 @@
{
fprintf( stderr, " count=%d,", req->count );
fprintf( stderr, " flags=%d,", req->flags );
- fprintf( stderr, " timeout=%d", req->timeout );
- return (int)sizeof(*req);
+ fprintf( stderr, " timeout=%d,", req->timeout );
+ fprintf( stderr, " handles=" );
+ return dump_ints( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_select_reply( struct select_reply *req, int len )
{
- fprintf( stderr, " signaled=%d", req->signaled );
- return (int)sizeof(*req);
+ fprintf( stderr, " signaled=%d,", req->signaled );
+ fprintf( stderr, " apcs=" );
+ return dump_ptrs( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_event_request( struct create_event_request *req, int len )
@@ -254,8 +293,8 @@
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_event_reply( struct create_event_reply *req, int len )
@@ -275,8 +314,8 @@
{
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_open_event_reply( struct open_event_reply *req, int len )
@@ -289,8 +328,8 @@
{
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_mutex_reply( struct create_mutex_reply *req, int len )
@@ -309,8 +348,8 @@
{
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_open_mutex_reply( struct open_mutex_reply *req, int len )
@@ -324,8 +363,8 @@
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_semaphore_reply( struct create_semaphore_reply *req, int len )
@@ -351,8 +390,8 @@
{
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_open_semaphore_reply( struct open_semaphore_reply *req, int len )
@@ -368,8 +407,8 @@
fprintf( stderr, " sharing=%08x,", req->sharing );
fprintf( stderr, " create=%d,", req->create );
fprintf( stderr, " attrs=%08x,", req->attrs );
- fprintf( stderr, " name=\"%.*s\"", len - (int)sizeof(*req), (char *)(req+1) );
- return len;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_file_reply( struct create_file_reply *req, int len )
@@ -538,8 +577,8 @@
fprintf( stderr, " mask=%d,", req->mask );
fprintf( stderr, " cursor_size=%d,", req->cursor_size );
fprintf( stderr, " cursor_visible=%d,", req->cursor_visible );
- fprintf( stderr, " title=\"%.*s\"", len - (int)sizeof(*req), (char *)(req+1) );
- return len;
+ fprintf( stderr, " title=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_get_console_info_request( struct get_console_info_request *req, int len )
@@ -603,8 +642,8 @@
fprintf( stderr, " protect=%d,", req->protect );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " handle=%d,", req->handle );
- fprintf( stderr, " name=\"%.*s\"", len - (int)sizeof(*req), (char *)(req+1) );
- return len;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_create_mapping_reply( struct create_mapping_reply *req, int len )
@@ -617,8 +656,8 @@
{
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;
+ fprintf( stderr, " name=" );
+ return dump_chars( req+1, len - (int)sizeof(*req) ) + sizeof(*req);
}
static int dump_open_mapping_reply( struct open_mapping_reply *req, int len )
@@ -722,139 +761,136 @@
fprintf( stderr, " pid=%p", req->pid );
return (int)sizeof(*req);
}
+typedef int (*dump_func)( void *req, int len );
-struct dumper
-{
- int (*dump_req)( void *data, int len );
- void (*dump_reply)( void *data );
+static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
+ (dump_func)dump_new_process_request,
+ (dump_func)dump_new_thread_request,
+ (dump_func)dump_set_debug_request,
+ (dump_func)dump_init_process_request,
+ (dump_func)dump_init_thread_request,
+ (dump_func)dump_terminate_process_request,
+ (dump_func)dump_terminate_thread_request,
+ (dump_func)dump_get_process_info_request,
+ (dump_func)dump_set_process_info_request,
+ (dump_func)dump_get_thread_info_request,
+ (dump_func)dump_set_thread_info_request,
+ (dump_func)dump_suspend_thread_request,
+ (dump_func)dump_resume_thread_request,
+ (dump_func)dump_debugger_request,
+ (dump_func)dump_queue_apc_request,
+ (dump_func)dump_close_handle_request,
+ (dump_func)dump_get_handle_info_request,
+ (dump_func)dump_set_handle_info_request,
+ (dump_func)dump_dup_handle_request,
+ (dump_func)dump_open_process_request,
+ (dump_func)dump_select_request,
+ (dump_func)dump_create_event_request,
+ (dump_func)dump_event_op_request,
+ (dump_func)dump_open_event_request,
+ (dump_func)dump_create_mutex_request,
+ (dump_func)dump_release_mutex_request,
+ (dump_func)dump_open_mutex_request,
+ (dump_func)dump_create_semaphore_request,
+ (dump_func)dump_release_semaphore_request,
+ (dump_func)dump_open_semaphore_request,
+ (dump_func)dump_create_file_request,
+ (dump_func)dump_get_read_fd_request,
+ (dump_func)dump_get_write_fd_request,
+ (dump_func)dump_set_file_pointer_request,
+ (dump_func)dump_truncate_file_request,
+ (dump_func)dump_set_file_time_request,
+ (dump_func)dump_flush_file_request,
+ (dump_func)dump_get_file_info_request,
+ (dump_func)dump_lock_file_request,
+ (dump_func)dump_unlock_file_request,
+ (dump_func)dump_create_pipe_request,
+ (dump_func)dump_alloc_console_request,
+ (dump_func)dump_free_console_request,
+ (dump_func)dump_open_console_request,
+ (dump_func)dump_set_console_fd_request,
+ (dump_func)dump_get_console_mode_request,
+ (dump_func)dump_set_console_mode_request,
+ (dump_func)dump_set_console_info_request,
+ (dump_func)dump_get_console_info_request,
+ (dump_func)dump_write_console_input_request,
+ (dump_func)dump_read_console_input_request,
+ (dump_func)dump_create_change_notification_request,
+ (dump_func)dump_create_mapping_request,
+ (dump_func)dump_open_mapping_request,
+ (dump_func)dump_get_mapping_info_request,
+ (dump_func)dump_create_device_request,
+ (dump_func)dump_create_snapshot_request,
+ (dump_func)dump_next_process_request,
+ (dump_func)dump_wait_debug_event_request,
+ (dump_func)dump_send_debug_event_request,
+ (dump_func)dump_continue_debug_event_request,
+ (dump_func)dump_debug_process_request,
};
-static const struct dumper dumpers[REQ_NB_REQUESTS] =
-{
- { (int(*)(void *,int))dump_new_process_request,
- (void(*)())dump_new_process_reply },
- { (int(*)(void *,int))dump_new_thread_request,
- (void(*)())dump_new_thread_reply },
- { (int(*)(void *,int))dump_set_debug_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_init_process_request,
- (void(*)())dump_init_process_reply },
- { (int(*)(void *,int))dump_init_thread_request,
- (void(*)())dump_init_thread_reply },
- { (int(*)(void *,int))dump_terminate_process_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_terminate_thread_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_process_info_request,
- (void(*)())dump_get_process_info_reply },
- { (int(*)(void *,int))dump_set_process_info_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_thread_info_request,
- (void(*)())dump_get_thread_info_reply },
- { (int(*)(void *,int))dump_set_thread_info_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_suspend_thread_request,
- (void(*)())dump_suspend_thread_reply },
- { (int(*)(void *,int))dump_resume_thread_request,
- (void(*)())dump_resume_thread_reply },
- { (int(*)(void *,int))dump_debugger_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_queue_apc_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_close_handle_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_handle_info_request,
- (void(*)())dump_get_handle_info_reply },
- { (int(*)(void *,int))dump_set_handle_info_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_dup_handle_request,
- (void(*)())dump_dup_handle_reply },
- { (int(*)(void *,int))dump_open_process_request,
- (void(*)())dump_open_process_reply },
- { (int(*)(void *,int))dump_select_request,
- (void(*)())dump_select_reply },
- { (int(*)(void *,int))dump_create_event_request,
- (void(*)())dump_create_event_reply },
- { (int(*)(void *,int))dump_event_op_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_open_event_request,
- (void(*)())dump_open_event_reply },
- { (int(*)(void *,int))dump_create_mutex_request,
- (void(*)())dump_create_mutex_reply },
- { (int(*)(void *,int))dump_release_mutex_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_open_mutex_request,
- (void(*)())dump_open_mutex_reply },
- { (int(*)(void *,int))dump_create_semaphore_request,
- (void(*)())dump_create_semaphore_reply },
- { (int(*)(void *,int))dump_release_semaphore_request,
- (void(*)())dump_release_semaphore_reply },
- { (int(*)(void *,int))dump_open_semaphore_request,
- (void(*)())dump_open_semaphore_reply },
- { (int(*)(void *,int))dump_create_file_request,
- (void(*)())dump_create_file_reply },
- { (int(*)(void *,int))dump_get_read_fd_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_write_fd_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_set_file_pointer_request,
- (void(*)())dump_set_file_pointer_reply },
- { (int(*)(void *,int))dump_truncate_file_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_set_file_time_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_flush_file_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_file_info_request,
- (void(*)())dump_get_file_info_reply },
- { (int(*)(void *,int))dump_lock_file_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_unlock_file_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_create_pipe_request,
- (void(*)())dump_create_pipe_reply },
- { (int(*)(void *,int))dump_alloc_console_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_free_console_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_open_console_request,
- (void(*)())dump_open_console_reply },
- { (int(*)(void *,int))dump_set_console_fd_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_console_mode_request,
- (void(*)())dump_get_console_mode_reply },
- { (int(*)(void *,int))dump_set_console_mode_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_set_console_info_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_get_console_info_request,
- (void(*)())dump_get_console_info_reply },
- { (int(*)(void *,int))dump_write_console_input_request,
- (void(*)())dump_write_console_input_reply },
- { (int(*)(void *,int))dump_read_console_input_request,
- (void(*)())dump_read_console_input_reply },
- { (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_open_mapping_request,
- (void(*)())dump_open_mapping_reply },
- { (int(*)(void *,int))dump_get_mapping_info_request,
- (void(*)())dump_get_mapping_info_reply },
- { (int(*)(void *,int))dump_create_device_request,
- (void(*)())dump_create_device_reply },
- { (int(*)(void *,int))dump_create_snapshot_request,
- (void(*)())dump_create_snapshot_reply },
- { (int(*)(void *,int))dump_next_process_request,
- (void(*)())dump_next_process_reply },
- { (int(*)(void *,int))dump_wait_debug_event_request,
- (void(*)())dump_wait_debug_event_reply },
- { (int(*)(void *,int))dump_send_debug_event_request,
- (void(*)())dump_send_debug_event_reply },
- { (int(*)(void *,int))dump_continue_debug_event_request,
- (void(*)())0 },
- { (int(*)(void *,int))dump_debug_process_request,
- (void(*)())0 },
+static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
+ (dump_func)dump_new_process_reply,
+ (dump_func)dump_new_thread_reply,
+ (dump_func)0,
+ (dump_func)dump_init_process_reply,
+ (dump_func)dump_init_thread_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_get_process_info_reply,
+ (dump_func)0,
+ (dump_func)dump_get_thread_info_reply,
+ (dump_func)0,
+ (dump_func)dump_suspend_thread_reply,
+ (dump_func)dump_resume_thread_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_get_handle_info_reply,
+ (dump_func)0,
+ (dump_func)dump_dup_handle_reply,
+ (dump_func)dump_open_process_reply,
+ (dump_func)dump_select_reply,
+ (dump_func)dump_create_event_reply,
+ (dump_func)0,
+ (dump_func)dump_open_event_reply,
+ (dump_func)dump_create_mutex_reply,
+ (dump_func)0,
+ (dump_func)dump_open_mutex_reply,
+ (dump_func)dump_create_semaphore_reply,
+ (dump_func)dump_release_semaphore_reply,
+ (dump_func)dump_open_semaphore_reply,
+ (dump_func)dump_create_file_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_set_file_pointer_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_get_file_info_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_create_pipe_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_open_console_reply,
+ (dump_func)0,
+ (dump_func)dump_get_console_mode_reply,
+ (dump_func)0,
+ (dump_func)0,
+ (dump_func)dump_get_console_info_reply,
+ (dump_func)dump_write_console_input_reply,
+ (dump_func)dump_read_console_input_reply,
+ (dump_func)dump_create_change_notification_reply,
+ (dump_func)dump_create_mapping_reply,
+ (dump_func)dump_open_mapping_reply,
+ (dump_func)dump_get_mapping_info_reply,
+ (dump_func)dump_create_device_reply,
+ (dump_func)dump_create_snapshot_reply,
+ (dump_func)dump_next_process_reply,
+ (dump_func)dump_wait_debug_event_reply,
+ (dump_func)dump_send_debug_event_reply,
+ (dump_func)0,
+ (dump_func)0,
};
static const char * const req_names[REQ_NB_REQUESTS] =
@@ -928,7 +964,7 @@
int size;
current->last_req = req;
fprintf( stderr, "%08x: %s(", (unsigned int)current, req_names[req] );
- size = dumpers[req].dump_req( data, len );
+ size = req_dumpers[req]( data, len );
if ((len -= size) > 0)
{
unsigned char *ptr = (unsigned char *)data + size;
@@ -952,24 +988,26 @@
void trace_reply( struct thread *thread, int type, int pass_fd,
struct iovec *vec, int veclen )
{
+ static char buffer[MAX_MSG_LENGTH];
+
if (!thread) return;
fprintf( stderr, "%08x: %s() = %d",
(unsigned int)thread, req_names[thread->last_req], type );
if (veclen)
{
+ char *p = buffer;
+ int len;
+ for (; veclen; veclen--, vec++)
+ {
+ memcpy( p, vec->iov_base, vec->iov_len );
+ p += vec->iov_len;
+ }
fprintf( stderr, " {" );
- if (dumpers[thread->last_req].dump_reply)
- {
- dumpers[thread->last_req].dump_reply( vec->iov_base );
- vec++;
- veclen--;
- }
- for (; veclen; veclen--, vec++)
- {
- unsigned char *ptr = vec->iov_base;
- int len = vec->iov_len;
- while (len--) fprintf( stderr, ", %02x", *ptr++ );
- }
+ len = p - buffer;
+ if (reply_dumpers[thread->last_req])
+ len -= reply_dumpers[thread->last_req]( buffer, len );
+ p -= len;
+ while (len--) fprintf( stderr, ", %02x", *p++ );
fprintf( stderr, " }" );
}
if (pass_fd != -1) fprintf( stderr, " fd=%d\n", pass_fd );