]> code.citadel.org Git - citadel.git/blobdiff - citadel/sysdep.c
* by counting up threads starting at 3, we seem to get what top shows in the LWPID...
[citadel.git] / citadel / sysdep.c
index a0b27a46e336b981822dc891972f37fae8426d50..a935c410b00cb38125697616b80fa8fc21467ab9 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"
@@ -106,7 +107,6 @@ 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);
@@ -120,30 +120,78 @@ void vCtdlLogPrintf(enum LogLevel loglevel, const char *format, va_list arg_ptr)
                struct timeval tv;
                struct tm tim;
                time_t unixtime;
+               StrBuf *lBuf;
                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->pid + 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);
+
+               if (CCC != NULL)
+                       lBuf = CCC->lBuf;
+               else 
+                       lBuf = NewStrBuf();
+               if (lBuf == NULL) {
+                       char buf[SIZ], buf2[SIZ];
+                       
+                       if ((CCC != NULL) && (CCC->cs_pid != 0)) {
+                               sprintf(buf,
+                                       "%04d/%02d/%02d %2d:%02d:%02d.%06ld xx [%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 xx ",
+                                       tim.tm_year + 1900, tim.tm_mon + 1,
+                                       tim.tm_mday, tim.tm_hour, tim.tm_min,
+                                       tim.tm_sec, (long)tv.tv_usec);
+                       }
+                       vsnprintf(buf2, SIZ, format, arg_ptr);   
+
+                       fprintf(stderr, "%s%s", buf, buf2);
                }
-               vsnprintf(buf2, SIZ, format, arg_ptr);   
+               else {
+                       StrBufPrintf(lBuf,
+                                    "%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, "%s%s", buf, buf2);
+                       
+                       if (lwpid != 0)
+                               StrBufAppendPrintf(lBuf,
+                                                  "[LWP:%d] ",
+                                                  lwpid);
+                               
+                       if (CCC != NULL) {
+                               if (CCC->cs_pid != 0)
+                                       StrBufAppendPrintf(lBuf,
+                                                          "[%3d] ",
+                                                          CCC->cs_pid);
+                               else if (CCC->user.usernum != 0)
+                                       StrBufAppendPrintf(lBuf,
+                                                          "[:%d] ",
+                                                          CCC->user.usernum);
+                       }
+                       StrBufVAppendPrintf(lBuf, format, arg_ptr);   
+                       fwrite(ChrPtr(lBuf), 1, StrLength(lBuf), stderr);
+               }
                fflush(stderr);
+               if (CCC == NULL) FreeStrBuf(&lBuf);
+
        }
 }   
 
@@ -169,6 +217,10 @@ static RETSIGTYPE signal_cleanup(int signum) {
        }
 }
 
