📄 example.c
字号:
case EXAMPLETIMETICKS: /* * Here both assumptions are correct, * so we just need to set up the answer. */ long_ret = 363136200; /* 42 days, 42 minutes and 42.0 seconds */ return (u_char *) & long_ret; case EXAMPLEIPADDRESS: /* * ipaddresses get returned as a long. ick */ /* * we're returning 127.0.0.1 */ long_ret = ntohl(INADDR_LOOPBACK); return (u_char *) & long_ret; case EXAMPLECOUNTER: long_ret = 42; return (u_char *) & long_ret; case EXAMPLEGAUGE: long_ret = 42; /* Do we detect a theme running through these answers? */ return (u_char *) & long_ret; case EXAMPLETRIGGERTRAP: /* * This object is essentially "write-only". * It only exists to trigger the sending of a trap. * Reading it will always return 0. */ long_ret = 0; *write_method = write_exampletrap; return (u_char *) & long_ret; case EXAMPLETRIGGERTRAP2: /* * This object is essentially "write-only". * It only exists to trigger the sending of a v2 trap. * Reading it will always return 0. */ long_ret = 0; *write_method = write_exampletrap2; return (u_char *) & long_ret; default: /* * This will only be triggered if there's a problem with * the coding of the module. SNMP requests that reference * a non-existant OID will be directed elsewhere. * If this branch is reached, log an error, so that * the problem can be investigated. */ DEBUGMSGTL(("snmpd", "unknown sub-id %d in examples/var_example\n", vp->magic)); } /* * If we fall through to here, fail by returning NULL. * This is essentially a continuation of the 'default' case above. */ return NULL;} /********************* * * Writeable object SET handling routines * *********************/intwrite_exampleint(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){ /* * Define an arbitrary maximum permissible value */#define MAX_EXAMPLE_INT 100 static long intval; static long old_intval; switch (action) { case RESERVE1: /* * Check that the value being set is acceptable */ if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("example", "%x not integer type", var_val_type)); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long)) { DEBUGMSGTL(("example", "wrong length %x", var_val_len)); return SNMP_ERR_WRONGLENGTH; } intval = *((long *) var_val); if (intval > MAX_EXAMPLE_INT) { DEBUGMSGTL(("example", "wrong value %x", intval)); return SNMP_ERR_WRONGVALUE; } break; case RESERVE2: /* * This is conventially where any necesary * resources are allocated (e.g. calls to malloc) * Here, we are using static variables * so don't need to worry about this. */ break; case FREE: /* * This is where any of the above resources * are freed again (because one of the other * values being SET failed for some reason). * Again, since we are using static variables * we don't need to worry about this either. */ break; case ACTION: /* * Set the variable as requested. * Note that this may need to be reversed, * so save any information needed to do this. */ old_intval = example_int; example_int = intval; break; case UNDO: /* * Something failed, so re-set the * variable to its previous value * (and free any allocated resources). */ example_int = old_intval; break; case COMMIT: /* * Everything worked, so we can discard any * saved information, and make the change * permanent (e.g. write to the config file). * We also free any allocated resources. * * In this case, there's nothing to do. */ break; } return SNMP_ERR_NOERROR;}intwrite_exampletrap(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){ long intval; DEBUGMSGTL(("example", "write_exampletrap entered: action=%d\n", action)); switch (action) { case RESERVE1: /* * The only acceptable value is the integer 1 */ if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("example", "%x not integer type", var_val_type)); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long)) { DEBUGMSGTL(("example", "wrong length %x", var_val_len)); return SNMP_ERR_WRONGLENGTH; } intval = *((long *) var_val); if (intval != 1) { DEBUGMSGTL(("example", "wrong value %x", intval)); return SNMP_ERR_WRONGVALUE; } break; case RESERVE2: /* * No resources are required.... */ break; case FREE: /* * ... so no resources need be freed */ break; case ACTION: /* * Having triggered the sending of a trap, * it would be impossible to revoke this, * so we can't actually invoke the action here. */ break; case UNDO: /* * We haven't done anything yet, * so there's nothing to undo */ break; case COMMIT: /* * Everything else worked, so it's now safe * to trigger the trap. * Note that this is *only* acceptable since * the trap sending routines are "failsafe". * (In fact, they can fail, but they return no * indication of this, which is the next best thing!) */ DEBUGMSGTL(("example", "write_exampletrap sending the trap\n", action)); send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 99); DEBUGMSGTL(("example", "write_exampletrap trap sent\n", action)); break; } return SNMP_ERR_NOERROR;}/* * this documents how to send a SNMPv2 (and higher) trap via the * send_v2trap() API. * * Coding SNMP-v2 Trap: * * The SNMPv2-Trap PDU contains at least a pair of object names and * values: - sysUpTime.0 whose value is the time in hundredths of a * second since the netwok management portion of system was last * reinitialized. - snmpTrapOID.0 which is part of the trap group SNMPv2 * MIB whose value is the object-id of the specific trap you have defined * in your own MIB. Other variables can be added to caracterize the * trap. * * The function send_v2trap adds automaticallys the two objects but the * value of snmpTrapOID.0 is 0.0 by default. If you want to add your trap * name, you have to reconstruct this object and to add your own * variable. * */intwrite_exampletrap2(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){ long intval; /* * these variales will be used when we send the trap */ oid objid_snmptrap[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 }; /* snmpTrapOID.0 */ oid demo_trap[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 990 }; /*demo-trap */ oid example_string_oid[] = { 1, 3, 6, 1, 4, 1, 2021, 254, 1, 0 }; static netsnmp_variable_list var_trap; static netsnmp_variable_list var_obj; DEBUGMSGTL(("example", "write_exampletrap2 entered: action=%d\n", action)); switch (action) { case RESERVE1: /* * The only acceptable value is the integer 1 */ if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("example", "%x not integer type", var_val_type)); return SNMP_ERR_WRONGTYPE; } if (var_val_len > sizeof(long)) { DEBUGMSGTL(("example", "wrong length %x", var_val_len)); return SNMP_ERR_WRONGLENGTH; } intval = *((long *) var_val); if (intval != 1) { DEBUGMSGTL(("example", "wrong value %x", intval)); return SNMP_ERR_WRONGVALUE; } break; case RESERVE2: /* * No resources are required.... */ break; case FREE: /* * ... so no resources need be freed */ break; case ACTION: /* * Having triggered the sending of a trap, * it would be impossible to revoke this, * so we can't actually invoke the action here. */ break; case UNDO: /* * We haven't done anything yet, * so there's nothing to undo */ break; case COMMIT: /* * Everything else worked, so it's now safe * to trigger the trap. * Note that this is *only* acceptable since * the trap sending routines are "failsafe". * (In fact, they can fail, but they return no * indication of this, which is the next best thing!) */ /* * trap definition objects */ var_trap.next_variable = &var_obj; /* next variable */ var_trap.name = objid_snmptrap; /* snmpTrapOID.0 */ var_trap.name_length = sizeof(objid_snmptrap) / sizeof(oid); /* number of sub-ids */ var_trap.type = ASN_OBJECT_ID; var_trap.val.objid = demo_trap; /* demo-trap objid */ var_trap.val_len = sizeof(demo_trap); /* length in bytes (not number of subids!) */ /* * additional objects */ var_obj.next_variable = NULL; /* No more variables after this one */ var_obj.name = example_string_oid; var_obj.name_length = sizeof(example_string_oid) / sizeof(oid); /* number of sub-ids */ var_obj.type = ASN_OCTET_STR; /* type of variable */ var_obj.val.string = example_str; /* value */ var_obj.val_len = strlen(example_str); DEBUGMSGTL(("example", "write_exampletrap2 sending the v2 trap\n", action)); send_v2trap(&var_trap); DEBUGMSGTL(("example", "write_exampletrap2 v2 trap sent\n", action)); break; } return SNMP_ERR_NOERROR;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -