From 830c171dd2888bb2c2258380f18206c24d0a1775 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sat, 5 Mar 2005 20:38:01 +0000 Subject: [PATCH 01/16] (start_server, main, service_main): Call emp_config() earlier. (main): Call loginit() later, after emp_config(). Previously, the program logged to the default datadir until emp_config(). (init_server, start_sever): Split start_server() into initialization and actual startup. Move initialization before disassoc(). (main, init_server): Log server startup only after initialization is complete. --- include/prototypes.h | 3 ++- src/lib/gen/service.c | 4 +++- src/server/main.c | 38 +++++++++++++++++++++++++------------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index 70836d55..8e41758a 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -48,7 +48,8 @@ extern void close_files(void); extern void panic(int sig); extern void shutdwn(int sig); -extern void start_server(int, char *); +extern void init_server(int); +extern void start_server(int); #if defined(_WIN32) extern void loc_NTTerm(void); #endif diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 66353772..587715bc 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -237,6 +237,7 @@ service_main(DWORD argc, LPTSTR *argv) sprintf(tbuf, "%s/econfig", datadir); config_file = tbuf; } + emp_config(config_file); service_status.dwServiceType = SERVICE_WIN32; service_status.dwCurrentState = SERVICE_START_PENDING; @@ -255,7 +256,8 @@ service_main(DWORD argc, LPTSTR *argv) } /* Initialization code goes here. */ - start_server(0, config_file); + init_server(0); + start_server(0); /* Initialization complete - report running status. */ service_status.dwCurrentState = SERVICE_RUNNING; diff --git a/src/server/main.c b/src/server/main.c index 305fd507..b0faf1da 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -166,8 +166,6 @@ main(int argc, char **argv) } } - loginit("server"); - #if defined(_WIN32) if ((debug || datadir_set || config_file != NULL) && remove_service_set) { @@ -190,6 +188,15 @@ main(int argc, char **argv) printf("Can't use both -r or -R and -i or -I options\n"); exit(EXIT_FAILURE); } +#endif /* _WIN32 */ + + if (config_file == NULL) { + sprintf(tbuf, "%s/econfig", datadir); + config_file = tbuf; + } + emp_config(config_file); + +#if defined(_WIN32) if (install_service_set) return install_service(argv[0], service_name, datadir_set); if (remove_service_set) @@ -201,9 +208,6 @@ main(int argc, char **argv) config_file = tbuf; } - logerror("------------------------------------------------------"); - logerror("Empire server (pid %d) started", (int)getpid()); - #if defined(_WIN32) if (debug == 0) { SERVICE_TABLE_ENTRY DispatchTable[]={{"Empire Server", service_main},{NULL, NULL}}; @@ -217,13 +221,14 @@ main(int argc, char **argv) } else /* start in the foreground */ debug = 1; } -#else - if (debug == 0 && flags == 0) { - disassoc(); - } -#endif +#endif /* _WIN32 */ - start_server(flags, config_file); + init_server(flags); +#ifndef _WIN32 + if (debug == 0 && flags == 0) + disassoc(); +#endif + start_server(flags); #if defined(__linux__) && defined(_EMPTH_POSIX) strcpy(tbuf, argv[0]); @@ -247,7 +252,7 @@ main(int argc, char **argv) void -start_server(int flags, char *config_file) +init_server(int flags) { #ifdef POSIXSIGNALS struct sigaction act; @@ -256,7 +261,6 @@ start_server(int flags, char *config_file) #if defined(_WIN32) loc_NTInit(); #endif - emp_config(config_file); update_policy_check(); nullify_objects(); @@ -316,6 +320,14 @@ start_server(int flags, char *config_file) mobility_init(); } + loginit("server"); + logerror("------------------------------------------------------"); + logerror("Empire server (pid %d) started", (int)getpid()); +} + +void +start_server(int flags) +{ empth_create(PP_ACCEPT, player_accept, (50 * 1024), flags, "AcceptPlayers", "Accept network connections", 0); empth_create(PP_KILLIDLE, player_kill_idle, (50 * 1024), flags, From d1d7028fc7aac0a4d8eeccdda92b8301716c84f5 Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Sun, 6 Mar 2005 19:53:14 +0000 Subject: [PATCH 02/16] (main,service_main) [_WIN32]: Fix config_file for WIN32. (main,service_main,empth_exit) [_WIN32]: Add daemon flag. Separate the debug_flag into two separate flags, one for debugging (debug) and controlling the daemon processing (daemon). --- include/service.h | 4 ++-- src/lib/empthread/ntthread.c | 2 +- src/lib/gen/service.c | 6 ++---- src/server/main.c | 28 +++++++++++++++------------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/include/service.h b/include/service.h index 35f68bf8..5070ebdb 100644 --- a/include/service.h +++ b/include/service.h @@ -35,9 +35,9 @@ #define SERVICE_H #define DEFAULT_SERVICE_NAME "Empire Server" -extern char *config_file; -extern int install_service(char *program_name, char *service_name, int datadir_set); +extern int install_service(char *program_name, char *service_name, + int datadir_set, char *config_file); extern int remove_service(char *service_name); extern void WINAPI service_main(DWORD argc, LPTSTR *argv); #endif diff --git a/src/lib/empthread/ntthread.c b/src/lib/empthread/ntthread.c index f3c99762..7ce861b6 100644 --- a/src/lib/empthread/ntthread.c +++ b/src/lib/empthread/ntthread.c @@ -471,7 +471,7 @@ empth_exit(void) if (pThread->bMainThread) { /* The main line. Wait forever. */ while (1) { - if (!debug) { + if (daemon) { if (service_stopped()) shutdwn(0); Sleep(3); diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 587715bc..924d0baa 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -39,11 +39,8 @@ #include "../gen/getopt.h" #include "optlist.h" - -char *config_file = NULL; - int -install_service(char *program_name, char *service_name, int datadir_set) +install_service(char *program_name, char *service_name, int datadir_set, char *config_file) { char strDir[1024]; HANDLE schSCManager,schService; @@ -219,6 +216,7 @@ service_main(DWORD argc, LPTSTR *argv) int op; s_char tbuf[256]; DWORD status; + char *config_file = NULL; optind = 1; opterr = 1; diff --git a/src/server/main.c b/src/server/main.c index b0faf1da..7d36d855 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -82,6 +82,7 @@ static int mainpid = 0; * call abort() on internal error. */ int debug = 0; +int daemon = 1; static void print_usage(char *program_name) @@ -107,9 +108,8 @@ main(int argc, char **argv) char *service_name = NULL; int remove_service_set = 0; int datadir_set = 0; -#else - char *config_file = NULL; #endif + char *config_file = NULL; int op; s_char tbuf[256]; @@ -129,6 +129,7 @@ main(int argc, char **argv) break; case 'd': debug++; + daemon = 0; break; case 'e': config_file = optarg; @@ -190,15 +191,10 @@ main(int argc, char **argv) } #endif /* _WIN32 */ - if (config_file == NULL) { - sprintf(tbuf, "%s/econfig", datadir); - config_file = tbuf; - } - emp_config(config_file); #if defined(_WIN32) if (install_service_set) - return install_service(argv[0], service_name, datadir_set); + return install_service(argv[0], service_name, datadir_set, config_file); if (remove_service_set) return remove_service(service_name); #endif /* _WIN32 */ @@ -207,25 +203,31 @@ main(int argc, char **argv) sprintf(tbuf, "%s/econfig", datadir); config_file = tbuf; } + emp_config(config_file); #if defined(_WIN32) - if (debug == 0) { + if (daemon != 0) { SERVICE_TABLE_ENTRY DispatchTable[]={{"Empire Server", service_main},{NULL, NULL}}; if (StartServiceCtrlDispatcher(DispatchTable)) return 0; - else + else { + /* + * If it is service startup error then exit otherwise + * start server in the foreground + */ if (GetLastError() != ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { logerror("Failed to dispatch service (%d)", GetLastError()); printf("Failed to dispatch service (%d)\n", GetLastError()); exit(EXIT_FAILURE); - } else /* start in the foreground */ - debug = 1; + } + } } + daemon = 0; #endif /* _WIN32 */ init_server(flags); #ifndef _WIN32 - if (debug == 0 && flags == 0) + if (daemon != 0 && flags == 0) disassoc(); #endif start_server(flags); From 0ba025cb4b229be391ad898d5bbd3e17df4a20be Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Sun, 6 Mar 2005 20:08:52 +0000 Subject: [PATCH 03/16] (main,service_main) [_WIN32]: Remove printf for errors during startup, as logerror will print to stderr or to log file. Remove logerror for successful installation and removal. --- src/lib/gen/service.c | 9 --------- src/server/main.c | 5 ----- 2 files changed, 14 deletions(-) diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 924d0baa..00c943ca 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -72,7 +72,6 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c if (schSCManager == NULL) { logerror("install_service failed to open Service Control Manager"); - printf("Install service: failed to open Service Control Manager.\n"); return EXIT_FAILURE; } @@ -94,7 +93,6 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c if (schService == NULL) { logerror("install_service failed to create service %s", service_name); - printf("Install service: failed to create service %s.\n", service_name); return EXIT_FAILURE; } sdBuf.lpDescription = "Server for Empire game"; @@ -104,10 +102,8 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c SERVICE_CONFIG_DESCRIPTION, /* change: description */ &sdBuf)) { /* value: new description */ logerror("install_service failed to set the description"); - printf("Install service: failed to set the description.\n"); } - logerror("install_service successfully created the service %s", service_name); printf("Service %s installed.\n", service_name); CloseServiceHandle(schService); return EXIT_SUCCESS; @@ -128,7 +124,6 @@ remove_service(char *service_name) if (schSCManager == NULL) { logerror("remove_service failed to open Service Control Manager"); - printf("remove service: failed to open Service Control Manager.\n"); return EXIT_FAILURE; } @@ -136,22 +131,18 @@ remove_service(char *service_name) if (hService == NULL) { logerror("remove_service failed to open service %s", service_name); - printf("Remove service: failed to open service %s.\n", service_name); return EXIT_FAILURE; } if (DeleteService(hService) == 0) { logerror("remove_service failed to remove service %s", service_name); - printf("Remove service: failed to remove service %s.\n", service_name); return EXIT_FAILURE; } if (CloseServiceHandle(hService) == 0) { logerror("remove_service failed to close service %s", service_name); - printf("Remove service: failed to close service %s.\n", service_name); return EXIT_FAILURE; } else { - logerror("remove_service successfully removed service %s", service_name); printf("Service %s removed.\n", service_name); return EXIT_SUCCESS; } diff --git a/src/server/main.c b/src/server/main.c index 7d36d855..d541dbf4 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -172,21 +172,16 @@ main(int argc, char **argv) remove_service_set) { logerror("Can't use -d, -D or -e with either " "-r or -R options when starting the server"); - printf("Can't use -d, -D or -e with either -r " - "or -R options\n"); exit(EXIT_FAILURE); } if (debug && install_service_set) { logerror("Can't use -d with either " "-i or -I options when starting the server"); - printf("Can't use -d with either -i " - "or -I options\n"); exit(EXIT_FAILURE); } if (install_service_set && remove_service_set) { logerror("Can't use both -r or -R and -i or -I options when starting " "the server"); - printf("Can't use both -r or -R and -i or -I options\n"); exit(EXIT_FAILURE); } #endif /* _WIN32 */ From 46a11d0d93dd1c2d91b97694094a51170d06c791 Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Sun, 6 Mar 2005 20:54:30 +0000 Subject: [PATCH 04/16] (main) [_WIN32]: Move install_service() so the config_file can be verified before installing. --- src/server/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/server/main.c b/src/server/main.c index d541dbf4..2587c0af 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -188,8 +188,6 @@ main(int argc, char **argv) #if defined(_WIN32) - if (install_service_set) - return install_service(argv[0], service_name, datadir_set, config_file); if (remove_service_set) return remove_service(service_name); #endif /* _WIN32 */ @@ -200,6 +198,11 @@ main(int argc, char **argv) } emp_config(config_file); +#if defined(_WIN32) + if (install_service_set) + return install_service(argv[0], service_name, datadir_set, config_file); +#endif /* _WIN32 */ + #if defined(_WIN32) if (daemon != 0) { SERVICE_TABLE_ENTRY DispatchTable[]={{"Empire Server", service_main},{NULL, NULL}}; From ab2bea581085e6663c4b9c0c96df6a71656a9278 Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Sun, 6 Mar 2005 20:58:48 +0000 Subject: [PATCH 05/16] (service_main) [_WIN32]: Remove the command line processing. The secondary command line processing was adding significant complexity for minimial gain. Now all the command line arguments can be prequalified during the installation of the service. (service_main) [_WIN32]: Move the initialization (init_server()) so logerror() will go to the file instead of stderr. --- src/lib/gen/service.c | 36 +++++------------------------------- 1 file changed, 5 insertions(+), 31 deletions(-) diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 00c943ca..71ed1c5e 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -36,7 +36,6 @@ #include "prototypes.h" #include "service.h" -#include "../gen/getopt.h" #include "optlist.h" int @@ -203,30 +202,8 @@ service_ctrl_handler(DWORD Opcode) void WINAPI service_main(DWORD argc, LPTSTR *argv) -{ - int op; - s_char tbuf[256]; - DWORD status; - char *config_file = NULL; - - optind = 1; - opterr = 1; - while ((op = getopt(argc, argv, "D:e:")) != EOF) { - switch (op) { - case 'D': - datadir = optarg; - break; - case 'e': - config_file = optarg; - break; - } - } - - if (config_file == NULL) { - sprintf(tbuf, "%s/econfig", datadir); - config_file = tbuf; - } - emp_config(config_file); +{ + init_server(0); service_status.dwServiceType = SERVICE_WIN32; service_status.dwCurrentState = SERVICE_START_PENDING; @@ -244,8 +221,6 @@ service_main(DWORD argc, LPTSTR *argv) return; } - /* Initialization code goes here. */ - init_server(0); start_server(0); /* Initialization complete - report running status. */ @@ -254,18 +229,17 @@ service_main(DWORD argc, LPTSTR *argv) service_status.dwWaitHint = 0; if (!SetServiceStatus (service_status_handle, &service_status)) { - status = GetLastError(); - logerror("SetServiceStatus error %ld\n",status); + logerror("SetServiceStatus error %ld\n", GetLastError()); } empth_exit(); -/* We should never get here. But, just in case... */ + /* We should never get here. But, just in case... */ close_files(); loc_NTTerm(); - // This is where the service does its work. + /* This is where the service does its work. */ logerror("Returning the Main Thread \n",0); return; } From 30f2b2c4ea5093900e4b29494ab98db76bc0dbed Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 8 Mar 2005 16:51:19 +0000 Subject: [PATCH 06/16] (player_init, player_accept): Move socket bind and listen from player_accept() to player_init(). Acquiring resources during initialization allows to exit unsuccessfully on errors. Previously, the daemon detached itself (exiting successfully), then failed in the background. (player_socket): New. --- src/lib/player/accept.c | 94 ++++++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index 2581337a..fe1b905f 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -60,13 +60,61 @@ #include #include -struct emp_qelem Players; +static struct emp_qelem Players; +static int player_socket; void player_init(void) { + struct sockaddr_in sin; + struct servent *sp; + int s; + short port; + int val; + emp_initque(&Players); init_player_commands(); + + + sp = getservbyname("empire", "tcp"); + if (sp == 0) + port = htons(atoi(loginport)); + else + port = sp->s_port; + sin.sin_addr.s_addr = INADDR_ANY; + sin.sin_port = port; + sin.sin_family = AF_INET; + if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + logerror("inet socket create"); + exit(1); + } + val = 1; +#if !(defined(__linux__) && defined(__alpha__)) + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)) + < 0) { + logerror("inet socket setsockopt SO_REUSEADDR (%d)", errno); + exit(1); + } +#else + logerror("Alpha/Linux? You don't support SO_REUSEADDR yet, do you?\n"); +#endif + if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { + logerror("inet socket bind"); + exit(1); + } +#ifdef LISTENMAXCONN /* because someone in linux world didn't want to use + * SOMAXCONN as defined in the header files... */ + if (listen(s, LISTENMAXCONN) < 0) { + logerror("inet socket listen"); + exit(1); + } +#else + if (listen(s, SOMAXCONN) < 0) { + logerror("inet socket listen"); + exit(1); + } +#endif + player_socket = s; } struct player * @@ -196,10 +244,7 @@ void player_accept(void *unused) { struct sockaddr_in sin; - struct servent *sp; - int s; - short port; - int val; + int s = player_socket; struct player *np; int len; int ns; @@ -207,45 +252,6 @@ player_accept(void *unused) int stacksize; char buf[128]; - player_init(); - sp = getservbyname("empire", "tcp"); - if (sp == 0) - port = htons(atoi(loginport)); - else - port = sp->s_port; - sin.sin_addr.s_addr = INADDR_ANY; - sin.sin_port = port; - sin.sin_family = AF_INET; - if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - logerror("inet socket create"); - exit(1); - } - val = 1; -#if !(defined(__linux__) && defined(__alpha__)) - if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)) - < 0) { - logerror("inet socket setsockopt SO_REUSEADDR (%d)", errno); - exit(1); - } -#else - logerror("Alpha/Linux? You don't support SO_REUSEADDR yet, do you?\n"); -#endif - if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { - logerror("inet socket bind"); - exit(1); - } -#ifdef LISTENMAXCONN /* because someone in linux world didn't want to use - * SOMAXCONN as defined in the header files... */ - if (listen(s, LISTENMAXCONN) < 0) { - logerror("inet socket listen"); - exit(1); - } -#else - if (listen(s, SOMAXCONN) < 0) { - logerror("inet socket listen"); - exit(1); - } -#endif while (1) { empth_select(s, EMPTH_FD_READ); len = sizeof(sin); From 84b8189c13d371d63e19cbbe3b6a3838c3db70f9 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 14:45:41 +0000 Subject: [PATCH 07/16] (daemon, daemonize): Rename to avoid name clash with BSD's daemon(). (daemonize): Supply missing declaration. --- include/misc.h | 1 + src/lib/empthread/ntthread.c | 2 +- src/server/main.c | 17 +++++++---------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/include/misc.h b/include/misc.h index 5086be35..5f350ae0 100644 --- a/include/misc.h +++ b/include/misc.h @@ -124,6 +124,7 @@ typedef short coord; #define days(x) (60*60*24*(x)) extern int debug; +extern int daemonize; /* * If EXPR is true, an internal error occured. diff --git a/src/lib/empthread/ntthread.c b/src/lib/empthread/ntthread.c index 7ce861b6..c27a6b64 100644 --- a/src/lib/empthread/ntthread.c +++ b/src/lib/empthread/ntthread.c @@ -471,7 +471,7 @@ empth_exit(void) if (pThread->bMainThread) { /* The main line. Wait forever. */ while (1) { - if (daemon) { + if (daemonize) { if (service_stopped()) shutdwn(0); Sleep(3); diff --git a/src/server/main.c b/src/server/main.c index 2587c0af..1e6bc705 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -76,13 +76,10 @@ static void loc_NTInit(void); static int mainpid = 0; -/* - * Debugging? - * If yes, don't fork into background, don't catch certain signals, - * call abort() on internal error. - */ +/* Debugging? If yes call abort() on internal error. */ int debug = 0; -int daemon = 1; +/* Run as daemon? If yes, detach from controlling terminal etc. */ +int daemonize = 1; static void print_usage(char *program_name) @@ -129,7 +126,7 @@ main(int argc, char **argv) break; case 'd': debug++; - daemon = 0; + daemonize = 0; break; case 'e': config_file = optarg; @@ -204,7 +201,7 @@ main(int argc, char **argv) #endif /* _WIN32 */ #if defined(_WIN32) - if (daemon != 0) { + if (daemonize != 0) { SERVICE_TABLE_ENTRY DispatchTable[]={{"Empire Server", service_main},{NULL, NULL}}; if (StartServiceCtrlDispatcher(DispatchTable)) return 0; @@ -220,12 +217,12 @@ main(int argc, char **argv) } } } - daemon = 0; + daemonize = 0; #endif /* _WIN32 */ init_server(flags); #ifndef _WIN32 - if (daemon != 0 && flags == 0) + if (daemonize != 0 && flags == 0) disassoc(); #endif start_server(flags); From 12518b82dd50f2f2702c85564a53615008844f9c Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 16:56:39 +0000 Subject: [PATCH 08/16] Fix missing include. --- include/item.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/item.h b/include/item.h index c85f737f..7ca1aa62 100644 --- a/include/item.h +++ b/include/item.h @@ -34,6 +34,8 @@ #ifndef _ITEM_H_ #define _ITEM_H_ +#include "misc.h" + typedef enum { IPKG, /* "inefficient" packaging (eff<60) */ NPKG, /* no special packaging */ From 1583d0c6a28223637ab77427330c2befa5107085 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 17:11:58 +0000 Subject: [PATCH 09/16] (dflt_econfig): New. (emp_config): Use it when argument is NULL. This simplifies callers except pconfig's main(), which now has to suppress reading the default file. Also fix callers to check the return value. Previously, a typo could easily start a grossly misconfigured program, with potentially disastrous results. --- include/optlist.h | 3 +++ src/lib/gen/emp_config.c | 10 +++++++--- src/lib/global/path.c | 3 ++- src/server/main.c | 11 ++--------- src/util/fairland.c | 8 ++------ src/util/files.c | 10 +++------- src/util/pconfig.c | 10 ++++------ 7 files changed, 23 insertions(+), 32 deletions(-) diff --git a/include/optlist.h b/include/optlist.h index 96bead32..74bd6939 100644 --- a/include/optlist.h +++ b/include/optlist.h @@ -37,6 +37,9 @@ #include "nsc.h" +/* Default econfig file */ +extern char dflt_econfig[]; + struct option_list { char *opt_key; int *opt_valuep; diff --git a/src/lib/gen/emp_config.c b/src/lib/gen/emp_config.c index 4def08f3..da1be7b2 100644 --- a/src/lib/gen/emp_config.c +++ b/src/lib/gen/emp_config.c @@ -88,9 +88,13 @@ emp_config(char *file) int errors = 0; int i; - if (file == NULL) { - fixup_files(); - return 0; + if (!file) { + if (!*dflt_econfig) { + /* No default econfig, use compiled in configuration */ + fixup_files(); + return 0; + } + file = dflt_econfig; } if ((fp = fopen(file, "r")) == NULL) { fprintf(stderr, "Can't open %s for reading (%s)\n", diff --git a/src/lib/global/path.c b/src/lib/global/path.c index cf2e515d..a52d21d3 100644 --- a/src/lib/global/path.c +++ b/src/lib/global/path.c @@ -33,7 +33,8 @@ */ #include "gamesdef.h" -#include "misc.h" + +char dflt_econfig[] = EMPDIR "/data/econfig"; char *infodir = EMPDIR "/info.nr"; char *datadir = EMPDIR "/data"; diff --git a/src/server/main.c b/src/server/main.c index 1e6bc705..837707c7 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -33,10 +33,6 @@ * Doug Hay, 1998 */ -#if defined(aix) || defined(linux) -#include -#endif /* aix or linux */ - #include #if !defined(_WIN32) #include @@ -189,11 +185,8 @@ main(int argc, char **argv) return remove_service(service_name); #endif /* _WIN32 */ - if (config_file == NULL) { - sprintf(tbuf, "%s/econfig", datadir); - config_file = tbuf; - } - emp_config(config_file); + if (emp_config(config_file) < 0) + exit(EXIT_FAILURE); #if defined(_WIN32) if (install_service_set) diff --git a/src/util/fairland.c b/src/util/fairland.c index 72faccba..e03da7fb 100644 --- a/src/util/fairland.c +++ b/src/util/fairland.c @@ -191,7 +191,6 @@ main(int argc, char *argv[]) { int opt; char *config_file = NULL; - char tbuf[512]; int i = 0; rnd_seed = time(NULL); @@ -222,11 +221,8 @@ main(int argc, char *argv[]) } } srandom(rnd_seed); - if (config_file == NULL) { - sprintf(tbuf, "%s/econfig", datadir); - config_file = tbuf; - } - emp_config(config_file); + if (emp_config(config_file)) + exit(1); parse_args(argc - optind, argv + optind); if (allocate_memory() == -1) diff --git a/src/util/files.c b/src/util/files.c index 6acee2fb..82e42d8b 100644 --- a/src/util/files.c +++ b/src/util/files.c @@ -77,7 +77,6 @@ int main(int argc, char *argv[]) { s_char buf[255]; - s_char tbuf[512]; s_char *filename; int x, y; struct natstr nat; @@ -102,12 +101,9 @@ main(int argc, char *argv[]) } } - /* Try to use the existing data directory */ - if (config_file == NULL) { - sprintf(tbuf, "%s/econfig", datadir); - config_file = tbuf; - } - emp_config(config_file); + if (emp_config(config_file) < 0) + exit(1); + empfile[EF_MAP].size = (WORLD_X * WORLD_Y) / 2; empfile[EF_BMAP].size = (WORLD_X * WORLD_Y) / 2; diff --git a/src/util/pconfig.c b/src/util/pconfig.c index f8009817..e9fcb0e2 100644 --- a/src/util/pconfig.c +++ b/src/util/pconfig.c @@ -31,18 +31,16 @@ * Julian Onions */ -#include #include +#include "optlist.h" #include "prototypes.h" int main(int argc, char **argv) { - if (argc > 1) - emp_config(argv[1]); - else - emp_config(NULL); - + *dflt_econfig = 0; /* don't read default econfig */ + if (emp_config(argc > 1 ? argv[1] : NULL) < 0) + exit(1); print_config(stdout); exit(0); } From 29da4b6cf4e4a32cdb0cade0582d989279f35f62 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 18:44:50 +0000 Subject: [PATCH 10/16] (empfile, teldir, motdfil, downfil, disablefil, telfil, annfil) (banfil, authfil, timestampfil): Make file names relative to DATADIR. (main): emp_server and files change to the data directory. fairland has to write newcap_script to the initial current directory, so it keeps it and makes file names relative to DATADIR absolute. (fixup_files): Nothing to do, remove. This fixes the following bug: fixup_files() formed file names by appending ep->name instead of the base name of ep->file to datadir. Thus, fixup_files() changed file names even when datadir had the compiled-in value. When emp_config() couldn't open econfig, it failed to call fixup_files(), and different file names got used. Note that with this revision the file names revert to the names used before fixup_files() was introduced. Closes #1146080. (print_config): Printing file names as comments is not really useful, remove. (otherfiles, ofiles): Unused, remove. (emp_config, main): Previously, pconfig had to call emp_config() even when it didn't want to read econfig, just to run fixup_files(). This is no longer necessary. Simplify. --- include/file.h | 4 +-- src/lib/gen/emp_config.c | 55 +--------------------------------------- src/lib/global/file.c | 30 +++++++++++----------- src/lib/global/path.c | 19 +++++++------- src/server/main.c | 5 ++++ src/util/fairland.c | 12 +++++---- src/util/files.c | 10 +++++--- src/util/pconfig.c | 6 ++--- 8 files changed, 49 insertions(+), 92 deletions(-) diff --git a/include/file.h b/include/file.h index a74bb6e5..dec56c7a 100644 --- a/include/file.h +++ b/include/file.h @@ -37,8 +37,8 @@ #include struct empfile { - char *name; /* file name (e.g., "treaty") */ - char *file; /* file path */ + char *name; /* Empire name (e.g., "treaty") */ + char *file; /* file name (relative to data directory) */ int flags; /* misc stuff */ int mode; /* O_flags */ int size; /* size of object */ diff --git a/src/lib/gen/emp_config.c b/src/lib/gen/emp_config.c index da1be7b2..b7c8c2e1 100644 --- a/src/lib/gen/emp_config.c +++ b/src/lib/gen/emp_config.c @@ -88,14 +88,8 @@ emp_config(char *file) int errors = 0; int i; - if (!file) { - if (!*dflt_econfig) { - /* No default econfig, use compiled in configuration */ - fixup_files(); - return 0; - } + if (!file) file = dflt_econfig; - } if ((fp = fopen(file, "r")) == NULL) { fprintf(stderr, "Can't open %s for reading (%s)\n", file, strerror(errno)); @@ -163,51 +157,11 @@ emp_config(char *file) } } fclose(fp); - fixup_files(); WORLD_X &= ~1; /* make even */ return -errors; } -struct otherfiles { - char **files; - char *name; -}; - -/* list of other well known files... -maybe tailor these oneday - * anyway - meantime they are all relative to datadir */ -static struct otherfiles ofiles[] = { - {&motdfil, "motd"}, - {&downfil, "down"}, - {&disablefil, "disable"}, - {&banfil, "ban"}, - {&authfil, "auth"}, - {&annfil, "ann"}, - {×tampfil, "timestamp"}, - {&teldir, "tel"}, - {&telfil, "tel/tel"}, - {NULL, NULL} -}; - -/* fix up the empfile struct to reference full path names */ -static void -fixup_files(void) -{ - struct empfile *ep; - struct otherfiles *op; - s_char buf[1024]; - - for (ep = empfile; ep < &empfile[EF_MAX]; ep++) { - sprintf(buf, "%s/%s", datadir, ep->name); - ep->file = strdup(buf); - } - - for (op = ofiles; op->files; op++) { - sprintf(buf, "%s/%s", datadir, op->name); - *op->files = strdup(buf); - } -} - /* find the key in the table */ static struct keymatch * keylookup(register s_char *command, struct keymatch *tbl) @@ -226,9 +180,7 @@ keylookup(register s_char *command, struct keymatch *tbl) void print_config(FILE *fp) { - struct empfile *ep; struct option_list *op; - struct otherfiles *ofp; struct keymatch *kp; fprintf(fp, "# Empire Configuration File:\n"); @@ -267,11 +219,6 @@ print_config(FILE *fp) } fprintf(fp, "\n"); - for (ep = empfile; ep < &empfile[EF_MAX]; ep++) - fprintf(fp, "# File %s -> %s\n", ep->name, ep->file); - for (ofp = ofiles; ofp->files; ofp++) - fprintf(fp, "# File %s -> %s\n", ofp->name, *(ofp->files)); - } diff --git a/src/lib/global/file.c b/src/lib/global/file.c index 30a9a2df..051de27c 100644 --- a/src/lib/global/file.c +++ b/src/lib/global/file.c @@ -53,49 +53,49 @@ #include "commodity.h" struct empfile empfile[] = { - {"sect", EMPDIR "/data/sector", EFF_XY | EFF_OWNER, + {"sect", "sector", EFF_XY | EFF_OWNER, 0, sizeof(struct sctstr), 0, 0, 0, offsetof(struct sctstr, sct_item), -1, -1, 0, 0, 0, 0, 0}, - {"ship", EMPDIR "/data/ship", EFF_XY | EFF_OWNER | EFF_GROUP, + {"ship", "ship", EFF_XY | EFF_OWNER | EFF_GROUP, 0, sizeof(struct shpstr), 0, 0, 0, offsetof(struct shpstr, shp_item), -1, -1, 0, 0, 0, 0, 0}, - {"plane", EMPDIR "/data/plane", EFF_XY | EFF_OWNER | EFF_GROUP, + {"plane", "plane", EFF_XY | EFF_OWNER | EFF_GROUP, 0, sizeof(struct plnstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"land", EMPDIR "/data/land", EFF_XY | EFF_OWNER | EFF_GROUP, + {"land", "land", EFF_XY | EFF_OWNER | EFF_GROUP, 0, sizeof(struct lndstr), 0, 0, 0, offsetof(struct lndstr, lnd_item), -1, -1, 0, 0, 0, 0, 0}, - {"nuke", EMPDIR "/data/nuke", EFF_XY | EFF_OWNER, + {"nuke", "nuke", EFF_XY | EFF_OWNER, 0, sizeof(struct nukstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"news", EMPDIR "/data/news", 0, + {"news", "news", 0, 0, sizeof(struct nwsstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"treaty", EMPDIR "/data/treaty", 0, + {"treaty", "treaty", 0, 0, sizeof(struct trtstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"trade", EMPDIR "/data/trade", 0, + {"trade", "trade", 0, 0, sizeof(struct trdstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"pow", EMPDIR "/data/power", 0, + {"pow", "power", 0, 0, sizeof(struct powstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"nat", EMPDIR "/data/nation", 0, + {"nat", "nation", 0, 0, sizeof(struct natstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"loan", EMPDIR "/data/loan", 0, + {"loan", "loan", 0, 0, sizeof(struct lonstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"map", EMPDIR "/data/map", 0, + {"map", "map", 0, 0, DEF_WORLD_X * DEF_WORLD_Y / 2, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"bmap", EMPDIR "/data/bmap", 0, + {"bmap", "bmap", 0, 0, DEF_WORLD_X * DEF_WORLD_Y / 2, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"commodity", EMPDIR "/data/commodity", 0, + {"commodity", "commodity", 0, 0, sizeof(struct comstr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0}, - {"lost", EMPDIR "/data/lostitems", 0, 0, + {"lost", "lostitems", 0, 0, sizeof(struct loststr), 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0} }; diff --git a/src/lib/global/path.c b/src/lib/global/path.c index a52d21d3..ed0e52b6 100644 --- a/src/lib/global/path.c +++ b/src/lib/global/path.c @@ -38,15 +38,16 @@ char dflt_econfig[] = EMPDIR "/data/econfig"; char *infodir = EMPDIR "/info.nr"; char *datadir = EMPDIR "/data"; -char *teldir = EMPDIR "/data/tel"; -char *motdfil = EMPDIR "/data/motd"; -char *downfil = EMPDIR "/data/down"; -char *disablefil = EMPDIR "/data/disable"; -char *telfil = EMPDIR "/data/tel/tel"; -char *annfil = EMPDIR "/data/ann"; -char *banfil = EMPDIR "/data/ban"; -char *authfil = EMPDIR "/data/auth"; -char *timestampfil = EMPDIR "/data/timestamp"; +/* relative to DATADIR */ +char *teldir = "tel"; +char *motdfil = "motd"; +char *downfil = "down"; +char *disablefil = "disable"; +char *telfil = "tel/tel"; +char *annfil = "ann"; +char *banfil = "ban"; +char *authfil = "auth"; +char *timestampfil = "timestamp"; char *loginport = EMP_PORT; diff --git a/src/server/main.c b/src/server/main.c index 837707c7..69db0c58 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -37,6 +37,7 @@ #if !defined(_WIN32) #include #endif +#include #include #include #include @@ -187,6 +188,10 @@ main(int argc, char **argv) if (emp_config(config_file) < 0) exit(EXIT_FAILURE); + if (chdir(datadir)) { + fprintf(stderr, "Can't chdir to %s (%s)\n", datadir, strerror(errno)); + exit(EXIT_FAILURE); + } #if defined(_WIN32) if (install_service_set) diff --git a/src/util/fairland.c b/src/util/fairland.c index e03da7fb..94e3d191 100644 --- a/src/util/fairland.c +++ b/src/util/fairland.c @@ -64,13 +64,11 @@ static int quiet = 0; /* lower URAN_MIN for more uranium */ #define URAN_MIN 56 -#if defined(aix) || defined(linux) || defined(solaris) -#include -#endif /* aix or linux */ #if defined(_WIN32) #include "../lib/gen/getopt.h" #endif +#include #include #include #include @@ -402,12 +400,16 @@ static int allocate_memory(void) { int i; + char *fname; - sect_fptr = fopen(empfile[EF_SECTOR].file, "wb"); + fname = malloc(strlen(datadir) + 1 + strlen(empfile[EF_SECTOR].file) + 1); + sprintf(fname, "%s/%s", datadir, empfile[EF_SECTOR].file); + sect_fptr = fopen(fname, "wb"); if (sect_fptr == NULL) { - perror(empfile[EF_SECTOR].file); + perror(fname); return -1; } + free(fname); sectsbuf = (struct sctstr *)calloc((YSIZE * XSIZE), sizeof(struct sctstr)); sects = (struct sctstr **)calloc(YSIZE, sizeof(struct sctstr *)); diff --git a/src/util/files.c b/src/util/files.c index 82e42d8b..ceeac41d 100644 --- a/src/util/files.c +++ b/src/util/files.c @@ -33,10 +33,6 @@ * Steve McClure, 1998 */ -#if defined(aix) || defined(linux) || defined(solaris) -#include -#endif /* aix or linux */ - #include #include #if !defined(_WIN32) @@ -46,6 +42,7 @@ #include #include "../lib/gen/getopt.h" #endif +#include #include #include @@ -112,6 +109,11 @@ main(int argc, char *argv[]) printf("Can't make game directory\n"); exit(1); } + if (chdir(datadir)) { + fprintf(stderr, "Can't chdir to %s (%s)\n", datadir, strerror(errno)); + exit(EXIT_FAILURE); + } + if (!force) { printf("WARNING: this blasts the existing game in %s (if any)\n", datadir); diff --git a/src/util/pconfig.c b/src/util/pconfig.c index e9fcb0e2..d4db5fdd 100644 --- a/src/util/pconfig.c +++ b/src/util/pconfig.c @@ -38,9 +38,9 @@ int main(int argc, char **argv) { - *dflt_econfig = 0; /* don't read default econfig */ - if (emp_config(argc > 1 ? argv[1] : NULL) < 0) - exit(1); + if (argc > 1) + if (emp_config(argv[1]) < 0) + exit(1); print_config(stdout); exit(0); } From fcf064625d951c369ff4c45b3ed592bcc0c0ef2f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 18:57:53 +0000 Subject: [PATCH 11/16] (main): Non-zero flags imply !daemonize. Make explicit. --- src/server/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/server/main.c b/src/server/main.c index 69db0c58..22b77674 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -149,9 +149,11 @@ main(int argc, char **argv) #else case 'p': flags |= EMPTH_PRINT; + daemonize = 0; break; case 's': flags |= EMPTH_PRINT | EMPTH_STACKCHECK; + daemonize = 0; break; #endif case 'h': @@ -220,7 +222,7 @@ main(int argc, char **argv) init_server(flags); #ifndef _WIN32 - if (daemonize != 0 && flags == 0) + if (daemonize) disassoc(); #endif start_server(flags); From ba7d26b2baa0993f60abd9e17aaa93a325b96ee2 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 19:25:20 +0000 Subject: [PATCH 12/16] (disassoc): src/lib/player/accept.c rev. 1.18.2.1 broke the server when it runs as daemon, because it relies on player_socket remaining open across disassoc(). Change disassoc() to only close file descriptors 0..2 instead of 0..9. By the way, it should really redirect 0..2 to /dev/null instead. --- src/lib/gen/disassoc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/gen/disassoc.c b/src/lib/gen/disassoc.c index 3260eef0..00e2209e 100644 --- a/src/lib/gen/disassoc.c +++ b/src/lib/gen/disassoc.c @@ -54,7 +54,7 @@ disassoc(void) if (fork() != 0) exit(0); - for (i = 0; i < 10; i++) + for (i = 0; i < 2; i++) (void)close(i); (void)open("/", O_RDONLY, 0); (void)dup2(0, 1); From d20fb6ba39141788b51bdbb0709271695fd4e76f Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 9 Mar 2005 19:37:48 +0000 Subject: [PATCH 13/16] (init_server, start_server): Move signal and thread initialization from init_server() to start_server(), and service startup next to its Unix equivalent disassoc(). This way, threading is always initialized after daemonizing, which is simpler and more portable. --- include/prototypes.h | 2 +- src/lib/gen/service.c | 2 +- src/server/main.c | 63 +++++++++++++++++++++---------------------- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/include/prototypes.h b/include/prototypes.h index 8e41758a..0cc0dd1f 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -48,7 +48,7 @@ extern void close_files(void); extern void panic(int sig); extern void shutdwn(int sig); -extern void init_server(int); +extern void init_server(void); extern void start_server(int); #if defined(_WIN32) extern void loc_NTTerm(void); diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 71ed1c5e..6bd67821 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -203,7 +203,7 @@ service_ctrl_handler(DWORD Opcode) void WINAPI service_main(DWORD argc, LPTSTR *argv) { - init_server(0); + init_server(); service_status.dwServiceType = SERVICE_WIN32; service_status.dwCurrentState = SERVICE_START_PENDING; diff --git a/src/server/main.c b/src/server/main.c index 22b77674..e9934752 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -200,6 +200,8 @@ main(int argc, char **argv) return install_service(argv[0], service_name, datadir_set, config_file); #endif /* _WIN32 */ + init_server(); + #if defined(_WIN32) if (daemonize != 0) { SERVICE_TABLE_ENTRY DispatchTable[]={{"Empire Server", service_main},{NULL, NULL}}; @@ -218,13 +220,10 @@ main(int argc, char **argv) } } daemonize = 0; -#endif /* _WIN32 */ - - init_server(flags); -#ifndef _WIN32 +#else /* !_WIN32 */ if (daemonize) disassoc(); -#endif +#endif /* !_WIN32 */ start_server(flags); #if defined(__linux__) && defined(_EMPTH_POSIX) @@ -249,18 +248,38 @@ main(int argc, char **argv) void -init_server(int flags) +init_server(void) { -#ifdef POSIXSIGNALS - struct sigaction act; -#endif /* POSIXSIGNALS */ - + srand(time(NULL)); #if defined(_WIN32) loc_NTInit(); #endif update_policy_check(); - nullify_objects(); + global_init(); + shutdown_init(); + player_init(); + ef_init(); + init_files(); + io_init(); + init_nreport(); + + if (opt_MOB_ACCESS) { + /* This fixes up mobility upon restart */ + mobility_init(); + } + + loginit("server"); + logerror("------------------------------------------------------"); + logerror("Empire server (pid %d) started", (int)getpid()); +} + +void +start_server(int flags) +{ +#ifdef POSIXSIGNALS + struct sigaction act; +#endif /* POSIXSIGNALS */ #if !defined(_WIN32) /* signal() should not be used with mit pthreads. Anyway if u @@ -302,29 +321,9 @@ init_server(int flags) signal(SIGPIPE, SIG_IGN); #endif /* POSIXSIGNALS */ #endif /* _WIN32 */ + empth_init((char **)&player, flags); - srand(time(NULL)); - global_init(); - shutdown_init(); - player_init(); - ef_init(); - init_files(); - io_init(); - init_nreport(); - if (opt_MOB_ACCESS) { - /* This fixes up mobility upon restart */ - mobility_init(); - } - - loginit("server"); - logerror("------------------------------------------------------"); - logerror("Empire server (pid %d) started", (int)getpid()); -} - -void -start_server(int flags) -{ empth_create(PP_ACCEPT, player_accept, (50 * 1024), flags, "AcceptPlayers", "Accept network connections", 0); empth_create(PP_KILLIDLE, player_kill_idle, (50 * 1024), flags, From b961414862399d4a59f06d346d2d7a425cf1cd4c Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Thu, 10 Mar 2005 16:13:51 +0000 Subject: [PATCH 14/16] (main) [_WIN32]: Add extern file for chdir(). (main) [_WIN32]: Add #ifdef for tbuf as it is only used in LINUX and EMPTH_POSIX. --- src/server/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/server/main.c b/src/server/main.c index e9934752..3c683609 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -47,6 +47,7 @@ #include #include "../lib/gen/getopt.h" #include "service.h" +#include "direct.h" #endif #include "misc.h" @@ -105,7 +106,9 @@ main(int argc, char **argv) #endif char *config_file = NULL; int op; +#if defined(__linux__) && defined(_EMPTH_POSIX) s_char tbuf[256]; +#endif mainpid = getpid(); From f03de3f9a57112f11e9fd3950efd45cdfde3d891 Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Thu, 10 Mar 2005 16:15:30 +0000 Subject: [PATCH 15/16] (service_main) [_WIN32]: Remove init_server() as it has already been done. --- src/lib/gen/service.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index 6bd67821..cded6551 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -203,8 +203,6 @@ service_ctrl_handler(DWORD Opcode) void WINAPI service_main(DWORD argc, LPTSTR *argv) { - init_server(); - service_status.dwServiceType = SERVICE_WIN32; service_status.dwCurrentState = SERVICE_START_PENDING; service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP; From 98f3d6efca15c237b31e9c6803ae06cc30c9b18d Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Thu, 10 Mar 2005 18:00:40 +0000 Subject: [PATCH 16/16] (main,service_main) [_WIN32]: Change startup errors to stderr from logerror() as log file is not open yet. --- src/lib/gen/service.c | 14 +++++++------- src/server/main.c | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib/gen/service.c b/src/lib/gen/service.c index cded6551..89b9c500 100644 --- a/src/lib/gen/service.c +++ b/src/lib/gen/service.c @@ -70,7 +70,7 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if (schSCManager == NULL) { - logerror("install_service failed to open Service Control Manager"); + fprintf(stderr, "install_service failed to open Service Control Manager\n"); return EXIT_FAILURE; } @@ -91,7 +91,7 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c NULL); /* no password */ if (schService == NULL) { - logerror("install_service failed to create service %s", service_name); + fprintf(stderr, "install_service failed to create service %s\n", service_name); return EXIT_FAILURE; } sdBuf.lpDescription = "Server for Empire game"; @@ -100,7 +100,7 @@ install_service(char *program_name, char *service_name, int datadir_set, char *c schService, /* handle to service */ SERVICE_CONFIG_DESCRIPTION, /* change: description */ &sdBuf)) { /* value: new description */ - logerror("install_service failed to set the description"); + fprintf(stderr, "install_service failed to set the description\n"); } printf("Service %s installed.\n", service_name); @@ -122,24 +122,24 @@ remove_service(char *service_name) schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (schSCManager == NULL) { - logerror("remove_service failed to open Service Control Manager"); + fprintf(stderr, "remove_service failed to open Service Control Manager\n"); return EXIT_FAILURE; } hService = OpenService(schSCManager, service_name, SERVICE_ALL_ACCESS); if (hService == NULL) { - logerror("remove_service failed to open service %s", service_name); + fprintf(stderr, "remove_service failed to open service %s\n", service_name); return EXIT_FAILURE; } if (DeleteService(hService) == 0) { - logerror("remove_service failed to remove service %s", service_name); + fprintf(stderr, "remove_service failed to remove service %s\n", service_name); return EXIT_FAILURE; } if (CloseServiceHandle(hService) == 0) { - logerror("remove_service failed to close service %s", service_name); + fprintf(stderr, "remove_service failed to close service %s\n", service_name); return EXIT_FAILURE; } else { printf("Service %s removed.\n", service_name); diff --git a/src/server/main.c b/src/server/main.c index 3c683609..632437af 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -169,18 +169,18 @@ main(int argc, char **argv) #if defined(_WIN32) if ((debug || datadir_set || config_file != NULL) && remove_service_set) { - logerror("Can't use -d, -D or -e with either " - "-r or -R options when starting the server"); + fprintf(stderr, "Can't use -d, -D or -e with either " + "-r or -R options when starting the server\n"); exit(EXIT_FAILURE); } if (debug && install_service_set) { - logerror("Can't use -d with either " - "-i or -I options when starting the server"); + fprintf(stderr, "Can't use -d with either " + "-i or -I options when starting the server\n"); exit(EXIT_FAILURE); } if (install_service_set && remove_service_set) { - logerror("Can't use both -r or -R and -i or -I options when starting " - "the server"); + fprintf(stderr, "Can't use both -r or -R and -i or -I options when starting " + "the server\n"); exit(EXIT_FAILURE); } #endif /* _WIN32 */