-/*
- * $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>
#endif
#include "libcitadel.h"
-
+#include "libcitadellocal.h"
ConstStr WF_MsgStrs[] = {
+ {HKEY("LOG")},
{HKEY("INFO")},
{HKEY("WARN")},
{HKEY("ERROR")},
- {HKEY("LOG")},
{HKEY("TRACE")},
{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);
}
}
}
-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;
}
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;
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];
BaseFrames --;
BaseFrames += AddBaseFrameSkip;
strings = backtrace_symbols(stack_frames, size);
- for (i = 0; i < size; i++) {
+ 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;
}
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");
}
if (StrLength(FullBinaryName) > 0)
start_addr2line_daemon(ChrPtr(FullBinaryName));
#endif
-
-
}
-JsonValue *WildFireException(StrBuf *Message,
- const char *Filename, long FileLen,
- long LineNo,
- 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
{
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);
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;
const char *Cat;
StrBuf *Header;
+ if (OutBuf == NULL)
+ Header = NewStrBuf();
if (*MsgCount == 0) {
if (OutBuf != NULL) {
StrBufAppendBufPlain(OutBuf,
"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",
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);
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);
-
-}
-
-*/