X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver_main.c;h=f1b458e5a98ce2ac1fea353f8841d6ee3eab3b95;hb=83f6f54ff172d43c9ab0fab87b10280d0c99ccec;hp=45312588ee614e90f17c836fd2b05e95f7c5578c;hpb=cdb873062246d255bb3813d4443bcaa0992e03ff;p=citadel.git diff --git a/citadel/server_main.c b/citadel/server_main.c index 45312588e..f1b458e5a 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -1,7 +1,7 @@ /* * citserver's main() function lives here. * - * Copyright (c) 1987-2016 by the citadel.org team + * Copyright (c) 1987-2017 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. @@ -11,9 +11,13 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ +#include +#include #include #include +#include #include +#include #include #include "citserver.h" @@ -29,10 +33,37 @@ 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, "main: creating lockfile"); + snprintf(lockfilename, sizeof lockfilename, "%s/citadel.lock", ctdl_run_dir); + fp = fopen(lockfilename, "w"); + if (!fp) { + syslog(LOG_ERR, "%s: %s", lockfilename, strerror(errno)); + exit(CTDLEXIT_DB); + } + if (flock(fileno(fp), (LOCK_EX|LOCK_NB)) != 0) { + syslog(LOG_ERR, "main: cannot lock %s , is another citserver running?", lockfilename); + exit(CTDLEXIT_DB); + } + return; + } + + syslog(LOG_DEBUG, "main: removing lockfile"); + unlink(lockfilename); + flock(fileno(fp), LOCK_UN); + fclose(fp); +} -void go_threading(void); /* * Here's where it all begins. @@ -175,33 +206,14 @@ int main(int argc, char **argv) drop_root_perms = 1; } -#if 0 - def HAVE_BACKTRACE - bzero(¶ms, sizeof(params)); - params.filename = file_pid_paniclog; - panic_fd=open(file_pid_paniclog, O_APPEND|O_CREAT|O_DIRECT); - params.filep = fopen(file_pid_paniclog, "a+"); - params.debugLevel = ECRASH_DEBUG_VERBOSE; - params.dumpAllThreads = TRUE; - params.useBacktraceSymbols = 1; - params.signals[0]=SIGSEGV; - params.signals[1]=SIGILL; - params.signals[2]=SIGBUS; - params.signals[3]=SIGABRT; - eCrash_Init(¶ms); - eCrash_RegisterThread("MasterThread", 0); -#endif - /* Tell 'em who's in da house */ - syslog(LOG_NOTICE, " "); - syslog(LOG_NOTICE, " "); - 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, " "); + 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-2017 by the Citadel development team."); + syslog(LOG_INFO, "This program is distributed under the terms of the GNU General Public License."); + syslog(LOG_INFO, " "); syslog(LOG_INFO, "%s", libcitadel_version_string()); #ifdef HAVE_RUN_DIR @@ -218,20 +230,18 @@ int main(int argc, char **argv) pwp = NULL; #endif // HAVE_GETPWUID_R - if ((mkdir(ctdl_run_dir, 0755) != 0) && (errno != EEXIST)) - syslog(LOG_EMERG, - "unable to create run directory [%s]: %s", - ctdl_run_dir, strerror(errno)); + if ((mkdir(ctdl_run_dir, 0755) != 0) && (errno != EEXIST)) { + syslog(LOG_ERR, "main: unable to create run directory [%s]: %s", ctdl_run_dir, strerror(errno)); + } - if (chown(ctdl_run_dir, ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0) - syslog(LOG_EMERG, - "unable to set the access rights for [%s]: %s", - ctdl_run_dir, strerror(errno)); + if (chown(ctdl_run_dir, ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0) { + syslog(LOG_ERR, "main: unable to set the access rights for [%s]: %s", ctdl_run_dir, strerror(errno)); + } } - - #endif + ctdl_lockfile(1); + /* Initialize... */ init_sysdep(); @@ -248,7 +258,7 @@ int main(int argc, char **argv) /* * Run any upgrade entry points */ - syslog(LOG_INFO, "Upgrading modules."); + syslog(LOG_INFO, "main: upgrading modules"); upgrade_modules(); /* @@ -299,7 +309,7 @@ int main(int argc, char **argv) /* * Load any server-side extensions available here. */ - syslog(LOG_INFO, "Initializing server extensions"); + syslog(LOG_INFO, "main: initializing server extensions"); initialise_modules(0); @@ -339,18 +349,15 @@ int main(int argc, char **argv) #endif // HAVE_GETPWUID_R if (pwp == NULL) - syslog(LOG_CRIT, "WARNING: getpwuid(%ld): %s" - "Group IDs will be incorrect.\n", (long)CTDLUID, - strerror(errno)); + syslog(LOG_ERR, "main: WARNING, getpwuid(%ld): %s" "Group IDs will be incorrect.", (long)CTDLUID, strerror(errno)); else { initgroups(pw.pw_name, pw.pw_gid); if (setgid(pw.pw_gid)) - syslog(LOG_CRIT, "setgid(%ld): %s", (long)pw.pw_gid, - strerror(errno)); + syslog(LOG_ERR, "main: setgid(%ld): %s", (long)pw.pw_gid, strerror(errno)); } - syslog(LOG_INFO, "Changing uid to %ld", (long)CTDLUID); + syslog(LOG_INFO, "main: changing uid to %ld", (long)CTDLUID); if (setuid(CTDLUID) != 0) { - syslog(LOG_CRIT, "setuid() failed: %s", strerror(errno)); + syslog(LOG_ERR, "main: setuid() failed: %s", strerror(errno)); } #if defined (HAVE_SYS_PRCTL_H) && defined (PR_SET_DUMPABLE) prctl(PR_SET_DUMPABLE, 1); @@ -362,6 +369,7 @@ int main(int argc, char **argv) go_threading(); - master_cleanup(exit_signal); - return(0); + int exit_code = master_cleanup(exit_signal); + ctdl_lockfile(0); + return(exit_code); }