X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserver_main.c;h=f13a77361275d59f30c74137d8a239049fdf9a3f;hb=b2e29e3d33f3eda3a3eb3f7be959cf841a393fb0;hp=3fb00e3c706b54caa96bbcd09ed88177b9f56dce;hpb=99778f1c3e0ad36441cc2b03885c1bccc949e1ee;p=citadel.git diff --git a/citadel/server_main.c b/citadel/server_main.c index 3fb00e3c7..f13a77361 100644 --- a/citadel/server_main.c +++ b/citadel/server_main.c @@ -53,10 +53,14 @@ #include "config.h" #include "control.h" #include "database.h" +#include "user_ops.h" #include "housekeeping.h" #include "tools.h" #include "citadel_dirs.c" +#include "modules_init.h" +#include "ecrash.h" + #ifdef HAVE_SYS_SELECT_H #include #endif @@ -64,8 +68,8 @@ #ifndef HAVE_SNPRINTF #include "snprintf.h" #endif - -int running_as_daemon = 0; +const char *CitadelServiceUDS="citadel-UDS"; +const char *CitadelServiceTCP="citadel-TCP"; /* * Here's where it all begins. @@ -74,7 +78,8 @@ int main(int argc, char **argv) { char facility[32]; int a, i; /* General-purpose variables */ - struct passwd *pw; + struct passwd pw, *pwp = NULL; + char pwbuf[SIZ]; int drop_root_perms = 1; size_t size; int relh=0; @@ -84,6 +89,14 @@ int main(int argc, char **argv) #ifdef HAVE_RUN_DIR struct stat filestats; #endif +#ifdef HAVE_BACKTRACE + eCrashParameters params; +// eCrashSymbolTable symbol_table; +#endif + /* initialise semaphores here. Patch by Matt and davew + * its called here as they are needed by lprintf for thread safety + */ + InitialiseSemaphores(); /* initialize the master context */ InitializeMasterCC(); @@ -146,25 +159,40 @@ int main(int argc, char **argv) } calc_dirs_n_files(relh, home, relhome, ctdldir); - /* daemonize, if we were asked to */ if (running_as_daemon) { start_daemon(0); drop_root_perms = 1; } +#ifdef 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; +/// BuildSymbolTable(&symbol_table); +// params.symbolTable = &symbol_table; + params.signals[0]=SIGSEGV; + params.signals[1]=SIGILL; + params.signals[2]=SIGBUS; + params.signals[3]=SIGABRT; + + eCrash_Init(¶ms); + + eCrash_RegisterThread("MasterThread", 0); + +/// signal(SIGSEGV, cit_panic_backtrace); +#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) { - if (running_as_daemon) { - openlog("citadel", LOG_NDELAY, 0); - } - else { - openlog("citadel", LOG_PERROR|LOG_NDELAY, 0); - } + openlog("citadel", LOG_NDELAY, 0); setlogmask(LOG_UPTO(verbosity)); } @@ -188,17 +216,17 @@ int main(int argc, char **argv) config.c_ipgm_secret = rand(); put_config(); - lprintf(CTDL_INFO, "Acquiring control record\n"); - get_control(); - #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){ - pw=getpwuid(config.c_ctdluid); +#ifdef SOLARIS_GETPWUID + pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf)); +#else + getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); +#endif mkdir(ctdl_run_dir, 0755); - chown(ctdl_run_dir, config.c_ctdluid, (pw==NULL)?-1:pw->pw_gid); - + chown(ctdl_run_dir, config.c_ctdluid, (pwp==NULL)?-1:pw.pw_gid); } @@ -212,14 +240,18 @@ int main(int argc, char **argv) */ master_startup(); + lprintf(CTDL_INFO, "Acquiring control record\n"); + get_control(); + /* * Bind the server to a Unix-domain socket. */ CtdlRegisterServiceHook(0, - file_citadel_socket, - citproto_begin_session, - do_command_loop, - do_async_loop); + file_citadel_socket, + citproto_begin_session, + do_command_loop, + do_async_loop, + CitadelServiceUDS); /* * Bind the server to our favorite TCP port (usually 504). @@ -228,28 +260,50 @@ int main(int argc, char **argv) NULL, citproto_begin_session, do_command_loop, - do_async_loop); + do_async_loop, + CitadelServiceTCP); /* * Load any server-side extensions available here. */ lprintf(CTDL_INFO, "Initializing server extensions\n"); size = strlen(ctdl_home_directory) + 9; + +/* initialize_server_extensions(); +*/ + + initialise_modules(); + + + + /* + * If we need host auth, start our chkpwd daemon. + */ + if (config.c_auth_mode == 1) { + start_chkpwd_daemon(); + } /* * Now that we've bound the sockets, change to the Citadel user id and its * corresponding group ids */ if (drop_root_perms) { - if ((pw = getpwuid(CTDLUID)) == NULL) + cdb_chmod_data(); /* make sure we own our data files */ + +#ifdef SOLARIS_GETPWUID + pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf)); +#else + getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp); +#endif + if (pwp == NULL) lprintf(CTDL_CRIT, "WARNING: getpwuid(%ld): %s\n" "Group IDs will be incorrect.\n", (long)CTDLUID, strerror(errno)); else { - initgroups(pw->pw_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)) + lprintf(CTDL_CRIT, "setgid(%ld): %s\n", (long)pw.pw_gid, strerror(errno)); } lprintf(CTDL_INFO, "Changing uid to %ld\n", (long)CTDLUID); @@ -275,7 +329,7 @@ int main(int argc, char **argv) } end_critical_section(S_WORKER_LIST); - /* Create the indexer thread. */ + /* Create the maintenance threads. */ create_maintenance_threads(); /* This thread is now useless. It can't be turned into a worker