get "segment fault" msg, please help me

"casper" <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
[email protected] create .c & .h files by using "mib2c -c iterate.conf XXX", and I use myTable_createEntry to add a row in the initialize_table_myTable function, this is the only thing I do in the template, of course some other tiny changes to make the code compile successfully,compile the subagent by the command "net-snmp-config". 

   I start the subagent, and try to get value from the row I added before. but I can't see any rows in the table by MG-SOFT MIB Browser. the table content is blank.if I add another row and get the value again, unfortunatelly I got "segment fault" message, meanwhile the subagent terminate.I don't why this happend. I came to the official mailist,but find nothing valuable. As a newbie to the net-snmp agent progamming, this problem cost me two days checking without any effect. I hope some one here can help me, I paste my code and any hint will be useful.Thank you all.

PS:Cos my poor english, I hope I have described the problem clearly:)

the code is here:

###################jmtest.h#######################
/*
 * Note: this file originally auto-generated by mib2c using
 *  : mib2c.iterate.conf,v 5.17 2005/05/09 08:13:45 dts12 Exp $
 */
#ifndef JMTEST_H
#define JMTEST_H

/*
 * function declarations 
 */
void            init_jmtest(void);
void            initialize_table_keyTable(void);
Netsnmp_Node_Handler keyTable_handler;
Netsnmp_First_Data_Point keyTable_get_first_data_point;
Netsnmp_Next_Data_Point keyTable_get_next_data_point;

/*
 * column number definitions for table keyTable 
 */
#define COLUMN_USERINDEX		1
#define COLUMN_USERSTATUS		2
#define COLUMN_CHECKTIME		3
#define COLUMN_MONSET		4
#endif                          /* JMTEST_H */

###################jmtest.c#######################
/*
 * Note: this file originally auto-generated by mib2c using
 *  : mib2c.iterate.conf,v 5.17 2005/05/09 08:13:45 dts12 Exp $
 */

#include 
#include 
#include 
#include "jmtest.h"
#include 

    /* Typical data structure for a row entry */
struct keyTable_entry {
    /* Index values */
    long userIndex;

    /* Column values */
    char userStatus[30];
    u_long checkTime;
    long monSet;
    long old_monSet;

    /* Illustrate using a simple linked list */
    int   valid;
    struct keyTable_entry *next;
};

struct keyTable_entry  *keyTable_head = NULL;

/* create a new row in the (unsorted) table */
struct keyTable_entry *
keyTable_createEntry(
                 long  userIndex, char *userStatus, u_long checkTime, long monSet
                ) {
    struct keyTable_entry *entry;

    entry = SNMP_MALLOC_TYPEDEF(struct keyTable_entry);
    if (!entry)
        return NULL;

    entry->userIndex = userIndex;
    strcpy(entry->userStatus, userStatus);
    entry->checkTime = checkTime;
    entry->monSet = monSet;
    entry->next = keyTable_head;
    keyTable_head = entry;
    return entry;
}

/* remove a row from the table */
void
keyTable_removeEntry( struct keyTable_entry *entry ) {
    struct keyTable_entry *ptr, *prev;

    if (!entry)
        return;    /* Nothing to remove */

    for ( ptr  = keyTable_head, prev = NULL;
          ptr != NULL;
          prev = ptr, ptr = ptr->next ) {
        if ( ptr == entry )
            break;
    }
    if ( !ptr )
        return;    /* Can't find it */

    if ( prev == NULL )
        keyTable_head = ptr->next;
    else
        prev->next = ptr->next;

    SNMP_FREE( entry );   /* XXX - release any other internal resources */
}
/** here is my row_adding code*/
void initializeTableContext()
{
    struct keyTable_entry *tmp;
    while(keyTable_head){
         tmp = keyTable_head->next;
         keyTable_removeEntry(keyTable_head);
         keyTable_head = tmp;
    }
    tmp = SNMP_MALLOC_TYPEDEF(struct keyTable_entry);
    tmp->next = NULL;
    memset(tmp, 0, sizeof(struct keyTable_entry));
    tmp->userIndex = 1;
    strcpy(tmp->userStatus, "shit");
    tmp->checkTime = 100;
    tmp->monSet = 3;
    keyTable_createEntry(tmp->userIndex, tmp->userStatus, tmp->checkTime, tmp->monSet);
    SNMP_FREE(tmp);
}


