diff options
Diffstat (limited to 'include/net-snmp/agent/agent_handler.h')
-rw-r--r-- | include/net-snmp/agent/agent_handler.h | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/include/net-snmp/agent/agent_handler.h b/include/net-snmp/agent/agent_handler.h new file mode 100644 index 0000000..69151a8 --- /dev/null +++ b/include/net-snmp/agent/agent_handler.h @@ -0,0 +1,269 @@ +/* Portions of this file are subject to the following copyright(s). See + * the Net-SNMP's COPYING file for more details and other copyrights + * that may apply: + */ +/* + * Portions of this file are copyrighted by: + * Copyright © 2003 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms specified in the COPYING file + * distributed with the Net-SNMP package. + */ +#ifndef AGENT_HANDLER_H +#define AGENT_HANDLER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** @file agent_handler.h + * + * @addtogroup handler + * + * @{ + */ + +struct netsnmp_handler_registration_s; + +/* + * per mib handler flags. + * NOTE: Lower bits are reserved for the agent handler's use. + * The high 4 bits (31-28) are reserved for use by the handler. + */ +#define MIB_HANDLER_AUTO_NEXT 0x00000001 +#define MIB_HANDLER_AUTO_NEXT_OVERRIDE_ONCE 0x00000002 +#define MIB_HANDLER_INSTANCE 0x00000004 + +#define MIB_HANDLER_CUSTOM4 0x10000000 +#define MIB_HANDLER_CUSTOM3 0x20000000 +#define MIB_HANDLER_CUSTOM2 0x40000000 +#define MIB_HANDLER_CUSTOM1 0x80000000 + + +/** @typedef struct netsnmp_mib_handler_s netsnmp_mib_handler + * Typedefs the netsnmp_mib_handler_s struct into netsnmp_mib_handler */ + +/** @struct netsnmp_mib_handler_s + * the mib handler structure to be registered + */ +typedef struct netsnmp_mib_handler_s { + char *handler_name; + /** for handler's internal use */ + void *myvoid; + /** for agent_handler's internal use */ + int flags; + + /** if you add more members, you probably also want to update */ + /** _clone_handler in agent_handler.c. */ + + int (*access_method) (struct netsnmp_mib_handler_s *, + struct + netsnmp_handler_registration_s *, + struct + netsnmp_agent_request_info_s *, + struct netsnmp_request_info_s *); + void (*data_free)(void *myvoid); /**< data free hook for myvoid */ + + struct netsnmp_mib_handler_s *next; + struct netsnmp_mib_handler_s *prev; +} netsnmp_mib_handler; + +/* + * per registration flags + */ +#define HANDLER_CAN_GETANDGETNEXT 0x01 /* must be able to do both */ +#define HANDLER_CAN_SET 0x02 /* implies create, too */ +#define HANDLER_CAN_GETBULK 0x04 +#define HANDLER_CAN_NOT_CREATE 0x08 /* auto set if ! CAN_SET */ +#define HANDLER_CAN_BABY_STEP 0x10 +#define HANDLER_CAN_STASH 0x20 + + +#define HANDLER_CAN_RONLY (HANDLER_CAN_GETANDGETNEXT) +#define HANDLER_CAN_RWRITE (HANDLER_CAN_GETANDGETNEXT | HANDLER_CAN_SET) +#define HANDLER_CAN_SET_ONLY (HANDLER_CAN_SET | HANDLER_CAN_NOT_CREATE) +#define HANDLER_CAN_DEFAULT (HANDLER_CAN_RONLY | HANDLER_CAN_NOT_CREATE) + +/** @typedef struct netsnmp_handler_registration_s netsnmp_handler_registration + * Typedefs the netsnmp_handler_registration_s struct into netsnmp_handler_registration */ + +/** @struct netsnmp_handler_registration_s + * Root registration info. + * The variables handlerName, contextName, and rootoid need to be allocated + * on the heap, when the registration structure is unregistered using + * unregister_mib_context() the code attempts to free them. + */ +typedef struct netsnmp_handler_registration_s { + + /** for mrTable listings, and other uses */ + char *handlerName; + /** NULL = default context */ + char *contextName; + + /** + * where are we registered at? + */ + oid *rootoid; + size_t rootoid_len; + + /** + * handler details + */ + netsnmp_mib_handler *handler; + int modes; + + /** + * more optional stuff + */ + int priority; + int range_subid; + oid range_ubound; + int timeout; + int global_cacheid; + + /** + * void ptr for registeree + */ + void * my_reg_void; + +} netsnmp_handler_registration; + +/* + * function handler definitions + */ + +typedef int (Netsnmp_Node_Handler) (netsnmp_mib_handler *handler, + /** pointer to registration struct */ + netsnmp_handler_registration *reginfo, + /** pointer to current transaction */ + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests); + + typedef struct netsnmp_handler_args_s { + netsnmp_mib_handler *handler; + netsnmp_handler_registration *reginfo; + netsnmp_agent_request_info *reqinfo; + netsnmp_request_info *requests; + } netsnmp_handler_args; + + typedef struct netsnmp_delegated_cache_s { + int transaction_id; + netsnmp_mib_handler *handler; + netsnmp_handler_registration *reginfo; + netsnmp_agent_request_info *reqinfo; + netsnmp_request_info *requests; + void *localinfo; + } netsnmp_delegated_cache; + + /* + * handler API functions + */ + void netsnmp_init_handler_conf(void); + int netsnmp_register_handler(netsnmp_handler_registration + *reginfo); + int netsnmp_unregister_handler(netsnmp_handler_registration + *reginfo); + int + netsnmp_register_handler_nocallback(netsnmp_handler_registration + *reginfo); + int netsnmp_inject_handler(netsnmp_handler_registration + *reginfo, + netsnmp_mib_handler *handler); + int + netsnmp_inject_handler_before(netsnmp_handler_registration *reginfo, + netsnmp_mib_handler *handler, + const char *before_what); + netsnmp_mib_handler + *netsnmp_find_handler_by_name(netsnmp_handler_registration + *reginfo, const char *name); + void + *netsnmp_find_handler_data_by_name(netsnmp_handler_registration + *reginfo, const char *name); + int netsnmp_call_handlers(netsnmp_handler_registration + *reginfo, + netsnmp_agent_request_info + *reqinfo, + netsnmp_request_info *requests); + int netsnmp_call_handler(netsnmp_mib_handler *next_handler, + netsnmp_handler_registration + *reginfo, + netsnmp_agent_request_info + *reqinfo, + netsnmp_request_info *requests); + int netsnmp_call_next_handler(netsnmp_mib_handler *current, + netsnmp_handler_registration + *reginfo, + netsnmp_agent_request_info + *reqinfo, + netsnmp_request_info + *requests); + int netsnmp_call_next_handler_one_request(netsnmp_mib_handler *current, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests); + + netsnmp_mib_handler *netsnmp_create_handler(const char *name, + Netsnmp_Node_Handler * + handler_access_method); + netsnmp_handler_registration * + netsnmp_handler_registration_create(const char *name, + netsnmp_mib_handler *handler, + oid * reg_oid, size_t reg_oid_len, + int modes); + netsnmp_handler_registration * + netsnmp_create_handler_registration(const char *name, Netsnmp_Node_Handler* + handler_access_method, oid *reg_oid, + size_t reg_oid_len, int modes); + + netsnmp_delegated_cache + *netsnmp_create_delegated_cache(netsnmp_mib_handler *, + netsnmp_handler_registration *, + netsnmp_agent_request_info *, + netsnmp_request_info *, void *); + void netsnmp_free_delegated_cache(netsnmp_delegated_cache *dcache); + netsnmp_delegated_cache + *netsnmp_handler_check_cache(netsnmp_delegated_cache *dcache); + void netsnmp_register_handler_by_name(const char *, + netsnmp_mib_handler + *); + + void netsnmp_clear_handler_list(void); + + void + netsnmp_request_add_list_data(netsnmp_request_info *request, + netsnmp_data_list *node); + + int + netsnmp_request_remove_list_data(netsnmp_request_info *request, + const char *name); + + void *netsnmp_request_get_list_data(netsnmp_request_info + *request, + const char *name); + + void + netsnmp_free_request_data_set(netsnmp_request_info *request); + + void + netsnmp_free_request_data_sets(netsnmp_request_info *request); + + void netsnmp_handler_free(netsnmp_mib_handler *); + netsnmp_mib_handler *netsnmp_handler_dup(netsnmp_mib_handler *); + netsnmp_handler_registration + *netsnmp_handler_registration_dup(netsnmp_handler_registration *); + void + netsnmp_handler_registration_free(netsnmp_handler_registration *); + +#define REQUEST_IS_DELEGATED 1 +#define REQUEST_IS_NOT_DELEGATED 0 + void + netsnmp_handler_mark_requests_as_delegated(netsnmp_request_info *, + int); + void *netsnmp_handler_get_parent_data(netsnmp_request_info *, + const char *); + +#ifdef __cplusplus +} +#endif + +#endif /* AGENT_HANDLER_H */ +/** @} */ |