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

📄 extend.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
                }                /*                 * 'run-command(3)' is the only valid assignment                 *  for permanent (i.e. config) entries                 */                if ((extension && extension->flags & NS_EXTEND_FLAGS_CONFIG)                    && i!=3 ) {                    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_INCONSISTENTVALUE);                    return SNMP_ERR_INCONSISTENTVALUE;                }                break;            case COLUMN_EXTCFG_STATUS:                if (request->requestvb->type != ASN_INTEGER) {                    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_WRONGTYPE);                    return SNMP_ERR_WRONGTYPE;                }                i = *request->requestvb->val.integer;                switch (i) {                case RS_ACTIVE:                case RS_NOTINSERVICE:                    if (!extension) {                        /* Must be used with existing rows */                        netsnmp_set_request_error(reqinfo, request,                                                  SNMP_ERR_INCONSISTENTVALUE);                        return SNMP_ERR_INCONSISTENTVALUE;                    }                    break;    /* OK */                case RS_CREATEANDGO:                case RS_CREATEANDWAIT:                    if (extension) {                        /* Can only be used to create new rows */                        netsnmp_set_request_error(reqinfo, request,                                                  SNMP_ERR_INCONSISTENTVALUE);                        return SNMP_ERR_INCONSISTENTVALUE;                    }                    break;                case RS_DESTROY:                    break;                default:                    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_WRONGVALUE);                    return SNMP_ERR_WRONGVALUE;                }                break;            default:                netsnmp_set_request_error(reqinfo, request,                                          SNMP_ERR_NOTWRITABLE);                return SNMP_ERR_NOTWRITABLE;            }            break;        case MODE_SET_RESERVE2:            switch (table_info->colnum) {            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                switch (i) {                case RS_CREATEANDGO:                case RS_CREATEANDWAIT:                    eptr = _find_extension_block( request->requestvb->name,                                                  request->requestvb->name_length );                    extension = _new_extension( table_info->indexes->val.string,                                                0, eptr );                    if (!extension) {  /* failed */                        netsnmp_set_request_error(reqinfo, request,                                                  SNMP_ERR_RESOURCEUNAVAILABLE);                        return SNMP_ERR_RESOURCEUNAVAILABLE;                    }                    netsnmp_insert_table_row( request, extension->row );                }            }            break;        case MODE_SET_FREE:            switch (table_info->colnum) {            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                switch (i) {                case RS_CREATEANDGO:                case RS_CREATEANDWAIT:                    eptr = _find_extension_block( request->requestvb->name,                                                  request->requestvb->name_length );                    _free_extension( extension, eptr );                }            }            break;        case MODE_SET_ACTION:            switch (table_info->colnum) {            case COLUMN_EXTCFG_COMMAND:                extension->old_command = extension->command;                extension->command = netsnmp_strdup_and_null(                    request->requestvb->val.string,                    request->requestvb->val_len);                break;            case COLUMN_EXTCFG_ARGS:                extension->old_args = extension->args;                extension->args = netsnmp_strdup_and_null(                    request->requestvb->val.string,                    request->requestvb->val_len);                break;            case COLUMN_EXTCFG_INPUT:                extension->old_input = extension->input;                extension->input = netsnmp_strdup_and_null(                    request->requestvb->val.string,                    request->requestvb->val_len);                break;            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                switch (i) {                case RS_ACTIVE:                case RS_CREATEANDGO:                    need_to_validate = 1;                }                break;            }            break;        case MODE_SET_UNDO:            switch (table_info->colnum) {            case COLUMN_EXTCFG_COMMAND:                if ( extension && extension->old_command ) {                    SNMP_FREE(extension->command);                    extension->command     = extension->old_command;                    extension->old_command = NULL;                }                break;            case COLUMN_EXTCFG_ARGS:                if ( extension && extension->old_args ) {                    SNMP_FREE(extension->args);                    extension->args     = extension->old_args;                    extension->old_args = NULL;                }                break;            case COLUMN_EXTCFG_INPUT:                if ( extension && extension->old_input ) {                    SNMP_FREE(extension->input);                    extension->input     = extension->old_input;                    extension->old_input = NULL;                }                break;            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                switch (i) {                case RS_CREATEANDGO:                case RS_CREATEANDWAIT:                    eptr = _find_extension_block( request->requestvb->name,                                                  request->requestvb->name_length );                    _free_extension( extension, eptr );                }                break;            }            break;        case MODE_SET_COMMIT:            switch (table_info->colnum) {            case COLUMN_EXTCFG_CACHETIME:                i = *request->requestvb->val.integer;                extension->cache->timeout = i;                break;            case COLUMN_EXTCFG_RUNTYPE:                i = *request->requestvb->val.integer;                switch (i) {                case 1:                    extension->flags &= ~NS_EXTEND_FLAGS_WRITEABLE;                    break;                case 2:                    extension->flags |=  NS_EXTEND_FLAGS_WRITEABLE;                    break;                case 3:                    (void)netsnmp_cache_check_and_reload( extension->cache );                    break;                }                break;            case COLUMN_EXTCFG_EXECTYPE:                i = *request->requestvb->val.integer;                if ( i == NS_EXTEND_ETYPE_SHELL )                    extension->flags |=  NS_EXTEND_FLAGS_SHELL;                else                    extension->flags &= ~NS_EXTEND_FLAGS_SHELL;                break;            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                switch (i) {                case RS_ACTIVE:                case RS_CREATEANDGO:                    extension->flags |= NS_EXTEND_FLAGS_ACTIVE;                    break;                case RS_NOTINSERVICE:                case RS_CREATEANDWAIT:                    extension->flags &= ~NS_EXTEND_FLAGS_ACTIVE;                    break;                case RS_DESTROY:                    eptr = _find_extension_block( request->requestvb->name,                                                  request->requestvb->name_length );                    _free_extension( extension, eptr );                    break;                }            }            break;        default:            netsnmp_set_request_error(reqinfo, request, SNMP_ERR_GENERR);            return SNMP_ERR_GENERR;        }    }    /*     * If we're marking a given row as active,     *  then we need to check that it's ready.     */    if (need_to_validate) {        for ( request=requests; request; request=request->next ) {            if (request->processed)                continue;            table_info = netsnmp_extract_table_info( request );            extension  = (netsnmp_extend*)netsnmp_extract_table_row_data( request );            switch (table_info->colnum) {            case COLUMN_EXTCFG_STATUS:                i = *request->requestvb->val.integer;                if (( i == RS_ACTIVE || i == RS_CREATEANDGO ) &&                    !(extension && extension->command &&                      extension->command[0] == '/' /* &&                      is_executable(extension->command) */)) {                    netsnmp_set_request_error(reqinfo, request,                                              SNMP_ERR_INCONSISTENTVALUE);                    return SNMP_ERR_INCONSISTENTVALUE;                }            }        }    }    return SNMP_ERR_NOERROR;}inthandle_nsExtendOutput1Table(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_extend             *extension;    int len;    for ( request=requests; request; request=request->next ) {        if (request->processed)            continue;        table_info = netsnmp_extract_table_info( request );        extension  = (netsnmp_extend*)netsnmp_extract_table_row_data( request );        DEBUGMSGTL(( "nsExtendTable:output1", "varbind: "));        DEBUGMSGOID(("nsExtendTable:output1", request->requestvb->name,                                              request->requestvb->name_length));        DEBUGMSG((   "nsExtendTable:output1", "\n"));        switch (reqinfo->mode) {        case MODE_GET:            if (!extension || !(extension->flags & NS_EXTEND_FLAGS_ACTIVE)) {                /*                 * If this row is inactive, then skip it.                 */                netsnmp_set_request_error(reqinfo, request,                                          SNMP_NOSUCHINSTANCE);                continue;            }            if (!(extension->flags & NS_EXTEND_FLAGS_WRITEABLE) &&                (netsnmp_cache_check_and_reload( extension->cache ) < 0 )) {                /*                 * If reloading the output cache of a 'run-on-read'                 * entry fails, then skip it.                 */                netsnmp_set_request_error(reqinfo, request,                                          SNMP_NOSUCHINSTANCE);                continue;            }            if ((extension->flags & NS_EXTEND_FLAGS_WRITEABLE) &&                (netsnmp_cache_check_expired( extension->cache ) == 1 )) {                /*                 * If the output cache of a 'run-on-write'                 * entry has expired, then skip it.                 */                netsnmp_set_request_error(reqinfo, request,                                          SNMP_NOSUCHINSTANCE);                continue;            }            switch (table_info->colnum) {            case COLUMN_EXTOUT1_OUTLEN:                snmp_set_var_typed_value(                     request->requestvb, ASN_INTEGER,                    (u_char*)&extension->out_len, sizeof(int));                break;            case COLUMN_EXTOUT1_OUTPUT1:                /*                  * If we've got more than one line,                 * find the length of the first one.                 * Otherwise find the length of the whole string.                 */                if (extension->numlines > 1) {                    len = (extension->lines[1])-(extension->output) -1;                } else if (extension->output) {                    len = strlen(extension->output);                } else {                    len = 0;                }                snmp_set_var_typed_value(                     request->requestvb, ASN_OCTET_STR,                     extension->output, len);                break;            case COLUMN_EXTOUT1_OUTPUT2:                snmp_set_var_typed_value(                     request->requestvb, ASN_OCTET_STR,                     extension->output,                    (extension->output)?extension->out_len:0);                break;            case COLUMN_EXTOUT1_NUMLINES:                snmp_set_var_typed_value(                     request->requestvb, ASN_INTEGER,                    (u_char*)&extension->numlines, sizeof(int));                break;            case COLUMN_EXTOUT1_RESULT:                snmp_set_var_typed_value(                     request->requestvb, ASN_INTEGER,                    (u_char*)&extension->result, sizeof(int));                break;            default:                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);                continue;            }            break;        default:            netsnmp_set_request_error(reqinfo, request, SNMP_ERR_GENERR);            return SNMP_ERR_GENERR;        }    }    return SNMP_ERR_NOERROR;}        /*************************         *         *  Multi-line output table handler         *  Most of the work is handled here.         *         *************************//*

⌨️ 快捷键说明

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