]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Found and removed a large section of the old LDAP connector.
[citadel.git] / citadel / sysdep.c
index 995742b40d834cb379c886740128f965579126cb..c06575888d9aead47d8f2c3298fdad465b3ae64b 100644 (file)
@@ -171,18 +171,19 @@ void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr)
                struct timeval tv;
                struct tm tim;
                time_t unixtime;
+               struct CitContext *CCC = CC;
 
                gettimeofday(&tv, NULL);
                /* Promote to time_t; types differ on some OSes (like darwin) */
                unixtime = tv.tv_sec;
                localtime_r(&unixtime, &tim);
-               if (CC->cs_pid != 0) {
+               if ((CCC != NULL) && (CCC->cs_pid != 0)) {
                        sprintf(buf,
                                "%04d/%02d/%02d %2d:%02d:%02d.%06ld [%3d] ",
                                tim.tm_year + 1900, tim.tm_mon + 1,
                                tim.tm_mday, tim.tm_hour, tim.tm_min,
                                tim.tm_sec, (long)tv.tv_usec,
-                               CC->cs_pid);
+                               CCC->cs_pid);
                } else {
                        sprintf(buf,
                                "%04d/%02d/%02d %2d:%02d:%02d.%06ld ",
@@ -375,6 +376,9 @@ int ig_uds_server(char *sockpath, int queue_len, char **errormessage)
        int s;
        int i;
        int actual_queue_len;
+#ifdef HAVE_STRUCT_UCRED
+       int passcred = 1;
+#endif
 
        actual_queue_len = queue_len;
        if (actual_queue_len < 5) actual_queue_len = 5;
@@ -431,6 +435,10 @@ int ig_uds_server(char *sockpath, int queue_len, char **errormessage)
                return(-1);
        }
 
+#ifdef HAVE_STRUCT_UCRED
+       setsockopt(s, SOL_SOCKET, SO_PASSCRED, &passcred, sizeof(passcred));
+#endif
+
        chmod(sockpath, S_ISGID|S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH);
        return(s);
 }
@@ -566,13 +574,19 @@ static unsigned on = 1, off = 0;
 
 void buffer_output(void) {
 #ifdef HAVE_TCP_BUFFERING
-       setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &on, 4);
+#ifdef HAVE_OPENSSL
+       if (!CC->redirect_ssl)
+#endif
+               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);
+#ifdef HAVE_OPENSSL
+       if (!CC->redirect_ssl)
+#endif
+               setsockopt(CC->client_socket, IPPROTO_TCP, TCP_CORK, &off, 4);
 #endif
 }
 
@@ -864,7 +878,6 @@ void sysdep_master_cleanup(void) {
        CtdlDestroySessionHooks();
        CtdlDestroyServiceHook();
        CtdlDestroyRoomHooks();
-       CtdlDestroyDirectoryServiceFuncs();
        #ifdef HAVE_BACKTRACE
        eCrash_Uninit();
        #endif
@@ -896,6 +909,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 +967,24 @@ void start_daemon(int unused) {
                        }
                        waitpid(current_child, &status, 0);
                }
-
                do_restart = 0;
+               nFireUpsNonRestart = nFireUps;
+               
+               /* Exit code 0 means the watcher should exit */
+               if (WIFEXITED(status) && (WEXITSTATUS(status) == CTDLEXIT_SHUTDOWN)) {
+                       do_restart = 0;
+               }
 
-               /* Did the main process exit with an actual exit code? */
-               if (WIFEXITED(status)) {
-
-                       /* Exit code 0 means the watcher should exit */
-                       if (WEXITSTATUS(status) == 0) {
-                               do_restart = 0;
-                       }
-
-                       /* Exit code 101-109 means the watcher should exit */
-                       else if ( (WEXITSTATUS(status) >= 101) && (WEXITSTATUS(status) <= 109) ) {
-                               do_restart = 0;
-                       }
-
-                       /* Any other exit code means we should restart. */
-                       else {
-                               do_restart = 1;
-                       }
+               /* Exit code 101-109 means the watcher should exit */
+               else if (WIFEXITED(status) && (WEXITSTATUS(status) >= 101) && (WEXITSTATUS(status) <= 109)) {
+                       do_restart = 0;
                }
 
-               /* Any other type of termination (signals, etc.) should also restart. */
+               /* Any other exit code, or no exit code, means we should restart. */
                else {
                        do_restart = 1;
+                       nFireUps++;
+                       ForkedPid = current_child;
                }
 
        } while (do_restart);
@@ -986,6 +995,32 @@ void start_daemon(int unused) {
 
 
 
+void checkcrash(void)
+{
+       if (nFireUpsNonRestart != nFireUps)
+       {
+               StrBuf *CrashMail;
+
+               CrashMail = NewStrBuf();
+               CtdlLogPrintf(CTDL_ALERT, "Posting crash message\n");
+               StrBufPrintf(CrashMail, 
+                       " \n"
+                       " The Citadel server process (citserver) terminated unexpectedly."
+                       "\n \n"
+                       " This could be the result of a bug in the server program, or some external "
+                       "factor.  You can obtain more information about this by enabling core dumps. "
+                       "For more information, please see: "
+                       "http://citadel.org/doku.php/faq:mastering_your_os:gdb#how.do.i.make.my.system.produce.core-files"
+                       "\n \n"
+                       " If you have already done this, the core dump is likely to be found at %score.%d\n"
+                       ,
+                       ctdl_run_dir, ForkedPid);
+               aide_message(ChrPtr(CrashMail), "Citadel server process terminated unexpectedly");
+               FreeStrBuf(&CrashMail);
+       }
+}
+
+
 /*
  * Generic routine to convert a login name to a full name (gecos)
  * Returns nonzero if a conversion took place