/* 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);
.SH SYNOPSIS
.B emp_server
[
-.B \-dhpsv
+.B \-dFhpsv
]
[
.BI \-e " configfile"
.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 \{\
*
* Known contributors to this file:
* Ron Koenderink, 2005
- * Markus Armbruster, 2005-2008
+ * Markus Armbruster, 2005-2011
*/
#include <config.h>
* Initialize empfile for full server operations.
*/
void
-ef_init_srv(void)
+ef_init_srv(int force_bad_state)
{
unsigned i;
}
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();
}
* Steve McClure, 1996, 1998
* Doug Hay, 1998
* Ron Koenderink, 2004-2009
- * Markus Armbruster, 2005-2010
+ * Markus Armbruster, 2005-2011
*/
#include <config.h>
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)
int remove_service_set = 0;
#endif
char *config_file = NULL;
+ int force_bad_state = 0;
int op, idx, sig;
unsigned seed = time(NULL);
#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;
}
oops_handler = oops_hndlr[idx];
break;
+ case 'F':
+ force_bad_state = 1;
+ break;
#if defined(_WIN32)
case 'I':
service_name = optarg;
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) {
* 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();