+static RETSIGTYPE signal_exit(int signum) {
+       exit(1);
+}
+
 
 
 /*
@@ -209,21 +261,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(SIGSEGV, signal_cleanup);     commented out because
-       // signal(SIGILL, signal_cleanup);      we want core dumps
+       signal(SIGUSR2, signal_exit);
+       // signal(SIGSEGV, signal_cleanup);     // we want coredumps
+       // signal(SIGILL, signal_cleanup);      // we want core dumps
        // signal(SIGBUS, signal_cleanup);
 
        /*
@@ -436,6 +489,7 @@ void flush_output(void) {
 #endif
 }
 
+/*
 static void flush_client_inbuf(void)
 {
        CitContext *CCC=CC;
@@ -444,6 +498,7 @@ static void flush_client_inbuf(void)
        CCC->Pos = NULL;
 
 }
+*/
 
 /*
  * client_write()   ...    Send binary data to the client.
@@ -459,17 +514,13 @@ int client_write(const char *buf, int nbytes)
        CitContext *Ctx;
        int fdflags;
 
+       if (nbytes < 1) return(0);
+
 //     flush_client_inbuf();
        Ctx = CC;
        if (Ctx->redirect_buffer != NULL) {
-               if ((Ctx->redirect_len + nbytes + 2) >= Ctx->redirect_alloc) {
-                       Ctx->redirect_alloc = (Ctx->redirect_alloc * 2) + nbytes;
-                       Ctx->redirect_buffer = realloc(Ctx->redirect_buffer,
-                                               Ctx->redirect_alloc);
-               }
-               memcpy(&Ctx->redirect_buffer[Ctx->redirect_len], buf, nbytes);
-               Ctx->redirect_len += nbytes;
-               Ctx->redirect_buffer[Ctx->redirect_len] = 0;
+               StrBufAppendBufPlain(Ctx->redirect_buffer,
+                                    buf, nbytes, 0);
                return 0;
        }
 
@@ -570,10 +621,15 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout)
 #ifdef HAVE_OPENSSL
        if (CCC->redirect_ssl) {
                retval = client_read_sslblob(Target, bytes, timeout);
+               if (retval < 0) {
+                       CtdlLogPrintf(CTDL_CRIT, 
+                                     "%s failed\n",
+                                     __FUNCTION__);
+               }
        }
        else 
 #endif
-
+       {
                retval = StrBufReadBLOBBuffered(Target, 
                                                CCC->ReadBuf,
                                                &CCC->Pos,
@@ -582,30 +638,96 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout)
                                                bytes,
                                                O_TERM,
                                                &Error);
-       if (retval < 0) {
-               CtdlLogPrintf(CTDL_CRIT, 
-                             "%s failed: %s\n",
-                             __FUNCTION__,
-                             Error);
+               if (retval < 0) {
+                       CtdlLogPrintf(CTDL_CRIT, 
+                                     "%s failed: %s\n",
+                                     __FUNCTION__, 
+                                     Error);
+                       return retval;
+               }
+               else
+               {
+#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
+
+               }
        }
-       else
-       {
-               char fn [SIZ];
-               FILE *fd;
+       return retval;
+}
 
-               snprintf(fn, SIZ, "/tmp/foolog_%s.%d", CCC->ServiceName, CCC->cs_pid);
 
-               fd = fopen(fn, "a+");
-                fprintf(fd, "Read: BufSize: %d BufContent: [",
-                        StrLength(Target));
-               fwrite(ChrPtr(Target), StrLength(Target), 1, fd);
-                fprintf(fd, "]\n");
+/*
+ * 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;
                
-                       
-                fclose(fd);
+               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;
        }
-       return retval == bytes;
+       else
+               return rc;
 }
 
 int client_read_to(char *buf, int bytes, int timeout)
@@ -632,10 +754,10 @@ int client_read_to(char *buf, int bytes, int timeout)
 
 int HaveMoreLinesWaiting(CitContext *CCC)
 {
-       if ((CCC->kill_me == 1) &&
+       if ((CCC->kill_me == 1) || (
            (CCC->Pos == NULL) && 
            (StrLength(CCC->ReadBuf) == 0) && 
-           (CCC->client_socket != -1))
+           (CCC->client_socket != -1)) )
                return 0;
        else
                return 1;
@@ -661,13 +783,64 @@ int CtdlClientGetLine(StrBuf *Target)
        FlushStrBuf(Target);
 #ifdef HAVE_OPENSSL
        if (CCC->redirect_ssl) {
-               return client_readline_sslbuffer(Target,
-                                                CCC->ReadBuf,
-                                                1);
+#ifdef BIGBAD_IODBG
+               char fn [SIZ];
+               FILE *fd;
+               int len = 0;
+               int rlen = 0;
+               int  nlen = 0;
+               int nrlen = 0;
+               const char *pch;
+
+               snprintf(fn, SIZ, "/tmp/foolog_%s.%d", CCC->ServiceName, CCC->cs_pid);
+
+               fd = fopen(fn, "a+");
+               pch = ChrPtr(CCC->ReadBuf);
+               len = StrLength(CCC->ReadBuf);
+               if (CCC->Pos != NULL)
+                       rlen = CC->Pos - pch;
+               else
+                       rlen = 0;
+
+/*             fprintf(fd, "\n\n\nBufSize: %d BufPos: %d \nBufContent: [%s]\n\n_____________________\n",
+                       len, rlen, pch);
+*/
+               fprintf(fd, "\n\n\nSSL1: BufSize: %d BufPos: %d \n_____________________\n",
+                       len, rlen);
+#endif
+               rc = client_readline_sslbuffer(Target,
+                                              CCC->ReadBuf,
+                                              &CCC->Pos,
+                                              1);
+#ifdef BIGBAD_IODBG
+                pch = ChrPtr(CCC->ReadBuf);
+                nlen = StrLength(CCC->ReadBuf);
+                if (CCC->Pos != NULL)
+                        nrlen = CC->Pos - pch;
+                else
+                        nrlen = 0;
+/*
+                fprintf(fd, "\n\n\nBufSize: was: %d is: %d BufPos: was: %d is: %d \nBufContent: [%s]\n\n_____________________\n",
+                        len, nlen, rlen, nrlen, pch);
+*/
+                fprintf(fd, "\n\n\nSSL2: BufSize: was: %d is: %d BufPos: was: %d is: %d \n",
+                        len, nlen, rlen, nrlen);
+
+                fprintf(fd, "SSL3: Read: BufSize: %d BufContent: [%s]\n\n*************\n",
+                        StrLength(Target), ChrPtr(Target));
+                fclose(fd);
+
+               if (rc < 0)
+                       CtdlLogPrintf(CTDL_CRIT, 
+                                     "%s failed\n",
+                                     __FUNCTION__);
+#endif
+               return rc;
        }
        else 
 #endif
        {
+#ifdef BIGBAD_IODBG
                char fn [SIZ];
                FILE *fd;
                int len, rlen, nlen, nrlen;
@@ -688,6 +861,7 @@ int CtdlClientGetLine(StrBuf *Target)
 */
                fprintf(fd, "\n\n\nBufSize: %d BufPos: %d \n_____________________\n",
                        len, rlen);
+#endif
                rc = StrBufTCP_read_buffered_line_fast(Target, 
                                                       CCC->ReadBuf,
                                                       &CCC->Pos,
@@ -696,6 +870,7 @@ int CtdlClientGetLine(StrBuf *Target)
                                                       1,
                                                       &Error);
 
+#ifdef BIGBAD_IODBG
                 pch = ChrPtr(CCC->ReadBuf);
                 nlen = StrLength(CCC->ReadBuf);
                 if (CCC->Pos != NULL)
@@ -718,6 +893,7 @@ int CtdlClientGetLine(StrBuf *Target)
                                      "%s failed: %s\n",
                                      __FUNCTION__,
                                      Error);
+#endif
                return rc;
        }
 }