%{ #include #include #include #include %} function task_dump:string(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); char buf[MAXSTRINGLEN]; int cc=0; if (task <= 0) { sprintf(buf+cc, "task NULL"); } else { sprintf(buf+cc, "task %p tk_pid %d tk_status %d\n", task, task->tk_pid, task->tk_status); cc = strlen(buf); } snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", buf); CATCH_DEREF_FAULT(); %} function task_status:long(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); THIS->__retvalue = task->tk_status; CATCH_DEREF_FAULT(); %} function cl_prognum:long(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); struct rpc_clnt *clnt = (struct rpc_clnt *)(long) kread(&(task->tk_client)); THIS->__retvalue = clnt->cl_prog; CATCH_DEREF_FAULT(); %} function cl_vers:long(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); struct rpc_clnt *clnt = (struct rpc_clnt *)(long) kread(&(task->tk_client)); THIS->__retvalue = clnt->cl_vers; CATCH_DEREF_FAULT(); %} function cl_prog:string(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); struct rpc_clnt *clnt = (struct rpc_clnt *)(long) kread(&(task->tk_client)); struct rpc_procinfo *proc = (struct rpc_procinfo *)(long) kread(&(clnt->cl_procinfo)); char *p_name = kread(&(proc->p_name)); static struct { int prog; char *string; } prog_progtbl[] = { {100000, "rpcbind"}, {100024, "statd"}, {100011, "rquotad"}, {100003, "nfs"}, {100021, "nlockmgr"}, {100005, "mountd"}, {100227, "nfs_acl"}, }; int i; int tabsz = (sizeof(prog_progtbl)/sizeof(prog_progtbl[0])); for (i = 0; i < tabsz; i++) { if (prog_progtbl[i].prog == clnt->cl_prog) { break; } } if (i == tabsz) snprintf(THIS->__retvalue, MAXSTRINGLEN, "0x%x[%d]:%d", clnt->cl_prog, clnt->cl_vers, proc->p_proc); else snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s[%d]:%d", prog_progtbl[i].string, clnt->cl_vers, proc->p_proc); CATCH_DEREF_FAULT(); %} function cl_server:string(_task:long) %{ struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task)); struct rpc_clnt *clnt = (struct rpc_clnt *)(long) kread(&(task->tk_client)); char *cl_server = kread(&(clnt->cl_server)); snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s", cl_server ? cl_server : "NULL"); CATCH_DEREF_FAULT(); %} /* function rpcprocnum:long(_msg:long) %{ struct rpc_message *msg = (struct rpc_message *)(long) kread(&(THIS->_msg)); struct rpc_procinfo *rpc_proc = (struct rpc_procinfo *)(long) kread(&(msg->rpc_proc)); THIS->__retvalue = rpc_proc->p_proc; CATCH_DEREF_FAULT(); %} function rpcprocname:string(_msg:long) %{ struct rpc_message *msg = (struct rpc_message *)(long) kread(&(THIS->_msg)); struct rpc_procinfo *rpc_proc = (struct rpc_procinfo *)(long) kread(&(msg->rpc_proc)); char *p_name = kread(&(rpc_proc->p_name)); char buf[MAXSTRINGLEN]; snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s(%d)", p_name ? p_name : "NULL" , rpc_proc->p_proc); CATCH_DEREF_FAULT(); %} */