Re: how to get table data inside request handler

Alexander Bubnov <[email protected]>
Newsgroups gmane.network.net-snmp.user
Message-ID <[email protected]>
I have found an answer on my question: I should keep table_set variable
(result of netsnmp_create_table_data_set()) to access them in Watcher
handler. (Watcher() is a handler of SNMP requests like GET, SET)

But now I have a strange situation:

1. My table has one row (named "ROW1", for example)

2. I receive snmpwalk request

3. Watcher() is called: here I delete all rows which I can

  netsnmp_table_row* row = netsnmp_table_data_set_get_first_row(table_set);
  while(row)
  {
  netsnmp_table_dataset_remove_and_delete_row(table_set,row);
  row = netsnmp_table_data_set_get_next_row(table_set,row);
  fprintf(stderr,"DELETED NEW ROW\n");
  }

4. snmpwalk returns "ROW1" - how is it possible if I deleted all rows in
Watcher()? And how to delete them in right way?

Actually, second snmpwalk call shows there are no any rows. I.e. I delete
all rows for next snmpwalk, but not current one.

Can you please help to find out a way to update the table when I receive GET
requests?

Thanks in advance.
2009/2/18 Alexander Bubnov <[email protected]>

> requests varibale of Watcher keeps row instead table pointer
>
> netsnmp_extract_table_data_set(requests); returns NULL
>
> netsnmp_extract_table_row(requests); returns valid data of row.
>
> What should I do to put table data inside request or how to get table data
> by row?
>
> 2009/2/18 Alexander Bubnov <[email protected]>
>
>> Hello, all!
>>
>> Can you please let me know a way getting table data to manipulate it?
>>
>> below code:
>>
>> 1. init_tables - init tables within main function.
>>
>> 2. Watcher - a callback, it is called when some request is received.
>> Inside of this callback I would like to change the table content before I
>> need to get a pointer to the table.
>>
>> inside Watcher() netsnmp_extract_table_data_set() function get NULL
>> instead returing data.
>>
>> #include<string.h>
>> #include <net-snmp/net-snmp-config.h>
>> #include <net-snmp/net-snmp-includes.h>
>> #include <net-snmp/agent/net-snmp-agent-includes.h>
>>
>> const int ROWID = 2;
>>
>>
>> static int Watcher(
>>   netsnmp_mib_handler * handler
>>   ,netsnmp_handler_registration * reginfo
>>   ,netsnmp_agent_request_info * reqinfo
>>   ,netsnmp_request_info * requests
>>   )
>> {
>>
>>   if(MODE_IS_GET(reqinfo->mode))
>>   {
>>   netsnmp_request_info *request;
>>   int i = 0;
>>
>>   for(request=requests;request;request = request->next)
>>   {
>>   netsnmp_table_data_set*table_set =
>> netsnmp_extract_table_data_set(requests);
>>
>>   if(table_set)
>>   {
>>   fprintf(stderr,"NOT NULL\n");
>>
>>   }
>>   else
>>   {
>>   fprintf(stderr,"NULL\n");
>>   }
>>   }
>>
>>   return SNMP_ERR_NOERROR;
>>   }
>>   else if(MODE_IS_SET(reqinfo->mode))
>>   {
>>   puts("SET request is is not allowed");
>>   return SNMP_ERR_NOTWRITABLE;
>>   }
>>   return SNMP_ERR_GENERR;
>> }
>>
>>
>> void init_tables()
>> {
>>   netsnmp_table_data_set *table_set;
>>   oid some_oid[] = {1,3,6,1,4,1,23668,1025,2,8,1};
>>   const char * table_name = "mytable";
>>
>>   const size_t size_some_oid = OID_LENGTH(some_oid);
>>   int count = 999;
>>   const char* pcount = (const char*)(&count);
>>
>>   table_set = netsnmp_create_table_data_set(table_name);
>>
>>   table_set->allow_creation = 0;
>>
>>   netsnmp_table_dataset_add_index(table_set, ASN_OCTET_STR);
>>
>>   netsnmp_table_set_multi_add_default_row(table_set,
>>   /*
>>   * column 2 = asn type,
>>   * writable = 0,
>>   * default value = NULL,
>>   * default value len = 0
>>   */
>>   ROWID,ASN_COUNTER,0,NULL,0,
>>   NULL /* done */ );
>>
>>   netsnmp_register_table_data_set(netsnmp_create_handler_registration
>>   (table_name, Watcher,
>>   some_oid,
>>   size_some_oid,
>>   HANDLER_CAN_RONLY|HANDLER_CAN_NOT_CREATE), table_set, NULL);
>>
>>   netsnmp_table_row *row = netsnmp_create_table_data_row();
>>   netsnmp_table_row_add_index(row, ASN_OCTET_STR, "some data string",
>>   strlen("some data string"));
>>   netsnmp_set_row_column(row, ROWID, ASN_COUNTER,
>>   pcount, sizeof(int));
>>   netsnmp_mark_row_column_writable(row, ROWID, 0);
>>   netsnmp_table_dataset_add_row(table_set, row);
>> }
>>
>>
>>
>> --
>> /BR, Alexander
>>
>
>
>
> --
> /BR, Alexander
>



-- 
/BR, Alexander

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H

_______________________________________________
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.