/*
* citserver's main() function lives here.
*
- * Copyright (c) 1987-2018 by the citadel.org team
+ * Copyright (c) 1987-2020 by the citadel.org team
*
* This program is open source software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3.
#include "serv_extensions.h"
#include "citadel_dirs.h"
#include "user_ops.h"
-#include "ecrash.h"
uid_t ctdluid = 0;
const char *CitadelServiceUDS="citadel-UDS";
const char *CitadelServiceTCP="citadel-TCP";
-void go_threading(void);
+int sanity_diag_mode = 0;
/*
* Create or remove a lock file, so we only have one Citadel Server running at a time.
*/
void ctdl_lockfile(int yo) {
- static char lockfilename[SIZ];
+ static char lockfilename[PATH_MAX];
static FILE *fp;
if (yo) {
struct passwd *p = NULL;
#ifdef HAVE_RUN_DIR
struct stat filestats;
-#endif
-#ifdef HAVE_BACKTRACE
- eCrashParameters params;
-// eCrashSymbolTable symbol_table;
#endif
/* initialize the master context */
InitializeMasterTSD();
/* parse command-line arguments */
- while ((a=getopt(argc, argv, "l:dh:x:t:B:Dru:")) != EOF) switch(a) {
+ while ((a=getopt(argc, argv, "l:dh:x:t:B:Dru:s:")) != EOF) switch(a) {
case 'l':
safestrncpy(facility, optarg, sizeof(facility));
}
break;
+ /* -s tells the server to behave differently during sanity checks */
+ case 's':
+ sanity_diag_mode = atoi(optarg);
+ break;
+
default:
/* any other parameter makes it crash and burn */
fprintf(stderr, "citserver: usage: "
syslog(LOG_INFO, " ");
syslog(LOG_INFO, "*** Citadel server engine ***\n");
syslog(LOG_INFO, "Version %d (build %s) ***", REV_LEVEL, svn_revision());
- syslog(LOG_INFO, "Copyright (C) 1987-2018 by the Citadel development team.");
+ syslog(LOG_INFO, "Copyright (C) 1987-2020 by the Citadel development team.");
syslog(LOG_INFO, " ");
syslog(LOG_INFO, "This program is open source software: you can redistribute it and/or");
syslog(LOG_INFO, "modify it under the terms of the GNU General Public License, version 3.");
#endif
ctdl_lockfile(1);
-
- /* Initialize... */
- init_sysdep();
-
- /*
- * Do non system dependent startup functions.
- */
- master_startup();
-
- /*
- * Check that the control record is correct and place sensible values if it isn't
- */
- check_control();
-
- /*
- * Run any upgrade entry points
- */
- syslog(LOG_INFO, "main: upgrading modules");
+ init_sysdep(); // Initialize...
+ master_startup(); // Do non system dependent startup functions
+ check_control(); // Check/sanitize/initialize control record, fix user indexes
+ syslog(LOG_INFO, "main: upgrading modules"); // Run any upgrade entry points
upgrade_modules();
-
+
/*
* Load the user for the masterCC or create them if they don't exist
*/
do_async_loop,
CitadelServiceTCP);
-
-
-
/*
* Load any server-side extensions available here.
*/
int exit_code = master_cleanup(exit_signal);
ctdl_lockfile(0);
+ if (restart_server) {
+ execv(argv[0], argv);
+ }
return(exit_code);
}