Ejemplo n.º 1
0
Archivo: asrv.C Proyecto: vonwenm/pbft
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
Archivo: asrv.C Proyecto: vonwenm/pbft
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 ());
}
Ejemplo n.º 4
0
Archivo: asrv.C Proyecto: vonwenm/pbft
void
asrv::stop ()
{
    if (xi->stab [progvers (rpcprog->progno, rpcprog->versno)] == this)
        xi->stab.remove (this);
}