From: Vlad S. <ser...@us...> - 2005-03-28 17:02:58
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7358/nsd Modified Files: filter.c info.c nsd.h op.c urlspace.c Log Message: Added support for ns_info filters, ns_info traces, ns_info requestprocs commands using new Tcl callback interface. New commands show information about registered filters/procs same way as ns_info scheduled does. Closes RFE #1161597. Index: nsd.h =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/nsd.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** nsd.h 26 Mar 2005 17:42:26 -0000 1.7 --- nsd.h 28 Mar 2005 17:02:07 -0000 1.8 *************** *** 837,844 **** --- 837,848 ---- extern Ns_OpProc NsTclRequest; extern Ns_OpProc NsAdpRequest; + extern Ns_ArgProc NsTclRequestArgProc; extern void NsGetCallbacks(Tcl_DString *dsPtr); extern void NsGetSockCallbacks(Tcl_DString *dsPtr); extern void NsGetScheduled(Tcl_DString *dsPtr); + extern void NsGetTraces(Tcl_DString *dsPtr, char *server); + extern void NsGetFilters(Tcl_DString *dsPtr, char *server); + extern void NsGetRequestProcs(Tcl_DString *dsPtr, char *server); #ifdef _WIN32 *************** *** 957,960 **** --- 961,966 ---- int *new_type, Tcl_DString *type_ds); + extern void NsUrlSpecificWalk(int id, char *server, Ns_ArgProc func, Tcl_DString *dsPtr); + /* * Proxy support Index: op.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/op.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** op.c 16 Feb 2005 08:39:21 -0000 1.1.1.1 --- op.c 28 Mar 2005 17:02:08 -0000 1.2 *************** *** 467,468 **** --- 467,523 ---- } + /* + *---------------------------------------------------------------------- + * + * NsRequestArgProc -- + * + * Proc info routine to copy Tcl request proc. + * + * Results: + * None. + * + * Side effects: + * Will copy script to given dstring. + * + *---------------------------------------------------------------------- + */ + + void + NsTclRequestArgProc(Tcl_DString *dsPtr, void *arg) + { + Req *reqPtr = arg; + + Ns_GetProcInfo(dsPtr, (void *) reqPtr->proc, reqPtr->arg); + } + + + /* + *---------------------------------------------------------------------- + * NsGetRequestProcs -- + * + * Returns information about registered requests/procs + * + * Results: + * DString with info as Tcl list + * + * Side effects: + * None + * + *---------------------------------------------------------------------- + */ + + void + NsGetRequestProcs(Tcl_DString *dsPtr, char *server) + { + NsServer *servPtr; + + servPtr = NsGetServer(server); + if (servPtr == NULL) { + return; + } + + Ns_MutexLock(&ulock); + NsUrlSpecificWalk(uid, servPtr->server, NsTclRequestArgProc, dsPtr); + Ns_MutexUnlock(&ulock); + } + Index: info.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/info.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** info.c 16 Feb 2005 08:40:00 -0000 1.1.1.1 --- info.c 28 Mar 2005 17:02:07 -0000 1.2 *************** *** 503,507 **** "pid", "platform", "pools", "scheduled", "server", "servers", "sockcallbacks", "tag", "tcllib", "threads", "uptime", ! "version", "winnt", NULL }; enum { --- 503,507 ---- "pid", "platform", "pools", "scheduled", "server", "servers", "sockcallbacks", "tag", "tcllib", "threads", "uptime", ! "version", "winnt", "filters", "traces", "requestprocs", NULL }; enum { *************** *** 511,515 **** IPidIdx, IPlatformIdx, IPoolsIdx, IScheduledIdx, IServerIdx, IServersIdx, sockICallbacksIdx, ITagIdx, ITclLibIdx, IThreadsIdx, IUptimeIdx, ! IVersionIdx, IWinntIdx, } opt; --- 511,515 ---- IPidIdx, IPlatformIdx, IPoolsIdx, IScheduledIdx, IServerIdx, IServersIdx, sockICallbacksIdx, ITagIdx, ITclLibIdx, IThreadsIdx, IUptimeIdx, ! IVersionIdx, IWinntIdx, IFiltersIdx, ITracesIdx, IRequestProcsIdx, } opt; *************** *** 556,559 **** --- 556,574 ---- break; + case IFiltersIdx: + NsGetFilters(&ds, itPtr->servPtr ? itPtr->servPtr->server : 0); + Tcl_DStringResult(interp, &ds); + break; + + case ITracesIdx: + NsGetTraces(&ds, itPtr->servPtr ? itPtr->servPtr->server : 0); + Tcl_DStringResult(interp, &ds); + break; + + case IRequestProcsIdx: + NsGetRequestProcs(&ds, itPtr->servPtr ? itPtr->servPtr->server : 0); + Tcl_DStringResult(interp, &ds); + break; + case ILocksIdx: Ns_MutexList(&ds); Index: urlspace.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/urlspace.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** urlspace.c 16 Feb 2005 08:40:08 -0000 1.1.1.1 --- urlspace.c 28 Mar 2005 17:02:08 -0000 1.2 *************** *** 44,47 **** --- 44,53 ---- /* + * Size of stack to keep track of server/method/url/... node path + */ + + #define STACK_SIZE 512 + + /* * This optimization, when turned on, prevents the server from doing a * whole lot of calls to Tcl_StringMatch on every lookup in urlspace. *************** *** 2090,2091 **** --- 2096,2200 ---- #endif + + + /* + *---------------------------------------------------------------------- + * + * NsUrlSpecificWalk -- + * + * Walk url tree, call ArgProc function for each node + * + * Results: + * None. + * + * Side effects: + * None + * + *---------------------------------------------------------------------- + */ + + static void + WalkTrie(Trie *triePtr, int id, char *server, Ns_ArgProc func, Tcl_DString *dsPtr, char **stack, char *filter) + { + int i, depth; + + for (i = 0; i < (&triePtr->branches)->n; i++) { + Branch *branch; + branch = (Branch *) Ns_IndexEl(&triePtr->branches, i); + + /* + * Remember current stack depth + */ + + for(depth = 0; stack[depth] != NULL && depth < STACK_SIZE-1; depth++) ; + + stack[depth] = branch->word; + WalkTrie(&(branch->node), id, server, func, dsPtr, stack, filter); + + /* + * Restore stack position + */ + + stack[depth] = 0; + } + if (triePtr->indexnode != NULL) { + for (i = 0; i < triePtr->indexnode->n; i++) { + Node *nodePtr; + nodePtr = (Node *) Ns_IndexEl(triePtr->indexnode, i); + if (nodePtr->id == id && !strcmp(server, stack[0])) { + Tcl_DStringStartSublist(dsPtr); + + /* + * Put stack contents into the sublist, + * 1st element is server, 2nd is method, the rest is url + */ + + for (depth = 0; stack[depth] != NULL; depth++) { + switch (depth) { + case 0: + Tcl_DStringAppendElement(dsPtr, stack[depth]); + break; + case 1: + Tcl_DStringAppendElement(dsPtr, stack[depth]); + Tcl_DStringAppend(dsPtr, " ", 1); + break; + default: + Ns_DStringVarAppend(dsPtr, "/", stack[depth], 0); + break; + } + } + Ns_DStringVarAppend(dsPtr, filter, " ", 0); + if (nodePtr->dataInherit != NULL) { + func(dsPtr, nodePtr->dataInherit); + } + if (nodePtr->dataNoInherit != NULL) { + func(dsPtr, nodePtr->dataNoInherit); + } + Tcl_DStringEndSublist(dsPtr); + } + } + } + } + + void + NsUrlSpecificWalk(int id, char *server, Ns_ArgProc func, Tcl_DString *dsPtr) + { + int i; + char *stack[STACK_SIZE]; + + memset(stack, 0, sizeof(stack)); + Ns_MutexLock(&lock); + #ifndef __URLSPACE_OPTIMIZE__ + for (i = 0; i < (&urlspace.byuse)->n; i++) { + Channel *channelPtr; + channelPtr = (Channel *) Ns_IndexEl(&urlspace.byuse, i); + #else + for (i = ((&urlspace.byname)->n - 1); i >= 0; i--) { + Channel *channelPtr; + channelPtr = (Channel *) Ns_IndexEl(&urlspace.byname, i); + #endif + WalkTrie(&channelPtr->trie, id, server, func, dsPtr, stack, channelPtr->filter); + } + Ns_MutexUnlock(&lock); + } + Index: filter.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/filter.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** filter.c 16 Feb 2005 08:39:41 -0000 1.1.1.1 --- filter.c 28 Mar 2005 17:02:07 -0000 1.2 *************** *** 307,308 **** --- 307,387 ---- return tracePtr; } + + + /* + *---------------------------------------------------------------------- + * NsGetTraces, NsGetFilters -- + * + * Returns information about registered filters/traces + * + * Results: + * DString with info as Tcl list + * + * Side effects: + * None + * + *---------------------------------------------------------------------- + */ + + void + NsGetFilters(Tcl_DString *dsPtr, char *server) + { + Filter *fPtr; + NsServer *servPtr; + + servPtr = NsGetServer(server); + if (servPtr == NULL) { + return; + } + fPtr = servPtr->filter.firstFilterPtr; + while (fPtr != NULL) { + Tcl_DStringStartSublist(dsPtr); + Tcl_DStringAppendElement(dsPtr, fPtr->method); + Tcl_DStringAppendElement(dsPtr, fPtr->url); + switch (fPtr->when) { + case NS_FILTER_PRE_AUTH: + Tcl_DStringAppendElement(dsPtr, "preauth"); + break; + case NS_FILTER_POST_AUTH: + Tcl_DStringAppendElement(dsPtr, "postauth"); + break; + case NS_FILTER_VOID_TRACE: + case NS_FILTER_TRACE: + Tcl_DStringAppendElement(dsPtr, "trace"); + break; + } + Ns_GetProcInfo(dsPtr, (void *) fPtr->proc, fPtr->arg); + Tcl_DStringEndSublist(dsPtr); + fPtr = fPtr->nextPtr; + } + } + + void + NsGetTraces(Tcl_DString *dsPtr, char *server) + { + Trace *tracePtr; + NsServer *servPtr; + + servPtr = NsGetServer(server); + if (servPtr == NULL) { + return; + } + tracePtr = servPtr->filter.firstTracePtr; + while (tracePtr != NULL) { + Tcl_DStringStartSublist(dsPtr); + Tcl_DStringAppendElement(dsPtr, "trace"); + Ns_GetProcInfo(dsPtr, (void *) tracePtr->proc, tracePtr->arg); + Tcl_DStringEndSublist(dsPtr); + tracePtr = tracePtr->nextPtr; + } + + tracePtr = servPtr->filter.firstCleanupPtr; + while (tracePtr != NULL) { + Tcl_DStringStartSublist(dsPtr); + Tcl_DStringAppendElement(dsPtr, "cleanup"); + Ns_GetProcInfo(dsPtr, (void *) tracePtr->proc, tracePtr->arg); + Tcl_DStringEndSublist(dsPtr); + tracePtr = tracePtr->nextPtr; + } + } + |