/*
* citserver's main() function lives here.
*
- * Copyright (c) 1987-2015 by the citadel.org team
+ * Copyright (c) 1987-2016 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 <stdio.h>
#include <sys/types.h>
#include <grp.h>
+#include <sys/file.h>
#include <libcitadel.h>
#include "citserver.h"
uid_t ctdluid = 0;
const char *CitadelServiceUDS="citadel-UDS";
const char *CitadelServiceTCP="citadel-TCP";
+
+
+
void go_threading(void);
+
+
+/*
+ * 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 FILE *fp;
+
+
+ if (yo) {
+ syslog(LOG_DEBUG, "Creating lockfile");
+ snprintf(lockfilename, sizeof lockfilename, "%s/citadel.lock", ctdl_run_dir);
+ fp = fopen(lockfilename, "w");
+ if (!fp) {
+ syslog(LOG_ERR, "Cannot open or create %s", lockfilename);
+ exit(CTDLEXIT_DB);
+ }
+ if (flock(fileno(fp), (LOCK_EX|LOCK_NB)) != 0) {
+ syslog(LOG_ERR, "Cannot lock %s , is another citserver running?", lockfilename);
+ exit(CTDLEXIT_DB);
+ }
+ return;
+ }
+
+ syslog(LOG_DEBUG, "Removing lockfile");
+ unlink(lockfilename);
+ flock(fileno(fp), LOCK_UN);
+ fclose(fp);
+}
+
+
+
+
+
+
/*
* Here's where it all begins.
*/
/* Tell 'em who's in da house */
syslog(LOG_NOTICE, " ");
syslog(LOG_NOTICE, " ");
- syslog(LOG_NOTICE,
- "*** Citadel server engine v%d.%02d (build %s) ***",
- (REV_LEVEL/100), (REV_LEVEL%100), svn_revision());
- syslog(LOG_NOTICE, "Copyright (C) 1987-2015 by the Citadel development team.");
+ syslog(LOG_NOTICE, "*** Citadel server engine ***\n");
+ syslog(LOG_NOTICE, "Version %d (build %s) ***", REV_LEVEL, svn_revision());
+ syslog(LOG_NOTICE, "Copyright (C) 1987-2016 by the Citadel development team.");
syslog(LOG_NOTICE, "This program is distributed under the terms of the GNU "
"General Public License.");
syslog(LOG_NOTICE, " ");
syslog(LOG_DEBUG, "Called as: %s", argv[0]);
syslog(LOG_INFO, "%s", libcitadel_version_string());
- /* Load site-specific configuration */
- syslog(LOG_INFO, "Loading citadel.config");
- get_config();
- validate_config();
-
- /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */
- syslog(LOG_INFO, "Acquiring control record");
- get_control();
-
- put_config();
-
#ifdef HAVE_RUN_DIR
/* on some dists rundir gets purged on startup. so we need to recreate it. */
#endif
+ ctdl_lockfile(1);
+
/* Initialize... */
init_sysdep();
/*
* Bind the server to our favorite TCP port (usually 504).
*/
- CtdlRegisterServiceHook(config.c_port_number,
+ CtdlRegisterServiceHook(CtdlGetConfigInt("c_port_number"),
NULL,
citproto_begin_session,
do_command_loop,
/*
* If we need host auth, start our chkpwd daemon.
*/
- if (config.c_auth_mode == AUTHMODE_HOST) {
+ if (CtdlGetConfigInt("c_auth_mode") == AUTHMODE_HOST) {
start_chkpwd_daemon();
}
go_threading();
- master_cleanup(exit_signal);
- return(0);
+ int exit_code = master_cleanup(exit_signal);
+ ctdl_lockfile(0);
+ return(exit_code);
}