/** Initializes the jmtest module */
void
init_jmtest(void)
{
  /* here we initialize all the tables we're planning on supporting */
    initialize_table_keyTable();
}

/** Initialize the keyTable table by defining its contents and how it's structured */
void
initialize_table_keyTable(void)
{
    static oid keyTable_oid[] = {1,3,6,1,3,72,3};
    size_t keyTable_oid_len   = OID_LENGTH(keyTable_oid);
    netsnmp_handler_registration    *reg;
    netsnmp_iterator_info           *iinfo;
    netsnmp_table_registration_info *table_info;

    reg = netsnmp_create_handler_registration(
              "keyTable",     keyTable_handler,
              keyTable_oid, keyTable_oid_len,
              HANDLER_CAN_RWRITE
              );

    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
    netsnmp_table_helper_add_indexes(table_info,
                           ASN_INTEGER,  /* index: userIndex */
                           0);
    table_info->min_column = 1;
    table_info->max_column = 4;
    
    iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
    iinfo->get_first_data_point = keyTable_get_first_data_point;
    iinfo->get_next_data_point  = keyTable_get_next_data_point;
    iinfo->table_reginfo        = table_info;
    
    netsnmp_register_table_iterator( reg, iinfo );

    /* Initialise the contents of the table here */
    initializeTableContext();
    
}

/* Example iterator hook routines - using 'get_next' to do most of the work */
netsnmp_variable_list *
keyTable_get_first_data_point(void **my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    *my_loop_context = keyTable_head;
    *my_data_context = keyTable_head;
    return keyTable_get_next_data_point(my_loop_context, my_data_context,
                                    put_index_data,  mydata );
}

netsnmp_variable_list *
keyTable_get_next_data_point(void **my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    struct keyTable_entry *entry = (struct keyTable_entry *)*my_loop_context;
    netsnmp_variable_list *idx = put_index_data;

    if ( entry ) {
        snmp_set_var_value( idx, (u_char *)&entry->userIndex, sizeof(entry->userIndex) );
        idx = idx->next_variable;
        *my_data_context = (void *)entry;
        *my_loop_context = (void *)entry->next;
    } else {
        return NULL;
    }
}


/** handles requests for the keyTable table */
int
keyTable_handler(
    netsnmp_mib_handler               *handler,
    netsnmp_handler_registration      *reginfo,
    netsnmp_agent_request_info        *reqinfo,
    netsnmp_request_info              *requests) {

    netsnmp_request_info       *request;
    netsnmp_table_request_info *table_info;
    struct keyTable_entry          *table_entry;

    switch (reqinfo->mode) {
        /*
         * Read-support (also covers GetNext requests)
         */
    case MODE_GET:
        for (request=requests; request; request=request->next) {
            table_entry = (struct keyTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);
    
            switch (table_info->colnum) {
            case COLUMN_USERINDEX:
                snmp_set_var_typed_value( request->requestvb, ASN_INTEGER,
                                          (u_char *)&table_entry->userIndex,
                                          sizeof(table_entry->userIndex));
                break;
            case COLUMN_USERSTATUS:
                snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
                                          table_entry->userStatus,
                                          sizeof(table_entry->userStatus));
                break;
            case COLUMN_CHECKTIME:
                snmp_set_var_typed_value( request->requestvb, ASN_TIMETICKS,
                                          (u_char *)&table_entry->checkTime,
                                          sizeof(table_entry->checkTime));
                break;
            case COLUMN_MONSET:
                snmp_set_var_typed_value( request->requestvb, ASN_INTEGER,
                                          (u_char *)&table_entry->monSet,
                                          sizeof(table_entry->monSet));
                break;
            }
        }
        break;

        /*
         * Write-support
         */
    case MODE_SET_RESERVE1:
        for (request=requests; request; request=request->next) {
            table_entry = (struct keyTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);
    
            switch (table_info->colnum) {
            case COLUMN_MONSET:
                if ( request->requestvb->type != ASN_INTEGER ) {
                    netsnmp_set_request_error( reqinfo, request,
                                               SNMP_ERR_WRONGTYPE );
                    return SNMP_ERR_NOERROR;
                }
                /* Also may need to check size/value */
                break;
            default:
                netsnmp_set_request_error( reqinfo, request,
                                           SNMP_ERR_NOTWRITABLE );
                return SNMP_ERR_NOERROR;
            }
        }
        break;

    case MODE_SET_RESERVE2:
        break;

    case MODE_SET_FREE:
        break;

    case MODE_SET_ACTION:
        for (request=requests; request; request=request->next) {
            table_entry = (struct keyTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);
    
            switch (table_info->colnum) {
            case COLUMN_MONSET:
                /* Need to save old 'table_entry->monSet' value.
                   May need to use 'memcpy' */
                table_entry->old_monSet = table_entry->monSet;
                table_entry->monSet     = *((long *)request->requestvb->val.integer);
                break;
            }
        }
        break;

    case MODE_SET_UNDO:
        for (request=requests; request; request=request->next) {
            table_entry = (struct keyTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);
    
            switch (table_info->colnum) {
            case COLUMN_MONSET:
                /* Need to restore old 'table_entry->monSet' value.
                   May need to use 'memcpy' */
                table_entry->monSet = table_entry->old_monSet;
                break;
            }
        }
        break;

    case MODE_SET_COMMIT:
        break;
    }
    return SNMP_ERR_NOERROR;
}
###################mib#######################
JM-TEST-1-MIB DEFINITIONS ::= BEGIN

