entLPMappingTable.c revision 252
252N/A/*
252N/A * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
252N/A *
252N/A * U.S. Government Rights - Commercial software. Government users are subject
252N/A * to the Sun Microsystems, Inc. standard license agreement and applicable
252N/A * provisions of the FAR and its supplements.
252N/A *
252N/A *
252N/A * This distribution may include materials developed by third parties. Sun,
252N/A * Sun Microsystems, the Sun logo and Solaris are trademarks or registered
252N/A * trademarks of Sun Microsystems, Inc. in the U.S. and other countries.
252N/A *
252N/A */
252N/A#pragma ident "@(#)entLPMappingTable.c 1.1 03/02/24 SMI"
252N/A
252N/A/*
252N/A * Note: this file originally auto-generated by mib2c using
252N/A * : mib2c.iterate.conf,v 5.4 2002/09/11 22:42:04 hardaker Exp $
252N/A */
252N/A
252N/A#include <net-snmp/net-snmp-config.h>
252N/A#include <net-snmp/net-snmp-includes.h>
252N/A#include <net-snmp/agent/net-snmp-agent-includes.h>
252N/A#include "stdhdr.h"
252N/A#include "entLPMappingTable.h"
252N/A#include "entLogicalTable.h"
252N/A#include "entPhysicalTable.h"
252N/A#include "entLastChangeTime.h"
252N/A
252N/Atypedef struct LPIndex_s {
252N/A entLPMappingTableEntry_t *pLPEntry;
252N/A int_l *pPhyIndex; /* Pointer to the current phy index */
252N/A} LPIndex_t;
252N/A
252N/Astatic LPIndex_t tracker;
252N/A
252N/A
252N/AentLPMappingTableEntry_t* gLPMappingTableHead;
252N/Aint gLPMappingTableSize;
252N/A
252N/A/*
252N/A * Initialize the entLPMappingTable table by defining its contents and how
252N/A * it's structured
252N/A */
252N/Avoid
252N/Ainitialize_table_entLPMappingTable(void)
252N/A{
252N/A static oid entLPMappingTable_oid[] = { 1, 3, 6, 1, 2, 1, 47, 1, 3, 1 };
252N/A netsnmp_table_registration_info *table_info;
252N/A netsnmp_handler_registration *my_handler;
252N/A netsnmp_iterator_info *iinfo;
252N/A
252N/A /*
252N/A * create the table structure itself
252N/A */
252N/A table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
252N/A iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
252N/A
252N/A /*
252N/A * if your table is read only, it's easiest to change the
252N/A * HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY
252N/A */
252N/A my_handler =
252N/A netsnmp_create_handler_registration("entLPMappingTable",
252N/A entLPMappingTable_handler, entLPMappingTable_oid,
252N/A OID_LENGTH(entLPMappingTable_oid), HANDLER_CAN_RONLY);
252N/A
252N/A if (!my_handler || !table_info || !iinfo)
252N/A return; /* mallocs failed */
252N/A
252N/A /*
252N/A * Setting up the table's definition
252N/A */
252N/A netsnmp_table_helper_add_indexes(table_info,
252N/A ASN_INTEGER, /* index: entLogicalIndex */
252N/A ASN_INTEGER, /* index: entLPPhysicalIndex */
252N/A 0);
252N/A
252N/A table_info->min_column = 1;
252N/A table_info->max_column = 1;
252N/A
252N/A /*
252N/A * iterator access routines
252N/A */
252N/A iinfo->get_first_data_point = entLPMappingTable_get_first_data_point;
252N/A iinfo->get_next_data_point = entLPMappingTable_get_next_data_point;
252N/A
252N/A iinfo->table_reginfo = table_info;
252N/A
252N/A /*
252N/A * registering the table with the master agent
252N/A */
252N/A DEBUGMSGTL(("initialize_table_entLPMappingTable",
252N/A "Registering table entLPMappingTable as a table iterator\n"));
252N/A netsnmp_register_table_iterator(my_handler, iinfo);
252N/A}
252N/A
252N/A/* Initializes the entLPMappingTable module */
252N/Avoid
252N/Ainit_entLPMappingTable(void)
252N/A{
252N/A
252N/A /*
252N/A * here we initialize all the tables we're planning on supporting
252N/A */
252N/A initialize_table_entLPMappingTable();
252N/A gLPMappingTableSize = 0;
252N/A gLPMappingTableHead = NULL;
252N/A}
252N/A
252N/A/*
252N/A * returns the first data point within the entLPMappingTable table data.
252N/A *
252N/A * Set the my_loop_context variable to the first data point structure
252N/A * of your choice (from which you can find the next one). This could
252N/A * be anything from the first node in a linked list, to an integer
252N/A * pointer containing the beginning of an array variable.
252N/A *
252N/A * Set the my_data_context variable to something to be returned to
252N/A * you later that will provide you with the data to return in a given
252N/A * row. This could be the same pointer as what my_loop_context is
252N/A * set to, or something different.
252N/A *
252N/A * The put_index_data variable contains a list of snmp variable
252N/A * bindings, one for each index in your table. Set the values of
252N/A * each appropriately according to the data matching the first row
252N/A * and return the put_index_data variable at the end of the function.
252N/A */
252N/Anetsnmp_variable_list *
252N/AentLPMappingTable_get_first_data_point(void **my_loop_context,
252N/A void **my_data_context, netsnmp_variable_list * put_index_data,
252N/A netsnmp_iterator_info * mydata)
252N/A{
252N/A netsnmp_variable_list *vptr;
252N/A entLPMappingTableEntry_t *zRunner, *zpValidEntry;
252N/A int_l *zPhyIndexes, zValidPhyIdx=0, *zpValidPhyIdx;
252N/A
252N/A zRunner = gLPMappingTableHead;
252N/A while (zRunner) {
252N/A if (zRunner->entLogicalIndex > 0) {
252N/A zPhyIndexes = zRunner->physicalIndexes;
252N/A while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)){
252N/A if (*zPhyIndexes > 0) {
252N/A zValidPhyIdx = *zPhyIndexes;
252N/A break;
252N/A }
252N/A zPhyIndexes++;
252N/A }
252N/A if (zValidPhyIdx) {
252N/A zpValidEntry = zRunner;
252N/A zpValidPhyIdx = zPhyIndexes;
252N/A break;
252N/A }
252N/A }
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A }
252N/A if (zRunner == NULL) return NULL;
252N/A
252N/A *my_loop_context = (void *) zpValidEntry;
252N/A *my_data_context = (void *) zpValidPhyIdx;
252N/A tracker.pPhyIndex = zpValidPhyIdx;
252N/A
252N/A vptr = put_index_data;
252N/A
252N/A snmp_set_var_value(vptr, (u_char *) &zpValidEntry->entLogicalIndex,
252N/A sizeof(zpValidEntry->entLogicalIndex));
252N/A vptr = vptr->next_variable;
252N/A snmp_set_var_value(vptr, (u_char *) zpValidPhyIdx, sizeof(int_l));
252N/A vptr = vptr->next_variable;
252N/A
252N/A return (put_index_data);
252N/A}
252N/A
252N/A/*
252N/A * functionally the same as entLPMappingTable_get_first_data_point, but
252N/A * my_loop_context has already been set to a previous value and should
252N/A * be updated to the next in the list. For example, if it was a
252N/A * linked list, you might want to cast it and the return
252N/A * my_loop_context->next. The my_data_context pointer should be set
252N/A * to something you need later and the indexes in put_index_data
252N/A * updated again.
252N/A */
252N/A
252N/Anetsnmp_variable_list *
252N/AentLPMappingTable_get_next_data_point(void **my_loop_context,
252N/A void **my_data_context, netsnmp_variable_list * put_index_data,
252N/A netsnmp_iterator_info * mydata)
252N/A{
252N/A netsnmp_variable_list *vptr;
252N/A entLPMappingTableEntry_t *zRunner, *zpValidEntry;
252N/A int_l *zPhyIndexes, zValidPhyIdx=0, *zpValidPhyIdx;
252N/A
252N/A zRunner = (entLPMappingTableEntry_t *)*my_loop_context;
252N/A zPhyIndexes = tracker.pPhyIndex;
252N/A if (zPhyIndexes != NULL)
252N/A zPhyIndexes++;
252N/A while (zRunner) {
252N/A if (zRunner->entLogicalIndex > 0) {
252N/A while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)){
252N/A if (*zPhyIndexes > 0) {
252N/A zValidPhyIdx = *zPhyIndexes;
252N/A break;
252N/A }
252N/A zPhyIndexes++;
252N/A }
252N/A if (zValidPhyIdx) {
252N/A zpValidEntry = zRunner;
252N/A zpValidPhyIdx = zPhyIndexes;
252N/A break;
252N/A }
252N/A }
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A if (zRunner)
252N/A zPhyIndexes = zRunner->physicalIndexes;
252N/A }
252N/A if (zRunner == NULL) return NULL;
252N/A
252N/A
252N/A *my_loop_context = (void *) zpValidEntry;
252N/A *my_data_context = (void *) zpValidPhyIdx;
252N/A tracker.pPhyIndex = zpValidPhyIdx;
252N/A
252N/A vptr = put_index_data;
252N/A
252N/A snmp_set_var_value(vptr, (u_char *) &zpValidEntry->entLogicalIndex,
252N/A sizeof(int_l));
252N/A vptr = vptr->next_variable;
252N/A snmp_set_var_value(vptr, (u_char *) zpValidPhyIdx, sizeof(int_l));
252N/A vptr = vptr->next_variable;
252N/A
252N/A return (put_index_data);
252N/A}
252N/A
252N/A/*
252N/A * handles requests for the entLPMappingTable table, if anything else
252N/A * needs to be done
252N/A */
252N/Aint
252N/AentLPMappingTable_handler(netsnmp_mib_handler * handler,
252N/A netsnmp_handler_registration * reginfo,
252N/A netsnmp_agent_request_info * reqinfo, netsnmp_request_info * requests)
252N/A{
252N/A netsnmp_request_info *request;
252N/A netsnmp_table_request_info *table_info;
252N/A netsnmp_variable_list *var;
252N/A int_l *idx;
252N/A
252N/A for (request = requests; request; request = request->next) {
252N/A var = request->requestvb;
252N/A if (request->processed != 0)
252N/A continue;
252N/A
252N/A /*
252N/A * perform anything here that you need to do. The request have
252N/A * already been processed by the master table_dataset handler,
252N/A * but this gives you chance to act on the request in some
252N/A * other way if need be.
252N/A */
252N/A
252N/A /*
252N/A * the following extracts the my_data_context pointer set in
252N/A * the loop functions above. You can then use the results to
252N/A * help return data for the columns of the entLPMappingTable
252N/A * table in question
252N/A */
252N/A /*
252N/A * XXX
252N/A */
252N/A idx = (int_l *) netsnmp_extract_iterator_context(request);
252N/A if (idx == NULL) {
252N/A if (reqinfo->mode == MODE_GET) {
252N/A netsnmp_set_request_error(reqinfo, request,
252N/A SNMP_NOSUCHINSTANCE);
252N/A continue;
252N/A }
252N/A /*
252N/A * XXX: no row existed, if you support creation and
252N/A * this is a set, start dealing with it here, else
252N/A * continue
252N/A */
252N/A }
252N/A
252N/A /*
252N/A * extracts the information about the table from the request
252N/A */
252N/A table_info = netsnmp_extract_table_info(request);
252N/A /*
252N/A * table_info->colnum contains the column number requested
252N/A */
252N/A /*
252N/A * table_info->indexes contains a linked list of snmp variable
252N/A * bindings for the indexes of the table. Values in the list
252N/A * have been set corresponding to the indexes of the
252N/A * request
252N/A */
252N/A if (table_info == NULL) {
252N/A continue;
252N/A }
252N/A
252N/A switch (reqinfo->mode) {
252N/A /*
252N/A * the table_iterator helper should change all GETNEXTs
252N/A * into GETs for you automatically, so you don't have to
252N/A * worry about the GETNEXT case. Only GETs and SETs need
252N/A * to be dealt with here
252N/A */
252N/A case MODE_GET:
252N/A switch (table_info->colnum) {
252N/A case COLUMN_ENTLPPHYSICALINDEX:
252N/A snmp_set_var_typed_value(var, ASN_INTEGER,
252N/A (u_char *) idx,
252N/A sizeof (idx));
252N/A break;
252N/A
252N/A default:
252N/A /*
252N/A * We shouldn't get here
252N/A */
252N/A snmp_log(LOG_ERR, "problem encountered in entLPMappingTable_handler: unknown column\n");
252N/A }
252N/A break;
252N/A
252N/A case MODE_SET_RESERVE1:
252N/A /*
252N/A * set handling...
252N/A */
252N/A
252N/A default:
252N/A snmp_log(LOG_ERR, "problem encountered in entLPMappingTable_handler: unsupported mode\n");
252N/A }
252N/A }
252N/A return (SNMP_ERR_NOERROR);
252N/A}
252N/A
252N/A/* Return 0 for success
252N/A 1 for entry already exists
252N/A -1 for failure
252N/A -2 for stale index */
252N/Aint
252N/AaddLPMappingTableEntry(int xentLogicalIndex, int xentPhysicalIndex)
252N/A{
252N/A entLogicalEntry_t *zLogicalEntry;
252N/A entPhysicalEntry_t *physentry;
252N/A entLPMappingTableEntry_t *zLPMappingTableEntry, *zRunner, *zlastEntry;
252N/A int_l *zPhyIndexes;
252N/A
252N/A /* Fix for 4888088: return -1 for out of bound index, return -2 for */
252N/A /* stale entry */
252N/A if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX || xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
252N/A return -1;
252N/A zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
252N/A physentry = getPhysicalTableStaleEntry(xentPhysicalIndex);
252N/A if ((zLogicalEntry != NULL) || (physentry != NULL)) {
252N/A return -2;
252N/A }
252N/A /* End of Fix for 4888088 */
252N/A
252N/A zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
252N/A physentry = getPhysicalTableEntry(xentPhysicalIndex);
252N/A
252N/A if ((zLogicalEntry == NULL) || (physentry == NULL)) {
252N/A/*
252N/A Handle error here. Send it to log files
252N/A*/
252N/A return (-1);
252N/A }
252N/A zlastEntry = NULL;
252N/A zRunner = gLPMappingTableHead;
252N/A while (zRunner != NULL) {
252N/A if (zRunner->entLogicalIndex == xentLogicalIndex) {
252N/A break;
252N/A }
252N/A zlastEntry = zRunner;
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A }
252N/A if (zRunner != NULL ) {/* Found a entry with log index */
252N/A int_l *p;
252N/A p = zRunner->physicalIndexes;
252N/A if (p == NULL) {
252N/A zPhyIndexes = (int_l *) malloc(2 * sizeof (int_l));
252N/A if (!zPhyIndexes) return -1;
252N/A zPhyIndexes[0] = xentPhysicalIndex;
252N/A zPhyIndexes[1] = 0;
252N/A zRunner->physicalIndexes = zPhyIndexes;
252N/A } else {/* Add phy index to last entry in the array */
252N/A int i=0;
252N/A while (p != NULL && *p != 0) {
252N/A /* Fix for 4888088: entry already exists, return 1 */
252N/A if (*p == xentPhysicalIndex)
252N/A return (1);
252N/A /* End of Fix for 4888088 */
252N/A if (*p == -xentPhysicalIndex) { /* Reuse a 'deleted' entry */
252N/A *p = xentPhysicalIndex;
252N/A /* Fix for 4928821 - does not generate notification event */
252N/A configChanged();
252N/A /* End of Fix for 4928821 */
252N/A return (0);
252N/A }
252N/A p++;
252N/A i++;
252N/A }
252N/A zRunner->physicalIndexes =
252N/A (int_l *)realloc(zRunner->physicalIndexes, (i + 2)*sizeof(int_l));
252N/A zRunner->physicalIndexes[i] = xentPhysicalIndex;
252N/A zRunner->physicalIndexes[i+1] = 0;
252N/A }
252N/A configChanged();
252N/A return (0);
252N/A }
252N/A
252N/A /* New entry*/
252N/A zLPMappingTableEntry = (entLPMappingTableEntry_t *)malloc(sizeof(entLPMappingTableEntry_t));
252N/A if (!zLPMappingTableEntry) return -1; /* malloc failed */
252N/A zLPMappingTableEntry->entLogicalIndex = xentLogicalIndex;
252N/A zPhyIndexes = (int_l *) malloc(2 * sizeof (int_l));
252N/A if (!zPhyIndexes) return -1;
252N/A zPhyIndexes[0] = xentPhysicalIndex;
252N/A zPhyIndexes[1] = 0;
252N/A zLPMappingTableEntry->physicalIndexes = zPhyIndexes;
252N/A zLPMappingTableEntry->pNextLPMappingTableEntry = NULL;
252N/A if (gLPMappingTableHead){
252N/A zlastEntry->pNextLPMappingTableEntry = zLPMappingTableEntry;
252N/A } else {
252N/A gLPMappingTableHead = zLPMappingTableEntry;
252N/A }
252N/A gLPMappingTableSize++;
252N/A configChanged();
252N/A return (0);
252N/A}
252N/A
252N/A
252N/A/*
252N/A This function deletes the table entries for a given logical index
252N/A and physical index.
252N/A Returns 0 for success,
252N/A -1 for failure,
252N/A -2 for stale entry
252N/A */
252N/Aint
252N/AdeleteLPMappingTableEntry(int xentLogicalIndex, int xentPhysicalIndex)
252N/A{
252N/A entLPMappingTableEntry_t *zRunner;
252N/A int_l *p;
252N/A
252N/A /* Fix for 4888088: return -1 for invalid index, -2 for stale entry */
252N/A entLogicalEntry_t *zLogicalEntry;
252N/A entPhysicalEntry_t *zPhysicalEntry;
252N/A
252N/A if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX || xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
252N/A return -1;
252N/A zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
252N/A if (zLogicalEntry != NULL)
252N/A return -2;
252N/A
252N/A zPhysicalEntry = getPhysicalTableStaleEntry(xentPhysicalIndex);
252N/A if (zPhysicalEntry != NULL)
252N/A return -2;
252N/A
252N/A zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
252N/A if (zLogicalEntry == NULL)
252N/A return -1;
252N/A zPhysicalEntry = getPhysicalTableEntry(xentPhysicalIndex);
252N/A if (zPhysicalEntry == NULL)
252N/A return -1;
252N/A /* End of Fix for 4888088 */
252N/A
252N/A zRunner = gLPMappingTableHead;
252N/A while (zRunner != NULL) {
252N/A if ((zRunner->entLogicalIndex == xentLogicalIndex)) {
252N/A p = zRunner->physicalIndexes;
252N/A while (p != NULL && *p != 0) {
252N/A if (*p == xentPhysicalIndex) {
252N/A *p = -xentPhysicalIndex;
252N/A configChanged();
252N/A return (0);
252N/A }
252N/A p++;
252N/A }
252N/A return (-1);
252N/A }
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A }
252N/A return (-1);
252N/A}
252N/A
252N/Astatic int
252N/AFreeLPMappingTableEntry(entLPMappingTableEntry_t *xEntry)
252N/A{
252N/A int nFound = 0;
252N/A /* Fix for 4888088 */
252N/A int_l *zPhyIndexes;
252N/A /* End of Fix for 4888088 */
252N/A
252N/A if (xEntry == NULL) return (-1);
252N/A /* Fix for 4888088: We need to count the number of entries deleted, and */
252N/A /* return that accordingly. Hence the loop */
252N/A zPhyIndexes = xEntry->physicalIndexes;
252N/A while ((zPhyIndexes != NULL) && (*zPhyIndexes != 0)) {
252N/A if (*zPhyIndexes > 0) {
252N/A /* Only count valid entries (i.e. non-negative ones) */
252N/A nFound++;
252N/A }
252N/A zPhyIndexes++;
252N/A }
252N/A /* End of Fix for 4888088 */
252N/A free(xEntry->physicalIndexes);
252N/A free(xEntry);
252N/A xEntry = NULL;
252N/A /* Fix for 4888088 */
252N/A return (nFound);
252N/A /* End of Fix for 4888088 */
252N/A}
252N/A
252N/A/* Returns num of successful deletion
252N/A -1 for entry not found
252N/A -2 for stale physical entry
252N/A*/
252N/Aint
252N/AdeleteLPMappingPhysicalIndex(int xentPhysicalIndex) {
252N/A entLPMappingTableEntry_t *zRunner;
252N/A int_l *p;
252N/A int num=0;
252N/A
252N/A /* Fix for 4888088: -2 for stale entry, -1 for invalid index */
252N/A entPhysicalEntry_t *zPhysicalEntry;
252N/A if (xentPhysicalIndex <= 0 || xentPhysicalIndex > MAX_ENTITY_INDEX)
252N/A return -1;
252N/A zPhysicalEntry = getPhysicalTableStaleEntry(xentPhysicalIndex);
252N/A if (zPhysicalEntry != NULL)
252N/A return -2;
252N/A zPhysicalEntry = getPhysicalTableEntry(xentPhysicalIndex);
252N/A if (zPhysicalEntry == NULL)
252N/A return -1;
252N/A /* End of Fix for 4888088 */
252N/A
252N/A zRunner = gLPMappingTableHead;
252N/A while (zRunner != NULL) {
252N/A p = zRunner->physicalIndexes;
252N/A while (p != NULL && *p != 0) {
252N/A if (*p == xentPhysicalIndex) {
252N/A *p = -xentPhysicalIndex;
252N/A num++;
252N/A break;
252N/A }
252N/A p++;
252N/A }
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A }
252N/A if (num) {
252N/A configChanged();
252N/A return (num);
252N/A } else {
252N/A return -1;
252N/A }
252N/A}
252N/A
252N/A/* Returns num of successful deletion
252N/A -1 for entry not found
252N/A -2 for stale logical entry
252N/A*/
252N/Aint
252N/AdeleteLPMappingLogicalIndex(int xentLogicalIndex) {
252N/A entLPMappingTableEntry_t *zRunner, *temp, *prevEntry;
252N/A int zLogicalIndex, nEntries=0;
252N/A
252N/A /* Fix for 4888088: -1 for invalid index, -2 for stale entry */
252N/A entLogicalEntry_t *zLogicalEntry;
252N/A if (xentLogicalIndex <= 0 || xentLogicalIndex > MAX_ENTITY_INDEX)
252N/A return -1;
252N/A zLogicalEntry = getLogicalTableStaleEntry(xentLogicalIndex);
252N/A if (zLogicalEntry != NULL)
252N/A return -2;
252N/A zLogicalEntry = getLogicalTableEntry(xentLogicalIndex);
252N/A if (zLogicalEntry == NULL)
252N/A return -1;
252N/A /* End of Fix for 4888088 */
252N/A
252N/A zRunner = gLPMappingTableHead;
252N/A prevEntry = NULL;
252N/A while (zRunner != NULL) {
252N/A zLogicalIndex = zRunner->entLogicalIndex;
252N/A if (zLogicalIndex > 0) {
252N/A if (zLogicalIndex == xentLogicalIndex) {
252N/A temp = zRunner->pNextLPMappingTableEntry;
252N/A zRunner->pNextLPMappingTableEntry = NULL;
252N/A if (prevEntry)
252N/A prevEntry->pNextLPMappingTableEntry = temp;
252N/A else
252N/A gLPMappingTableHead = temp;
252N/A /* Fix for 4888088: we are going to return the number of */
252N/A /* entries removed */
252N/A nEntries = FreeLPMappingTableEntry(zRunner);
252N/A /* End of Fix for 4888088 */
252N/A gLPMappingTableSize--;
252N/A configChanged();
252N/A /* Fix for 4888088 */
252N/A return (nEntries); /* Successful deletion */
252N/A /* End of Fix for 4888088 */
252N/A }
252N/A }
252N/A prevEntry = zRunner;
252N/A zRunner = zRunner->pNextLPMappingTableEntry;
252N/A }
252N/A return (-1); /* Entry not found */
252N/A}
252N/A