X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fserv_extensions.c;h=45221c514eef4a3ced49c122cadc8e8c49e14c32;hb=e85aa196b15dae29036b46a28412ce57961c85f9;hp=d2890ebaeedbd5094f0e06d99bf4bedd4dda892f;hpb=a4b7b2c87bf09fe0c558358eb784bf21c26aca39;p=citadel.git diff --git a/citadel/serv_extensions.c b/citadel/serv_extensions.c index d2890ebae..45221c514 100644 --- a/citadel/serv_extensions.c +++ b/citadel/serv_extensions.c @@ -51,7 +51,12 @@ * Structure defentitions for hook tables */ - +typedef struct __LogDebugEntry { + CtdlDbgFunction F; + const char *Name; + long Len; +} LogDebugEntry; +HashList *LogDebugEntryTable = NULL; typedef struct LogFunctionHook LogFunctionHook; struct LogFunctionHook { @@ -61,7 +66,6 @@ struct LogFunctionHook { }; extern LogFunctionHook *LogHookTable; - typedef struct FixedOutputHook FixedOutputHook; struct FixedOutputHook { FixedOutputHook *next; @@ -328,6 +332,77 @@ long FourHash(const char *key, long length) return ret; } +/* +typedef struct __LogDebugEntry { + CtdlDbgFunction F; + const char *Name; + long Len; +} LogDebugEntry; +HashList *LogDebugEntryTable = NULL; +*/ +void CtdlRegisterDebugFlagHook(const char *Name, long Len, CtdlDbgFunction F) +{ + LogDebugEntry *E; + if (LogDebugEntryTable == NULL) + LogDebugEntryTable = NewHash(1, NULL); + E = (LogDebugEntry*) malloc(sizeof(LogDebugEntry)); + E->F = F; + E->Name = Name; + E->Len = Len; + Put(LogDebugEntryTable, Name, Len, E, NULL); + +} +void CtdlSetDebugLogFacilities(const char **Str, long n) +{ + StrBuf *Token = NULL; + StrBuf *Buf = NULL; + const char *ch; + int i; + int DoAll = 0; + void *vptr; + + for (i=0; i < n; i++){ + if ((Str[i] != NULL) && !IsEmptyStr(Str[i])) { + if (strcmp(Str[i], "all") == 0) { + DoAll = 1; + continue; + } + Buf = NewStrBufPlain(Str[i], -1); + ch = NULL; + if (Token == NULL) + Token = NewStrBufPlain(NULL, StrLength(Buf)); + while ((ch != StrBufNOTNULL) && + StrBufExtract_NextToken(Token, Buf, &ch, ',')) { + if (GetHash(LogDebugEntryTable, SKEY(Token), &vptr) && + (vptr != NULL)) + { + LogDebugEntry *E = (LogDebugEntry*)vptr; + E->F(); + } + } + } + FreeStrBuf(&Buf); + } + FreeStrBuf(&Token); + if (DoAll) { + long HKLen; + const char *ch; + HashPos *Pos; + + Pos = GetNewHashPos(LogDebugEntryTable, 0); + while (GetNextHashPos(LogDebugEntryTable, Pos, &HKLen, &ch, &vptr)) { + LogDebugEntry *E = (LogDebugEntry*)vptr; + E->F(); + } + + DeleteHashPos(&Pos); + } +} +void CtdlDestroyDebugTable(void) +{ + + DeleteHash(&LogDebugEntryTable); +} void CtdlRegisterProtoHook(void (*handler) (char *), char *cmd, char *desc) {