summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/fd_event_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/fd_event_manager.h')
-rw-r--r--include/net-snmp/library/fd_event_manager.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/include/net-snmp/library/fd_event_manager.h b/include/net-snmp/library/fd_event_manager.h
new file mode 100644
index 0000000..ede67b4
--- /dev/null
+++ b/include/net-snmp/library/fd_event_manager.h
@@ -0,0 +1,134 @@
+/**************************************************************************
+ * UNIT: File Descriptor (FD) Event Manager
+ *
+ * OVERVIEW: This unit contains functions to register a FD with the FD
+ * event manager for callbacks when activity is received on that
+ * FD. Notification of read, write, and exception activity can
+ * all be registered for individually. Once a registered FD is
+ * closed by the user, the FD must be unregistered. To use
+ * the FD Event manager you need to make calls to
+ * netsnmp_external_event_info() and
+ * netsnmp_dispatch_external_events() in your event loop to receive
+ * callbacks for registered events. See snmpd.c and snmptrapd.c
+ * for examples.
+ *
+ * LIMITATIONS:
+ **************************************************************************/
+#ifndef FD_EVENT_MANAGER_H
+#define FD_EVENT_MANAGER_H
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NUM_EXTERNAL_FDS 32
+#define FD_REGISTERED_OK 0
+#define FD_REGISTRATION_FAILED -2
+#define FD_UNREGISTERED_OK 0
+#define FD_NO_SUCH_REGISTRATION -1
+
+/* Since the inception of netsnmp_external_event_info and
+ * netsnmp_dispatch_external_events, there is no longer a need for the data
+ * below to be globally visible. We will leave it global for now for
+ * compatibility purposes. */
+extern int external_readfd[NUM_EXTERNAL_FDS], external_readfdlen;
+extern int external_writefd[NUM_EXTERNAL_FDS], external_writefdlen;
+extern int external_exceptfd[NUM_EXTERNAL_FDS], external_exceptfdlen;
+
+extern void (*external_readfdfunc[NUM_EXTERNAL_FDS]) (int, void *);
+extern void (*external_writefdfunc[NUM_EXTERNAL_FDS]) (int, void *);
+extern void (*external_exceptfdfunc[NUM_EXTERNAL_FDS]) (int, void *);
+
+extern void *external_readfd_data[NUM_EXTERNAL_FDS];
+extern void *external_writefd_data[NUM_EXTERNAL_FDS];
+extern void *external_exceptfd_data[NUM_EXTERNAL_FDS];
+
+/* Here are the key functions of this unit. Use register_xfd to register
+ * a callback to be called when there is x activity on the register fd.
+ * x can be read, write, or except (for exception). When registering,
+ * you can pass in a pointer to some data that you have allocated that
+ * you would like to have back when the callback is called. */
+int register_readfd(int, void (*func)(int, void *), void *);
+int register_writefd(int, void (*func)(int, void *), void *);
+int register_exceptfd(int, void (*func)(int, void *), void *);
+
+/* Unregisters a given fd for events */
+int unregister_readfd(int);
+int unregister_writefd(int);
+int unregister_exceptfd(int);
+
+/*
+ * External Event Info
+ *
+ * Description:
+ * Call this function to add an external event fds to your read, write,
+ * exception fds that your application already has. When this function
+ * returns, your fd_sets will be ready for select(). It returns the
+ * biggest fd in the fd_sets so far.
+ *
+ * Input Parameters: None
+ *
+ * Output Parameters: None
+ *
+ * In/Out Parameters:
+ * numfds - The biggest fd so far. On exit to this function, numfds
+ * could of changed since we pass out the new biggest fd.
+ * readfds - Set of read FDs that we are monitoring. This function
+ * can modify this set to have more FDs that we are monitoring.
+ * writefds - Set of write FDs that we are monitoring. This function
+ * can modify this set to have more FDs that we are monitoring.
+ * exceptfds - Set of exception FDs that we are monitoring. This function
+ * can modify this set to have more FDs that we are monitoring.
+ *
+ * Return Value: None
+ *
+ * Side Effects: None
+ */
+NETSNMP_IMPORT
+void netsnmp_external_event_info(int *numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds);
+
+NETSNMP_IMPORT
+void netsnmp_external_event_info2(int *numfds,
+ netsnmp_large_fd_set *readfds,
+ netsnmp_large_fd_set *writefds,
+ netsnmp_large_fd_set *exceptfds);
+
+/*
+ * Dispatch External Events
+ *
+ * Description:
+ * Call this function after select returns with pending events. If any of
+ * them were NETSNMP external events, the registered callback will be called.
+ * The corresponding fd_set will have the FD cleared after the event is
+ * dispatched.
+ *
+ * Input Parameters: None
+ *
+ * Output Parameters: None
+ *
+ * In/Out Parameters:
+ * count - Number of FDs that have activity. In this function, we decrement
+ * count as we dispatch an event.
+ * readfds - Set of read FDs that have activity
+ * writefds - Set of write FDs that have activity
+ * exceptfds - Set of exception FDs that have activity
+ *
+ * Return Value: None
+ *
+ * Side Effects: None
+ */
+NETSNMP_IMPORT
+void netsnmp_dispatch_external_events(int *count, fd_set *readfds, fd_set *writefds, fd_set *exceptfds);
+NETSNMP_IMPORT
+void netsnmp_dispatch_external_events2(int *count,
+ netsnmp_large_fd_set *readfds,
+ netsnmp_large_fd_set *writefds,
+ netsnmp_large_fd_set *exceptfds);
+#ifdef __cplusplus
+}
+#endif
+#endif