ClientData createLogToChannel()

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;
}