/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 1.48 $ of : mfd-top.m2c,v $ 
 *
 * $Id$
 */
/** \page MFD helper for tcpListenerTable
 *
 * \section intro Introduction
 * Introductory text.
 *
 */
/*
 * standard Net-SNMP includes 
 */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

/*
 * include our parent header 
 */
#include "tcpListenerTable.h"

#include <net-snmp/agent/mib_modules.h>

#include "tcpListenerTable_interface.h"

const oid       tcpListenerTable_oid[] = { TCPLISTENERTABLE_OID };
const int       tcpListenerTable_oid_size =
OID_LENGTH(tcpListenerTable_oid);

tcpListenerTable_registration tcpListenerTable_user_context;

void            initialize_table_tcpListenerTable(void);
void            shutdown_table_tcpListenerTable(void);


/**
 * Initializes the tcpListenerTable module
 */
void
init_tcpListenerTable(void)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:init_tcpListenerTable",
                "called\n"));

    /*
     * TODO:300:o: Perform tcpListenerTable one-time module initialization.
     */

    /*
     * here we initialize all the tables we're planning on supporting
     */
    if (should_init("tcpListenerTable"))
        initialize_table_tcpListenerTable();

}                               /* init_tcpListenerTable */

/**
 * Shut-down the tcpListenerTable module (agent is exiting)
 */
void
shutdown_tcpListenerTable(void)
{
    if (should_init("tcpListenerTable"))
        shutdown_table_tcpListenerTable();

}

/**
 * Initialize the table tcpListenerTable 
 *    (Define its contents and how it's structured)
 */
void
initialize_table_tcpListenerTable(void)
{
    tcpListenerTable_registration *user_context;
    u_long          flags;

    DEBUGMSGTL(("verbose:tcpListenerTable:initialize_table_tcpListenerTable", "called\n"));

    /*
     * TODO:301:o: Perform tcpListenerTable one-time table initialization.
     */

    /*
     * TODO:302:o: |->Initialize tcpListenerTable user context
     * if you'd like to pass in a pointer to some data for this
     * table, allocate or set it up here.
     */
    user_context = &tcpListenerTable_user_context;

    /*
     * No support for any flags yet, but in the future you would
     * set any flags here.
     */
    flags = 0;

    /*
     * call interface initialization code
     */
    _tcpListenerTable_initialize_interface(user_context, flags);
}                               /* initialize_table_tcpListenerTable */

/**
 * Shutdown the table tcpListenerTable 
 */
void
shutdown_table_tcpListenerTable(void)
{
    /*
     * call interface shutdown code
     */
    _tcpListenerTable_shutdown_interface(&tcpListenerTable_user_context);
}

/**
 * extra context initialization (eg default values)
 *
 * @param rowreq_ctx    : row request context
 * @param user_init_ctx : void pointer for user (parameter to rowreq_ctx_allocate)
 *
 * @retval MFD_SUCCESS  : no errors
 * @retval MFD_ERROR    : error (context allocate will fail)
 */
int
tcpListenerTable_rowreq_ctx_init(tcpListenerTable_rowreq_ctx * rowreq_ctx,
                                 void *user_init_ctx)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_rowreq_ctx_init", "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:210:o: |-> Perform extra tcpListenerTable rowreq initialization. (eg DEFVALS)
     */

    return MFD_SUCCESS;
}                               /* tcpListenerTable_rowreq_ctx_init */

/**
 * extra context cleanup
 *
 */
void
tcpListenerTable_rowreq_ctx_cleanup(tcpListenerTable_rowreq_ctx *
                                    rowreq_ctx)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_rowreq_ctx_cleanup", "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:211:o: |-> Perform extra tcpListenerTable rowreq cleanup.
     */
    netsnmp_access_tcpconn_entry_free(rowreq_ctx->data);
    rowreq_ctx->data = NULL;
}                               /* tcpListenerTable_rowreq_ctx_cleanup */

/**
 * pre-request callback
 *
 *
 * @retval MFD_SUCCESS              : success.
 * @retval MFD_ERROR                : other error
 */
int
tcpListenerTable_pre_request(tcpListenerTable_registration * user_context)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_pre_request",
                "called\n"));

    /*
     * TODO:510:o: Perform tcpListenerTable pre-request actions.
     */

    return MFD_SUCCESS;
}                               /* tcpListenerTable_pre_request */

/**
 * post-request callback
 *
 * Note:
 *   New rows have been inserted into the container, and
 *   deleted rows have been removed from the container and
 *   released.
 * @param user_context
 * @param rc : MFD_SUCCESS if all requests succeeded
 *
 * @retval MFD_SUCCESS : success.
 * @retval MFD_ERROR   : other error (ignored)
 */
