int Web_Recv()

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