]> code.citadel.org Git - citadel.git/blobdiff - citadel/server_main.c
The encoding and decoding tables for Base64 are
[citadel.git] / citadel / server_main.c
index 69dea688188025edb7d2ba56e68a1bea3224a7b7..2be4109c57fdb124b2995844a123453d0a99306d 100644 (file)
@@ -38,9 +38,6 @@
 #include <stdarg.h>
 #include <grp.h>
 #include <pwd.h>
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
 #ifdef HAVE_SYS_PRCTL_H
 #include <sys/prctl.h>
 #endif
@@ -49,6 +46,7 @@
 #include "server.h"
 #include "serv_extensions.h"
 #include "sysdep_decls.h"
+#include "threads.h"
 #include "citserver.h"
 #include "support.h"
 #include "config.h"
@@ -99,9 +97,8 @@ int main(int argc, char **argv)
 //     eCrashSymbolTable symbol_table;
 #endif
        /* initialise semaphores here. Patch by Matt and davew
-        * its called here as they are needed by lprintf for thread safety
+        * its called here as they are needed by CtdlLogPrintf for thread safety
         */
-       CtdlInitBase64Table();
        InitialiseSemaphores();
        
        /* initialize the master context */
@@ -157,7 +154,7 @@ int main(int argc, char **argv)
 
                /* any other parameter makes it crash and burn */
                else {
-                       lprintf(CTDL_EMERG,     "citserver: usage: "
+                       CtdlLogPrintf(CTDL_EMERG,       "citserver: usage: "
                                        "citserver "
                                        "[-lLogFacility] "
                                        "[-d] [-f] [-D] "
@@ -207,22 +204,22 @@ int main(int argc, char **argv)
        }
        
        /* Tell 'em who's in da house */
-       lprintf(CTDL_NOTICE, "\n");
-       lprintf(CTDL_NOTICE, "\n");
-       lprintf(CTDL_NOTICE,
+       CtdlLogPrintf(CTDL_NOTICE, "\n");
+       CtdlLogPrintf(CTDL_NOTICE, "\n");
+       CtdlLogPrintf(CTDL_NOTICE,
                "*** Citadel server engine v%d.%02d ***\n",
                (REV_LEVEL/100), (REV_LEVEL%100));
-       lprintf(CTDL_NOTICE,
-               "Copyright (C) 1987-2007 by the Citadel development team.\n");
-       lprintf(CTDL_NOTICE,
+       CtdlLogPrintf(CTDL_NOTICE,
+               "Copyright (C) 1987-2008 by the Citadel development team.\n");
+       CtdlLogPrintf(CTDL_NOTICE,
                "This program is distributed under the terms of the GNU "
                "General Public License.\n");
-       lprintf(CTDL_NOTICE, "\n");
-       lprintf(CTDL_DEBUG, "Called as: %s\n", argv[0]);
-       lprintf(CTDL_INFO, "%s\n", libcitadel_version_string());
+       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 */
-       lprintf(CTDL_INFO, "Loading citadel.config\n");
+       CtdlLogPrintf(CTDL_INFO, "Loading citadel.config\n");
        get_config();
        config.c_ipgm_secret = rand();
        put_config();
@@ -231,11 +228,15 @@ int main(int argc, char **argv)
        /* 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));
-#else
+#else // SOLARIS_GETPWUID
                getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
-#endif
+#endif // SOLARIS_GETPWUID
+#else // HAVE_GETPWUID_R
+               pwp = NULL;
+#endif // HAVE_GETPWUID_R
                mkdir(ctdl_run_dir, 0755);
                chown(ctdl_run_dir, config.c_ctdluid, (pwp==NULL)?-1:pw.pw_gid);
        }
@@ -251,7 +252,7 @@ int main(int argc, char **argv)
         */
        master_startup();
 
-       lprintf(CTDL_INFO, "Acquiring control record\n");
+       CtdlLogPrintf(CTDL_INFO, "Acquiring control record\n");
        get_control();
 
        /*
@@ -274,10 +275,18 @@ int main(int argc, char **argv)
                                do_async_loop,
                                CitadelServiceTCP);
 
+                               
+       /*
+        * Run any upgrade entry points
+        */
+       CtdlLogPrintf(CTDL_INFO, "Upgrading modules.\n");
+       upgrade_modules();
+       
+       
        /*
         * Load any server-side extensions available here.
         */
-       lprintf(CTDL_INFO, "Initializing server extensions\n");
+       CtdlLogPrintf(CTDL_INFO, "Initializing server extensions\n");
        size = strlen(ctdl_home_directory) + 9;
        
        initialise_modules(0);
@@ -287,7 +296,7 @@ int main(int argc, char **argv)
        /*
         * If we need host auth, start our chkpwd daemon.
         */
-       if (config.c_auth_mode == 1) {
+       if (config.c_auth_mode == AUTHMODE_HOST) {
                start_chkpwd_daemon();
        }
 
@@ -298,24 +307,29 @@ int main(int argc, char **argv)
        if (drop_root_perms) {
                cdb_chmod_data();       /* make sure we own our data files */
 
+#ifdef HAVE_GETPWUID_R
 #ifdef SOLARIS_GETPWUID
                pwp = getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf));
-#else
+#else // SOLARIS_GETPWUID
                getpwuid_r(config.c_ctdluid, &pw, pwbuf, sizeof(pwbuf), &pwp);
-#endif
+#endif // SOLARIS_GETPWUID
+#else // HAVE_GETPWUID_R
+               pwp = NULL;
+#endif // HAVE_GETPWUID_R
+
                if (pwp == NULL)
-                       lprintf(CTDL_CRIT, "WARNING: getpwuid(%ld): %s\n"
+                       CtdlLogPrintf(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,
+                               CtdlLogPrintf(CTDL_CRIT, "setgid(%ld): %s\n", (long)pw.pw_gid,
                                        strerror(errno));
                }
-               lprintf(CTDL_INFO, "Changing uid to %ld\n", (long)CTDLUID);
+               CtdlLogPrintf(CTDL_INFO, "Changing uid to %ld\n", (long)CTDLUID);
                if (setuid(CTDLUID) != 0) {
-                       lprintf(CTDL_CRIT, "setuid() failed: %s\n", strerror(errno));
+                       CtdlLogPrintf(CTDL_CRIT, "setuid() failed: %s\n", strerror(errno));
                }
 #if defined (HAVE_SYS_PRCTL_H) && defined (PR_SET_DUMPABLE)
                prctl(PR_SET_DUMPABLE, 1);
@@ -331,103 +345,3 @@ int main(int argc, char **argv)
        master_cleanup(exit_signal);
        return(0);
 }
-
-
-
-void go_threading(void)
-{
-       int i;
-       struct CtdlThreadNode *last_worker;
-       
-       /* We can't use CT_PUSH() here so we do it the long way 
-        * So we can still use CT for current thread */
-       struct CtdlThreadNode *_this_cit_thread;
-       
-       /*
-        * Initialise the thread system
-        */
-       ctdl_thread_internal_init();
-       _this_cit_thread = CtdlThreadSelf();
-       /*
-        * Now create a bunch of worker threads.
-        */
-       CtdlLogPrintf(CTDL_DEBUG, "Starting %d worker threads\n", config.c_min_workers);
-       begin_critical_section(S_THREAD_LIST);
-       i=0;    /* Always start at least 1 worker thread */
-       do
-       {
-               ctdl_internal_create_thread("Worker Thread", CTDLTHREAD_BIGSTACK + CTDLTHREAD_WORKER, worker_thread, NULL);
-       } while (++i < config.c_min_workers);
-       end_critical_section(S_THREAD_LIST);
-
-       /* Second call to module init functions now that threading is up */
-       initialise_modules(1);
-
-       /*
-        * This thread is now used for garbage collection of other threads in the thread list
-        */
-       CtdlLogPrintf(CTDL_INFO, "Startup thread %d becoming garbage collector,\n", pthread_self());
-
-       /*
-        * We do a lot of locking and unlocking of the thread list in here.
-        * We do this so that we can repeatedly release time for other threads
-        * that may be waiting on the thread list.
-        * We are a low priority thread so we can afford to do this
-        */
-       
-       while (CtdlThreadGetCount())
-       {
-               if (exit_signal)
-                       CtdlThreadStopAll();
-               check_sched_shutdown();
-               begin_critical_section(S_THREAD_LIST);
-               ctdl_thread_internal_calc_loadavg();
-               end_critical_section(S_THREAD_LIST);
-       
-               /* Reduce the size of the worker thread pool if necessary. */
-               if ((CtdlThreadGetWorkers() > config.c_min_workers) && (CtdlThreadWorkerAvg < 20))
-               {
-                       /* Ask a worker thread to stop as we no longer need it */
-                       begin_critical_section(S_THREAD_LIST);
-                       last_worker = CtdlThreadList;
-                       while (last_worker)
-                       {
-                               if (last_worker->flags & CTDLTHREAD_WORKER && last_worker->state > CTDL_THREAD_STOPPING)
-                                       break;
-                               else
-                                       last_worker = last_worker->next;
-                       }
-                       end_critical_section(S_THREAD_LIST);
-                       if (last_worker)
-                       {
-#ifdef WITH_THREADLOG
-                               CtdlLogPrintf(CTDL_DEBUG, "Thread system, stopping excess worker thread \"%s\" (%ld).\n",
-                                       last_worker->name,
-                                       last_worker->tid
-                                       );
-#endif
-                               CtdlThreadStop(last_worker);
-//                             ctdl_thread_internal_change_state (last_worker, CTDL_THREAD_STOP_REQ);
-//                             pthread_mutex_lock(&last_worker->ThreadMutex);
-//                             pthread_cond_signal(&last_worker->ThreadCond);
-//                             pthread_mutex_unlock(&last_worker->ThreadMutex);
-                       }
-               }
-       
-               
-               CtdlThreadSleep(1);
-               begin_critical_section(S_THREAD_LIST);
-               ctdl_internal_thread_gc();
-               end_critical_section(S_THREAD_LIST);
-               if (CtdlThreadGetCount() <= 1) // Shutting down clean up the garbage collector
-               {
-                       begin_critical_section(S_THREAD_LIST);
-                       ctdl_internal_thread_gc();
-                       end_critical_section(S_THREAD_LIST);
-               }
-       }
-       /*
-        * If the above loop exits we must be shutting down since we obviously have no threads
-        */
-       ctdl_thread_internal_cleanup();
-}