X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver_main.c;h=a015876e5beedd803790e92aa0dda78093a5825d;hb=0475c981817d12900332693297a77a9ae7168129;hp=d4558f86d5299c3061406adbe70a3d869d474ceb;hpb=56d69e5d8434e98835a2582c59b771ba69475431;p=citadel.git diff --git a/citadel/server_main.c b/citadel/server_main.c index d4558f86d..a015876e5 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -1,88 +1,32 @@ /* * citserver's main() function lives here. * - * Copyright (c) 1987-2010 by the citadel.org team + * Copyright (c) 1987-2015 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * 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. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#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"; @@ -95,19 +39,21 @@ 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; char pwbuf[SIZ]; int drop_root_perms = 1; - size_t size; int relh=0; int home=0; int dbg=0; - int have_log=0; - int have_minus_x=0; 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 @@ -116,92 +62,111 @@ int main(int argc, char **argv) // eCrashSymbolTable symbol_table; #endif -#ifdef HAVE_GC - GC_INIT(); - GC_find_leak = 1; -#endif - - - /* initialise semaphores here. Patch by Matt and davew - * its called here as they are needed by CtdlLogPrintf for thread safety - */ - InitialiseSemaphores(); - /* initialize the master context */ InitializeMasterCC(); + InitializeMasterTSD(); /* parse command-line arguments */ - for (a=1; a 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 */ - else { - CtdlLogPrintf(CTDL_EMERG, "citserver: usage: " + fprintf(stderr, "citserver: usage: " "citserver " - "[-lLogFacility] " - "[-d] [-D] [-s]" - " [-tTraceFile]" - " [-xLogLevel] [-hHomeDir]\n"); + "[-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); } - if (have_minus_x && running_as_daemon && have_log) - print_to_logfile = 1; + StartLibCitadel(basesize); + openlog("citserver", + ( running_as_daemon ? (LOG_PID) : (LOG_PID | LOG_PERROR) ), + syslog_facility + ); calc_dirs_n_files(relh, home, relhome, ctdldir, dbg); /* daemonize, if we were asked to */ @@ -210,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); @@ -226,39 +192,18 @@ int main(int argc, char **argv) eCrash_RegisterThread("MasterThread", 0); #endif - /* Initialize the syslogger. Yes, we are really using 0 as the - * facility, because we are going to bitwise-OR the facility to - * the severity of each message, allowing us to write to other - * facilities when we need to... - */ - if (enable_syslog) { - openlog("citadel", LOG_NDELAY, 0); - setlogmask(LOG_UPTO(verbosity)); - } - /* Tell 'em who's in da house */ - CtdlLogPrintf(CTDL_NOTICE, "\n"); - CtdlLogPrintf(CTDL_NOTICE, "\n"); - CtdlLogPrintf(CTDL_NOTICE, - "*** Citadel server engine v%d.%02d (build %s) ***\n", + 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()); - CtdlLogPrintf(CTDL_NOTICE, "Copyright (C) 1987-2010 by the Citadel development team.\n"); - CtdlLogPrintf(CTDL_NOTICE, "This program is distributed under the terms of the GNU " - "General Public License.\n"); - CtdlLogPrintf(CTDL_NOTICE, "\n"); - CtdlLogPrintf(CTDL_DEBUG, "Called as: %s\n", argv[0]); - CtdlLogPrintf(CTDL_INFO, "%s\n", libcitadel_version_string()); - - /* Load site-specific parameters, and set the ipgm secret */ - CtdlLogPrintf(CTDL_INFO, "Loading citadel.config\n"); - get_config(); - config.c_ipgm_secret = rand(); - - /* get_control() MUST MUST MUST be called BEFORE the databases are opened!! */ - CtdlLogPrintf(CTDL_INFO, "Acquiring control record\n"); - get_control(); - - put_config(); + syslog(LOG_NOTICE, "Copyright (C) 1987-2015 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()); #ifdef HAVE_RUN_DIR /* on some dists rundir gets purged on startup. so we need to recreate it. */ @@ -266,21 +211,21 @@ int main(int argc, char **argv) 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; #endif // HAVE_GETPWUID_R if ((mkdir(ctdl_run_dir, 0755) != 0) && (errno != EEXIST)) - CtdlLogPrintf(CTDL_EMERG, + syslog(LOG_EMERG, "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) - CtdlLogPrintf(CTDL_EMERG, + 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)); } @@ -304,22 +249,22 @@ int main(int argc, char **argv) /* * Run any upgrade entry points */ - CtdlLogPrintf(CTDL_INFO, "Upgrading modules.\n"); + syslog(LOG_INFO, "Upgrading modules."); upgrade_modules(); -/** +/* * Load the user for the masterCC or create them if they don't exist */ if (CtdlGetUser(&masterCC.user, "SYS_Citadel")) { - /** User doesn't exist. We can't use create user here as the user number needs to be 0 */ + /* User doesn't exist. We can't use create user here as the user number needs to be 0 */ strcpy (masterCC.user.fullname, "SYS_Citadel") ; CtdlPutUser(&masterCC.user); - CtdlGetUser(&masterCC.user, "SYS_Citadel"); /** Just to be safe */ + CtdlGetUser(&masterCC.user, "SYS_Citadel"); /* Just to be safe */ } /* - * Bind the server to a Unix-domain socket. + * Bind the server to a Unix-domain socket (user client access) */ CtdlRegisterServiceHook(0, file_citadel_socket, @@ -328,10 +273,21 @@ int main(int argc, char **argv) do_async_loop, CitadelServiceUDS); + /* + * Bind the server to a Unix-domain socket (admin client access) + */ + CtdlRegisterServiceHook(0, + file_citadel_admin_socket, + citproto_begin_admin_session, + do_command_loop, + do_async_loop, + CitadelServiceUDS); + chmod(file_citadel_admin_socket, S_IRWXU); /* for your eyes only */ + /* * 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, @@ -344,17 +300,17 @@ int main(int argc, char **argv) /* * Load any server-side extensions available here. */ - CtdlLogPrintf(CTDL_INFO, "Initializing server extensions\n"); - size = strlen(ctdl_home_directory) + 9; + syslog(LOG_INFO, "Initializing server extensions"); 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(); } @@ -375,27 +331,27 @@ 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; #endif // HAVE_GETPWUID_R if (pwp == NULL) - CtdlLogPrintf(CTDL_CRIT, "WARNING: getpwuid(%ld): %s\n" + syslog(LOG_CRIT, "WARNING: getpwuid(%ld): %s" "Group IDs will be incorrect.\n", (long)CTDLUID, strerror(errno)); else { initgroups(pw.pw_name, pw.pw_gid); if (setgid(pw.pw_gid)) - CtdlLogPrintf(CTDL_CRIT, "setgid(%ld): %s\n", (long)pw.pw_gid, + syslog(LOG_CRIT, "setgid(%ld): %s", (long)pw.pw_gid, strerror(errno)); } - CtdlLogPrintf(CTDL_INFO, "Changing uid to %ld\n", (long)CTDLUID); + syslog(LOG_INFO, "Changing uid to %ld", (long)CTDLUID); if (setuid(CTDLUID) != 0) { - CtdlLogPrintf(CTDL_CRIT, "setuid() failed: %s\n", strerror(errno)); + syslog(LOG_CRIT, "setuid() failed: %s", strerror(errno)); } #if defined (HAVE_SYS_PRCTL_H) && defined (PR_SET_DUMPABLE) prctl(PR_SET_DUMPABLE, 1); @@ -403,11 +359,10 @@ 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(); - master_cleanup(exit_signal); return(0); }