| ## -*- 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); |
| FindVarMethod var_$name; |
| @foreach $i table@ |
| FindVarMethod var_${i}; |
| @end@ |
| @foreach $i scalar@ |
| @if $i.settable@ |
| WriteMethod write_${i}; |
| @end@ |
| @end@ |
| @foreach $i table@ |
| @foreach $c column@ |
| @if $c.settable@ |
| WriteMethod write_${c}; |
| @end@ |
| @end@ |
| @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" |
| |
| /* |
| * ${name}_variables_oid: |
| * this is the top level oid that we want to register under. This |
| * is essentially a prefix, with the suffix appearing in the |
| * variable below. |
| */ |
| |
| oid ${name}_variables_oid[] = { $name.commaoid }; |
| |
| /* |
| * variable4 ${name}_variables: |
| * this variable defines function callbacks and type return information |
| * for the $name mib section |
| */ |
| |
| struct variable4 ${name}_variables[] = { |
| /* magic number , variable type , ro/rw , callback fn , L, oidsuffix */ |
| @eval $magic = 0@ |
| @eval $namelen = length("$name.commaoid")@ |
| @foreach $i scalar@ |
| @eval $magic = $magic + 1@ |
| @eval $suffix = substr("$i.commaoid", $namelen + 1)@ |
| @eval $suffixlen = $i.oidlength - $name.oidlength@ |
| #define $i.uc $magic |
| @if $i.settable@ |
| {$i.uc, $i.type, NETSNMP_OLDAPI_RWRITE, |
| var_${name}, $suffixlen, { $suffix }}, |
| @end@ |
| @if !$i.settable@ |
| {$i.uc, $i.type, NETSNMP_OLDAPI_RONLY, |
| var_${name}, $suffixlen, { $suffix }}, |
| @end@ |
| @end@ |
| |
| @foreach $i table@ |
| @eval $magic = 0@ |
| @eval $nlen2 = length("$i.commaoid")@ |
| @if $nlen2 > $namelen@ |
| @eval $suffix = substr("$i.commaoid", $namelen + 1)@ |
| @eval $ctmp = ","@ |
| @else@ |
| @eval $suffix = ""@ |
| @eval $ctmp = ""@ |
| @end@ |
| @eval $suffixlen = $i.oidlength - $name.oidlength + 2@ |
| @foreach $c column@ |
| @eval $magic = $magic + 1@ |
| #define $c.uc $magic |
| @if $c.settable@ |
| {$c.uc, $c.type, NETSNMP_OLDAPI_RWRITE, |
| var_${i}, $suffixlen, { $suffix $ctmp 1, $c.subid }}, |
| @end@ |
| @if !$c.settable@ |
| {$c.uc, $c.type, NETSNMP_OLDAPI_RONLY, |
| var_${i}, $suffixlen, { $suffix $ctmp 1, $c.subid }}, |
| @end@ |
| @end@ |
| @end@ |
| }; |
| /* (L = length of the oidsuffix) */ |
| |
| |
| /** Initializes the $name module */ |
| void |
| init_$name(void) |
| { |
| |
| DEBUGMSGTL(("$name", "Initializing\n")); |
| |
| /* register ourselves with the agent to handle our mib tree */ |
| REGISTER_MIB("$name", ${name}_variables, variable4, |
| ${name}_variables_oid); |
| |
| /* place any other initialization junk you need here */ |
| } |
| |
| /* |
| * var_$name(): |
| * This function is called every time the agent gets a request for |
| * a scalar variable that might be found within your mib section |
| * registered above. It is up to you to do the right thing and |
| * return the correct value. |
| * You should also correct the value of "var_len" if necessary. |
| * |
| * Please see the documentation for more information about writing |
| * module extensions, and check out the examples in the examples |
| * and mibII directories. |
| */ |
| unsigned char * |
| var_$name(struct variable *vp, |
| oid *name, |
| size_t *length, |
| int exact, |
| size_t *var_len, |
| WriteMethod **write_method) |
| { |
| /* variables we may use later */ |
| static long long_ret; |
| static u_long ulong_ret; |
| static unsigned char string[SPRINT_MAX_LEN]; |
| static oid objid[MAX_OID_LEN]; |
| static struct counter64 c64; |
| |
| if (header_generic(vp,name,length,exact,var_len,write_method) |
| == MATCH_FAILED ) |
| return NULL; |
| |
| /* |
| * this is where we do the value assignments for the mib results. |
| */ |
| switch(vp->magic) { |
| @foreach $i scalar@ |
| case $i.uc: |
| @if $i.settable@ |
| *write_method = write_${i}; |
| @end@ |
| VAR = VALUE; /* XXX */ |
| return (u_char*) &VAR; |
| @end@ |
| default: |
| ERROR_MSG(""); |
| } |
| return NULL; |
| } |
| |
| |
| @foreach $i table@ |
| /* |
| * var_$i(): |
| * Handle this table separately from the scalar value case. |
| * The workings of this are basically the same as for var_$name above. |
| */ |
| unsigned char * |
| var_$i(struct variable *vp, |
| oid *name, |
| size_t *length, |
| int exact, |
| size_t *var_len, |
| WriteMethod **write_method) |
| { |
| /* variables we may use later */ |
| static long long_ret; |
| static u_long ulong_ret; |
| static unsigned char string[SPRINT_MAX_LEN]; |
| static oid objid[MAX_OID_LEN]; |
| static struct counter64 c64; |
| |
| /* |
| * This assumes that the table is a 'simple' table. |
| * See the implementation documentation for the meaning of this. |
| * You will need to provide the correct value for the TABLE_SIZE parameter |
| * |
| * If this table does not meet the requirements for a simple table, |
| * you will need to provide the replacement code yourself. |
| * Mib2c is not smart enough to write this for you. |
| * Again, see the implementation documentation for what is required. |
| */ |
| if (header_simple_table(vp,name,length,exact,var_len,write_method, TABLE_SIZE) |
| == MATCH_FAILED ) |
| return NULL; |
| |
| /* |
| * this is where we do the value assignments for the mib results. |
| */ |
| switch(vp->magic) { |
| @foreach $c column@ |
| case $c.uc: |
| @if $c.settable@ |
| *write_method = write_${c}; |
| @end@ |
| VAR = VALUE; /* XXX */ |
| return (u_char*) &VAR; |
| @end@ |
| default: |
| ERROR_MSG(""); |
| } |
| return NULL; |
| } |
| @end@ |
| |
| @foreach $i scalar@ |
| @if $i.settable@ |
| |
| |
| int |
| write_$i(int action, |
| u_char *var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char *statP, |
| oid *name, |
| size_t name_len) |
| { |
| $i.decl value; |
| int size; |
| |
| switch ( action ) { |
| case RESERVE1: |
| if (var_val_type != $i.type) { |
| fprintf(stderr, "write to $name not $i.type\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (var_val_len > sizeof($i.decl)) { |
| fprintf(stderr,"write to $name: bad length\n"); |
| return SNMP_ERR_WRONGLENGTH; |
| } |
| break; |
| |
| case RESERVE2: |
| size = var_val_len; |
| value = * ($i.decl *) var_val; |
| |
| break; |
| |
| case FREE: |
| /* Release any resources that have been allocated */ |
| break; |
| |
| case ACTION: |
| /* |
| * The variable has been stored in 'value' for you to use, |
| * and you have just been asked to do something with it. |
| * Note that anything done here must be reversable in the UNDO case |
| */ |
| break; |
| |
| case UNDO: |
| /* Back out any changes made in the ACTION case */ |
| break; |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } |
| @end@ |
| @end@ |
| |
| @foreach $i table@ |
| @foreach $c column@ |
| @if $c.settable@ |
| int |
| write_$c(int action, |
| u_char *var_val, |
| u_char var_val_type, |
| size_t var_val_len, |
| u_char *statP, |
| oid *name, |
| size_t name_len) |
| { |
| $c.decl value; |
| int size; |
| |
| switch ( action ) { |
| case RESERVE1: |
| if (var_val_type != $c.type) { |
| fprintf(stderr, "write to $name not $c.type\n"); |
| return SNMP_ERR_WRONGTYPE; |
| } |
| if (var_val_len > sizeof($c.decl)) { |
| fprintf(stderr,"write to $name: bad length\n"); |
| return SNMP_ERR_WRONGLENGTH; |
| } |
| break; |
| |
| case RESERVE2: |
| size = var_val_len; |
| value = * ($c.decl *) var_val; |
| |
| break; |
| |
| case FREE: |
| /* Release any resources that have been allocated */ |
| break; |
| |
| case ACTION: |
| /* |
| * The variable has been stored in 'value' for you to use, |
| * and you have just been asked to do something with it. |
| * Note that anything done here must be reversable in the UNDO case |
| */ |
| break; |
| |
| case UNDO: |
| /* Back out any changes made in the ACTION case */ |
| break; |
| |
| case COMMIT: |
| /* |
| * Things are working well, so it's now safe to make the change |
| * permanently. Make sure that anything done here can't fail! |
| */ |
| break; |
| } |
| return SNMP_ERR_NOERROR; |
| } |
| @end@ |
| @end@ |
| @end@ |