]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* Rewrote vCtdlLogPrintf() to NOT use any buffers at all, only v*printf() type functi...
[citadel.git] / citadel / sysdep.c
index 41bc7d0e79113d62149535ba6e8fe8a0d20becc0..9dce3a3ae0a94c973a897e31407417fcdb1a8c53 100644 (file)
@@ -49,6 +49,7 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <grp.h>
+#define SHOW_ME_VAPPEND_PRINTF
 #include <libcitadel.h>
 #include "citadel.h"
 #include "server.h"
@@ -92,7 +93,7 @@ int verbosity = DEFAULT_VERBOSITY;            /* Logging level */
 
 int syslog_facility = LOG_DAEMON;
 int enable_syslog = 0;
-
+int print_to_logfile = 1;
 
 /*
  * CtdlLogPrintf()  ...   Write logging information
@@ -106,14 +107,13 @@ void CtdlLogPrintf(enum LogLevel loglevel, const char *format, ...) {
 
 void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr)
 {
-       char buf[SIZ], buf2[SIZ];
 
        if (enable_syslog) {
                vsyslog((syslog_facility | loglevel), format, arg_ptr);
        }
 
        /* stderr output code */
-       if (enable_syslog || running_as_daemon) return;
+       if (enable_syslog || !print_to_logfile) return;
 
        /* if we run in forground and syslog is disabled, log to terminal */
        if (loglevel <= verbosity) { 
@@ -121,28 +121,45 @@ void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr)
                struct tm tim;
                time_t unixtime;
                CitContext *CCC = CC;
+               ThreadTSD *cTSD = CTP;
+               CtdlThreadNode *node = NULL;
+               long lwpid = 0;
+
+               if (cTSD != NULL) {
+                       node = cTSD->self;
+               }
+
+               if ((node != NULL) && (node->reltid != 0)) {
+                       lwpid = node->reltid;
+               }
 
                gettimeofday(&tv, NULL);
+
                /* Promote to time_t; types differ on some OSes (like darwin) */
                unixtime = tv.tv_sec;
                localtime_r(&unixtime, &tim);
-               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,
-                               CCC->cs_pid);
-               } else {
-                       sprintf(buf,
-                               "%04d/%02d/%02d %2d:%02d:%02d.%06ld ",
-                               tim.tm_year + 1900, tim.tm_mon + 1,
-                               tim.tm_mday, tim.tm_hour, tim.tm_min,
-                               tim.tm_sec, (long)tv.tv_usec);
+
+               fprintf(stderr,
+                       "%04d/%02d/%02d %2d:%02d:%02d.%06ld ",
+                       tim.tm_year + 1900, tim.tm_mon + 1,
+                       tim.tm_mday, tim.tm_hour, tim.tm_min,
+                       tim.tm_sec, (long)tv.tv_usec
+               );
+
+               if (lwpid != 0) {
+                       fprintf(stderr, "[LWP:%ld] ", lwpid);
+               }
+                       
+               if (CCC != NULL) {
+                       if (CCC->cs_pid != 0) {
+                               fprintf(stderr, "[%3d] ", CCC->cs_pid);
+                       }
+                       else if (CCC->user.usernum != 0) {
+                               fprintf(stderr, "[:%ld] ", CCC->user.usernum);
+                       }
                }
-               vsnprintf(buf2, SIZ, format, arg_ptr);   
 
-               fprintf(stderr, "%s%s", buf, buf2);
+               vfprintf(stderr, format, arg_ptr);   
                fflush(stderr);
        }
 }   
