bool print_procedure()

in src/analysis/print_analyzer.cpp [55:163]


bool print_procedure(std::ostream& out, const RPCProcedure* proc)
{
    using namespace NST::utils;
    bool result{false};
    out << *(proc->session);

    auto&               call = proc->call;
    const unsigned long nfs_version{call.ru.RM_cmb.cb_vers};
    if(out_all())
    {
        out << " XID: " << call.rm_xid
            << " RPC version: " << call.ru.RM_cmb.cb_rpcvers
            << " RPC program: " << call.ru.RM_cmb.cb_prog
            << " version: " << nfs_version << ' ';
    }
    switch(nfs_version)
    {
    case NFS_V3:
        out << print_nfs3_procedures(static_cast<ProcEnumNFS3::NFSProcedure>(call.ru.RM_cmb.cb_proc));
        break;
    case NFS_V4:
        out << print_nfs41_procedures(static_cast<ProcEnumNFS41::NFSProcedure>(call.ru.RM_cmb.cb_proc));
        break;
    }

    // check procedure reply
    auto& reply = proc->reply;
    if(reply.ru.RM_rmb.rp_stat == reply_stat::MSG_ACCEPTED)
    {
        switch(reply.ru.RM_rmb.ru.RP_ar.ar_stat)
        {
        case accept_stat::SUCCESS:
            result = true; // Ok, reply is correct
            break;
        case accept_stat::PROG_MISMATCH:
            out << " Program mismatch: "
                << " low: " << reply.ru.RM_rmb.ru.RP_ar.ru.AR_versions.low
                << " high: " << reply.ru.RM_rmb.ru.RP_ar.ru.AR_versions.high;
            break;
        case accept_stat::PROG_UNAVAIL:
            out << " Program unavailable";
            break;
        case accept_stat::PROC_UNAVAIL:
            out << " Procedure unavailable";
            break;
        case accept_stat::GARBAGE_ARGS:
            out << " Garbage arguments";
            break;
        case accept_stat::SYSTEM_ERR:
            out << " System error";
            break;
        }
    }
    else if(reply.ru.RM_rmb.rp_stat == reply_stat::MSG_DENIED)
    {
        out << " RPC Call rejected: ";
        switch(reply.ru.RM_rmb.ru.RP_dr.rj_stat)
        {
        case reject_stat::RPC_MISMATCH:
            out << "RPC version number mismatch, "
                << " low: "
                << reply.ru.RM_rmb.ru.RP_dr.ru.RJ_versions.low
                << " high: "
                << reply.ru.RM_rmb.ru.RP_dr.ru.RJ_versions.high;
            break;
        case reject_stat::AUTH_ERROR:
        {
            out << " Authentication check: ";
            switch(reply.ru.RM_rmb.ru.RP_dr.ru.RJ_why)
            {
            case auth_stat::AUTH_OK:
                out << "OK";
                break;
            case auth_stat::AUTH_BADCRED:
                out << " bogus credentials (seal broken)"
                    << " (failed at remote end)";
                break;
            case auth_stat::AUTH_REJECTEDCRED:
                out << " rejected credentials (client should begin new session)"
                    << " (failed at remote end)";
                break;
            case auth_stat::AUTH_BADVERF:
                out << " bogus verifier (seal broken)"
                    << " (failed at remote end)";
                break;
            case auth_stat::AUTH_REJECTEDVERF:
                out << " verifier expired or was replayed"
                    << " (failed at remote end)";
                break;
            case auth_stat::AUTH_TOOWEAK:
                out << " too weak (rejected due to security reasons)"
                    << " (failed at remote end)";
                break;
            case auth_stat::AUTH_INVALIDRESP:
                out << " bogus response verifier"
                    << " (failed locally)";
                break;
            default:
                out << " some unknown reason"
                    << " (failed locally)";
                break;
            }
            break;
        }
        }
    }
    out << '\n'; // end line of RPC procedure information
    return result;
}