Added -f option to make wineserver remain in the foreground for
debugging.
Close stdin/stdout when not in the foreground (based on a patch by
Francois Gouget).

diff --git a/server/main.c b/server/main.c
index 0089c35..b68268e 100644
--- a/server/main.c
+++ b/server/main.c
@@ -35,6 +35,7 @@
 /* command-line options */
 int debug_level = 0;
 int master_socket_timeout = 3;  /* master socket timeout in seconds, default is 3 s */
+int foreground = 0;
 const char *server_argv0;
 
 /* name space for synchronization objects */
@@ -49,6 +50,7 @@
     fprintf(stderr, "options:\n");
     fprintf(stderr, "   -d<n>  set debug level to <n>\n");
     fprintf(stderr, "   -p[n]  make server persistent, optionally for n seconds\n");
+    fprintf(stderr, "   -f     remain in the foreground for debugging\n");
     fprintf(stderr, "   -w     wait until the current wineserver terminates\n");
     fprintf(stderr, "   -k[n]  kill the current wineserver, optionally with signal n\n");
     fprintf(stderr, "   -h     display this help message\n");
@@ -70,6 +72,9 @@
                 if (isdigit(argv[i][2])) debug_level = atoi( argv[i] + 2 );
                 else debug_level++;
                 break;
+            case 'f':
+                foreground = 1;
+                break;
             case 'h':
                 usage();
                 exit(0);
diff --git a/server/object.h b/server/object.h
index c72b873..256c99e 100644
--- a/server/object.h
+++ b/server/object.h
@@ -156,6 +156,7 @@
   /* command-line options */
 extern int debug_level;
 extern int master_socket_timeout;
+extern int foreground;
 extern const char *server_argv0;
 
   /* server start time used for GetTickCount() */
diff --git a/server/request.c b/server/request.c
index a926f5c..6b3b4b6 100644
--- a/server/request.c
+++ b/server/request.c
@@ -705,7 +705,7 @@
 /* open the master server socket and start waiting for new clients */
 void open_master_socket(void)
 {
-    int pid, status, sync_pipe[2];
+    int fd, pid, status, sync_pipe[2];
     char dummy;
 
     /* make sure no request is larger than the maximum size */
@@ -713,36 +713,51 @@
     assert( sizeof(union generic_reply) == sizeof(struct request_max_size) );
 
     create_server_dir();
-    if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
 
-    pid = fork();
-    switch( pid )
+    if (!foreground)
     {
-    case 0:  /* child */
-        setsid();
-        close( sync_pipe[0] );
+        if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
+        pid = fork();
+        switch( pid )
+        {
+        case 0:  /* child */
+            setsid();
+            close( sync_pipe[0] );
 
+            acquire_lock();
+
+            /* close stdin and stdout */
+            if ((fd = open( "/dev/null", O_RDWR )) != -1)
+            {
+                dup2( fd, 0 );
+                dup2( fd, 1 );
+                close( fd );
+            }
+
+            /* signal parent */
+            write( sync_pipe[1], &dummy, 1 );
+            close( sync_pipe[1] );
+            break;
+
+        case -1:
+            fatal_perror( "fork" );
+            break;
+
+        default:  /* parent */
+            close( sync_pipe[1] );
+
+            /* wait for child to signal us and then exit */
+            if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0);
+
+            /* child terminated, propagate exit status */
+            wait4( pid, &status, 0, NULL );
+            if (WIFEXITED(status)) _exit( WEXITSTATUS(status) );
+            _exit(1);
+        }
+    }
+    else  /* remain in the foreground */
+    {
         acquire_lock();
-
-        /* signal parent */
-        write( sync_pipe[1], &dummy, 1 );
-        close( sync_pipe[1] );
-        break;
-
-    case -1:
-        fatal_perror( "fork" );
-        break;
-
-    default:  /* parent */
-        close( sync_pipe[1] );
-
-        /* wait for child to signal us and then exit */
-        if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0);
-
-        /* child terminated, propagate exit status */
-        wait4( pid, &status, 0, NULL );
-        if (WIFEXITED(status)) _exit( WEXITSTATUS(status) );
-        _exit(1);
     }
 
     /* setup msghdr structure constant fields */