X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver_main.c;h=592ea7708bbc620f518e10eb21af59406b86642d;hb=a793d2fbf5e0aa9151490b76defd22f6db7ef7ed;hp=3c610aba915ae23e95de5a140df1216becc5f86d;hpb=9a7a7863409fb96e229a93471ec75346c472645d;p=citadel.git diff --git a/citadel/server_main.c b/citadel/server_main.c index 3c610aba9..592ea7708 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -1,7 +1,15 @@ /* * citserver's main() function lives here. + * + * Copyright (c) 1987-2012 by the citadel.org team * - * $Id$ + * 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. */ #include "sysdep.h" @@ -37,22 +45,30 @@ #include #include #include -#ifdef HAVE_PTHREAD_H -#include -#endif +#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 "config.h" +#include "control.h" #include "database.h" +#include "user_ops.h" #include "housekeeping.h" -#include "tools.h" +#include "svn_revision.h" +#include "citadel_dirs.h" + +#include "context.h" + +#include "modules_init.h" +#include "ecrash.h" #ifdef HAVE_SYS_SELECT_H #include @@ -61,8 +77,12 @@ #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif +const char *CitadelServiceUDS="citadel-UDS"; +const char *CitadelServiceTCP="citadel-TCP"; + -int running_as_daemon = 0; + +void go_threading(void); /* * Here's where it all begins. @@ -70,24 +90,34 @@ int running_as_daemon = 0; int main(int argc, char **argv) { char facility[32]; - int a, i; /* General-purpose variables */ - struct passwd *pw; + 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; + char relhome[PATH_MAX]=""; + char ctdldir[PATH_MAX]=CTDLDIR; + int syslog_facility = LOG_DAEMON; +#ifdef HAVE_RUN_DIR + struct stat filestats; +#endif +#ifdef HAVE_BACKTRACE + eCrashParameters params; +// eCrashSymbolTable symbol_table; +#endif /* initialize the master context */ InitializeMasterCC(); - - /* set default syslog facility */ - syslog_facility = LOG_DAEMON; + InitializeMasterTSD(); /* parse command-line arguments */ for (a=1; apw_name, pw->pw_gid); - if (setgid(pw->pw_gid)) - lprintf(CTDL_CRIT, "setgid(%ld): %s\n", (long)pw->pw_gid, + initgroups(pw.pw_name, pw.pw_gid); + if (setgid(pw.pw_gid)) + syslog(LOG_CRIT, "setgid(%ld): %s", (long)pw.pw_gid, strerror(errno)); } - lprintf(CTDL_INFO, "Changing uid to %ld\n", (long)CTDLUID); + syslog(LOG_INFO, "Changing uid to %ld", (long)CTDLUID); if (setuid(CTDLUID) != 0) { - lprintf(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); @@ -231,26 +362,8 @@ int main(int argc, char **argv) /* We want to check for idle sessions once per minute */ CtdlRegisterSessionHook(terminate_idle_sessions, EVT_TIMER); - /* - * Now create a bunch of worker threads. - */ - lprintf(CTDL_DEBUG, "Starting %d worker threads\n", - config.c_min_workers-1); - begin_critical_section(S_WORKER_LIST); - for (i=0; i<(config.c_min_workers-1); ++i) { - create_worker(); - } - end_critical_section(S_WORKER_LIST); - - /* Create the indexer thread. */ - create_indexer_thread(); - - /* This thread is now useless. It can't be turned into a worker - * thread because its stack is too small, but it can't be killed - * either because the whole server process would exit. So we just - * join to the first worker thread and exit when it exits. - */ - pthread_join(worker_list->tid, NULL); - master_cleanup(0); + go_threading(); + + master_cleanup(exit_signal); return(0); }