int
tcpListenerTable_post_request(tcpListenerTable_registration * user_context,
                              int rc)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_post_request",
                "called\n"));

    /*
     * TODO:511:o: Perform tcpListenerTable post-request actions.
     */

    return MFD_SUCCESS;
}                               /* tcpListenerTable_post_request */


/**********************************************************************
 **********************************************************************
 ***
 *** Table tcpListenerTable
 ***
 **********************************************************************
 **********************************************************************/
/*
 * TCP-MIB::tcpListenerTable is subid 20 of tcp.
 * Its status is Current.
 * OID: .1.3.6.1.2.1.6.20, length: 8
 */

/*
 * ---------------------------------------------------------------------
 * * TODO:200:r: Implement tcpListenerTable data context functions.
 */
/*
 * tcpListenerTable_allocate_data
 *
 * Purpose: create new tcpListenerTable_data.
 */
tcpListenerTable_data *
tcpListenerTable_allocate_data(void)
{
    /*
     * TODO:201:r: |-> allocate memory for the tcpListenerTable data context.
     */
    tcpListenerTable_data *rtn =
        SNMP_MALLOC_TYPEDEF(tcpListenerTable_data);

    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_allocate_data",
                "called\n"));

    if (NULL == rtn) {
        snmp_log(LOG_ERR, "unable to malloc memory for new "
                 "tcpListenerTable_data.\n");
    }

    return rtn;
}                               /* tcpListenerTable_allocate_data */

/*
 * tcpListenerTable_release_data
 *
 * Purpose: release tcpListenerTable data.
 */
void
tcpListenerTable_release_data(tcpListenerTable_data * data)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_release_data",
                "called\n"));

    /*
     * TODO:202:r: |-> release memory for the tcpListenerTable data context.
     */
    free(data);
}                               /* tcpListenerTable_release_data */



/**
 * set mib index(es)
 *
 * @param tbl_idx mib index structure
 * @param tcpListenerLocalAddressType_val
 * @param tcpListenerLocalAddress_val_ptr
 * @param tcpListenerLocalAddress_val_ptr_len
 * @param tcpListenerLocalPort_val
 *
 * @retval MFD_SUCCESS     : success.
 * @retval MFD_ERROR       : other error.
 *
 * @remark
 *  This convenience function is useful for setting all the MIB index
 *  components with a single function call. It is assume that the C values
 *  have already been mapped from their native/rawformat to the MIB format.
 */
int
tcpListenerTable_indexes_set_tbl_idx(tcpListenerTable_mib_index * tbl_idx,
                                     u_long
                                     tcpListenerLocalAddressType_val,
                                     char *tcpListenerLocalAddress_val_ptr,
                                     size_t
                                     tcpListenerLocalAddress_val_ptr_len,
                                     u_long tcpListenerLocalPort_val)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_indexes_set_tbl_idx", "called\n"));

    /*
     * tcpListenerLocalAddressType(1)/InetAddressType/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h 
     */
    /** WARNING: this code might not work for netsnmp_tcpconn_entry */
    if (4 == tcpListenerLocalAddressType_val)
        tbl_idx->tcpListenerLocalAddressType = INETADDRESSTYPE_IPV4;
    else if (16 == tcpListenerLocalAddressType_val)
        tbl_idx->tcpListenerLocalAddressType = INETADDRESSTYPE_IPV6;
    else
        tbl_idx->tcpListenerLocalAddressType = INETADDRESSTYPE_UNKNOWN;

    /*
     * tcpListenerLocalAddress(2)/InetAddress/ASN_OCTET_STR/char(char)//L/a/w/e/R/d/h 
     */
    tbl_idx->tcpListenerLocalAddress_len = sizeof(tbl_idx->tcpListenerLocalAddress) / sizeof(tbl_idx->tcpListenerLocalAddress[0]);      /* max length */
    /** WARNING: this code might not work for netsnmp_tcpconn_entry */
    /*
     * make sure there is enough space for tcpListenerLocalAddress data
     */
    if ((NULL == tbl_idx->tcpListenerLocalAddress) ||
        (tbl_idx->tcpListenerLocalAddress_len <
         (tcpListenerLocalAddress_val_ptr_len))) {
        snmp_log(LOG_ERR, "not enough space for value\n");
        return MFD_ERROR;
    }
    tbl_idx->tcpListenerLocalAddress_len =
        tcpListenerLocalAddress_val_ptr_len;
    memcpy(tbl_idx->tcpListenerLocalAddress,
           tcpListenerLocalAddress_val_ptr,
           tcpListenerLocalAddress_val_ptr_len *
           sizeof(tcpListenerLocalAddress_val_ptr[0]));

    /*
     * tcpListenerLocalPort(3)/InetPortNumber/ASN_UNSIGNED/u_long(u_long)//l/a/w/e/R/d/H 
     */
    /** WARNING: this code might not work for netsnmp_tcpconn_entry */
    tbl_idx->tcpListenerLocalPort = tcpListenerLocalPort_val;


    return MFD_SUCCESS;
}                               /* tcpListenerTable_indexes_set_tbl_idx */