@@ -213,22 +230,22 @@ void init_sysdep(void) {
         * call signal_cleanup() to gracefully shut down the server.
         */
        sigemptyset(&set);
-       sigaddset(&set, SIGINT);
-       sigaddset(&set, SIGQUIT);
+       sigaddset(&set, SIGINT);                // intr = shutdown
+       // sigaddset(&set, SIGQUIT);            // quit = force quit
        sigaddset(&set, SIGHUP);
        sigaddset(&set, SIGTERM);
-       // sigaddset(&set, SIGSEGV);    commented out because
-       // sigaddset(&set, SIGILL);     we want core dumps
+       // sigaddset(&set, SIGSEGV);            // we want core dumps
+       // sigaddset(&set, SIGILL);             // we want core dumps
        // sigaddset(&set, SIGBUS);
        sigprocmask(SIG_UNBLOCK, &set, NULL);
 
-       signal(SIGINT, signal_cleanup);
-       signal(SIGQUIT, signal_cleanup);
+       signal(SIGINT, signal_cleanup);         // intr = shutdown
+       // signal(SIGQUIT, signal_cleanup);     // quit = force quit
        signal(SIGHUP, signal_cleanup);
        signal(SIGTERM, signal_cleanup);
        signal(SIGUSR2, signal_exit);
-       // signal(SIGSEGV, signal_cleanup);     commented out because
-       // signal(SIGILL, signal_cleanup);      we want core dumps
+       // signal(SIGSEGV, signal_cleanup);     // we want coredumps
+       // signal(SIGILL, signal_cleanup);      // we want core dumps
        // signal(SIGBUS, signal_cleanup);
 
        /*
@@ -621,6 +638,67 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout)
        return retval;
 }
 
+
+/*
+ * to make client_read_random_blob() more efficient, increase buffer size.
+ * just use in greeting function, else your buffer may be flushed
+ */
+void client_set_inbound_buf(long N)
+{
+       FlushStrBuf(CC->ReadBuf);
+       ReAdjustEmptyBuf(CC->ReadBuf, N * SIZ, N * SIZ);
+}
+
+int client_read_random_blob(StrBuf *Target, int timeout)
+{
+       CitContext *CCC=CC;
+       int rc;
+
+       rc =  client_read_blob(Target, 1, timeout);
+       if (rc > 0)
+       {
+               long len;
+               const char *pch;
+               
+               len = StrLength(CCC->ReadBuf);
+               pch = ChrPtr(CCC->ReadBuf);
+
+               if (len > 0)
+               {
+                       if (CCC->Pos != NULL) {
+                               len -= CCC->Pos - pch;
+                               pch = CCC->Pos;
+                       }
+                       StrBufAppendBufPlain(Target, pch, len, 0);
+                       FlushStrBuf(CCC->ReadBuf);
+                       CCC->Pos = NULL;
+#ifdef BIGBAD_IODBG
+                       {
+                               int rv = 0;
+                               char fn [SIZ];
+                               FILE *fd;
+                       
+                               snprintf(fn, SIZ, "/tmp/foolog_%s.%d", CCC->ServiceName, CCC->cs_pid);
+                       
+                               fd = fopen(fn, "a+");
+                               fprintf(fd, "Read: BufSize: %d BufContent: [",
+                                       StrLength(Target));
+                               rv = fwrite(ChrPtr(Target), StrLength(Target), 1, fd);
+                               fprintf(fd, "]\n");
+                       
+                       
+                               fclose(fd);
+                       }
+#endif
+       
+                       return StrLength(Target);
+               }
+               return rc;
+       }
+       else
+               return rc;
+}
+
 int client_read_to(char *buf, int bytes, int timeout)
 {
        CitContext *CCC=CC;
@@ -1253,6 +1331,10 @@ void *select_on_master (void *arg)
        int m;
        int i;
        int retval;
+       struct CitContext select_on_master_CC;
+
+       CtdlFillSystemContext(&select_on_master_CC, "select_on_master");
+       citthread_setspecific(MyConKey, (void *)&select_on_master_CC);
 
        while (!CtdlThreadCheckStop()) {
                /* Initialize the fdset. */
@@ -1356,6 +1438,8 @@ void *select_on_master (void *arg)
                        }
                }
        }
+       CtdlClearSystemContext();
+
        return NULL;
 }