diff options
Diffstat (limited to 'local/mib2c.row.conf')
-rwxr-xr-x | local/mib2c.row.conf | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/local/mib2c.row.conf b/local/mib2c.row.conf new file mode 100755 index 0000000..f736baa --- /dev/null +++ b/local/mib2c.row.conf @@ -0,0 +1,284 @@ +## -*- c -*- +###################################################################### +## Do the .h file +###################################################################### +@open ${name}.h@ +/* + * Note: this file originally auto-generated by mib2c using + * $Id$ + */ +#ifndef $name.uc_H +#define $name.uc_H + +/* function declarations */ +void init_$name(void); +@foreach $i table@ +void initialize_table_$i(void); +Netsnmp_Node_Handler ${i}_handler; +netsnmp_variable_list *${i}_buildIndexList(struct ${i}_entry *row); +struct ${i}_entry * +${i}_createEntry( + @foreach $idx index@ + @if $idx.needlength@ + , $idx.decl* $idx + , size_t ${idx}_len + @else@ + , $idx.decl $idx + @end@ + @end@ + ); +@end@ +@foreach $i table@ + +/* column number definitions for table $i */ + @foreach $c column@ + #define COLUMN_$c.uc $c.subid + @end@ + + +/* Typical data structure for a row entry */ +struct ${i}_entry { + netsnmp_index oid_index; + + /* Index values */ + @foreach $idx index@ + @if $idx.needlength@ + $idx.decl $idx[NNN]; + size_t ${idx}_len; + @else@ + $idx.decl $idx; + @end@ + @end@ + + /* Column values */ + @foreach $c column@ + @if $c.readable@ + @if $c.needlength@ + $c.decl $c[NNN]; + size_t ${c}_len; + @else@ + $c.decl $c; + @end@ + @if $c.settable@ + @if !$c.rowstatus@ + @if $c.needlength@ + $c.decl old_$c[NNN]; + size_t old_${c}_len; + @else@ + $c.decl old_$c; + @end@ + @end@ + @end@ + @end@ + @end@ + + int valid; +}; + +@end@ +#endif /* $name.uc_H */ +###################################################################### +## Do the .c file +###################################################################### +@open ${name}.c@ +/* + * Note: this file originally auto-generated by mib2c using + * $Id$ + */ + +#include <net-snmp/net-snmp-config.h> +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include "${name}.h" + +/** Initializes the $name module */ +void +init_$name(void) +{ + /* here we initialize all the table rows we're planning on supporting */ + @foreach $i table@ + initialize_table_$i(); + @end@ +} + +@foreach $i table@ + @eval $first_column = "-"@ + @eval $last_column = "-"@ + @foreach $c column@ + @if $c.readable@ + @if "$first_column" eq "-"@ + @eval $first_column = $c@ + @end@ + @eval $last_column = $c@ + @end@ + @end@ + +/** Initialize an entry in the $i table, including how the table is structured */ +void +initialize_table_$i(void) +{ + const oid ${i}_oid[] = {$i.commaoid}; + netsnmp_handler_registration *reg; + struct ${i}_entry *row; + netsnmp_variable_list *idxs; + netsnmp_table_registration_info *table_info; + + DEBUGMSGTL(("${name}:init", "initializing table $i\n")); + + reg = netsnmp_create_handler_registration( + "$i", ${i}_handler, + ${i}_oid, OID_LENGTH(${i}_oid), +@if $i.settable@ + HANDLER_CAN_RWRITE +@else@ + HANDLER_CAN_RONLY +@end@ + ); + + table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info ); + netsnmp_table_helper_add_indexes(table_info, + @foreach $idx index@ + $idx.type, /* index: $idx */ + @end@ + 0); + table_info->min_column = COLUMN_$first_column.uc; + table_info->max_column = COLUMN_$last_column.uc; + + /* + * Create the row to be registered + */ + row = ${i}_createEntry( + @foreach $idx index@ + @if $idx.needlength@ + ,/* $idx value */ , /* $idx length */ + @else@ + ,/* $idx value */ + @end@ + @end@ + ); + /* + * XXX: Set any other readable column values here + */ + idxs = ${i}_buildIndexList(row); + netsnmp_table_row_register( reg, table_info, row, idxs ); + + /* Repeat for any other rows to be registered */ +} + +/* create a new row in the table */ +struct ${i}_entry * +${i}_createEntry( + @foreach $idx index@ + @if $idx.needlength@ + , $idx.decl* $idx + , size_t ${idx}_len + @else@ + , $idx.decl $idx + @end@ + @end@ + ) { + struct ${i}_entry *entry; + + entry = SNMP_MALLOC_TYPEDEF(struct ${i}_entry); + if (!entry) + return NULL; + + @foreach $idx index@ + @if $idx.needlength@ + memcpy(entry->$idx, $idx, ${idx}_len); + entry->${idx}_len = ${idx}_len; + @else@ + entry->$idx = $idx; + @end@ + @end@ + + return entry; +} + +netsnmp_variable_list * +${i}_buildIndexList(struct ${i}_entry *row) +{ + netsnmp_variable_list *v1 = NULL, *v2; + + if (!row) + return NULL; + + @eval $first=1@ + @foreach $idx index@ + @if $first==1@ + v1 = SNMP_MALLOC_TYPEDEF(netsnmp_variable_list); + v2 = v1; + @else@ + v2->next_variable = SNMP_MALLOC_TYPEDEF(netsnmp_variable_list); + v2 = v2->next_variable; + @end@ + @if $idx.needlength@ + snmp_set_var_typed_value( v2, $idx.type, row->$idx, row->${idx}_len); + @else@ + snmp_set_var_typed_integer( v2, $idx.type, row->$idx); + @end@ + @eval $first=0@ + @end@ + + return v1; +} + +/** handles requests for a row of the $i table */ +int +${i}_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; + netsnmp_table_data *table_data; + struct ${i}_entry *table_entry; + int ret; + + DEBUGMSGTL(("${name}:handler", "Processing request (%d)\n", reqinfo->mode)); + + switch (reqinfo->mode) { + /* + * Read-support (also covers GetNext requests) + */ + case MODE_GET: + for (request=requests; request; request=request->next) { + table_entry = (struct ${i}_entry *) + netsnmp_table_row_extract(request); + + switch (request->requestvb->name[$i.oidlength+1]) { + @foreach $c column@ + @if $c.readable@ + case COLUMN_$c.uc: + @if $c.needlength@ + snmp_set_var_typed_value( request->requestvb, $c.type, + table_entry->$c, + table_entry->${c}_len); + @else@ + snmp_set_var_typed_integer( request->requestvb, $c.type, + table_entry->$c); + @end@ + break; + @end@ + @end@ + default: + /* An unsupported/unreadable column (if applicable) */ + snmp_set_var_typed_value( request->requestvb, SNMP_NOSUCHOBJECT, + NULL, 0 ); + } + } + break; + +@if $i.settable@ + /* + * Write-support - TODO + */ +@end@ + break; +@end@ + } + return SNMP_ERR_NOERROR; +} +@end@ |