X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver_main.c;h=45312588ee614e90f17c836fd2b05e95f7c5578c;hb=cdb873062246d255bb3813d4443bcaa0992e03ff;hp=bab3ab69f29bc960da866d43e7c5cfd5a1417825;hpb=5d452833280383337232ccedeef69a15084ed7d5;p=citadel.git diff --git a/citadel/server_main.c b/citadel/server_main.c index bab3ab69f..45312588e 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -1,7 +1,7 @@ /* * citserver's main() function lives here. * - * Copyright (c) 1987-2012 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. @@ -11,72 +11,22 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ - -#include "sysdep.h" -#include -#include #include -#include -#include -#include #include -#include -#include -#include -#include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -#ifdef HAVE_SYS_PRCTL_H -#include -#endif #include -#include "citadel.h" -#include "server.h" -#include "serv_extensions.h" -#include "sysdep_decls.h" -#include "threads.h" + #include "citserver.h" -#include "support.h" +#include "svn_revision.h" +#include "modules_init.h" #include "config.h" #include "control.h" -#include "database.h" -#include "user_ops.h" -#include "housekeeping.h" -#include "svn_revision.h" +#include "serv_extensions.h" #include "citadel_dirs.h" - -#include "context.h" - -#include "modules_init.h" +#include "user_ops.h" #include "ecrash.h" -#ifdef HAVE_SYS_SELECT_H -#include -#endif - -#ifndef HAVE_SNPRINTF -#include "snprintf.h" -#endif +uid_t ctdluid = 0; const char *CitadelServiceUDS="citadel-UDS"; const char *CitadelServiceTCP="citadel-TCP"; @@ -89,6 +39,7 @@ void go_threading(void); */ int main(int argc, char **argv) { + size_t basesize = 64; char facility[32]; int a; /* General-purpose variables */ struct passwd pw, *pwp = NULL; @@ -100,6 +51,9 @@ int main(int argc, char **argv) char relhome[PATH_MAX]=""; char ctdldir[PATH_MAX]=CTDLDIR; int syslog_facility = LOG_DAEMON; + const char *eDebuglist[] = {NULL, NULL}; + uid_t u = 0; + struct passwd *p = NULL; #ifdef HAVE_RUN_DIR struct stat filestats; #endif @@ -113,7 +67,7 @@ int main(int argc, char **argv) InitializeMasterTSD(); /* parse command-line arguments */ - while ((a=getopt(argc, argv, "l:dh:x:t:Dr")) != EOF) switch(a) { + while ((a=getopt(argc, argv, "l:dh:x:t:B:Dru:")) != EOF) switch(a) { case 'l': safestrncpy(facility, optarg, sizeof(facility)); @@ -136,11 +90,15 @@ int main(int argc, char **argv) home=1; break; - case 'x': /* deprecated */ + case 'x': + eDebuglist [0] = optarg; break; case 't': /* deprecated */ break; + case 'B': /* Basesize */ + basesize = atoi(optarg); + break; case 'D': dbg = 1; @@ -153,17 +111,58 @@ int main(int argc, char **argv) drop_root_perms = 0; break; + /* -u tells the server what uid to run under... */ + case 'u': + u = atoi(optarg); + if (u > 0) { + ctdluid = u; + } + else { + p = getpwnam(optarg); + if (p) { + u = p->pw_uid; + } + } + if (u > 0) { + ctdluid = u; + } + break; + default: /* any other parameter makes it crash and burn */ fprintf(stderr, "citserver: usage: " "citserver " "[-l LogFacility] " "[-d] [-D] [-r] " + "[-u user] " "[-h HomeDir]\n" ); exit(1); } + /* Last ditch effort to determine the user name ... if there's a user called "citadel" then use that */ + if (ctdluid == 0) { + p = getpwnam("citadel"); + if (!p) { + p = getpwnam("bbs"); + } + if (!p) { + p = getpwnam("guest"); + } + if (p) { + u = p->pw_uid; + } + if (u > 0) { + ctdluid = u; + } + } + + if ((ctdluid == 0) && (drop_root_perms == 0)) { + fprintf(stderr, "citserver: cannot determine user to run as; please specify -r or -u options\n"); + exit(CTDLEXIT_UNUSER); + } + + StartLibCitadel(basesize); openlog("citserver", ( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ), syslog_facility @@ -176,7 +175,8 @@ int main(int argc, char **argv) drop_root_perms = 1; } -#ifdef HAVE_BACKTRACE +#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); @@ -195,35 +195,24 @@ int main(int argc, char **argv) /* 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-2012 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(); - - /* 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. */ if (stat(ctdl_run_dir, &filestats)==-1){ #ifdef HAVE_GETPWUID_R #ifdef SOLARIS_GETPWUID - pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf)); + pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf)); #else // SOLARIS_GETPWUID - getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); + getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); #endif // SOLARIS_GETPWUID #else // HAVE_GETPWUID_R pwp = NULL; @@ -234,7 +223,7 @@ int main(int argc, char **argv) "unable to create run directory [%s]: %s", ctdl_run_dir, strerror(errno)); - if (chown(ctdl_run_dir, config.c_ctdluid, (pwp==NULL)?-1:pw.pw_gid) != 0) + 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)); @@ -297,7 +286,7 @@ int main(int argc, char **argv) /* * 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, @@ -314,10 +303,13 @@ int main(int argc, char **argv) initialise_modules(0); + eDebuglist[1] = getenv("CITADEL_LOGDEBUG"); + CtdlSetDebugLogFacilities(eDebuglist, 2); + /* * 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(); } @@ -338,9 +330,9 @@ int main(int argc, char **argv) #ifdef HAVE_GETPWUID_R #ifdef SOLARIS_GETPWUID - pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf)); + pwp = getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf)); #else // SOLARIS_GETPWUID - getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); + getpwuid_r(ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); #endif // SOLARIS_GETPWUID #else // HAVE_GETPWUID_R pwp = NULL; @@ -366,7 +358,7 @@ int main(int argc, char **argv) } /* We want to check for idle sessions once per minute */ - CtdlRegisterSessionHook(terminate_idle_sessions, EVT_TIMER); + CtdlRegisterSessionHook(terminate_idle_sessions, EVT_TIMER, PRIO_CLEANUP + 1); go_threading();