⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 master_admin.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 2 页
字号:
    default:        return AGENTX_ERR_REQUEST_DENIED;    }}intallocate_idx_list(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    netsnmp_variable_list *vp, *vp2, *next, *res;    int             flags = 0;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    if (pdu->flags & AGENTX_MSG_FLAG_ANY_INSTANCE)        flags |= ALLOCATE_ANY_INDEX;    if (pdu->flags & AGENTX_MSG_FLAG_NEW_INSTANCE)        flags |= ALLOCATE_NEW_INDEX;    /*     * XXX - what about errors?     *     *  If any allocations fail, then we need to     *    *fully* release the earlier ones.     *  (i.e. remove them completely from the index registry,     *    not simply mark them as available for re-use)     *     * For now - assume they all succeed.     */    for (vp = pdu->variables; vp != NULL; vp = next) {        next = vp->next_variable;        res = register_index(vp, flags, session);        if (res == NULL) {            /*             *  If any allocations fail, we need to *fully* release             *      all previous ones (i.e. remove them completely             *      from the index registry)             */            for (vp2 = pdu->variables; vp2 != vp; vp2 = vp2->next_variable) {                remove_index(vp2, session);            }            return AGENTX_ERR_INDEX_NONE_AVAILABLE;     /* XXX */        } else {            (void) snmp_clone_var(res, vp);            free(res);        }        vp->next_variable = next;    }    return AGENTX_ERR_NOERROR;}intrelease_idx_list(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    netsnmp_variable_list *vp, *vp2, *rv = NULL;    int             res;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    for (vp = pdu->variables; vp != NULL; vp = vp->next_variable) {        res = unregister_index(vp, TRUE, session);        /*         *  If any releases fail,         *      we need to reinstate all previous ones.         */        if (res != SNMP_ERR_NOERROR) {            for (vp2 = pdu->variables; vp2 != vp; vp2 = vp2->next_variable) {                rv = register_index(vp2, ALLOCATE_THIS_INDEX, session);                free(rv);            }            return AGENTX_ERR_INDEX_NOT_ALLOCATED;      /* Probably */        }    }    return AGENTX_ERR_NOERROR;}intadd_agent_caps_list(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    register_sysORTable_sess(pdu->variables->name,                             pdu->variables->name_length,                             (char *) pdu->variables->val.string, sp);    return AGENTX_ERR_NOERROR;}intremove_agent_caps_list(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    if (unregister_sysORTable_sess(pdu->variables->name,                                   pdu->variables->name_length, sp) < 0)        return AGENTX_ERR_UNKNOWN_AGENTCAPS;    else        return AGENTX_ERR_NOERROR;}intagentx_notify(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    netsnmp_variable_list *var;    int             got_sysuptime = 0;    extern oid      sysuptime_oid[], snmptrap_oid[];    extern size_t   sysuptime_oid_len, snmptrap_oid_len;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    var = pdu->variables;    if (!var)        return AGENTX_ERR_PROCESSING_ERROR;    if (snmp_oid_compare(var->name, var->name_length,                         sysuptime_oid, sysuptime_oid_len) == 0) {        got_sysuptime = 1;        var = var->next_variable;    }    if (!var || snmp_oid_compare(var->name, var->name_length,                                 snmptrap_oid, snmptrap_oid_len) != 0)        return AGENTX_ERR_PROCESSING_ERROR;    /*     *  If sysUptime isn't the first varbind, don't worry.       *     send_trap_vars() will add it if necessary.     *     *  Note that if this behaviour is altered, it will     *     be necessary to add sysUptime here,     *     as this is valid AgentX syntax.     */    send_trap_vars(-1, -1, pdu->variables);    return AGENTX_ERR_NOERROR;}intagentx_ping_response(netsnmp_session * session, netsnmp_pdu *pdu){    netsnmp_session *sp;    sp = find_agentx_session(session, pdu->sessid);    if (sp == NULL)        return AGENTX_ERR_NOT_OPEN;    else        return AGENTX_ERR_NOERROR;}inthandle_master_agentx_packet(int operation,                            netsnmp_session * session,                            int reqid, netsnmp_pdu *pdu, void *magic){    netsnmp_agent_session *asp;    struct timeval  now;    if (operation == NETSNMP_CALLBACK_OP_DISCONNECT) {        DEBUGMSGTL(("agentx/master",                    "transport disconnect on session %08p\n", session));        /*         * Shut this session down gracefully.           */        close_agentx_session(session, -1);        return 1;    } else if (operation != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {        DEBUGMSGTL(("agentx/master", "unexpected callback op %d\n",                    operation));        return 1;    }    /*     * Okay, it's a NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE op.       */    if (magic) {        asp = (netsnmp_agent_session *) magic;    } else {        asp = init_agent_snmp_session(session, pdu);    }    DEBUGMSGTL(("agentx/master", "handle pdu (req=0x%x,trans=0x%x,sess=0x%x)\n",                pdu->reqid,pdu->transid, pdu->sessid));        switch (pdu->command) {    case AGENTX_MSG_OPEN:        asp->pdu->sessid = open_agentx_session(session, pdu);        if (asp->pdu->sessid == -1)            asp->status = session->s_snmp_errno;        break;    case AGENTX_MSG_CLOSE:        asp->status = close_agentx_session(session, pdu->sessid);        break;    case AGENTX_MSG_REGISTER:        asp->status = register_agentx_list(session, pdu);        break;    case AGENTX_MSG_UNREGISTER:        asp->status = unregister_agentx_list(session, pdu);        break;    case AGENTX_MSG_INDEX_ALLOCATE:        asp->status = allocate_idx_list(session, asp->pdu);        if (asp->status != AGENTX_ERR_NOERROR) {            snmp_free_pdu(asp->pdu);            asp->pdu = snmp_clone_pdu(pdu);        }        break;    case AGENTX_MSG_INDEX_DEALLOCATE:        asp->status = release_idx_list(session, pdu);        break;    case AGENTX_MSG_ADD_AGENT_CAPS:        asp->status = add_agent_caps_list(session, pdu);        break;    case AGENTX_MSG_REMOVE_AGENT_CAPS:        asp->status = remove_agent_caps_list(session, pdu);        break;    case AGENTX_MSG_NOTIFY:        asp->status = agentx_notify(session, pdu);        break;    case AGENTX_MSG_PING:        asp->status = agentx_ping_response(session, pdu);        break;        /*         * TODO: Other admin packets          */    case AGENTX_MSG_GET:    case AGENTX_MSG_GETNEXT:    case AGENTX_MSG_GETBULK:    case AGENTX_MSG_TESTSET:    case AGENTX_MSG_COMMITSET:    case AGENTX_MSG_UNDOSET:    case AGENTX_MSG_CLEANUPSET:    case AGENTX_MSG_RESPONSE:        /*         * Shouldn't be handled here          */        break;    default:        asp->status = AGENTX_ERR_PARSE_FAILED;        break;    }    gettimeofday(&now, NULL);    asp->pdu->time = calculate_time_diff(&now, &starttime);    asp->pdu->command = AGENTX_MSG_RESPONSE;    asp->pdu->errstat = asp->status;    DEBUGMSGTL(("agentx/master", "send response, stat %d (req=0x%x,trans="                "0x%x,sess=0x%x)\n",                asp->status, pdu->reqid,pdu->transid, pdu->sessid));    if (!snmp_send(asp->session, asp->pdu)) {        char           *eb = NULL;        int             pe, pse;        snmp_error(asp->session, &pe, &pse, &eb);        snmp_free_pdu(asp->pdu);        DEBUGMSGTL(("agentx/master", "FAILED %d %d %s\n", pe, pse, eb));        free(eb);    }    asp->pdu = NULL;    free_agent_snmp_session(asp);    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -