in src/generic/log.c [769:963]
int Web_LogFilter(ClientData clientData,
Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[])
{
LogData *logData;
int idx;
static TCLCONST char *subCommands[] = {
WEB_LOG_SUBCMD_ADD,
WEB_LOG_SUBCMD_DELETE,
WEB_LOG_SUBCMD_NAMES,
WEB_LOG_SUBCMD_LEVELS,
NULL
};
enum subCommands
{ ADD, DELETE, NAMES, LEVELS };
/* --------------------------------------------------------------------------
* check for internal data
* ----------------------------------------------------------------------- */
WebAssertData(interp, clientData, "Web_LogFilter", TCL_ERROR)
logData = (LogData *) clientData;
/* --------------------------------------------------------------------------
* enough arguments ?
* ----------------------------------------------------------------------- */
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");
return TCL_ERROR;
}
/* ------------------------------------------------------------------------
* check subcommand
* --------------------------------------------------------------------- */
if (Tcl_GetIndexFromObj(interp, objv[1], subCommands, "option", 0, &idx)
!= TCL_OK) {
return TCL_ERROR;
}
switch ((enum subCommands) idx) {
case ADD:{
/* ------------------------------------------------------------------------
* web::loglevel add sytnax is as follows:
* web::loglevel add level
* 0 1 2
* --------------------------------------------------------------------- */
LogLevel *logLevel = NULL;
char *name = NULL;
/* ------------------------------------------------------------------------
* enough arguments ?
* --------------------------------------------------------------------- */
if (objc != 3) {
Tcl_WrongNumArgs(interp, 2, objv, "level");
return TCL_ERROR;
}
/* ------------------------------------------------------------------------
* parse level
* --------------------------------------------------------------------- */
logLevel =
parseLogLevel(interp, Tcl_GetString(objv[2]), "user", -1);
if (logLevel == NULL) {
WebFreeIfNotNull(name);
return TCL_ERROR;
}
logLevel->keep = logData->keep;
/* ------------------------------------------------------------------------
* and add to list
* --------------------------------------------------------------------- */
name = insertIntoFilterList(logData, logLevel);
if (name == NULL) {
Tcl_SetResult(interp, "cannot append new log filter to list", NULL);
destroyLogLevel(logLevel, NULL);
return TCL_ERROR;
}
Tcl_SetResult(interp, name, Tcl_Free);
return TCL_OK;
break;
}
case NAMES:{
Tcl_ResetResult(interp);
if (logData->listOfFilters != NULL) {
int i;
LogLevel **logLevels = logData->listOfFilters;
for (i = 0; i < logData->filterSize; i++) {
if (logLevels[i] != NULL) {
char * name = createLogName(LOG_FILTER_PREFIX, i);
if (name != NULL) {
Tcl_AppendElement(interp, name);
Tcl_Free(name);
}
}
}
}
return TCL_OK;
break;
}
case LEVELS:{
LogLevel *logLevel = NULL;
int namesIsFirst = TCL_OK;
Tcl_SetResult(interp, "", NULL);
if (logData->listOfFilters != NULL) {
int i;
LogLevel ** logLevels = logData->listOfFilters;
for (i = 0; i < logData->filterSize; i++) {
if (logLevels[i] != NULL) {
char * name = createLogName(LOG_FILTER_PREFIX, i);
if (namesIsFirst == TCL_ERROR)
Tcl_AppendResult(interp, "\n", NULL);
else
namesIsFirst = TCL_ERROR;
logLevel = logLevels[i];
Tcl_AppendResult(interp,
name, " ",
logLevel->facility, ".",
getSeverityName(logLevel->minSeverity),
"-",
getSeverityName(logLevel->maxSeverity),
NULL);
Tcl_Free(name);
}
}
}
return TCL_OK;
break;
}
case DELETE:{
/* 0 1 2 */
/* web::loglevel delete logLevel1 */
switch (objc) {
case 3: {
LogLevel ** logLevels = logData->listOfFilters;
if (!strcmp("-requests", Tcl_GetString(objv[2]))) {
/* special case: delete all levels NOT created during web::initializer */
int i;
for (i = 0; i < logData->filterSize; i++) {
if (logLevels[i] != NULL && !logLevels[i]->keep) {
destroyLogLevel(logLevels[i], interp);
logLevels[i] = NULL;
}
}
return TCL_OK;
} else {
int inx = getIndexFromLogName(LOG_FILTER_PREFIX"%d", Tcl_GetString(objv[2]));
if (inx < 0
|| inx >= logData->filterSize
|| logLevels[inx] == NULL) {
Tcl_SetResult(interp, "no such log filter \"", NULL);
Tcl_AppendResult(interp, Tcl_GetString(objv[2]), "\"",
NULL);
return TCL_ERROR;
}
destroyLogLevel(logLevels[inx], interp);
logLevels[inx] = NULL;
return TCL_OK;
break;
}
}
case 2:
/* -----------------------------------------------------
* no argument --> resets the list
* ----------------------------------------------------- */
if (logData->listOfFilters != NULL) {
int i;
LogLevel ** logLevels = logData->listOfFilters;
for (i = 0; i < logData->filterSize; i++) {
if (logLevels[i] != NULL) {
destroyLogLevel(logLevels[i], interp);
logLevels[i] = NULL;
}
}
}
return TCL_OK;
break;
default:
Tcl_WrongNumArgs(interp, 1, objv, "delete ?filtername?");
return TCL_ERROR;
}
break;
}
default:
return TCL_OK;
}
}