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).
oldstable
Alexandre Julliard 2003-03-14 04:08:42 +00:00
parent a67d999da9
commit 7ad5be967d
3 changed files with 48 additions and 27 deletions

View File

@ -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);

View File

@ -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() */

View File

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