fix dlen
[citadel.git] / libcitadel / lib / wildfire.c
index 6d6669034c3d5c9e8617dd710b59c9bd4e9bc480..02a2cb9145ca57a8858921a1cc7327f165c7a4f4 100644 (file)
@@ -1,8 +1,5 @@
-/*
- * $Id: wildfire.c 6962 2009-01-18 19:33:45Z dothebart $
- */
-
-/*@{*/
+// This doesn't belong in the build but WebCit-classic depends on it.
+// When we move to WebCit-NG we will axe this.
 
 #include "sysdep.h"
 #include <sys/types.h>
@@ -19,7 +16,7 @@
 #endif
 
 #include "libcitadel.h"
-
+#include "libcitadellocal.h"
 
 
 ConstStr WF_MsgStrs[] = {
@@ -31,66 +28,40 @@ ConstStr WF_MsgStrs[] = {
        {HKEY("EXCEPTION")}
 };
 
-static JsonValue *WFInfo(const char *Filename, long fnlen,
-                        long LineNo, 
-                        WF_MessageType Type)
-{
+static JsonValue *WFInfo(const char *Filename, long fnlen, long LineNo, WF_MessageType Type) {
        JsonValue *Val;
 
        Val = NewJsonObject(NULL, 0);
-       JsonObjectAppend(Val, 
-                        NewJsonPlainString(HKEY("Type"),
-                                           WF_MsgStrs[Type].Key, 
-                                           WF_MsgStrs[Type].len));
-       JsonObjectAppend(Val, 
-                        NewJsonPlainString(HKEY("File"), 
-                                           Filename, fnlen));
-       JsonObjectAppend(Val, 
-                        NewJsonNumber(HKEY("Line"), LineNo));
+       JsonObjectAppend(Val, NewJsonPlainString(HKEY("Type"), WF_MsgStrs[Type].Key, WF_MsgStrs[Type].len));
+       JsonObjectAppend(Val, NewJsonPlainString(HKEY("File"), Filename, fnlen));
+       JsonObjectAppend(Val, NewJsonNumber(HKEY("Line"), LineNo));
        return Val;
 }
                            
 
-JsonValue *WildFireMessage(const char *Filename, long fnlen,
-                          long LineNo,
-                          StrBuf *Msg, 
-                          WF_MessageType Type)
-{
+JsonValue *WildFireMessage(const char *Filename, long fnlen, long LineNo, StrBuf *Msg, WF_MessageType Type) {
        JsonValue *Ret;
 
        Ret = NewJsonArray(NULL, 0);
-       JsonArrayAppend(Ret, WFInfo(Filename, fnlen,
-                                   LineNo, Type));
+       JsonArrayAppend(Ret, WFInfo(Filename, fnlen, LineNo, Type));
 
-       JsonArrayAppend(Ret, 
-                       NewJsonString(NULL, 0, Msg));
+       JsonArrayAppend(Ret, NewJsonString(NULL, 0, Msg, NEWJSONSTRING_COPYBUF));
        return Ret;
 }
 
-JsonValue *WildFireMessagePlain(const char *Filename, long fnlen,
-                               long LineNo,
-                               const char *Message, long len, 
-                               WF_MessageType Type)
-{
+JsonValue *WildFireMessagePlain(const char *Filename, long fnlen, long LineNo, const char *Message, long len, WF_MessageType Type) {
        JsonValue *Val;
        Val = NewJsonArray(NULL, 0);
 
-       JsonArrayAppend(Val, WFInfo(Filename, fnlen,
-                                   LineNo, Type));
-       JsonArrayAppend(Val, 
-                       NewJsonPlainString(NULL, 0, Message, len));
+       JsonArrayAppend(Val, WFInfo(Filename, fnlen, LineNo, Type));
+       JsonArrayAppend(Val, NewJsonPlainString(NULL, 0, Message, len));
        return Val;
 }
 
-void WildFireAddArray(JsonValue *ReportBase, JsonValue *Array, WF_MessageType Type)
-{
+void WildFireAddArray(JsonValue *ReportBase, JsonValue *Array, WF_MessageType Type) {
        JsonValue *Val;
        Val = NewJsonArray(NULL, 0);
-       JsonArrayAppend(Val, 
-                       NewJsonPlainString(NULL, 0, 
-                                          WF_MsgStrs[Type].Key, 
-                                          WF_MsgStrs[Type].len));
-
+       JsonArrayAppend(Val, NewJsonPlainString(NULL, 0, WF_MsgStrs[Type].Key, WF_MsgStrs[Type].len));
        JsonArrayAppend(Val, Array);
 }
 
@@ -141,19 +112,12 @@ static void start_addr2line_daemon(const char *binary)
        }
 }
 
-static int addr2lineBacktrace(StrBuf *Function, 
-                             StrBuf *FileName, 
-                             StrBuf *Pointer, 
-                             StrBuf *Buf,
-                             unsigned int *FunctionLine)
-
-{
+static int addr2lineBacktrace(StrBuf *Function, StrBuf *FileName, StrBuf *Pointer, StrBuf *Buf, unsigned int *FunctionLine) {
        const char *err;
        const char *pch, *pche;
 
        write(addr2line_write_pipe[1], SKEY(Pointer));
-       if (StrBufTCP_read_line(Buf, &addr2line_read_pipe[0], 0, &err) <= 0)
-       {
+       if (StrBufTCP_read_line(Buf, &addr2line_read_pipe[0], 0, &err) <= 0) {
                StrBufAppendBufPlain(Buf, err, -1, 0);
                return 0;
        }
@@ -161,17 +125,16 @@ static int addr2lineBacktrace(StrBuf *Function,
        pche = strchr(pch, ':');
        FlushStrBuf(FileName);
        StrBufAppendBufPlain(FileName, pch, pche - pch, 0);
-       pche++;
-       *FunctionLine = atoi(pche);
-
+       if (pche != NULL) {
+               pche++;
+               *FunctionLine = atoi(pche);
+       }
+       else 
+               *FunctionLine = 0;
        return 1;
 }
 
-static int ParseBacktrace(char *Line, 
-                         StrBuf *Function, 
-                         StrBuf *FileName, 
-                         unsigned int *FunctionLine)
-{
+static int ParseBacktrace(char *Line, StrBuf *Function, StrBuf *FileName, unsigned int *FunctionLine) {
        char *pch, *pche;
 
        pch = Line;
@@ -194,8 +157,14 @@ static int ParseBacktrace(char *Line,
 long BaseFrames = 0;
 StrBuf *FullBinaryName = NULL;
 
-void WildFireInitBacktrace(const char *argvNull, int AddBaseFrameSkip)
-{
+void WildFireShutdown(void) {
+       close(addr2line_write_pipe[0]);
+       close(addr2line_read_pipe[0]);
+
+       FreeStrBuf(&FullBinaryName);
+}
+
+void WildFireInitBacktrace(const char *argvNull, int AddBaseFrameSkip) {
 
 #ifdef HAVE_BACKTRACE
        void *stack_frames[100];
@@ -220,9 +189,7 @@ void WildFireInitBacktrace(const char *argvNull, int AddBaseFrameSkip)
        strings = backtrace_symbols(stack_frames, size);
        for (i = 1; i < size; i++) {
                if (strings != NULL){
-                       ParseBacktrace(strings[i], Function, 
-                                      FileName, 
-                                      &FunctionLine);
+                       ParseBacktrace(strings[i], Function, FileName, &FunctionLine);
                        FullBinaryName = NewStrBufDup(FileName);
                        size = i;
                }
@@ -235,12 +202,10 @@ void WildFireInitBacktrace(const char *argvNull, int AddBaseFrameSkip)
                        i = size;
                 }
        }
-       if ((stat(ChrPtr(FullBinaryName), &filestats)==-1) ||
-           (filestats.st_size==0)){
+       if ((stat(ChrPtr(FullBinaryName), &filestats)==-1) || (filestats.st_size==0)) {
                FlushStrBuf(FullBinaryName);
                StrBufAppendBufPlain(FullBinaryName, argvNull, -1, 0);
-               if ((stat(ChrPtr(FullBinaryName), &filestats)==-1) ||
-                   (filestats.st_size==0)){
+               if ((stat(ChrPtr(FullBinaryName), &filestats)==-1) || (filestats.st_size==0)) {
                        FlushStrBuf(FullBinaryName);
                        fprintf(stderr, "unable to open my binary for addr2line checking, verbose backtraces won't work.\n");
                }
@@ -253,42 +218,24 @@ void WildFireInitBacktrace(const char *argvNull, int AddBaseFrameSkip)
        if (StrLength(FullBinaryName) > 0)
                start_addr2line_daemon(ChrPtr(FullBinaryName));
 #endif
-
-
 }
 
 
-JsonValue *WildFireException(const char *Filename, long FileLen,
-                            long LineNo,
-                            StrBuf *Message,
-                            int StackOffset)
-{
+JsonValue *WildFireException(const char *Filename, long FileLen, long LineNo, StrBuf *Message, int StackOffset) {
        JsonValue *ExcClass;
        JsonValue *Val;
        Val = NewJsonArray(NULL, 0);
 
-       JsonArrayAppend(Val, WFInfo(Filename, FileLen,
-                                   LineNo, eEXCEPTION));
-
-       ExcClass = NewJsonObject(WF_MsgStrs[eTRACE].Key, 
-                                WF_MsgStrs[eTRACE].len);
-       
+       JsonArrayAppend(Val, WFInfo(Filename, FileLen, LineNo, eEXCEPTION));
+       ExcClass = NewJsonObject(WF_MsgStrs[eTRACE].Key, WF_MsgStrs[eTRACE].len);
        JsonArrayAppend(Val, ExcClass);
-       JsonObjectAppend(ExcClass, 
-                        NewJsonPlainString(HKEY("Class"), 
-                                           HKEY("Exception")));
-       JsonObjectAppend(ExcClass, 
-                        NewJsonString(HKEY("Message"), Message));
-       JsonObjectAppend(ExcClass, 
-                        NewJsonPlainString(HKEY("File"), 
-                                           Filename, FileLen));
+       JsonObjectAppend(ExcClass, NewJsonPlainString(HKEY("Class"), HKEY("Exception")));
+       JsonObjectAppend(ExcClass, NewJsonString(HKEY("Message"), Message, NEWJSONSTRING_COPYBUF));
+       JsonObjectAppend(ExcClass, NewJsonPlainString(HKEY("File"), Filename, FileLen));
 /*
-       JsonObjectAppend(ExcClass, 
-                        NewJsonPlainString(HKEY("Type"), 
-                                           HKEY("throw")));
+       JsonObjectAppend(ExcClass, NewJsonPlainString(HKEY("Type"), HKEY("throw")));
 */
-       JsonObjectAppend(ExcClass, 
-                        NewJsonNumber(HKEY("Line"), LineNo));
+       JsonObjectAppend(ExcClass, NewJsonNumber(HKEY("Line"), LineNo));
 
 #ifdef HAVE_BACKTRACE
        {
@@ -315,30 +262,16 @@ JsonValue *WildFireException(const char *Filename, long FileLen,
                strings = backtrace_symbols(stack_frames, size);
                for (i = StackOffset + 1; i < size; i++) {
                        if (strings != NULL){
-                               ParseBacktrace(strings[i], Function, 
-                                              FileName,
-                                              &FunctionLine);
-                               
+                               ParseBacktrace(strings[i], Function, FileName, &FunctionLine);
                        }
                        StrBufPrintf(Pointer, "%p\n", stack_frames[i]);
-                       
-                       addr2lineBacktrace(Function, 
-                                          FileName, 
-                                          Pointer, 
-                                          Buf, 
-                                          &FunctionLine);
-
+                       addr2lineBacktrace(Function, FileName, Pointer, Buf, &FunctionLine);
                        Frame = NewJsonObject(NULL, 0);
                        JsonArrayAppend(Trace, Frame);
-                       JsonObjectAppend(Frame, 
-                                        NewJsonString(HKEY("function"), Function));
-                       JsonObjectAppend(Frame, 
-                                        NewJsonString(HKEY("file"), FileName));
-                       JsonObjectAppend(Frame, 
-                                        NewJsonNumber(HKEY("line"), FunctionLine));
-                       JsonObjectAppend(Frame, 
-                                        NewJsonArray(HKEY("args")));/* not supportet... */
-
+                       JsonObjectAppend(Frame, NewJsonString(HKEY("function"), Function, NEWJSONSTRING_COPYBUF));
+                       JsonObjectAppend(Frame, NewJsonString(HKEY("file"), FileName, NEWJSONSTRING_COPYBUF));
+                       JsonObjectAppend(Frame, NewJsonNumber(HKEY("line"), FunctionLine));
+                       JsonObjectAppend(Frame, NewJsonArray(HKEY("args"))); // not supported
                        FunctionLine = 0;
                        FlushStrBuf(FileName);
                        FlushStrBuf(Function);
@@ -354,8 +287,7 @@ JsonValue *WildFireException(const char *Filename, long FileLen,
        return Val;
 }
 
-void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount, AddHeaderFunc AddHdr)
-{
+void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount, AddHeaderFunc AddHdr) {
        int n = *MsgCount;
        StrBuf *Buf;
        StrBuf *HeaderName;
@@ -365,6 +297,8 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount,
        const char *Cat;
        StrBuf *Header;
 
+       if (OutBuf == NULL)
+               Header = NewStrBuf();
        if (*MsgCount == 0) {
                if (OutBuf != NULL) {
                        StrBufAppendBufPlain(OutBuf, 
@@ -384,7 +318,6 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount,
                                                     "http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1\r\n"), 0);
                }
                else {
-                       Header = NewStrBuf();
                        AddHdr("X-Wf-Protocol-1", 
                               "http://meta.wildfirehq.org/Protocol/JsonStream/0.2");
                        AddHdr("X-Wf-1-Plugin-1",
@@ -413,21 +346,11 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount,
                        Cat = empty;
                }
                if (OutBuf != NULL) {
-                       StrBufAppendPrintf(OutBuf, 
-                                          "%s: %s|%s|%s\r\n", 
-                                          ChrPtr(HeaderName), 
-                                          ChrPtr(N),
-                                          ChrPtr(Buf), 
-                                          Cat);
+                       StrBufAppendPrintf(OutBuf, "%s: %s|%s|%s\r\n", ChrPtr(HeaderName), ChrPtr(N), ChrPtr(Buf), Cat);
                }
                else {
-                       StrBufAppendPrintf(Header, 
-                                          "%s|%s|%s", 
-                                          ChrPtr(N),
-                                          ChrPtr(Buf), 
-                                          Cat);
+                       StrBufAppendPrintf(Header, "%s|%s|%s", ChrPtr(N), ChrPtr(Buf), Cat);
                        AddHdr(ChrPtr(HeaderName), ChrPtr(Header));
-                       
                }
 
                FlushStrBuf(N);
@@ -437,77 +360,7 @@ void WildFireSerializePayload(StrBuf *JsonBuffer, StrBuf *OutBuf, int *MsgCount,
        if (OutBuf == NULL) {
                FreeStrBuf(&Header);
        }
+       FreeStrBuf(&N);
+       FreeStrBuf(&Buf);
+       FreeStrBuf(&HeaderName);
 }
-
-
-
-
-
-
-/* this is how we do it...
-void CreateWildfireSampleMessage(void)
-{
-       JsonValue *Error;
-               
-       StrBuf *Buf;
-       StrBuf *Header;
-       StrBuf *Json;
-       int n = 1;
-
-       Header = NewStrBuf();
-       Json = NewStrBuf();
-
-       Error = WildFireMessagePlain(HKEY(__FILE__), __LINE__, HKEY("Info message"), eINFO);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-       Error = WildFireMessagePlain(HKEY(__FILE__), __LINE__,  HKEY("Warn message"), eWARN);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-       Error = WildFireMessagePlain(HKEY(__FILE__), __LINE__, HKEY("Error message"), eERROR);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-       Error = WildFireMessagePlain(HKEY(__FILE__), __LINE__, HKEY("Info message"), eINFO);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-       Error = WildFireMessagePlain(HKEY(__FILE__), __LINE__, HKEY("Info message"), eINFO);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-
-       Buf = NewStrBufPlain(HKEY("test error message"));
-       Error = WildFireException(Buf, HKEY(__FILE__), __LINE__, 1);
-       SerializeJson(Json, Error);
-       WildFireSerializePayload(Json, Header, &n, NULL);
-       StrBufAppendBuf(WC->HBuf, Header, 0);
-       DeleteJSONValue(Error);
-
-       FlushStrBuf(Json);
-       FlushStrBuf(Header);
-
-}
-
-*/