From: Markus Armbruster Date: Sun, 10 Jul 2011 15:53:31 +0000 (+0200) Subject: New server option -F to force start even when state looks bad X-Git-Tag: v4.3.28~11 X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=c6d3f68bbb6c7d9e9731ecbefdf09b06088ed472 New server option -F to force start even when state looks bad Risks crashes and further corruption, but gives deities a chance to fix up a bad game state with edit commands and such. --- diff --git a/include/prototypes.h b/include/prototypes.h index 601202685..5dd3fbbd3 100644 --- a/include/prototypes.h +++ b/include/prototypes.h @@ -415,7 +415,7 @@ extern int disloan(int, struct lonstr *); /* distrea.c */ extern int distrea(int, struct trtstr *); /* fileinit.c */ -extern void ef_init_srv(void); +extern void ef_init_srv(int); extern void ef_fin_srv(void); /* fortdef.c */ extern int sd(natid, natid, coord, coord, int, int, int); diff --git a/man/emp_server.6 b/man/emp_server.6 index b504929c4..d651179d4 100644 --- a/man/emp_server.6 +++ b/man/emp_server.6 @@ -7,7 +7,7 @@ emp_server \- Empire server .SH SYNOPSIS .B emp_server [ -.B \-dhpsv +.B \-dFhpsv ] [ .BI \-e " configfile" @@ -59,6 +59,13 @@ What to do on recoverable internal error ("oops"): \fBabort\fP, .ie \nw \fBcrash-dump\fP is not implemented for Windows. .el \fBcrash-dump\fP works by aborting a fork of the server process. .TP +.B \-F +Force +.B emp_server +to start even when game state looks bad. Risks crashes and further +corruption; use this only for attempting to fix up problems. Better +make a backup first, and lock out players. +.TP .B \-h Help. Print brief usage information and exit. .if \nw \{\ diff --git a/src/lib/subs/fileinit.c b/src/lib/subs/fileinit.c index 053d458e9..b3c312929 100644 --- a/src/lib/subs/fileinit.c +++ b/src/lib/subs/fileinit.c @@ -28,7 +28,7 @@ * * Known contributors to this file: * Ron Koenderink, 2005 - * Markus Armbruster, 2005-2008 + * Markus Armbruster, 2005-2011 */ #include @@ -60,7 +60,7 @@ static void ef_close_srv(void); * Initialize empfile for full server operations. */ void -ef_init_srv(void) +ef_init_srv(int force_bad_state) { unsigned i; @@ -71,11 +71,14 @@ ef_init_srv(void) } nsc_init(); - ef_open_srv(); if (ef_verify_config() < 0) exit(EXIT_FAILURE); - if (ef_verify_state(1) < 0) + ef_open_srv(); + if (ef_verify_state(1) < 0 && !force_bad_state) { + fprintf(stderr, "You can try -F to force running anyway," + " but that's risky; see the manual page\n"); exit(EXIT_FAILURE); + } global_init(); unit_cargo_init(); } diff --git a/src/server/main.c b/src/server/main.c index 72ca45c37..22ef0b2e8 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -31,7 +31,7 @@ * Steve McClure, 1996, 1998 * Doug Hay, 1998 * Ron Koenderink, 2004-2009 - * Markus Armbruster, 2005-2010 + * Markus Armbruster, 2005-2011 */ #include @@ -71,7 +71,7 @@ static void ignore(void); static void crash_dump(void); -static void init_server(unsigned); +static void init_server(unsigned, int); static void create_pidfile(char *, pid_t); #if defined(_WIN32) @@ -138,6 +138,7 @@ main(int argc, char **argv) int remove_service_set = 0; #endif char *config_file = NULL; + int force_bad_state = 0; int op, idx, sig; unsigned seed = time(NULL); @@ -148,7 +149,7 @@ main(int argc, char **argv) #else # define XOPTS #endif - while ((op = getopt(argc, argv, "de:E:hpsR:v" XOPTS)) != EOF) { + while ((op = getopt(argc, argv, "de:E:FhpsR:v" XOPTS)) != EOF) { switch (op) { case 'p': flags |= EMPTH_PRINT; @@ -168,6 +169,9 @@ main(int argc, char **argv) } oops_handler = oops_hndlr[idx]; break; + case 'F': + force_bad_state = 1; + break; #if defined(_WIN32) case 'I': service_name = optarg; @@ -247,7 +251,7 @@ main(int argc, char **argv) return install_service(program_name, service_name, config_file); #endif /* _WIN32 */ - init_server(seed); + init_server(seed, force_bad_state); #if defined(_WIN32) if (daemonize != 0) { @@ -342,14 +346,14 @@ crash_dump(void) * Initialize for serving, acquire resources. */ static void -init_server(unsigned seed) +init_server(unsigned seed, int force_bad_state) { srandom(seed); #if defined(_WIN32) loc_NTInit(); #endif player_init(); - ef_init_srv(); + ef_init_srv(force_bad_state); io_init(); init_nreport();