New server option -F to force start even when state looks bad
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 10 Jul 2011 15:53:31 +0000 (17:53 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 10 Jul 2011 19:17:01 +0000 (21:17 +0200)
Risks crashes and further corruption, but gives deities a chance to
fix up a bad game state with edit commands and such.

include/prototypes.h
man/emp_server.6
src/lib/subs/fileinit.c
src/server/main.c

index 6012026853746b8ff13e36686c3473e86d424842..5dd3fbbd3240930dc62583a4647536014994c3ab 100644 (file)
@@ -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);
index b504929c478e65fc86fa33ace4b8f383a6d0035c..d651179d4badbb19e2cdec9fbb9bfb9644ab52d3 100644 (file)
@@ -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 \{\
index 053d458e95b80b48d03dcfc409d91603393b5e47..b3c3129290e661dd7c6caf6206b975933b4fef21 100644 (file)
@@ -28,7 +28,7 @@
  *
  *  Known contributors to this file:
  *     Ron Koenderink, 2005
- *     Markus Armbruster, 2005-2008
+ *     Markus Armbruster, 2005-2011
  */
 
 #include <config.h>
@@ -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();
 }
index 72ca45c379f9cc8b30a1ffb57e39110a300c668b..22ef0b2e86ac5129d972074b6756b722979091be 100644 (file)
@@ -31,7 +31,7 @@
  *     Steve McClure, 1996, 1998
  *     Doug Hay, 1998
  *     Ron Koenderink, 2004-2009
- *     Markus Armbruster, 2005-2010
+ *     Markus Armbruster, 2005-2011
  */
 
 #include <config.h>
@@ -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();