void asrv::start () { if (xi->stab[progvers (rpcprog->progno, rpcprog->versno)]) panic ("attempt to reregister %s on same transport\n", rpcprog->name); xi->stab.insert (this); }
bool json_introspection_server_t::is_associated (ptr<axprt> x) { ptr<xhinfo> xi = xhinfo::lookup (x); bool ret = false; if (xi) { ret = xi->stab[progvers (s_prog.progno, s_prog.versno)]; } return ret; }
void asrv::dispatch (ref<xhinfo> xi, const char *msg, ssize_t len, const sockaddr *src) { if (!msg || len < 8 || getint (msg + 4) != CALL) { seteof (xi, src, len < 0); return; } xdrmem x (msg, len, XDR_DECODE); auto_ptr<svccb> sbp (New svccb); rpc_msg *m = &sbp->msg; if (!xdr_callmsg (x.xdrp (), m)) { trace (1) << "asrv::dispatch: xdr_callmsg failed\n"; seteof (xi, src); return; } if (m->rm_call.cb_rpcvers != RPC_MSG_VERSION) { trace (1) << "asrv::dispatch: bad RPC message version\n"; asrv_rpc_mismatch (xi, src, m->rm_xid); return; } asrv *s = xi->stab[progvers (sbp->prog (), sbp->vers ())]; if (!s || !s->cb) { if (asrvtrace >= 1) { if (s) warn ("asrv::dispatch: no callback for %s (proc = %u)\n", s->rpcprog->name, sbp->proc ()); else warn ("asrv::dispatch: invalid prog/vers %u/%u (proc = %u)\n", (u_int) sbp->prog (), (u_int) sbp->vers (), (u_int) sbp->proc ()); } asrv_accepterr (xi, src, PROG_UNAVAIL, m); return; } if (s->recv_hook) s->recv_hook (); sbp->init (s, src); if (sbp->proc () >= s->nproc) { if (asrvtrace >= 1) warn ("asrv::dispatch: invalid procno %s:%u\n", s->rpcprog->name, (u_int) sbp->proc ()); asrv_accepterr (xi, src, PROC_UNAVAIL, m); return; } if (s->isreplay (sbp.get ())) { trace (4, "replay %s:%s x=%x", s->rpcprog->name, s->tbl[m->rm_call.cb_proc].name, xidswap (m->rm_xid)) << sock2str (src) << "\n"; return; } const rpcgen_table *rtp = &s->tbl[sbp->proc ()]; sbp->arg = s->tbl[sbp->proc ()].alloc_arg (); if (!rtp->xdr_arg (x.xdrp (), sbp->arg)) { if (asrvtrace >= 1) warn ("asrv::dispatch: bad message %s:%s x=%x", s->rpcprog->name, rtp->name, xidswap (m->rm_xid)) << sock2str (src) << "\n"; asrv_accepterr (xi, src, GARBAGE_ARGS, m); s->inc_svccb_count (); s->sendreply (sbp.release (), NULL, true); return; } if (asrvtrace >= 2) { if (const authunix_parms *aup = sbp->getaup ()) trace (2, "serve %s:%s x=%x u=%u g=%u", s->rpcprog->name, rtp->name, xidswap (m->rm_xid), aup->aup_uid, aup->aup_gid) << sock2str (src) << "\n"; else if (u_int32_t i = sbp->getaui ()) trace (2, "serve %s:%s x=%x i=%u", s->rpcprog->name, rtp->name, xidswap (m->rm_xid), i) << sock2str (src) << "\n"; else trace (2, "serve %s:%s x=%x", s->rpcprog->name, rtp->name, xidswap (m->rm_xid)) << sock2str (src) << "\n"; } if (asrvtrace >= 5 && rtp->print_arg) rtp->print_arg (sbp->arg, NULL, asrvtrace - 4, "ARGS", ""); s->inc_svccb_count (); (*s->cb) (sbp.release ()); }
void asrv::stop () { if (xi->stab [progvers (rpcprog->progno, rpcprog->versno)] == this) xi->stab.remove (this); }