IMPORTS
    experimental, MODULE-IDENTITY, OBJECT-TYPE FROM SNMPv2-SMI
     DisplayString FROM SNMPv2-TC;
    
jmtest MODULE-IDENTITY
    LAST-UPDATED "200203210000Z"
    ORGANIZATION "Temple U"
    CONTACT-INFO
        "None yet."
    DESCRIPTION
        "AgentX testing MIB"
    REVISION     "200203210000Z"
    DESCRIPTION
        "None yet."
    ::= { experimental 72}

firstKey OBJECT-TYPE
    SYNTAX		INTEGER (0..100)
    MAX-ACCESS  read-write
    STATUS      current
    DESCRIPTION
        "Value initialized to 0 and on each 
         access:
         - Return current val.
         - increment"

    ::= { jmtest 1 } 
    
secondKey OBJECT-TYPE
    SYNTAX	DisplayString
    MAX-ACCESS read-write
    STATUS current
    DESCRIPTION
    	"Value initialize to some string"
    ::= { jmtest 2 }
    
keyTable OBJECT-TYPE
	SYNTAX SEQUENCE OF keyEntry
	MAX-ACCESS not-accessible
	STATUS current
	DESCRIPTION
		"A list of Sample Entries"
	::= { jmtest 3 }
	
keyEntry OBJECT-TYPE
	SYNTAX keyEntry
	MAX-ACCESS not-accessible
	STATUS current
	DESCRIPTION
		"An Entry containing  management info"
	INDEX { userIndex }
	::= { keyTable 1 }

keyEntry ::= SEQUENCE {
						userIndex INTEGER,
						userStatus DisplayString,
						checkTime TimeTicks,
						monSet	INTEGER
						}

userIndex OBJECT-TYPE
	SYNTAX INTEGER
	MAX-ACCESS read-only
	STATUS current
	DESCRIPTION
		"A unique Value of the row"
	::= { keyEntry 1 }

userStatus OBJECT-TYPE
	SYNTAX DisplayString
	MAX-ACCESS read-only
	STATUS current
	DESCRIPTION
		"machine status."
	::= { keyEntry 2 }

checkTime OBJECT-TYPE
	SYNTAX TimeTicks
	MAX-ACCESS read-only
	STATUS current
	DESCRIPTION
		"machine status checking time."
	::= { keyEntry 3 }

monSet OBJECT-TYPE
	SYNTAX INTEGER
	MAX-ACCESS read-write
	STATUS current
	DESCRIPTION
		"An Example to test set Fun."
	::= { keyEntry 4 }

END




casper
2006-04-30




-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Net-snmp-users mailing list
[email protected]
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.