diff options
Diffstat (limited to 'agent/mibgroup/mibII/setSerialNo.c')
-rw-r--r-- | agent/mibgroup/mibII/setSerialNo.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/agent/mibgroup/mibII/setSerialNo.c b/agent/mibgroup/mibII/setSerialNo.c new file mode 100644 index 0000000..85a4098 --- /dev/null +++ b/agent/mibgroup/mibII/setSerialNo.c @@ -0,0 +1,84 @@ +/** + * This file implements the snmpSetSerialNo TestAndIncr counter + */ +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-features.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> + +netsnmp_feature_require(watcher_spinlock) + + +#include "setSerialNo.h" + +/* + * A watched spinlock can be fully implemented by the spinlock helper, + * but we still need a suitable variable to hold the value. + */ +static int setserialno; + + /* + * TestAndIncr values should persist across agent restarts, + * so we need config handling routines to load and save the + * current value (incrementing this whenever it's loaded). + */ +static void +setserial_parse_config( const char *token, char *cptr ) +{ + setserialno = atoi(cptr); + setserialno++; + DEBUGMSGTL(("snmpSetSerialNo", + "Re-setting SnmpSetSerialNo to %d\n", setserialno)); +} +static int +setserial_store_config( int a, int b, void *c, void *d ) +{ + char line[SNMP_MAXBUF_SMALL]; + snprintf(line, SNMP_MAXBUF_SMALL, "setserialno %d", setserialno); + snmpd_store_config( line ); + return 0; +} + +void +init_setSerialNo(void) +{ + oid set_serial_oid[] = { 1, 3, 6, 1, 6, 3, 1, 1, 6, 1 }; + + /* + * If we can't retain the TestAndIncr value across an agent restart, + * then it should be initialised to a pseudo-random value. So set it + * as such, before registering the config handlers to override this. + */ +#ifdef SVR4 + setserialno = lrand48(); +#else + setserialno = random(); +#endif + DEBUGMSGTL(("snmpSetSerialNo", + "Initalizing SnmpSetSerialNo to %d\n", setserialno)); + snmpd_register_config_handler("setserialno", setserial_parse_config, + NULL, "integer"); + snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA, + setserial_store_config, NULL); + + /* + * Register 'setserialno' as a watched spinlock object + */ +#ifndef NETSNMP_NO_WRITE_SUPPORT + netsnmp_register_watched_spinlock( + netsnmp_create_handler_registration("snmpSetSerialNo", NULL, + set_serial_oid, + OID_LENGTH(set_serial_oid), + HANDLER_CAN_RWRITE), + &setserialno ); +#else /* !NETSNMP_NO_WRITE_SUPPORT */ + netsnmp_register_watched_spinlock( + netsnmp_create_handler_registration("snmpSetSerialNo", NULL, + set_serial_oid, + OID_LENGTH(set_serial_oid), + HANDLER_CAN_RONLY), + &setserialno ); +#endif /* !NETSNMP_NO_WRITE_SUPPORT */ + DEBUGMSGTL(("scalar_int", "Done initalizing example scalar int\n")); +} + |