]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Set CTDLEXIT_SHUTDOWN value to 0
[citadel.git] / citadel / sysdep.c
index 995742b40d834cb379c886740128f965579126cb..ac654ac52c1d171e06b19b1c572cb3426f11a6cb 100644 (file)
@@ -566,13 +566,17 @@ static unsigned on = 1, off = 0;
 
 void buffer_output(void) {
 #ifdef HAVE_TCP_BUFFERING
-       setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
+       if (!CC->redirect_ssl) {
+               setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
+       }
 #endif
 }
 
 void unbuffer_output(void) {
 #ifdef HAVE_TCP_BUFFERING
-       setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
+       if (!CC->redirect_ssl) {
+               setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
+       }
 #endif
 }
 
@@ -896,6 +900,9 @@ void graceful_shutdown(int signum) {
        exit(0);
 }
 
+int nFireUps = 0;
+int nFireUpsNonRestart = 0;
+pid_t ForkedPid = 1;
 
 /*
  * Start running as a daemon.
@@ -951,31 +958,40 @@ void start_daemon(int unused) {
                        }
                        waitpid(current_child, &status, 0);
                }
-
                do_restart = 0;
-
+               nFireUpsNonRestart = nFireUps;
                /* Did the main process exit with an actual exit code? */
                if (WIFEXITED(status)) {
+               
+                       CtdlLogPrintf(CTDL_DEBUG, "\e[31m WIFEXITED! \e[0m\n");
 
                        /* Exit code 0 means the watcher should exit */
-                       if (WEXITSTATUS(status) == 0) {
+                       if (WEXITSTATUS(status) == CTDLEXIT_SHUTDOWN) {
+                               CtdlLogPrintf(CTDL_DEBUG, "\e[31m CTDLEXIT_SHUTDOWN \e[0m\n");
                                do_restart = 0;
                        }
 
                        /* Exit code 101-109 means the watcher should exit */
                        else if ( (WEXITSTATUS(status) >= 101) && (WEXITSTATUS(status) <= 109) ) {
+                               CtdlLogPrintf(CTDL_DEBUG, "\e[31m CTDLEXIT NO RESTART \e[0m\n");
                                do_restart = 0;
                        }
 
                        /* Any other exit code means we should restart. */
                        else {
+                               CtdlLogPrintf(CTDL_DEBUG, "\e[31m ANY OTHER EXIT CODE \e[0m\n");
                                do_restart = 1;
+                               nFireUps++;
+                               ForkedPid = current_child;
                        }
                }
 
                /* Any other type of termination (signals, etc.) should also restart. */
                else {
+                       CtdlLogPrintf(CTDL_DEBUG, "\e[31m NON-EXIT TERMINATION \e[0m\n");
                        do_restart = 1;
+                       nFireUps++;
+                       ForkedPid = current_child;
                }
 
        } while (do_restart);
@@ -986,6 +1002,28 @@ void start_daemon(int unused) {
 
 
 
+void checkcrash(void)
+{
+       if (nFireUpsNonRestart != nFireUps)
+       {
+               StrBuf *CrashMail;
+
+               CrashMail = NewStrBuf();
+               CtdlLogPrintf (CTDL_ALERT, "----------------sending crash mail\n");
+               StrBufPrintf(CrashMail, 
+                            "Your CitServer is just recovering from an unexpected termination.\n"
+                            " this maybe the result of an error in citserver or an external influence.\n"
+                            " You can get more information on this by enabling coredumping; for more information see\n"
+                            " http://citadel.org/doku.php/faq:mastering_your_os:gdb#how.do.i.make.my.system.produce.core-files\n"
+                            " If you already did, the file you're looking for most probably is %score.%d\n"
+                            " Yours faithfully...",
+                            ctdl_run_dir, ForkedPid);
+               aide_message(ChrPtr(CrashMail), "Citadel server crashed.");
+               FreeStrBuf(&CrashMail);
+       }
+}
+
+
 /*
  * Generic routine to convert a login name to a full name (gecos)
  * Returns nonzero if a conversion took place