1 /* Portions of this file are subject to the following copyright(s).  See
2  * the Net-SNMP's COPYING file for more details and other copyrights
3  * that may apply:
4  */
5 /*
6  * Portions of this file are copyrighted by:
7  * Copyright � 2003 Sun Microsystems, Inc. All rights reserved.
8  * Use is subject to license terms specified in the COPYING file
9  * distributed with the Net-SNMP package.
10  */
11 /*
12  * Portions of this file are copyrighted by:
13  * Copyright (C) 2007 Apple, Inc. All rights reserved.
14  * Use is subject to license terms specified in the COPYING file
15  * distributed with the Net-SNMP package.
16  */
17 /*
18  * @file table.h
19  *
20  * @addtogroup table
21  *
22  * @{
23  */
24 #ifndef _TABLE_HANDLER_H_
25 #define _TABLE_HANDLER_H_
26 
27 #ifdef __cplusplus
28 extern          "C" {
29 #endif
30 
31 /**
32  * The table helper is designed to simplify the task of writing a
33  * table handler for the net-snmp agent.  You should create a normal
34  * handler and register it using the netsnmp_register_table() function
35  * instead of the netsnmp_register_handler() function.
36  */
37 
38 /**
39  * Notes:
40  *
41  *   1) illegal indexes automatically get handled for get/set cases.
42  *      Simply check to make sure the value is type ASN_NULL before
43  *      you answer a request.
44  */
45 
46 /**
47  * used as an index to parent_data lookups
48  */
49 #define TABLE_HANDLER_NAME "table"
50 
51 /** @typedef struct netsnmp_column_info_t netsnmp_column_info
52  * Typedefs the netsnmp_column_info_t struct into netsnmp_column_info */
53 
54 /**
55  * @struct netsnmp_column_info_t
56  * column info struct.  OVERLAPPING RANGES ARE NOT SUPPORTED.
57  */
58     typedef struct netsnmp_column_info_t {
59         char            isRange;
60  	/** only useful if isRange == 0 */
61         char            list_count;
62 
63         union {
64             unsigned int    range[2];
65             unsigned int   *list;
66         } details;
67 
68         struct netsnmp_column_info_t *next;
69 
70     } netsnmp_column_info;
71 
72 /** @typedef struct netsnmp_table_registration_info_s netsnmp_table_registration_info
73   * Typedefs the netsnmp_table_registration_info_s  struct into
74   * netsnmp_table_registration_info */
75 
76 /**
77  * @struct netsnmp_table_registration_info_s
78  * Table registration structure.
79  */
80     typedef struct netsnmp_table_registration_info_s {
81  	/** list of varbinds with only 'type' set */
82         netsnmp_variable_list *indexes;
83  	/** calculated automatically */
84         unsigned int    number_indexes;
85 
86        /**
87         * the minimum columns number. If there are columns
88         * in-between which are not valid, use valid_columns to get
89         * automatic column range checking.
90         */
91         unsigned int    min_column;
92  	/** the maximum columns number */
93         unsigned int    max_column;
94 
95  	/** more details on columns */
96         netsnmp_column_info *valid_columns;
97 
98     } netsnmp_table_registration_info;
99 
100 /** @typedef struct netsnmp_table_request_info_s netsnmp_table_request_info
101   * Typedefs the netsnmp_table_request_info_s  struct into
102   * netsnmp_table_request_info */
103 
104 /**
105  * @struct netsnmp_table_request_info_s
106  * The table request info structure.
107  */
108     typedef struct netsnmp_table_request_info_s {
109  	/** 0 if OID not long enough */
110         unsigned int    colnum;
111         /** 0 if failure to parse any */
112         unsigned int    number_indexes;
113  	/** contents freed by helper upon exit */
114         netsnmp_variable_list *indexes;
115 
116         oid             index_oid[MAX_OID_LEN];
117         size_t          index_oid_len;
118         netsnmp_table_registration_info *reg_info;
119     } netsnmp_table_request_info;
120 
121     netsnmp_mib_handler
122         *netsnmp_get_table_handler(netsnmp_table_registration_info
123                                    *tabreq);
124     void  netsnmp_handler_owns_table_info(netsnmp_mib_handler *handler);
125     void  netsnmp_registration_owns_table_info(netsnmp_handler_registration *reg);
126     int   netsnmp_register_table(  netsnmp_handler_registration    *reginfo,
127                                    netsnmp_table_registration_info *tabreq);
128     int   netsnmp_unregister_table(netsnmp_handler_registration    *reginfo);
129     int   netsnmp_table_build_oid( netsnmp_handler_registration    *reginfo,
130                                    netsnmp_request_info            *reqinfo,
131                                    netsnmp_table_request_info   *table_info);
132     int
133         netsnmp_table_build_oid_from_index(netsnmp_handler_registration
134                                            *reginfo,
135                                            netsnmp_request_info *reqinfo,
136                                            netsnmp_table_request_info
137                                            *table_info);
138     int             netsnmp_table_build_result(netsnmp_handler_registration
139                                                *reginfo,
140                                                netsnmp_request_info
141                                                *reqinfo,
142                                                netsnmp_table_request_info
143                                                *table_info, u_char type,
144                                                u_char * result,
145                                                size_t result_len);
146     int
147         netsnmp_update_variable_list_from_index(netsnmp_table_request_info
148                                                 *);
149     int
150         netsnmp_update_indexes_from_variable_list
151         (netsnmp_table_request_info *tri);
152     netsnmp_table_registration_info
153         *netsnmp_find_table_registration_info(netsnmp_handler_registration
154                                               *reginfo);
155     netsnmp_table_registration_info *
156         netsnmp_table_registration_info_clone(netsnmp_table_registration_info *tri);
157     void netsnmp_table_registration_info_free(netsnmp_table_registration_info *);
158 
159     netsnmp_index * netsnmp_table_index_find_next_row(netsnmp_container *c,
160                                                       netsnmp_table_request_info *tblreq);
161 
162     unsigned int    netsnmp_closest_column(unsigned int current,
163                                            netsnmp_column_info
164                                            *valid_columns);
165 
166     Netsnmp_Node_Handler table_helper_handler;
167 
168 #define netsnmp_table_helper_add_index(tinfo, type) snmp_varlist_add_variable(&tinfo->indexes, NULL, 0, (u_char)type, NULL, 0);
169 
170     void
171         netsnmp_table_helper_add_indexes(netsnmp_table_registration_info
172                                          *tinfo, ...);
173 
174     int netsnmp_check_getnext_reply(netsnmp_request_info *request,
175                                     oid * prefix, size_t prefix_len,
176                                     netsnmp_variable_list * newvar,
177                                     netsnmp_variable_list ** outvar);
178 
179     netsnmp_table_request_info
180         *netsnmp_extract_table_info(netsnmp_request_info *);
181     netsnmp_oid_stash_node
182         **netsnmp_table_get_or_create_row_stash(netsnmp_agent_request_info
183                                                 *reqinfo,
184                                                 const u_char *
185                                                 storage_name);
186 	unsigned int
187 		netsnmp_table_next_column(netsnmp_table_request_info *table_info);
188 
189 
190     int   netsnmp_sparse_table_register(netsnmp_handler_registration    *reginfo,
191                                         netsnmp_table_registration_info *tabreq);
192 
193     netsnmp_mib_handler *netsnmp_sparse_table_handler_get(void);
194 
195 #ifdef __cplusplus
196 }
197 #endif
198 
199 #endif                          /* _TABLE_HANDLER_H_ */
200 /** @} */
201