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 */