/**
 * @internal
 * set row context indexes
 *
 * @param reqreq_ctx the row context that needs updated indexes
 *
 * @retval MFD_SUCCESS     : success.
 * @retval MFD_ERROR       : other error.
 *
 * @remark
 *  This function sets the mib indexs, then updates the oid indexs
 *  from the mib index.
 */
int
tcpListenerTable_indexes_set(tcpListenerTable_rowreq_ctx * rowreq_ctx,
                             u_long tcpListenerLocalAddressType_val,
                             char *tcpListenerLocalAddress_val_ptr,
                             size_t tcpListenerLocalAddress_val_ptr_len,
                             u_long tcpListenerLocalPort_val)
{
    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerTable_indexes_set",
                "called\n"));

    if (MFD_SUCCESS !=
        tcpListenerTable_indexes_set_tbl_idx(&rowreq_ctx->tbl_idx,
                                             tcpListenerLocalAddressType_val,
                                             tcpListenerLocalAddress_val_ptr,
                                             tcpListenerLocalAddress_val_ptr_len,
                                             tcpListenerLocalPort_val))
        return MFD_ERROR;

    /*
     * convert mib index to oid index
     */
    rowreq_ctx->oid_idx.len = sizeof(rowreq_ctx->oid_tmp) / sizeof(oid);
    if (0 != tcpListenerTable_index_to_oid(&rowreq_ctx->oid_idx,
                                           &rowreq_ctx->tbl_idx)) {
        return MFD_ERROR;
    }

    return MFD_SUCCESS;
}                               /* tcpListenerTable_indexes_set */


/*---------------------------------------------------------------------
 * TCP-MIB::tcpListenerEntry.tcpListenerProcess
 * tcpListenerProcess is subid 4 of tcpListenerEntry.
 * Its status is Current, and its access level is ReadOnly.
 * OID: .1.3.6.1.2.1.6.20.1.4
 * Description:
The system's process ID for the process associated with 
            this listener, or zero if there is no such process.  This 
            value is expected to be the same as HOST-RESOURCES-MIB::
            hrSWRunIndex or SYSAPPL-MIB::sysApplElmtRunIndex for some
            row in the appropriate tables.
 *
 * Attributes:
 *   accessible 1     isscalar 0     enums  0      hasdefval 0
 *   readable   1     iscolumn 1     ranges 0      hashint   0
 *   settable   0
 *
 *
 * Its syntax is UNSIGNED32 (based on perltype UNSIGNED32)
 * The net-snmp type is ASN_UNSIGNED. The C type decl is u_long (u_long)
 */
/**
 * Extract the current value of the tcpListenerProcess data.
 *
 * Set a value using the data context for the row.
 *
 * @param rowreq_ctx
 *        Pointer to the row request context.
 * @param tcpListenerProcess_val_ptr
 *        Pointer to storage for a u_long variable
 *
 * @retval MFD_SUCCESS         : success
 * @retval MFD_SKIP            : skip this node (no value for now)
 * @retval MFD_ERROR           : Any other error
 */
int
tcpListenerProcess_get(tcpListenerTable_rowreq_ctx * rowreq_ctx,
                       u_long * tcpListenerProcess_val_ptr)
{
   /** we should have a non-NULL pointer */
    netsnmp_assert(NULL != tcpListenerProcess_val_ptr);


    DEBUGMSGTL(("verbose:tcpListenerTable:tcpListenerProcess_get",
                "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:231:o: |-> Extract the current value of the tcpListenerProcess data.
     * copy (* tcpListenerProcess_val_ptr ) from rowreq_ctx->data
     */
    (*tcpListenerProcess_val_ptr) = rowreq_ctx->data->pid;

    return MFD_SUCCESS;
}                               /* tcpListenerProcess_get */



/** @} */
/** @} */
/** @{ */
