Hi all, I'm trying to develop a private mib module that involves both
scalars and a couple of tables. I don't have any problems with the scalars,
I can read them using snmpwalk without problems. But when I try to read a
table..the snmpd deamon crashes. I use mib2c to generate my code's template,
and after that only includes a couple of threads that will read some files
constantly and fill my mibs tables. Could anyone give me an idea of where to
start to lookaround???

Here is part of my mib file (one of the tables)...

MonThreadsTable OBJECT-TYPE
            SYNTAX         SEQUENCE OF monThreadsEntry
            MAX-ACCESS     not-accessible
            STATUS         current
            DESCRIPTION
                    "softelMonitor Threads Info table"
            ::= { softelMonitor 1 }

monThreadsEntry OBJECT-TYPE
        SYNTAX      monThreadsDetailsEntry
        ACCESS      not-accessible
        STATUS      current
            DESCRIPTION
                    "The monThreadsEntry row definition."
    INDEX    { IdThread }
    ::= { MonThreadsTable 1 }

monThreadsDetailsEntry ::=
    SEQUENCE {
            IdThread           INTEGER,
            ProcTime           Unsigned32,
            MaxProcTime     Unsigned32,
            ExecNumber         Unsigned32
    }

IdThread     OBJECT-TYPE
            SYNTAX INTEGER
            ACCESS  read-only
            STATUS      current
            DESCRIPTION
                    "Thread Id"
            ::= { monThreadsEntry 1 }

ProcTime     OBJECT-TYPE
            SYNTAX      Unsigned32
            ACCESS  read-only
            STATUS      current
            DESCRIPTION
                    "Thread's last processing time"
            ::= { monThreadsEntry 2 }

MaxProcTime     OBJECT-TYPE
            SYNTAX      Unsigned32
            ACCESS  read-only
            STATUS      current
            DESCRIPTION
                    "Thread's maximum processing time"
            ::= { monThreadsEntry 3 }

ExecNumber    OBJECT-TYPE
            SYNTAX      Unsigned32
            ACCESS  read-only
            STATUS      current
            DESCRIPTION
                    "Thread's executions count"
            ::= { monThreadsEntry 4 }

and here's the code mib2c generated...I will include the data acquisition
fucntions I made


/* Typical data structure for a row entry */
typedef struct MonThreadsTable_entry_s
{
    /* Column values */
    long IdThread;
    u_long ProcTime;
    u_long MaxProcTime;
    u_long ExecNumber;
    /* Illustrate using a simple linked list */
    int   valid;
    struct MonThreadsTable_entry_s *next;
}MonThreadsTable_entry;

MonThreadsTable_entry  *MonThreadsTable_head=NULL;
void MonThreadsTable_createEntry(MonThreadsTable_entry  *data);
MonThreadsTable_entry *MonThreadsTable_fetchEntry(MonThreadsTable_entry
*entry);
void MonThreadsTable_removeEntry(MonThreadsTable_entry *entry );


void AnalizeProcMon(char *buffer,int len_buffer)
{
    MonThreadsTable_entry data;
    MonThreadsTable_entry *ptr;
    ptr=NULL;
    sscanf(buffer,"%ld %ld %ld %ld",&data.IdThread,
        &data.ProcTime,&data.MaxProcTime,&data.ExecNumber);
    ptr=MonThreadsTable_fetchEntry(&data);
    if(ptr==NULL)
        MonThreadsTable_createEntry(&data);
    else
    {
        ptr->ProcTime=data.ProcTime;
        ptr->MaxProcTime=data.MaxProcTime;
        ptr->ExecNumber=data.ExecNumber;
    }
}

void *setProcMonThread(void *parameter)
{
    FILE *fp;
    int sizeBuffer;
    sizeBuffer = 100;
    int len_buffer=0;
    char buffer[sizeBuffer];
    while( 1 )
    {
        // Obteniendo flujo de datos
        fp = fopen( "/usr/monitorMSC/procesosSNMP.dat", "r" );
        if ( fp == NULL )
            return NULL;
        memset(buffer,0x0,sizeBuffer);
        while( feof( fp ) == 0 )
        {
                buffer[len_buffer]=fgetc(fp);
                len_buffer++;
                if(buffer[len_buffer-1]=='\n')
                {
                    //DEBUGMSGTL(("softelMonitor", "Trama ProcMon\n"));
                    //DEBUGMSGTL(("softelMonitor", buffer));
                    AnalizeProcMon(buffer,len_buffer-1);
                    len_buffer=0;
                    memset(buffer,0x0,sizeBuffer);
                }

        }
        fclose(fp);
        sleep(5);
    }
}// FIN setProcMonThread()

