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

📄 nsvacmaccesstable.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
字号:
/* * Note: this file originally auto-generated by mib2c using *  : mib2c.iterate.conf,v 5.17 2005/05/09 08:13:45 dts12 Exp $ */#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <net-snmp/library/vacm.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include "nsVacmAccessTable.h"/** Initializes the nsVacmAccessTable module */voidinit_register_nsVacm_context(const char *context){    /*     * Initialize the nsVacmAccessTable table by defining its     *   contents and how it's structured     */    static oid nsVacmAccessTable_oid[]   = { 1,3,6,1,4,1,8072,1,9,1 };    size_t     nsVacmAccessTable_oid_len = OID_LENGTH(nsVacmAccessTable_oid);    netsnmp_handler_registration    *reg;    netsnmp_iterator_info           *iinfo;    netsnmp_table_registration_info *table_info;    reg = netsnmp_create_handler_registration("nsVacmAccessTable",                                            nsVacmAccessTable_handler,                                            nsVacmAccessTable_oid,                                            nsVacmAccessTable_oid_len,                                            HANDLER_CAN_RWRITE);    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);    netsnmp_table_helper_add_indexes(table_info,                                     ASN_OCTET_STR, /* index: vacmGroupName */                                     ASN_OCTET_STR, /* index: vacmAccessContextPrefix */                                     ASN_INTEGER,   /* index: vacmAccessSecurityModel */                                     ASN_INTEGER,   /* index: vacmAccessSecurityLevel */                                     ASN_OCTET_STR, /* index: nsVacmAuthType */                                     0);    table_info->min_column = COLUMN_NSVACMCONTEXTMATCH;    table_info->max_column = COLUMN_NSVACMACCESSSTATUS;    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);    iinfo->get_first_data_point = nsVacmAccessTable_get_first_data_point;    iinfo->get_next_data_point  = nsVacmAccessTable_get_next_data_point;    iinfo->table_reginfo = table_info;    if ( context && context[0] )        reg->contextName = strdup(context);    netsnmp_register_table_iterator(reg, iinfo);}voidinit_nsVacmAccessTable(void){    init_register_nsVacm_context("");}/* * Iterator hook routines */static int nsViewIdx;   /* This should really be handled via the 'loop_context'                           parameter, but it's easier (read lazier) to use a                           global variable as well.  Bad David! */netsnmp_variable_list *nsVacmAccessTable_get_first_data_point(void **my_loop_context,                                       void **my_data_context,                                       netsnmp_variable_list *put_index_data,                                       netsnmp_iterator_info *mydata){    vacm_scanAccessInit();    *my_loop_context = vacm_scanAccessNext();    nsViewIdx = 0;    return nsVacmAccessTable_get_next_data_point(my_loop_context,                                                 my_data_context,                                                 put_index_data, mydata);}netsnmp_variable_list *nsVacmAccessTable_get_next_data_point(void **my_loop_context,                                      void **my_data_context,                                      netsnmp_variable_list *put_index_data,                                      netsnmp_iterator_info *mydata){    struct vacm_accessEntry *entry =        (struct vacm_accessEntry *) *my_loop_context;    netsnmp_variable_list *idx;    int len;    char *cp;newView:    idx = put_index_data;    if ( nsViewIdx == VACM_MAX_VIEWS ) {        entry = vacm_scanAccessNext();        nsViewIdx = 0;    }    if (entry) {        len = entry->groupName[0];        snmp_set_var_value(idx, (u_char *)entry->groupName+1, len);        idx = idx->next_variable;        len = entry->contextPrefix[0];        snmp_set_var_value(idx, (u_char *)entry->contextPrefix+1, len);        idx = idx->next_variable;        snmp_set_var_value(idx, (u_char *)&entry->securityModel,                           sizeof(entry->securityModel));        idx = idx->next_variable;        snmp_set_var_value(idx, (u_char *)&entry->securityLevel,                           sizeof(entry->securityLevel));        /*         * Find the next valid authType view - skipping unused entries         */        idx = idx->next_variable;        for (; nsViewIdx < VACM_MAX_VIEWS; nsViewIdx++) {            if ( entry->views[ nsViewIdx ][0] )                break;        }        if ( nsViewIdx == VACM_MAX_VIEWS )            goto newView;        cp = se_find_label_in_slist(VACM_VIEW_ENUM_NAME, nsViewIdx++);        DEBUGMSGTL(("nsVacm", "nextDP %s:%s (%d)\n", entry->groupName+1, cp, nsViewIdx-1));        snmp_set_var_value(idx, (u_char *)cp, strlen(cp));        idx = idx->next_variable;        *my_data_context = (void *) entry;        *my_loop_context = (void *) entry;        return put_index_data;    } else {        return NULL;    }}/** handles requests for the nsVacmAccessTable table */intnsVacmAccessTable_handler(netsnmp_mib_handler *handler,                          netsnmp_handler_registration *reginfo,                          netsnmp_agent_request_info *reqinfo,                          netsnmp_request_info *requests){    netsnmp_request_info *request;    netsnmp_table_request_info *table_info;    netsnmp_variable_list      *idx;    struct vacm_accessEntry    *entry;    char atype[20];    int  viewIdx, ret;    char *gName, *cPrefix;    int  model, level;    switch (reqinfo->mode) {        /*         * Read-support (also covers GetNext requests)         */    case MODE_GET:        for (request = requests; request; request = request->next) {            entry = (struct vacm_accessEntry *)                netsnmp_extract_iterator_context(request);            table_info = netsnmp_extract_table_info(request);            /* Extract the authType token from the list of indexes */            idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;            memset(atype, 0, sizeof(atype));            strncpy(atype, (char *)idx->val.string, idx->val_len);            viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);            DEBUGMSGTL(("nsVacm", "GET %s (%d)\n", idx->val.string, viewIdx));            if (!entry)                continue;            switch (table_info->colnum) {            case COLUMN_NSVACMCONTEXTMATCH:                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,                                           entry->contextMatch);                break;            case COLUMN_NSVACMVIEWNAME:                snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,                               (u_char *)entry->views[ viewIdx ],                                  strlen(entry->views[ viewIdx ]));                break;            case COLUMN_VACMACCESSSTORAGETYPE:                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,                                           entry->storageType);                break;            case COLUMN_NSVACMACCESSSTATUS:                snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,                                           entry->status);                break;            }        }        break;        /*         * Write-support         */    case MODE_SET_RESERVE1:        for (request = requests; request; request = request->next) {            entry = (struct vacm_accessEntry *)                netsnmp_extract_iterator_context(request);            table_info = netsnmp_extract_table_info(request);            ret = SNMP_ERR_NOERROR;            switch (table_info->colnum) {            case COLUMN_NSVACMCONTEXTMATCH:                ret = netsnmp_check_vb_int_range(request->requestvb, 1, 2);                break;            case COLUMN_NSVACMVIEWNAME:                ret = netsnmp_check_vb_type_and_max_size(request->requestvb,                                                         ASN_OCTET_STR,                                                         VACM_MAX_STRING);                break;            case COLUMN_VACMACCESSSTORAGETYPE:                ret = netsnmp_check_vb_storagetype(request->requestvb,                          (/*entry ? entry->storageType :*/ SNMP_STORAGE_NONE));                break;            case COLUMN_NSVACMACCESSSTATUS:                /*                 * The usual 'check_vb_rowstatus' call is too simplistic                 *   to be used here.  Because we're implementing a table                 *   within an existing table, it's quite possible for a                 *   the vacmAccessTable entry to exist, even if this is                 *   a "new" nsVacmAccessEntry.                 *                 * We can check that the value being assigned is suitable                 *   for a RowStatus syntax object, but the transition                 *   checks need to be done explicitly.                 */                ret = netsnmp_check_vb_rowstatus_value(request->requestvb);                if ( ret != SNMP_ERR_NOERROR )                    break;                /*                 * Extract the authType token from the list of indexes                 */                idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;                memset(atype, 0, sizeof(atype));                strncpy(atype, (char *)idx->val.string, idx->val_len);                viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);                if ( viewIdx < 0 ) {                    ret = SNMP_ERR_NOCREATION;                    break;                }                switch ( *request->requestvb->val.integer ) {                case RS_ACTIVE:                case RS_NOTINSERVICE:                    /* Check that this particular view is already set */                    if ( !entry || !entry->views[viewIdx][0] )                        ret = SNMP_ERR_INCONSISTENTVALUE;                    break;                case RS_CREATEANDWAIT:                case RS_CREATEANDGO:                    /* Check that this particular view is not yet set */                    if ( entry && entry->views[viewIdx][0] )                        ret = SNMP_ERR_INCONSISTENTVALUE;                    break;                }                break;            } /* switch(colnum) */            if ( ret != SNMP_ERR_NOERROR ) {                netsnmp_set_request_error(reqinfo, request, ret);                return SNMP_ERR_NOERROR;            }        }        break;    case MODE_SET_RESERVE2:        for (request = requests; request; request = request->next) {            entry = (struct vacm_accessEntry *)                netsnmp_extract_iterator_context(request);            table_info = netsnmp_extract_table_info(request);            switch (table_info->colnum) {            case COLUMN_NSVACMACCESSSTATUS:                switch (*request->requestvb->val.integer) {                case RS_CREATEANDGO:                case RS_CREATEANDWAIT:                    if (!entry) {                         idx = table_info->indexes; gName = (char*)idx->val.string;                         idx = idx->next_variable;  cPrefix = (char*)idx->val.string;                         idx = idx->next_variable;  model = *idx->val.integer;                         idx = idx->next_variable;  level = *idx->val.integer;                         entry = vacm_createAccessEntry( gName, cPrefix, model, level );                         entry->storageType = ST_NONVOLATILE;                         netsnmp_insert_iterator_context(request, (void*)entry);                    }                }            }        }        break;    case MODE_SET_FREE:    case MODE_SET_UNDO:        /* XXX - TODO */        break;    case MODE_SET_ACTION:        /* ??? Empty ??? */        break;    case MODE_SET_COMMIT:        for (request = requests; request; request = request->next) {            entry = (struct vacm_accessEntry *)                netsnmp_extract_iterator_context(request);            table_info = netsnmp_extract_table_info(request);            if ( !entry )                continue;  /* Shouldn't happen */            /* Extract the authType token from the list of indexes */            idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;            memset(atype, 0, sizeof(atype));            strncpy(atype, (char *)idx->val.string, idx->val_len);            viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);            switch (table_info->colnum) {            case COLUMN_NSVACMCONTEXTMATCH:                entry->contextMatch = *request->requestvb->val.integer;                break;            case COLUMN_NSVACMVIEWNAME:                memset( entry->views[viewIdx], 0, VACMSTRINGLEN );                memcpy( entry->views[viewIdx], request->requestvb->val.string,                                               request->requestvb->val_len);                break;            case COLUMN_VACMACCESSSTORAGETYPE:                entry->storageType = *request->requestvb->val.integer;                break;            case COLUMN_NSVACMACCESSSTATUS:                switch (*request->requestvb->val.integer) {                case RS_DESTROY:                    memset( entry->views[viewIdx], 0, VACMSTRINGLEN );                    break;                }                break;            }        }        break;    }    return SNMP_ERR_NOERROR;}

⌨️ 快捷键说明

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