| .TH SNMP_ALARM 3 "01 Aug 2002" VVERSIONINFO "Net-SNMP" |
| .SH NAME |
| snmp_alarm_register, |
| snmp_alarm_register_hr, |
| snmp_alarm_unregister - alarm functions |
| .SH SYNOPSIS |
| .B #include <net-snmp/utilities.h> |
| .PP |
| .B "unsigned int" |
| .br |
| .BI "snmp_alarm_register(unsigned int " seconds "," |
| .br |
| .BI " unsigned int " flags "," |
| .br |
| .BI " SNMPAlarmCallback *" f_callback "," |
| .br |
| .BI " void *" clientarg ");" |
| .PP |
| .B "unsigned int" |
| .br |
| .BI "snmp_alarm_register_hr(struct timeval " t "," |
| .br |
| .BI " unsigned int " flags "," |
| .br |
| .BI " SNMPAlarmCallback *" f_callback "," |
| .br |
| .BI " void *" clientarg ");" |
| .PP |
| .B "void |
| .br |
| .BI "snmp_alarm_unregister(unsigned int " reg ");" |
| .SH DESCRIPTION |
| .PP |
| These functions implement support for a generic timer handling |
| mechanism for multiple parts of an application to register function |
| callbacks to happen at a particular time in the future. |
| .SH USAGE |
| .PP |
| The usage is fairly simple and straight-forward: Simply create a |
| function you want called back at some point in the future. The |
| function definition should be similar to: |
| .RS 4 |
| .PP |
| .BI "void my_callback(unsigned int " reg ", void *" clientarg ");" |
| .RE |
| .PP |
| Then, call |
| .B snmp_alarm_register() |
| to register your callback to be called |
| .I seconds |
| from now. The |
| .I flags |
| field should either be |
| .I SA_REPEAT |
| or |
| .I NULL. |
| If flags is set with |
| .I SA_REPEAT, |
| then the registered callback function will be called every |
| .I seconds. |
| If |
| .I flags |
| is |
| .I NULL |
| then the function will only be called once and then removed from the |
| alarm system registration. |
| .PP |
| The |
| .I clientarg |
| parameter in the registration function is used only by |
| the client function and is stored and passed back directly to them on |
| every call to the system. |
| .PP |
| The |
| .B snmp_alarm_register() |
| function returns a unique |
| .I "unsigned int" |
| (which is also passed as the first argument of each callback), which |
| can then be used to remove the callback from the queue at a later |
| point in the future using the |
| .B snmp_alarm_unregister() |
| function. If the |
| .B snmp_alarm_register() |
| call fails it returns zero. In particular, note that it is entirely |
| permissible for an alarm function to unregister itself. |
| .PP |
| The |
| .B snmp_alarm_register_hr() |
| function is identical in operation to the |
| .B snmp_alarm_register() |
| function, but takes a |
| .I "struct timeval" |
| as a first parameter, and schedules the callback after the period |
| represented by |
| .I t |
| (the letters |
| .B hr |
| stand for "high resolution"). The operation of this function is |
| dependent on the provision of the |
| .BR setitimer (2) |
| system call by the operating system. If this system call is not |
| available, the alarm will be scheduled as if |
| .B snmp_alarm_register() |
| had been called with a first argument equal to the value of the |
| .I tv_sec |
| member of |
| .IR "t". |
| See, however, the notes below. |
| .SH INITIALIZATION |
| The |
| .B init_snmp() |
| function initialises the snmp_alarm subsystem by calling |
| .B init_snmp_alarm() |
| and then |
| .B init_alarm_post_config() |
| to set up the first timer to initialise the callback function. These |
| two functions should not be used directly by applications. |
| .SH "NOTES" |
| The default behaviour of the snmp_alarm subsystem is to request |
| .I SIGALRM |
| signals from the operating system via the |
| .BR alarm (2) |
| or |
| .BR setitimer (2) |
| system calls. This has the disadvantage, however, that no other part |
| of the application can use the |
| .I SIGLARM |
| functionality (or, if some other part of the application |
| .I does |
| use the |
| .I SIGALRM |
| functionality, the snmp_alarm subsystem will not work correctly). |
| .PP |
| If your application runs a |
| .BR select (2)-based |
| event loop, however, there is no need to use |
| .I SIGALRM |
| for the snmp_alarm subsystem, leaving it available for other parts of |
| the application. This is done by making the following call: |
| .PP |
| .nf |
| netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, |
| NETSNMP_DS_LIB_ALARM_DONT_USE_SIG, 1); |
| .fi |
| .PP |
| before calling |
| .BR "init_snmp()". |
| Then, |
| .BR snmp_select_info() |
| takes alarms into account when calculating the timeout value to be |
| used for |
| .BR select (2). |
| All you need to do is call |
| .BR run_alarms() |
| when |
| .BR select (2) |
| times out (return value of zero). This is the approach taken in the |
| agent; see |
| .IR "snmpd.c". |
| Furthermore, when using this method, high resolution alarms do not |
| depend on the presence of the |
| .BR setitimer (2) |
| system call, although overall precision is of course still determined |
| by the underlying operating system. Recommended. |
| .SH "SEE ALSO" |
| .BR netsnmp_session_api "(3), " default_store "(3), " |
| .BR alarm "(2), " setitimer "(2), " select "(2)" |
| .\" Local Variables: |
| .\" mode: nroff |
| .\" End: |