| /* | |
| * Server main function | |
| * | |
| * Copyright (C) 1998 Alexandre Julliard | |
| */ | |
| #include <assert.h> | |
| #include <ctype.h> | |
| #include <fcntl.h> | |
| #include <signal.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <sys/time.h> | |
| #include <unistd.h> | |
| #include "object.h" | |
| #include "thread.h" | |
| #include "request.h" | |
| /* command-line options */ | |
| int debug_level = 0; | |
| int persistent_server = 0; | |
| unsigned int server_start_ticks = 0; | |
| /* parse-line args */ | |
| /* FIXME: should probably use getopt, and add a (more complete?) help option */ | |
| static void usage(const char *exeName) | |
| { | |
| fprintf(stderr, "\nusage: %s [options]\n\n", exeName); | |
| fprintf(stderr, "options:\n"); | |
| fprintf(stderr, " -d<n> set debug level to <n>\n"); | |
| fprintf(stderr, " -p make server persistent\n"); | |
| fprintf(stderr, " -h display this help message\n"); | |
| fprintf(stderr, "\n"); | |
| } | |
| static void parse_args( int argc, char *argv[] ) | |
| { | |
| int i; | |
| for (i = 1; i < argc; i++) | |
| { | |
| if (argv[i][0] == '-') | |
| { | |
| switch(argv[i][1]) | |
| { | |
| case 'd': | |
| if (isdigit(argv[i][2])) debug_level = atoi( argv[i] + 2 ); | |
| else debug_level++; | |
| break; | |
| case 'h': | |
| usage( argv[0] ); | |
| exit(0); | |
| break; | |
| case 'p': | |
| persistent_server = 1; | |
| break; | |
| default: | |
| fprintf( stderr, "Unknown option '%s'\n", argv[i] ); | |
| usage( argv[0] ); | |
| exit(1); | |
| } | |
| } | |
| else | |
| { | |
| fprintf( stderr, "Unknown argument '%s'. Your version of wine may be too old.\n", argv[i] ); | |
| usage(argv[0]); | |
| exit(1); | |
| } | |
| } | |
| } | |
| static void sigterm_handler() | |
| { | |
| exit(1); /* make sure atexit functions get called */ | |
| } | |
| /* initialize signal handling */ | |
| static void signal_init(void) | |
| { | |
| signal( SIGPIPE, SIG_IGN ); | |
| signal( SIGHUP, sigterm_handler ); | |
| signal( SIGINT, sigterm_handler ); | |
| signal( SIGQUIT, sigterm_handler ); | |
| signal( SIGTERM, sigterm_handler ); | |
| signal( SIGABRT, sigterm_handler ); | |
| } | |
| /* get server start ticks used to calculate GetTickCount() in Wine clients */ | |
| static void get_start_ticks(void) | |
| { | |
| struct timeval t; | |
| gettimeofday( &t, NULL ); | |
| server_start_ticks = (t.tv_sec * 1000) + (t.tv_usec / 1000); | |
| } | |
| int main( int argc, char *argv[] ) | |
| { | |
| parse_args( argc, argv ); | |
| signal_init(); | |
| open_master_socket(); | |
| setvbuf( stderr, NULL, _IOLBF, 0 ); | |
| if (debug_level) fprintf( stderr, "Server: starting (pid=%ld)\n", (long) getpid() ); | |
| get_start_ticks(); | |
| init_registry(); | |
| select_loop(); | |
| close_registry(); | |
| if (debug_level) fprintf( stderr, "Server: exiting (pid=%ld)\n", (long) getpid() ); | |
| #ifdef DEBUG_OBJECTS | |
| close_atom_table(); | |
| dump_objects(); /* dump any remaining objects */ | |
| #endif | |
| return 0; | |
| } |