in src/generic/logtochannel.c [69:142]
ClientData createLogToChannel(Tcl_Interp * interp, ClientData clientData,
int objc, Tcl_Obj * CONST objv[])
{
LogToChannelData *logToChannelData = NULL;
int iCurArg;
char *channelName = NULL;
Tcl_Channel channel;
int mode;
/* --------------------------------------------------------------------------
* syntax is: file [-unbuffered] channelName
* 0 1 2
* ----------------------------------------------------------------------- */
if ((objc < 2) || (objc > 4)) {
Tcl_WrongNumArgs(interp, 1, objv, WEB_LOGTOCHANNEL_USAGE);
return NULL;
}
if (strcmp(Tcl_GetString(objv[0]), "channel") != 0) {
Tcl_SetResult(interp, WEB_LOGTOCHANNEL_USAGE, NULL);
return NULL;
}
/* --------------------------------------------------------------------------
* do we have the channelName ?
* ----------------------------------------------------------------------- */
iCurArg = argIndexOfFirstArg(objc, objv, NULL, NULL);
if (iCurArg >= objc) {
Tcl_SetResult(interp, WEB_LOGTOCHANNEL_USAGE, NULL);
return NULL;
}
channelName = Tcl_GetString(objv[iCurArg]);
/* --------------------------------------------------------------------------
* get channel
* ----------------------------------------------------------------------- */
channel = Tcl_GetChannel(interp, channelName, &mode);
if (channel == NULL) {
LOG_MSG(interp, WRITE_LOG | SET_RESULT, __FILE__, __LINE__,
"web::logdest", WEBLOG_ERROR,
"cannot get channel \"", channelName, "\"", NULL);
return NULL;
}
if (!(mode & TCL_WRITABLE)) {
LOG_MSG(interp, WRITE_LOG | SET_RESULT, __FILE__, __LINE__,
"web::logdest", WEBLOG_ERROR,
"channel \"", channelName, "\" not open for writing", NULL);
return NULL;
}
/* --------------------------------------------------------------------------
* everything ok so far. Get memory
* ----------------------------------------------------------------------- */
logToChannelData = createLogToChannelData();
if (logToChannelData == NULL) {
LOG_MSG(interp, WRITE_LOG | SET_RESULT, __FILE__, __LINE__,
"web::logdest", WEBLOG_ERROR,
"cannot get memory for internal data", NULL);
return NULL;
}
/* --------------------------------------------------------------------------
* and set values
* ----------------------------------------------------------------------- */
logToChannelData->channelName = allocAndSet(channelName);
if (argKeyExists(objc, objv, "-unbuffered") == TCL_OK)
logToChannelData->isBuffered = TCL_ERROR;
else
logToChannelData->isBuffered = TCL_OK;
return (ClientData) logToChannelData;
}