]> code.citadel.org Git - citadel.git/blobdiff - webcit/webserver.c
* Allow the '-S' command line option, so the cipher suites can be specified without...
[citadel.git] / webcit / webserver.c
index 31025cf2b347d881843a35e2696ff356f0c5a8fd..064031ff36a9805d78f880ed888423287551e514 100644 (file)
@@ -28,7 +28,7 @@ int follow_xff = 0;           /* Follow X-Forwarded-For: header */
 int home_specified = 0;                /* did the user specify a homedir? */
 int time_to_die = 0;            /* Nonzero if server is shutting down */
 int DisableGzip = 0;
-extern void *context_loop(int*);
+extern void *context_loop(ParsedHttpHdrs *Hdr);
 extern void *housekeeping_loop(void);
 extern pthread_mutex_t SessionListMutex;
 extern pthread_key_t MyConKey;
@@ -99,11 +99,10 @@ void graceful_shutdown_watcher(int signum) {
  */
 pid_t current_child;
 void graceful_shutdown(int signum) {
-       char wd[SIZ];
        FILE *FD;
        int fd;
-       getcwd(wd, SIZ);
-       lprintf (1, "bye going down gracefull.[%d][%s]\n", signum, wd);
+
+       lprintf (1, "WebCit is being shut down on signal %d.\n", signum);
        fd = msock;
        msock = -1;
        time_to_die = 1;
@@ -123,6 +122,8 @@ void start_daemon(char *pid_file)
        pid_t child = 0;
        FILE *fp;
        int do_restart = 0;
+       int rv;
+       FILE *rvfp = NULL;
 
        current_child = 0;
 
@@ -130,7 +131,7 @@ void start_daemon(char *pid_file)
         * We don't just call close() because we don't want these fd's
         * to be reused for other files.
         */
-       chdir("/");
+       rv = chdir("/");
 
        signal(SIGHUP, SIG_IGN);
        signal(SIGINT, SIG_IGN);
@@ -143,9 +144,9 @@ void start_daemon(char *pid_file)
 
        setsid();
        umask(0);
-       freopen("/dev/null", "r", stdin);
-       freopen("/dev/null", "w", stdout);
-       freopen("/dev/null", "w", stderr);
+       rvfp = freopen("/dev/null", "r", stdin);
+       rvfp = freopen("/dev/null", "w", stdout);
+       rvfp = freopen("/dev/null", "w", stderr);
        signal(SIGTERM, graceful_shutdown_watcher);
        signal(SIGHUP, graceful_shutdown_watcher);
 
@@ -219,16 +220,15 @@ void spawn_another_worker_thread()
        pthread_attr_t attr;    /* Thread attributes */
        int ret;
 
-       lprintf(3, "Creating a new thread\n");
+       lprintf(3, "Creating a new thread.  Pool size is now %d\n", ++num_threads);
 
        /* set attributes for the new thread */
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
        /*
-        * Our per-thread stacks need to be bigger than the default size, otherwise
-        * the MIME parser crashes on FreeBSD, and the IMAP service crashes on
-        * 64-bit Linux.
+        * Our per-thread stacks need to be bigger than the default size,
+        * otherwise the MIME parser crashes on FreeBSD.
         */
        if ((ret = pthread_attr_setstacksize(&attr, 1024 * 1024))) {
                lprintf(1, "pthread_attr_setstacksize: %s\n",
@@ -262,6 +262,7 @@ extern int LoadTemplates;
 extern HashList *HandlerHash;
 
 
+
 void
 webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdir, char *relhome)
 {
@@ -286,6 +287,9 @@ webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdi
        COMPUTE_DIRECTORY(static_icon_dir);
        basedir=WWWDIR "/static.local";
        COMPUTE_DIRECTORY(static_local_dir);
+       StripSlashes(static_dir, 1);
+       StripSlashes(static_icon_dir, 1);
+       StripSlashes(static_local_dir, 1);
 
        snprintf(file_crpt_file_key,
                 sizeof file_crpt_file_key, 
@@ -324,13 +328,10 @@ int main(int argc, char **argv)
        char webcitdir[PATH_MAX] = DATADIR;
        char *pidfile = NULL;
        char *hdir;
-       const char *basedir;
-#ifdef ENABLE_NLS
-       char *locale = NULL;
-       char *mo = NULL;
-#endif /* ENABLE_NLS */
+       const char *basedir = NULL;
        char uds_listen_path[PATH_MAX]; /* listen on a unix domain socket? */
        const char *I18nDumpFile = NULL;
+       FILE *rvfp = NULL;
 
        WildFireInitBacktrace(argv[0], 2);
 
@@ -353,7 +354,7 @@ int main(int argc, char **argv)
 
        /* Parse command line */
 #ifdef HAVE_OPENSSL
-       while ((a = getopt(argc, argv, "h:i:p:t:T:B:x:dD:G:cfsZ")) != EOF)
+       while ((a = getopt(argc, argv, "h:i:p:t:T:B:x:dD:G:cfsS:Z")) != EOF)
 #else
        while ((a = getopt(argc, argv, "h:i:p:t:T:B:x:dD:G:cfZ")) != EOF)
 #endif
@@ -361,11 +362,12 @@ int main(int argc, char **argv)
                case 'h':
                        hdir = strdup(optarg);
                        relh=hdir[0]!='/';
-                       if (!relh) safestrncpy(webcitdir, hdir,
-                                                                  sizeof webcitdir);
-                       else
-                               safestrncpy(relhome, relhome,
-                                                       sizeof relhome);
+                       if (!relh) {
+                               safestrncpy(webcitdir, hdir, sizeof webcitdir);
+                       }
+                       else {
+                               safestrncpy(relhome, relhome, sizeof relhome);
+                       }
                        /* free(hdir); TODO: SHOULD WE DO THIS? */
                        home_specified = 1;
                        home=1;
@@ -393,9 +395,9 @@ int main(int argc, char **argv)
                        break;
                case 't':
                        safestrncpy(tracefile, optarg, sizeof tracefile);
-                       freopen(tracefile, "w", stdout);
-                       freopen(tracefile, "w", stderr);
-                       freopen(tracefile, "r", stdin);
+                       rvfp = freopen(tracefile, "w", stdout);
+                       rvfp = freopen(tracefile, "w", stderr);
+                       rvfp = freopen(tracefile, "r", stdin);
                        break;
                case 'T':
                        LoadTemplates = atoi(optarg);
@@ -426,9 +428,15 @@ int main(int argc, char **argv)
                                }
                        }
                        break;
+#ifdef HAVE_OPENSSL
                case 's':
                        is_https = 1;
                        break;
+               case 'S':
+                       is_https = 1;
+                       ssl_cipher_list = strdup(optarg);
+                       break;
+#endif
                case 'G':
                        DumpTemplateI18NStrings = 1;
                        I18nDump = NewStrBufPlain(HKEY("int templatestrings(void)\n{\n"));
@@ -441,7 +449,7 @@ int main(int argc, char **argv)
                                "[-T Templatedebuglevel] "
                                "[-d] [-Z] [-G i18ndumpfile] "
 #ifdef HAVE_OPENSSL
-                               "[-s] "
+                               "[-s] [-S cipher_suites]"
 #endif
                                "[remotehost [remoteport]]\n");
                        return 1;
@@ -473,18 +481,6 @@ int main(int argc, char **argv)
 
 
        /* initialize the International Bright Young Thing */
-#ifdef ENABLE_NLS
-       initialize_locales();
-
-
-       locale = setlocale(LC_ALL, "");
-
-       mo = malloc(strlen(webcitdir) + 20);
-       lprintf(9, "Message catalog directory: %s\n", bindtextdomain("webcit", LOCALEDIR"/locale"));
-       free(mo);
-       lprintf(9, "Text domain: %s\n", textdomain("webcit"));
-       lprintf(9, "Text domain Charset: %s\n", bind_textdomain_codeset("webcit","UTF8"));
-#endif
 
        initialise_modules();
        initialize_viewdefs();
@@ -598,9 +594,6 @@ void ShutDownWebcit(void)
        icalmemory_free_ring ();
        ShutDownLibCitadel ();
        shutdown_modules ();
-#ifdef ENABLE_NLS
-       ShutdownLocale();
-#endif
 #ifdef HAVE_OPENSSL
        if (is_https) {
                shutdown_ssl();
@@ -619,7 +612,11 @@ void worker_entry(void)
        int ret;
        struct timeval tv;
        fd_set readset, tempset;
+       ParsedHttpHdrs Hdr;
 
+       memset(&Hdr, 0, sizeof(ParsedHttpHdrs));
+       Hdr.HR.eReqType = eGET;
+       http_new_modules(&Hdr); 
        tv.tv_sec = 0;
        tv.tv_usec = 10000;
        FD_ZERO(&readset);
@@ -668,6 +665,7 @@ void worker_entry(void)
                        end_critical_section(S_SHUTDOWN);
                        if (shutdown == 1)
                        {/* we're the one to cleanup the mess. */
+                               http_destroy_modules(&Hdr);
                                lprintf(2, "I'm master shutdown: tagging sessions to be killed.\n");
                                shutdown_sessions();
                                lprintf(2, "master shutdown: waiting for others\n");
@@ -718,9 +716,6 @@ void worker_entry(void)
 #endif
 
                        if (fail_this_transaction == 0) {
-                               ParsedHttpHdrs Hdr;
-                               memset(&Hdr, 0, sizeof(ParsedHttpHdrs));
-                               Hdr.HR.eReqType = eGET;
                                Hdr.http_sock = ssock;
 
                                /* Perform an HTTP transaction... */
@@ -736,12 +731,15 @@ void worker_entry(void)
                                /* ...and close the socket. */
                                if (Hdr.http_sock > 0)
                                        lingering_close(ssock);
+                               http_detach_modules(&Hdr);
+
                        }
 
                }
 
        } while (!time_to_die);
 
+       http_destroy_modules(&Hdr);
        lprintf (1, "bye\n");
        pthread_exit(NULL);
 }