.c和.h生成,上一篇总结文章里面已经说了,也是使用mib2c同样的方法。
这里只贴出来.c的模板代码,基本可以实现set操作。具体到每一个case处理,我还没有去深入的研究。
-
#include <net-snmp/net-snmp-config.h>
-
#include <net-snmp/net-snmp-includes.h>
-
#include <net-snmp/agent/net-snmp-agent-includes.h>
-
#include "confNewVersion.h"
-
#include<stdlib.h>
-
/** Initializes the confNewVersion module */
-
void
-
init_confNewVersion(void)
-
{
-
const oid confNewVersion_oid[] = { 1,3,6,1,4,1,201566,1,6,3 };
-
-
DEBUGMSGTL(("confNewVersion", "Initializing\n"));
-
-
netsnmp_register_scalar(
-
netsnmp_create_handler_registration("confNewVersion", handle_confNewVersion,
-
confNewVersion_oid, OID_LENGTH(confNewVersion_oid),
-
HANDLER_CAN_RWRITE
-
));
-
}
-
static char buff[256]="beijing";
-
/*void init_baseinfo(void)
-
{
-
memset(buff,'\0',sizeof(buff));
-
memcpy(buff,"beijing",sizeof(buff));
-
}*/
-
int
-
handle_confNewVersion(netsnmp_mib_handler *handler,
-
netsnmp_handler_registration *reginfo,
-
netsnmp_agent_request_info *reqinfo,
-
netsnmp_request_info *requests)
-
{
-
int ret;
-
char cmd[50];
-
/* We are never called for a GETNEXT if it's registered as a
-
"instance", as it's "magically" handled for us. */
-
-
/* a instance handler also only hands us one request at a time, so
-
we don't need to loop over a list of requests; we'll only get one. */
-
-
switch(reqinfo->mode) {
-
-
case MODE_GET:
-
//1
-
snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
-
buff /* XXX: a pointer to the scalar's data */,
-
strlen(buff)/* XXX: the length of the data in bytes */);
-
break;
-
-
/*
-
* SET REQUEST
-
*
-
* multiple states in the transaction. See:
-
* http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg
-
*/
-
case MODE_SET_RESERVE1:
-
//1
-
/* or you could use netsnmp_check_vb_type_and_size instead */
-
ret = netsnmp_check_vb_type(requests->requestvb, ASN_OCTET_STR);
-
if ( ret != SNMP_ERR_NOERROR ) {
-
netsnmp_set_request_error(reqinfo, requests, ret );
-
}
-
break;
-
-
case MODE_SET_RESERVE2:
-
//1
-
/* XXX malloc "undo" storage buffer */
-
if (0/* XXX if malloc, or whatever, failed: */) {
-
netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_RESOURCEUNAVAILABLE);
-
}
-
break;
-
-
case MODE_SET_FREE:
-
//0
-
/* XXX: free resources allocated in RESERVE1 and/or
-
RESERVE2. Something failed somewhere, and the states
-
below won't be called. */
-
break;
-
-
case MODE_SET_ACTION:
-
/* XXX: perform the value change here */
-
//1
-
if (0/* XXX: error? */) {
-
netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED/* some error */);
-
}
-
break;
-
-
case MODE_SET_COMMIT:
-
/* XXX: delete temporary storage */
-
memcpy(buff,requests->requestvb->buf,requests->requestvb->val_len);
-
buff[requests->requestvb->val_len] ='\0';
-
//1
-
if (0/* XXX: error? */) {
-
/* try _really_really_ hard to never get to this point */
-
netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_COMMITFAILED);
-
}
-
break;
-
-
case MODE_SET_UNDO:
-
/* XXX: UNDO and return to previous value for the object */
-
if (0/* XXX: error? */) {
-
/* try _really_really_ hard to never get to this point */
-
netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED);
-
}
-
break;
-
-
default:
-
/* we should never get here, so this is a really bad error */
-
snmp_log(LOG_ERR, "unknown mode (%d) in handle_confNewVersion\n", reqinfo->mode );
-
return SNMP_ERR_GENERR;
-
}
-
-
return SNMP_ERR_NOERROR;
-
}
代码同样的方法去编译运行。
通过命令:snmpset -c private -v 2c localhost confNewVersion.0 s hebei 去测试。
阅读(4564) | 评论(0) | 转发(0) |