in src/generic/messages.c [112:178]
int Web_Recv(ClientData clientData,
Tcl_Interp * interp, int objc, Tcl_Obj * CONST objv[])
{
int mode = 0;
void *data = NULL;
TCLCONST char *res = NULL;
int cmdcode = 0;
int flags = 0;
int size = 0;
Tcl_Channel tc;
Tcl_Obj *to = NULL;
/* ------------------------------------------------------------------------
* arg check
* --------------------------------------------------------------------- */
WebAssertObjc(objc != 5, 1, "channel cmdvarname resvarname flagsvarname");
/* ------------------------------------------------------------------------
* see if we can get this channel
* --------------------------------------------------------------------- */
tc = Tcl_GetChannel(interp, Tcl_GetString(objv[1]), &mode);
if (tc == NULL) {
LOG_MSG(interp, WRITE_LOG | SET_RESULT,
__FILE__, __LINE__, "web::recv", WEBLOG_ERROR,
"unknown channel \"", Tcl_GetString(objv[1]), "\"", NULL);
return TCL_ERROR;
}
if ((mode & TCL_READABLE) == 0) {
LOG_MSG(interp, WRITE_LOG | SET_RESULT, __FILE__, __LINE__,
"web::recv", WEBLOG_ERROR,
"channel \"", Tcl_GetString(objv[1]),
"\" not open for reading", NULL);
return TCL_ERROR;
}
if (receive_msg(tc, &cmdcode, &flags, &size, &data) == -1) {
if (data)
Tcl_Free((char *) data);
Tcl_PosixError(interp);
return TCL_ERROR;
}
res = Tcl_SetVar(interp, Tcl_GetString(objv[3]), (char *) data, TCL_LEAVE_ERR_MSG);
Tcl_Free((char *) data);
if (res == NULL)
return TCL_ERROR;
to = Tcl_NewIntObj(cmdcode);
Tcl_IncrRefCount(to);
if (Tcl_ObjSetVar2(interp, objv[2], NULL, to, TCL_LEAVE_ERR_MSG) == NULL) {
Tcl_DecrRefCount(to);
return TCL_ERROR;
}
Tcl_DecrRefCount(to);
to = Tcl_NewIntObj(flags);
Tcl_IncrRefCount(to);
if (Tcl_ObjSetVar2(interp, objv[4], NULL, to, TCL_LEAVE_ERR_MSG) == NULL) {
Tcl_DecrRefCount(to);
return TCL_ERROR;
}
Tcl_DecrRefCount(to);
Tcl_SetObjResult(interp, Tcl_NewIntObj(size));
return TCL_OK;
}