* move the instant death to USR2 as dave questioned
[citadel.git] / citadel / sysdep.c
index 416fc7b897a1c70b840e5af4333c35f13b5edcf4..cb5b3a650458d22013992b9e1ee374a9711cdf41 100644 (file)
@@ -169,6 +169,10 @@ static RETSIGTYPE signal_cleanup(int signum) {
        }
 }
 
+static RETSIGTYPE signal_exit(int signum) {
+       exit(1);
+}
+
 
 
 /*
@@ -222,6 +226,7 @@ void init_sysdep(void) {
        signal(SIGQUIT, signal_cleanup);
        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(SIGBUS, signal_cleanup);
@@ -436,6 +441,7 @@ void flush_output(void) {
 #endif
 }
 
+/*
 static void flush_client_inbuf(void)
 {
        CitContext *CCC=CC;
@@ -444,6 +450,7 @@ static void flush_client_inbuf(void)
        CCC->Pos = NULL;
 
 }
+*/
 
 /*
  * client_write()   ...    Send binary data to the client.
@@ -459,17 +466,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;
        }
 
@@ -588,6 +591,26 @@ int client_read_blob(StrBuf *Target, int bytes, int timeout)
                              __FUNCTION__,
                              Error);
        }
+       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
+
+       }
        return retval == bytes;
 }
 
@@ -615,7 +638,10 @@ int client_read_to(char *buf, int bytes, int timeout)
 
 int HaveMoreLinesWaiting(CitContext *CCC)
 {
-       if ((CCC->Pos == NULL) && (StrLength(CCC->ReadBuf) == 0))
+       if ((CCC->kill_me == 1) || (
+           (CCC->Pos == NULL) && 
+           (StrLength(CCC->ReadBuf) == 0) && 
+           (CCC->client_socket != -1)) )
                return 0;
        else
                return 1;
@@ -641,13 +667,61 @@ 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, rlen, nlen, nrlen;
+               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\nBufSize: %d BufPos: %d \n_____________________\n",
+                       len, rlen);
+#endif
+               rc = client_readline_sslbuffer(Target,
+                                              CCC->ReadBuf,
+                                              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\nBufSize: was: %d is: %d BufPos: was: %d is: %d \n",
+                        len, nlen, rlen, nrlen);
+
+                fprintf(fd, "Read: BufSize: %d BufContent: [%s]\n\n*************\n",
+                        StrLength(Target), ChrPtr(Target));
+                fclose(fd);
+
+               if ((rc < 0) && (Error != NULL))
+                       CtdlLogPrintf(CTDL_CRIT, 
+                                     "%s failed: %s\n",
+                                     __FUNCTION__,
+                                     Error);
+#endif
+               return rc;
        }
        else 
 #endif
        {
+#ifdef BIGBAD_IODBG
                char fn [SIZ];
                FILE *fd;
                int len, rlen, nlen, nrlen;
@@ -668,6 +742,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,
@@ -676,6 +751,7 @@ int CtdlClientGetLine(StrBuf *Target)
                                                       1,
                                                       &Error);
 
+#ifdef BIGBAD_IODBG
                 pch = ChrPtr(CCC->ReadBuf);
                 nlen = StrLength(CCC->ReadBuf);
                 if (CCC->Pos != NULL)
@@ -698,6 +774,7 @@ int CtdlClientGetLine(StrBuf *Target)
                                      "%s failed: %s\n",
                                      __FUNCTION__,
                                      Error);
+#endif
                return rc;
        }
 }
@@ -715,6 +792,9 @@ int client_getln(char *buf, int bufsize)
        const char *pCh;
 
        retval = CtdlClientGetLine(CCC->MigrateBuf);
+       if (retval < 0)
+         return(retval >= 0);
+
 
        i = StrLength(CCC->MigrateBuf);
        pCh = ChrPtr(CCC->MigrateBuf);
@@ -1081,17 +1161,24 @@ do_select:      force_purge = 0;
                begin_critical_section(S_SESSION_TABLE);
                for (ptr = ContextList; ptr != NULL; ptr = ptr->next) {
                        int checkfd = ptr->client_socket;
-                       if ((checkfd != -1) && 
-                           (FD_ISSET(checkfd, &readfds)) &&
-                           (ptr->state == CON_IDLE) ) 
-                       {
-                               ptr->input_waiting = 1;
-                               if (!bind_me) {
-                                       bind_me = ptr;  /* I choose you! */
-                                       bind_me->state = CON_EXECUTING;
-                               }
-                               else {
-                                       ptr->state = CON_READY;
+                       if ((checkfd != -1) && (ptr->state == CON_IDLE) ){
+                               if (FD_ISSET(checkfd, &readfds)) {
+                                       ptr->input_waiting = 1;
+                                       if (!bind_me) {
+                                               bind_me = ptr;  /* I choose you! */
+                                               bind_me->state = CON_EXECUTING;
+                                       }
+                                       else {
+                                               ptr->state = CON_READY;
+                                       }
+                               } else if ((ptr->is_async) && (ptr->async_waiting) && (ptr->h_async_function)) {
+                                       if (!bind_me) {
+                                               bind_me = ptr;  /* I choose you! */
+                                               bind_me->state = CON_EXECUTING;
+                                       }
+                                       else {
+                                               ptr->state = CON_READY;
+                                       }
                                }
                        }
                }