/**  
 *  This file implements the snmpSetSerialNo TestAndIncr counter
 */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

#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
     */
    netsnmp_register_watched_spinlock(
        netsnmp_create_handler_registration("snmpSetSerialNo", NULL,
                                   set_serial_oid,
                                   OID_LENGTH(set_serial_oid),
                                   HANDLER_CAN_RWRITE),
                                       &setserialno );

    DEBUGMSGTL(("scalar_int", "Done initalizing example scalar int\n"));
}

