1 /*
2  * table_iterator.h
3  */
4 #ifndef _TABLE_DATA_HANDLER_H_
5 #define _TABLE_DATA_HANDLER_H_
6 
7 #ifdef __cplusplus
8 extern          "C" {
9 #endif
10 
11     /*
12      * This helper is designed to completely automate the task of storing
13      * tables of data within the agent that are not tied to external data
14      * sources (like the kernel, hardware, or other processes, etc).  IE,
15      * all rows within a table are expected to be added manually using
16      * functions found below.
17      */
18 
19 #define TABLE_DATA_NAME "table_data"
20 #define TABLE_DATA_ROW  "table_data"
21 #define TABLE_DATA_TABLE "table_data_table"
22 
23     typedef struct netsnmp_table_row_s {
24         netsnmp_variable_list *indexes; /* stored permanently if store_indexes = 1 */
25         oid            *index_oid;
26         size_t          index_oid_len;
27         void           *data;   /* the data to store */
28 
29         struct netsnmp_table_row_s *next, *prev;        /* if used in a list */
30     } netsnmp_table_row;
31 
32     typedef struct netsnmp_table_data_s {
33         netsnmp_variable_list *indexes_template;        /* containing only types */
34         char           *name;   /* if !NULL, it's registered globally */
35         int             flags;  /* not currently used */
36         int             store_indexes;
37         netsnmp_table_row *first_row;
38         netsnmp_table_row *last_row;
39     } netsnmp_table_data;
40 
41 /* =================================
42  * Table Data API: Table maintenance
43  * ================================= */
44 
45     void       netsnmp_table_data_generate_index_oid( netsnmp_table_row  *row);
46 
47     netsnmp_table_data *netsnmp_create_table_data(const char *name);
48     netsnmp_table_row  *netsnmp_create_table_data_row(void);
49     netsnmp_table_row  *netsnmp_table_data_clone_row( netsnmp_table_row  *row);
50     void               *netsnmp_table_data_delete_row(netsnmp_table_row  *row);
51     int                 netsnmp_table_data_add_row(   netsnmp_table_data *table,
52                                                       netsnmp_table_row  *row);
53     void
54        netsnmp_table_data_replace_row(netsnmp_table_data *table,
55                                       netsnmp_table_row *origrow,
56                                       netsnmp_table_row *newrow);
57     netsnmp_table_row *netsnmp_table_data_remove_row(netsnmp_table_data *table,
58                                                      netsnmp_table_row  *row);
59     void   *netsnmp_table_data_remove_and_delete_row(netsnmp_table_data *table,
60                                                      netsnmp_table_row  *row);
61     void    netsnmp_table_data_delete_table( netsnmp_table_data *table );
62 
63 /* =================================
64  * Table Data API: MIB maintenance
65  * ================================= */
66 
67     netsnmp_mib_handler *
68         netsnmp_get_table_data_handler(netsnmp_table_data           *table);
69 
70     int netsnmp_register_table_data(netsnmp_handler_registration    *reginfo,
71                                     netsnmp_table_data              *table,
72                                     netsnmp_table_registration_info *table_info);
73     int netsnmp_register_read_only_table_data(
74                                     netsnmp_handler_registration    *reginfo,
75                                     netsnmp_table_data              *table,
76                                     netsnmp_table_registration_info *table_info);
77     Netsnmp_Node_Handler netsnmp_table_data_helper_handler;
78 
79     netsnmp_table_data *netsnmp_extract_table(    netsnmp_request_info *);
80     netsnmp_table_row  *netsnmp_extract_table_row(netsnmp_request_info *);
81     void          *netsnmp_extract_table_row_data(netsnmp_request_info *);
82     void netsnmp_insert_table_row(netsnmp_request_info *, netsnmp_table_row *);
83 
84     int netsnmp_table_data_build_result(netsnmp_handler_registration *reginfo,
85                                         netsnmp_agent_request_info   *reqinfo,
86                                         netsnmp_request_info         *request,
87                                         netsnmp_table_row *row, int column,
88                                         u_char type, u_char * result_data,
89                                         size_t result_data_len);
90 
91 /* =================================
92  * Table Data API: Row operations
93  * ================================= */
94 
95     netsnmp_table_row *netsnmp_table_data_get_first_row(
96                                               netsnmp_table_data    *table);
97     netsnmp_table_row *netsnmp_table_data_get_next_row(
98                                               netsnmp_table_data    *table,
99                                               netsnmp_table_row     *row);
100 
101     netsnmp_table_row *netsnmp_table_data_get(netsnmp_table_data    *table,
102                                               netsnmp_variable_list *indexes);
103 
104     netsnmp_table_row *netsnmp_table_data_get_from_oid(
105                                               netsnmp_table_data    *table,
106                                               oid *  searchfor,
107                                               size_t searchfor_len);
108 
109     int netsnmp_table_data_num_rows(netsnmp_table_data *table);
110 
111 
112 /* =================================
113  * Table Data API: Index operations
114  * ================================= */
115 
116 #define netsnmp_table_data_add_index(thetable, type) snmp_varlist_add_variable(&thetable->indexes_template, NULL, 0, type, NULL, 0)
117 #define netsnmp_table_row_add_index(row, type, value, value_len) snmp_varlist_add_variable(&row->indexes, NULL, 0, type, (const u_char *) value, value_len)
118 
119 
120 #ifdef __cplusplus
121 }
122 #endif
123 
124 #endif                          /* _TABLE_DATA_HANDLER_H_ */
125