/** Initialize the MonThreadsTable table by defining its contents and how
it's structured */
void initialize_table_MonThreadsTable(void)
{
    static oid MonThreadsTable_oid[] = {1,3,6,1,4,1,17723,2,1,1,19,1};
    size_t MonThreadsTable_oid_len   = OID_LENGTH(MonThreadsTable_oid);
    netsnmp_handler_registration    *reg;
    netsnmp_iterator_info           *iinfo;
    netsnmp_table_registration_info *table_info;

    reg = netsnmp_create_handler_registration(
              "MonThreadsTable",
            MonThreadsTable_handler,
            MonThreadsTable_oid,
            MonThreadsTable_oid_len,
            HANDLER_CAN_RONLY);

    /** create the table structure itself */
    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );

    /*indica que solo tenemos un índice de tipo entero*/
    netsnmp_table_helper_add_indexes(table_info,
                           ASN_INTEGER,  /* index: IdThread */
                           0);

    /*define el minimo y maximo de columnas accesibles*/
    table_info->min_column = 1;
    table_info->max_column = 4;

    iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
    iinfo->get_first_data_point = MonThreadsTable_get_first_data_point;
    iinfo->get_next_data_point  = MonThreadsTable_get_next_data_point;
    iinfo->table_reginfo        = table_info;

    netsnmp_register_table_iterator( reg, iinfo );
    DEBUGMSGTL(("softelMonitor", "threads init\n"));
    /* Initialise the contents of the table here */
}



/* create a new row in the (unsorted) table */
void MonThreadsTable_createEntry(MonThreadsTable_entry  *data)
{
    MonThreadsTable_entry *entry;
    entry = (MonThreadsTable_entry *)malloc(sizeof(MonThreadsTable_entry));
    //entry = SNMP_MALLOC_TYPEDEF(MonThreadsTable_entry);
    if (!entry)
        return;
    entry->IdThread = data->IdThread;
    entry->ProcTime= data->ProcTime;
    entry->MaxProcTime= data->MaxProcTime;
    entry->ExecNumber= data->ExecNumber;
    entry->next = MonThreadsTable_head;
    MonThreadsTable_head = entry;
}

/*fetch a row from the table*/
MonThreadsTable_entry *MonThreadsTable_fetchEntry(MonThreadsTable_entry
*entry)
{
    MonThreadsTable_entry *ptr,*prev;
    if (!entry)
        return NULL;
    for ( ptr  = MonThreadsTable_head, prev=NULL;ptr!=NULL;prev=ptr,ptr =
ptr->next)
    {
        if ( ptr->IdThread == entry->IdThread )
            return entry;
    }
    return NULL;
}

/* remove a row from the table */
void MonThreadsTable_removeEntry(MonThreadsTable_entry *entry )
{
    MonThreadsTable_entry *ptr, *prev;
    if (!entry)
        return;    /* Nothing to remove */
    for ( ptr  = MonThreadsTable_head, prev=NULL;ptr!=NULL;prev=ptr,ptr =
ptr->next)
    {
        if ( ptr->IdThread == entry->IdThread )
            break;
    }
    if ( !ptr )
        return;    /* Can't find it */
    if ( prev == NULL )
        MonThreadsTable_head = ptr->next;
    else
        prev->next = ptr->next;
    SNMP_FREE( entry );   /* XXX - release any other internal resources */
}

/* Example iterator hook routines - using 'get_next' to do most of the work
*/
netsnmp_variable_list *MonThreadsTable_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 = MonThreadsTable_head;
    return MonThreadsTable_get_next_data_point(my_loop_context,
my_data_context,
                                    put_index_data,  mydata );
}

netsnmp_variable_list *MonThreadsTable_get_next_data_point(void
**my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    MonThreadsTable_entry *entry = (MonThreadsTable_entry
*)*my_loop_context;
    netsnmp_variable_list *idx = put_index_data;
    if ( entry )
    {
        snmp_set_var_value( idx,(u_char *)entry->IdThread,
sizeof(entry->IdThread) );
        idx = idx->next_variable;
        *my_data_context = (void *)entry;
        *my_loop_context = (void *)entry->next;
    }
    else
    {
        return NULL;
    }
    return idx;
}


/** handles requests for the MonThreadsTable table */
int MonThreadsTable_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;
    MonThreadsTable_entry          *table_entry;
    DEBUGMSGTL(("softelMonitor", "handler threads mode_get\n"));
    switch (reqinfo->mode)
    {
        /*
         * Read-support (also covers GetNext requests)
         */
    case MODE_GET:
        for (request=requests; request; request=request->next) {
            table_entry = (MonThreadsTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(request);
            switch (table_info->colnum)
            {
                case COLUMN_IDTHREAD:
                    snmp_set_var_typed_value(
request->requestvb,ASN_INTEGER,
                                          (u_char *)table_entry->IdThread,
                                          sizeof(table_entry->IdThread));
                    break;
                case COLUMN_PROCTIME:
                    snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
                                          (u_char *)table_entry->ProcTime,
                                          sizeof(table_entry->ProcTime));
                    break;
                case COLUMN_MAXPROCTIME:
                    snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
                                          (u_char
*)table_entry->MaxProcTime,
                                          sizeof(table_entry->MaxProcTime));
                    break;
                case COLUMN_EXECNUMBER:
                    snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
                                          (u_char *)table_entry->ExecNumber,
                                          sizeof(table_entry->ExecNumber));
                    break;
                }
            }
            break;
    }
    return SNMP_ERR_NOERROR;
}

Thanks in advance,
Alejandro
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to