static int show_udp_pcb(struct udp_inf * inf, FILE * f) { char buf1[24]; char buf2[24]; fprintf(f, "udp %-22s %-22s\n", sock2str(buf1, inf->laddr, inf->lport), sock2str(buf2, inf->faddr, inf->fport)); return 0; }
static int show_tcp_pcb(struct tcp_inf * inf, FILE * f) { char buf1[24]; char buf2[24]; fprintf(f, "tcp %-22s %-22s %s\n", sock2str(buf1, inf->laddr, inf->lport), sock2str(buf2, inf->faddr, inf->fport), tcp_state[(int)inf->state]); return 0; }
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 ()); }