%{ #include #include %} 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(); %} function rpcprogname:string(_clnt:long) %{ struct rpc_clnt *clnt = (struct rpc_clnt *)(long) kread(&(THIS->_clnt)); char *cl_server = kread(&(clnt->cl_server)); char *cl_protname = kread(&(clnt->cl_protname)); char buf[MAXSTRINGLEN]; snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s:%s", cl_server ? cl_server : "NULL" , cl_protname ? cl_protname : "NULL" ); CATCH_DEREF_FAULT(); %} global syn_clnt, syn_msg, syn_flags global asyn_clnt, asyn_msg, asyn_flags global show_all probe module("sunrpc").function("rpc_call_sync") { if (show_all) { printf("%s(%d): rpc_call_sync:%s:%s: flags 0x%x\n", execname(), pid(), rpcprocname($msg), rpcprogname($clnt), $flags); } syn_clnt = $clnt; syn_msg = $msg; syn_flags = $flags; } probe module("sunrpc").function("rpc_call_sync").return { if ($return) { if (rpcprocnum(syn_msg) != 2 && $return != -2) { printf("%s(%d): rpc_call_sync:%s:%s: return %d (%s)\n", execname(), pid(), rpcprocname(syn_msg), rpcprogname(syn_clnt), $return, errno_str($return)); } } } probe module("sunrpc").function("rpc_call_async") { if (show_all) { printf("%s(%d): rpc_call_sync:%s:%s:flags 0x%x\n", execname(), pid(), rpcprocname($msg), rpcprogname($clnt), $flags); } asyn_clnt = $clnt; asyn_msg = $msg; asyn_flags = $flags; } probe module("sunrpc").function("rpc_call_async").return { if ($return) { if (rpcprocnum(asyn_msg) != 2 && $return != -2) { printf("%s(%d): rpc_call_sync:%s:%s: return %d (%s)\n", execname(), pid(), rpcprocname(syn_msg), rpcprogname(syn_clnt), $return, errno_str($return)); } } } probe begin { show_all = 0; if (argc > 0) { if (isinstr(argv[1], "--show_all")) { show_all = 1 } else { error("Usage: sunrpc -- --show_all"); } } log("starting sunrpc probe") } probe end { log("ending sunrpc probe") }