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).
This commit is contained in:
parent
a67d999da9
commit
7ad5be967d
|
@ -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 @@ static void usage(void)
|
|||
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 @@ static void parse_args( int argc, char *argv[] )
|
|||
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);
|
||||
|
|
|
@ -156,6 +156,7 @@ extern void release_global_atom( atom_t atom );
|
|||
/* 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() */
|
||||
|
|
|
@ -705,7 +705,7 @@ static void acquire_lock(void)
|
|||
/* 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 @@ void open_master_socket(void)
|
|||
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 */
|
||||
|
|
Loading…
Reference in New Issue