Commit 7ad5be96 authored by Alexandre Julliard's avatar Alexandre Julliard

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).
parent a67d999d
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
/* command-line options */ /* command-line options */
int debug_level = 0; int debug_level = 0;
int master_socket_timeout = 3; /* master socket timeout in seconds, default is 3 s */ int master_socket_timeout = 3; /* master socket timeout in seconds, default is 3 s */
int foreground = 0;
const char *server_argv0; const char *server_argv0;
/* name space for synchronization objects */ /* name space for synchronization objects */
...@@ -49,6 +50,7 @@ static void usage(void) ...@@ -49,6 +50,7 @@ static void usage(void)
fprintf(stderr, "options:\n"); fprintf(stderr, "options:\n");
fprintf(stderr, " -d<n> set debug level to <n>\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, " -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, " -w wait until the current wineserver terminates\n");
fprintf(stderr, " -k[n] kill the current wineserver, optionally with signal n\n"); fprintf(stderr, " -k[n] kill the current wineserver, optionally with signal n\n");
fprintf(stderr, " -h display this help message\n"); fprintf(stderr, " -h display this help message\n");
...@@ -70,6 +72,9 @@ static void parse_args( int argc, char *argv[] ) ...@@ -70,6 +72,9 @@ static void parse_args( int argc, char *argv[] )
if (isdigit(argv[i][2])) debug_level = atoi( argv[i] + 2 ); if (isdigit(argv[i][2])) debug_level = atoi( argv[i] + 2 );
else debug_level++; else debug_level++;
break; break;
case 'f':
foreground = 1;
break;
case 'h': case 'h':
usage(); usage();
exit(0); exit(0);
......
...@@ -156,6 +156,7 @@ extern void release_global_atom( atom_t atom ); ...@@ -156,6 +156,7 @@ extern void release_global_atom( atom_t atom );
/* command-line options */ /* command-line options */
extern int debug_level; extern int debug_level;
extern int master_socket_timeout; extern int master_socket_timeout;
extern int foreground;
extern const char *server_argv0; extern const char *server_argv0;
/* server start time used for GetTickCount() */ /* server start time used for GetTickCount() */
......
...@@ -705,7 +705,7 @@ static void acquire_lock(void) ...@@ -705,7 +705,7 @@ static void acquire_lock(void)
/* open the master server socket and start waiting for new clients */ /* open the master server socket and start waiting for new clients */
void open_master_socket(void) void open_master_socket(void)
{ {
int pid, status, sync_pipe[2]; int fd, pid, status, sync_pipe[2];
char dummy; char dummy;
/* make sure no request is larger than the maximum size */ /* make sure no request is larger than the maximum size */
...@@ -713,36 +713,51 @@ void open_master_socket(void) ...@@ -713,36 +713,51 @@ void open_master_socket(void)
assert( sizeof(union generic_reply) == sizeof(struct request_max_size) ); assert( sizeof(union generic_reply) == sizeof(struct request_max_size) );
create_server_dir(); create_server_dir();
if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
pid = fork(); if (!foreground)
switch( pid )
{ {
case 0: /* child */ if (pipe( sync_pipe ) == -1) fatal_perror( "pipe" );
setsid(); pid = fork();
close( sync_pipe[0] ); switch( pid )
{
case 0: /* child */
setsid();
close( sync_pipe[0] );
acquire_lock(); acquire_lock();
/* signal parent */ /* close stdin and stdout */
write( sync_pipe[1], &dummy, 1 ); if ((fd = open( "/dev/null", O_RDWR )) != -1)
close( sync_pipe[1] ); {
break; dup2( fd, 0 );
dup2( fd, 1 );
close( fd );
}
case -1: /* signal parent */
fatal_perror( "fork" ); write( sync_pipe[1], &dummy, 1 );
break; close( sync_pipe[1] );
break;
default: /* parent */ case -1:
close( sync_pipe[1] ); fatal_perror( "fork" );
break;
/* wait for child to signal us and then exit */ default: /* parent */
if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0); close( sync_pipe[1] );
/* child terminated, propagate exit status */ /* wait for child to signal us and then exit */
wait4( pid, &status, 0, NULL ); if (read( sync_pipe[0], &dummy, 1 ) == 1) _exit(0);
if (WIFEXITED(status)) _exit( WEXITSTATUS(status) );
_exit(1); /* 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();
} }
/* setup msghdr structure constant fields */ /* setup msghdr structure constant fields */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment