Added beginnings of server-side file handling.
Added -debugmsg +server support.
Better server request dumping for varargs requests.

diff --git a/tools/make_requests b/tools/make_requests
index f02bd43..5c80ecf 100755
--- a/tools/make_requests
+++ b/tools/make_requests
@@ -9,8 +9,11 @@
 %formats =
 (
     "int"          => "%d",
+    "char"         => "%c",
+    "char[0]"      => "\\\"%.*s\\\"",
     "unsigned int" => "%08x",
-    "void*"        => "%p"
+    "void*"        => "%p",
+    "time_t"       => "%ld"
 );
 
 my @requests = ();
@@ -46,9 +49,8 @@
 
 struct dumper
 {
-    void (*dump_req)();
-    void (*dump_reply)();
-    unsigned int size;
+    int (*dump_req)( void *data, int len );
+    void (*dump_reply)( void *data );
 };
 
 static const struct dumper dumpers[REQ_NB_REQUESTS] =
@@ -59,9 +61,8 @@
 {
     $request = $req . "_request";
     $reply = $replies{$req} ? "dump_${req}_reply" : "0";
-    print TRACE "    { (void(*)())dump_$request,\n";
-    print TRACE "      (void(*)())$reply,\n";
-    print TRACE "      sizeof(struct $request) },\n";
+    print TRACE "    { (int(*)(void *,int))dump_$request,\n";
+    print TRACE "      (void(*)())$reply },\n";
 }
 
 print TRACE <<EOF;
@@ -82,13 +83,13 @@
 
 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] );
-    dumpers[req].dump_req( data );
-    if (len > dumpers[req].size)
+    size = dumpers[req].dump_req( data, len );
+    if ((len -= size) > 0)
     {
-        unsigned char *ptr = (unsigned char *)data + dumpers[req].size;
-	len -= dumpers[req].size;
+        unsigned char *ptr = (unsigned char *)data + size;
         while (len--) printf( ", %02x", *ptr++ );
     }
     if (fd != -1) printf( " ) fd=%d\\n", fd );
@@ -196,8 +197,8 @@
         next if /^{$/;
 	s!/\*.*\*/!!g;
 	next if /^\s*$/;
-	/ *(\w+\**( +\w+\**)*) +(\w+);/ or die "Unrecognized syntax $_";
-	my $type = $1;
+	/ *(\w+\**( +\w+\**)*) +(\w+)(\[0\])?;/ or die "Unrecognized syntax $_";
+	my $type = $1 . ($4 || "");
 	my $var = $3;
         die "Unrecognized type $type" unless defined($formats{$type});
 	push @struct, $type, $var;
@@ -232,15 +233,25 @@
 
 sub DO_DUMP_FUNC
 {
+    my $vararg = 0;
     my $name = shift;
-    print TRACE "\nstatic void dump_$name( struct $name *req )\n{\n";
+    print TRACE "\nstatic int dump_$name( struct $name *req, int len )\n{\n";
     while ($#_ >= 0)
     {
 	my $type = shift;
 	my $var = shift;
 	print TRACE "    printf( \" $var=$formats{$type}";
 	print TRACE "," if ($#_ > 0);
-	print TRACE "\", req->$var );\n";
+	print TRACE "\", ";
+	if ($type =~ s/\[0\]$//g)  # vararg type?
+	{
+	    $vararg = 1;
+	    print TRACE "len - (int)sizeof(*req), ($type *)(req+1) );\n";
+	}
+	else
+	{
+	    print TRACE "req->$var );\n";
+        }
     }
-    print TRACE "}\n";
+    print TRACE "    return ", $vararg ? "len" : "(int)sizeof(*req)", ";\n}\n";
 }