Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 147 | f9daq | 1 | #ifndef _NETSNMPLIB_H | 
        
| 2 | #define _NETSNMPLIB_H | 
        ||
| 3 | |||
| 4 | |||
| 5 | #define false 0; | 
        ||
| 6 | #define true  1; | 
        ||
| 7 | |||
| 8 | |||
| 9 | #include <winsock2.h> | 
        ||
| 10 | #include <ws2tcpip.h> | 
        ||
| 11 | #include <stdio.h> | 
        ||
| 12 | |||
| 13 | |||
| 14 | #include <net-snmp/net-snmp-config.h> | 
        ||
| 15 | |||
| 16 | |||
| 17 | /* | 
        ||
| 18 |  * Basic system type definitions, taken from the BSD file sys/types.h. | 
        ||
| 19 |  */ | 
        ||
| 20 | typedef unsigned char u_char;  | 
        ||
| 21 | typedef unsigned short u_short;  | 
        ||
| 22 | typedef unsigned int u_int;  | 
        ||
| 23 | typedef unsigned long u_long;  | 
        ||
| 24 | |||
| 25 | #include <net-snmp/library/asn1.h> | 
        ||
| 26 | #include <net-snmp/library/snmp.h> | 
        ||
| 27 | |||
| 28 | |||
| 29 | #define SNMP_VERSION_2c    1 | 
        ||
| 30 | typedef void *HSNMP; // SNMP handle (like FILE)  | 
        ||
| 31 | |||
| 32 | |||
| 33 | |||
| 34 | /* | 
        ||
| 35 |  *  For the initial release, this will just refer to the | 
        ||
| 36 |  *  relevant UCD header files. | 
        ||
| 37 |  *    In due course, the types and structures relevant to the | 
        ||
| 38 |  *  Net-SNMP API will be identified, and defined here directly. | 
        ||
| 39 |  * | 
        ||
| 40 |  *  But for the time being, this header file is primarily a placeholder, | 
        ||
| 41 |  *  to allow application writers to adopt the new header file names. | 
        ||
| 42 |  */ | 
        ||
| 43 | |||
| 44 | typedef union {  | 
        ||
| 45 | long *integer;  | 
        ||
| 46 | u_char *string;  | 
        ||
| 47 | oid *objid;  | 
        ||
| 48 | u_char *bitstring;  | 
        ||
| 49 | struct counter64 *counter64;  | 
        ||
| 50 | #ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES | 
        ||
| 51 | float *floatVal;  | 
        ||
| 52 | double *doubleVal;  | 
        ||
| 53 |   /* | 
        ||
| 54 |    * t_union *unionVal; | 
        ||
| 55 |    */ | 
        ||
| 56 | #endif                          /* NETSNMP_WITH_OPAQUE_SPECIAL_TYPES */ | 
        ||
| 57 | } netsnmp_vardata;  | 
        ||
| 58 | |||
| 59 | |||
| 60 | /** @typedef struct variable_list netsnmp_variable_list | 
        ||
| 61 |  * Typedefs the variable_list struct into netsnmp_variable_list */ | 
        ||
| 62 | /** @struct variable_list | 
        ||
| 63 |  * The netsnmp variable list binding structure, it's typedef'd to | 
        ||
| 64 |  * netsnmp_variable_list. | 
        ||
| 65 |  */ | 
        ||
| 66 | typedef struct variable_list {  | 
        ||
| 67 |   /** NULL for last variable */ | 
        ||
| 68 | struct variable_list *next_variable;  | 
        ||
| 69 |   /** Object identifier of variable */ | 
        ||
| 70 | oid *name;  | 
        ||
| 71 |   /** number of subid's in name */ | 
        ||
| 72 | size_t name_length;  | 
        ||
| 73 |   /** ASN type of variable */ | 
        ||
| 74 |   u_char          type; | 
        ||
| 75 |   /** value of variable */ | 
        ||
| 76 |   netsnmp_vardata val; | 
        ||
| 77 |   /** the length of the value to be copied into buf */ | 
        ||
| 78 | size_t val_len;  | 
        ||
| 79 |   /** 90 percentile < 24. */ | 
        ||
| 80 | oid name_loc[MAX_OID_LEN];  | 
        ||
| 81 |   /** 90 percentile < 40. */ | 
        ||
| 82 | u_char buf[40];  | 
        ||
| 83 |   /** (Opaque) hook for additional data */ | 
        ||
| 84 | void *data;  | 
        ||
| 85 |   /** callback to free above */ | 
        ||
| 86 | void (*dataFreeHook)(void *);  | 
        ||
| 87 | int index;  | 
        ||
| 88 | } netsnmp_variable_list;  | 
        ||
| 89 | |||
| 90 | /** @typedef struct snmp_pdu to netsnmp_pdu | 
        ||
| 91 |  * Typedefs the snmp_pdu struct into netsnmp_pdu */ | 
        ||
| 92 | /** @struct snmp_pdu | 
        ||
| 93 |  * The snmp protocol data unit. | 
        ||
| 94 |  */ | 
        ||
| 95 | typedef struct snmp_pdu {  | 
        ||
| 96 | |||
| 97 | #define non_repeaters errstat | 
        ||
| 98 | #define max_repetitions errindex | 
        ||
| 99 | |||
| 100 |   /* | 
        ||
| 101 |    * Protocol-version independent fields | 
        ||
| 102 |    */ | 
        ||
| 103 |   /** snmp version */ | 
        ||
| 104 | long version;  | 
        ||
| 105 |   /** Type of this PDU */ | 
        ||
| 106 | int command;  | 
        ||
| 107 |   /** Request id - note: not incremented on retries */ | 
        ||
| 108 | long reqid;  | 
        ||
| 109 |   /** Message id for V3 messages note: incremented for each retry */ | 
        ||
| 110 | long msgid;  | 
        ||
| 111 |   /** Unique ID for incoming transactions */ | 
        ||
| 112 | long transid;  | 
        ||
| 113 |   /** Session id for AgentX messages */ | 
        ||
| 114 | long sessid;  | 
        ||
| 115 |   /** Error status (non_repeaters in GetBulk) */ | 
        ||
| 116 | long errstat;  | 
        ||
| 117 |   /** Error index (max_repetitions in GetBulk) */ | 
        ||
| 118 | long errindex;  | 
        ||
| 119 |   /** Uptime */ | 
        ||
| 120 | u_long time;  | 
        ||
| 121 |   u_long          flags; | 
        ||
| 122 | |||
| 123 | int securityModel;  | 
        ||
| 124 |   /** noAuthNoPriv, authNoPriv, authPriv */ | 
        ||
| 125 | int securityLevel;  | 
        ||
| 126 | int msgParseModel;  | 
        ||
| 127 | |||
| 128 |   /** | 
        ||
| 129 |    * Transport-specific opaque data.  This replaces the IP-centric address | 
        ||
| 130 |    * field. | 
        ||
| 131 |    */ | 
        ||
| 132 | |||
| 133 | void *transport_data;  | 
        ||
| 134 | int transport_data_length;  | 
        ||
| 135 | |||
| 136 |   /** | 
        ||
| 137 |    * The actual transport domain.  This SHOULD NOT BE FREE()D. | 
        ||
| 138 |    */ | 
        ||
| 139 | |||
| 140 | const oid *tDomain;  | 
        ||
| 141 | size_t tDomainLen;  | 
        ||
| 142 | |||
| 143 | netsnmp_variable_list *variables;  | 
        ||
| 144 | |||
| 145 | |||
| 146 |   /* | 
        ||
| 147 |    * SNMPv1 & SNMPv2c fields | 
        ||
| 148 |    */ | 
        ||
| 149 |   /** community for outgoing requests. */ | 
        ||
| 150 | u_char *community;  | 
        ||
| 151 |   /** length of community name. */ | 
        ||
| 152 | size_t community_len;  | 
        ||
| 153 | |||
| 154 |   /* | 
        ||
| 155 |    * Trap information | 
        ||
| 156 |    */ | 
        ||
| 157 |   /** System OID */ | 
        ||
| 158 | oid *enterprise;  | 
        ||
| 159 | size_t enterprise_length;  | 
        ||
| 160 |   /** trap type */ | 
        ||
| 161 | long trap_type;  | 
        ||
| 162 |   /** specific type */ | 
        ||
| 163 | long specific_type;  | 
        ||
| 164 |   /** This is ONLY used for v1 TRAPs  */ | 
        ||
| 165 | unsigned char agent_addr[4];  | 
        ||
| 166 | |||
| 167 |   /* | 
        ||
| 168 |    *  SNMPv3 fields | 
        ||
| 169 |    */ | 
        ||
| 170 |   /** context snmpEngineID */ | 
        ||
| 171 | u_char *contextEngineID;  | 
        ||
| 172 |   /** Length of contextEngineID */ | 
        ||
| 173 | size_t contextEngineIDLen;  | 
        ||
| 174 |   /** authoritative contextName */ | 
        ||
| 175 | char *contextName;  | 
        ||
| 176 |   /** Length of contextName */ | 
        ||
| 177 | size_t contextNameLen;  | 
        ||
| 178 |   /** authoritative snmpEngineID for security */ | 
        ||
| 179 | u_char *securityEngineID;  | 
        ||
| 180 |   /** Length of securityEngineID */ | 
        ||
| 181 | size_t securityEngineIDLen;  | 
        ||
| 182 |   /** on behalf of this principal */ | 
        ||
| 183 | char *securityName;  | 
        ||
| 184 |   /** Length of securityName. */ | 
        ||
| 185 | size_t securityNameLen;  | 
        ||
| 186 | |||
| 187 |   /* | 
        ||
| 188 |    * AgentX fields | 
        ||
| 189 |    *      (also uses SNMPv1 community field) | 
        ||
| 190 |    */ | 
        ||
| 191 | int priority;  | 
        ||
| 192 | int range_subid;  | 
        ||
| 193 | |||
| 194 | void *securityStateRef;  | 
        ||
| 195 | } netsnmp_pdu;  | 
        ||
| 196 | |||
| 197 | |||
| 198 | struct snmp_session;  | 
        ||
| 199 | typedef struct snmp_session netsnmp_session;  | 
        ||
| 200 | |||
| 201 | |||
| 202 | #define USM_AUTH_KU_LEN     32 | 
        ||
| 203 | #define USM_PRIV_KU_LEN     32 | 
        ||
| 204 | |||
| 205 | |||
| 206 | typedef int (*netsnmp_callback) (int, netsnmp_session *, int,  | 
        ||
| 207 | netsnmp_pdu *, void *);  | 
        ||
| 208 | |||
| 209 | /** @struct snmp_session | 
        ||
| 210 |  * The snmp session structure. | 
        ||
| 211 |  */ | 
        ||
| 212 | struct snmp_session {  | 
        ||
| 213 |   /* | 
        ||
| 214 |    * Protocol-version independent fields | 
        ||
| 215 |    */ | 
        ||
| 216 |   /** snmp version */ | 
        ||
| 217 | long version;  | 
        ||
| 218 |   /** Number of retries before timeout. */ | 
        ||
| 219 | int retries;  | 
        ||
| 220 |   /** Number of uS until first timeout, then exponential backoff */ | 
        ||
| 221 | long timeout;  | 
        ||
| 222 |   u_long          flags; | 
        ||
| 223 | struct snmp_session *subsession;  | 
        ||
| 224 | struct snmp_session *next;  | 
        ||
| 225 | |||
| 226 |   /** name or address of default peer (may include transport specifier and/or port number) */ | 
        ||
| 227 | char *peername;  | 
        ||
| 228 |   /** UDP port number of peer. (NO LONGER USED - USE peername INSTEAD) */ | 
        ||
| 229 |   u_short         remote_port; | 
        ||
| 230 |   /** My Domain name or dotted IP address, 0 for default */ | 
        ||
| 231 | char *localname;  | 
        ||
| 232 |   /** My UDP port number, 0 for default, picked randomly */ | 
        ||
| 233 |   u_short         local_port; | 
        ||
| 234 |   /** | 
        ||
| 235 |    * Authentication function or NULL if null authentication is used | 
        ||
| 236 |    */ | 
        ||
| 237 | u_char *(*authenticator) (u_char *, size_t *, u_char *, size_t);  | 
        ||
| 238 |   /** Function to interpret incoming data */ | 
        ||
| 239 |   netsnmp_callback callback; | 
        ||
| 240 |   /** | 
        ||
| 241 |    * Pointer to data that the callback function may consider important | 
        ||
| 242 |    */ | 
        ||
| 243 | void *callback_magic;  | 
        ||
| 244 |   /** copy of system errno */ | 
        ||
| 245 | int s_errno;  | 
        ||
| 246 |   /** copy of library errno */ | 
        ||
| 247 | int s_snmp_errno;  | 
        ||
| 248 |   /** Session id - AgentX only */ | 
        ||
| 249 | long sessid;  | 
        ||
| 250 | |||
| 251 |   /* | 
        ||
| 252 |    * SNMPv1 & SNMPv2c fields | 
        ||
| 253 |    */ | 
        ||
| 254 |   /** community for outgoing requests. */ | 
        ||
| 255 | u_char *community;  | 
        ||
| 256 |   /** Length of community name. */ | 
        ||
| 257 | size_t community_len;  | 
        ||
| 258 |   /**  Largest message to try to receive.  */ | 
        ||
| 259 | size_t rcvMsgMaxSize;  | 
        ||
| 260 |   /**  Largest message to try to send.  */ | 
        ||
| 261 | size_t sndMsgMaxSize;  | 
        ||
| 262 | |||
| 263 |   /* | 
        ||
| 264 |    * SNMPv3 fields | 
        ||
| 265 |    */ | 
        ||
| 266 |   /** are we the authoritative engine? */ | 
        ||
| 267 |   u_char          isAuthoritative; | 
        ||
| 268 |   /** authoritative snmpEngineID */ | 
        ||
| 269 | u_char *contextEngineID;  | 
        ||
| 270 |   /** Length of contextEngineID */ | 
        ||
| 271 | size_t contextEngineIDLen;  | 
        ||
| 272 |   /** initial engineBoots for remote engine */ | 
        ||
| 273 |   u_int           engineBoots; | 
        ||
| 274 |   /** initial engineTime for remote engine */ | 
        ||
| 275 |   u_int           engineTime; | 
        ||
| 276 |   /** authoritative contextName */ | 
        ||
| 277 | char *contextName;  | 
        ||
| 278 |   /** Length of contextName */ | 
        ||
| 279 | size_t contextNameLen;  | 
        ||
| 280 |   /** authoritative snmpEngineID */ | 
        ||
| 281 | u_char *securityEngineID;  | 
        ||
| 282 |   /** Length of contextEngineID */ | 
        ||
| 283 | size_t securityEngineIDLen;  | 
        ||
| 284 |   /** on behalf of this principal */ | 
        ||
| 285 | char *securityName;  | 
        ||
| 286 |   /** Length of securityName. */ | 
        ||
| 287 | size_t securityNameLen;  | 
        ||
| 288 | |||
| 289 |   /** auth protocol oid */ | 
        ||
| 290 | oid *securityAuthProto;  | 
        ||
| 291 |   /** Length of auth protocol oid */ | 
        ||
| 292 | size_t securityAuthProtoLen;  | 
        ||
| 293 |   /** Ku for auth protocol XXX */ | 
        ||
| 294 | u_char securityAuthKey[USM_AUTH_KU_LEN];  | 
        ||
| 295 |   /** Length of Ku for auth protocol */ | 
        ||
| 296 | size_t securityAuthKeyLen;  | 
        ||
| 297 |   /** Kul for auth protocol */ | 
        ||
| 298 | u_char *securityAuthLocalKey;  | 
        ||
| 299 |   /** Length of Kul for auth protocol XXX */ | 
        ||
| 300 | size_t securityAuthLocalKeyLen;  | 
        ||
| 301 | |||
| 302 |   /** priv protocol oid */ | 
        ||
| 303 | oid *securityPrivProto;  | 
        ||
| 304 |   /** Length of priv protocol oid */ | 
        ||
| 305 | size_t securityPrivProtoLen;  | 
        ||
| 306 |   /** Ku for privacy protocol XXX */ | 
        ||
| 307 | u_char securityPrivKey[USM_PRIV_KU_LEN];  | 
        ||
| 308 |   /** Length of Ku for priv protocol */ | 
        ||
| 309 | size_t securityPrivKeyLen;  | 
        ||
| 310 |   /** Kul for priv protocol */ | 
        ||
| 311 | u_char *securityPrivLocalKey;  | 
        ||
| 312 |   /** Length of Kul for priv protocol XXX */ | 
        ||
| 313 | size_t securityPrivLocalKeyLen;  | 
        ||
| 314 | |||
| 315 |   /** snmp security model, v1, v2c, usm */ | 
        ||
| 316 | int securityModel;  | 
        ||
| 317 |   /** noAuthNoPriv, authNoPriv, authPriv */ | 
        ||
| 318 | int securityLevel;  | 
        ||
| 319 |   /** target param name */ | 
        ||
| 320 | char *paramName;  | 
        ||
| 321 | |||
| 322 |   /** | 
        ||
| 323 |    * security module specific | 
        ||
| 324 |    */ | 
        ||
| 325 | void *securityInfo;  | 
        ||
| 326 | |||
| 327 |   /** | 
        ||
| 328 |    * use as you want data | 
        ||
| 329 |    * | 
        ||
| 330 |    *     used by 'SNMP_FLAGS_RESP_CALLBACK' handling in the agent | 
        ||
| 331 |    * XXX: or should we add a new field into this structure? | 
        ||
| 332 |    */ | 
        ||
| 333 | void *myvoid;  | 
        ||
| 334 | };  | 
        ||
| 335 | |||
| 336 | |||
| 337 | /** | 
        ||
| 338 |  * Structure for holding a set of file descriptors, similar to fd_set. | 
        ||
| 339 |  * | 
        ||
| 340 |  * This structure however can hold so-called large file descriptors | 
        ||
| 341 |  * (>= FD_SETSIZE or 1024) on Unix systems or more than FD_SETSIZE (64) | 
        ||
| 342 |  * sockets on Windows systems. | 
        ||
| 343 |  * | 
        ||
| 344 |  * It is safe to allocate this structure on the stack. | 
        ||
| 345 |  * | 
        ||
| 346 |  * This structure must be initialized by calling netsnmp_large_fd_set_init() | 
        ||
| 347 |  * and must be cleaned up via netsnmp_large_fd_set_cleanup(). If this last | 
        ||
| 348 |  * function is not called this may result in a memory leak. | 
        ||
| 349 |  */ | 
        ||
| 350 | typedef struct netsnmp_large_fd_set_s {  | 
        ||
| 351 |   /** Maximum set size. */ | 
        ||
| 352 | unsigned lfs_setsize;  | 
        ||
| 353 |   /** | 
        ||
| 354 |    * Points to lfs_set if lfs_setsize <= FD_SETSIZE, and otherwise | 
        ||
| 355 |    * to dynamically allocated memory. | 
        ||
| 356 |    */ | 
        ||
| 357 | fd_set *lfs_setptr;  | 
        ||
| 358 |   /** File descriptor / socket set data if lfs_setsize <= FD_SETSIZE. */ | 
        ||
| 359 |   fd_set          lfs_set; | 
        ||
| 360 | } netsnmp_large_fd_set;  | 
        ||
| 361 | |||
| 362 | |||
| 363 | /* | 
        ||
| 364 |      * A tree in the format of the tree structure of the MIB. | 
        ||
| 365 |      */ | 
        ||
| 366 | struct tree {  | 
        ||
| 367 | struct tree *child_list; /* list of children of this node */  | 
        ||
| 368 | struct tree *next_peer; /* Next node in list of peers */  | 
        ||
| 369 | struct tree *next; /* Next node in hashed list of names */  | 
        ||
| 370 | struct tree *parent;  | 
        ||
| 371 | char *label; /* This node's textual name */  | 
        ||
| 372 | u_long subid; /* This node's integer subidentifier */  | 
        ||
| 373 | int modid; /* The module containing this node */  | 
        ||
| 374 | int number_modules;  | 
        ||
| 375 | int *module_list; /* To handle multiple modules */  | 
        ||
| 376 | int tc_index; /* index into tclist (-1 if NA) */  | 
        ||
| 377 | int type; /* This node's object type */  | 
        ||
| 378 | int access; /* This nodes access */  | 
        ||
| 379 | int status; /* This nodes status */  | 
        ||
| 380 | struct enum_list *enums; /* (optional) list of enumerated integers */  | 
        ||
| 381 | struct range_list *ranges;  | 
        ||
| 382 | struct index_list *indexes;  | 
        ||
| 383 | char *augments;  | 
        ||
| 384 | struct varbind_list *varbinds;  | 
        ||
| 385 | char *hint;  | 
        ||
| 386 | char *units;  | 
        ||
| 387 | int (*printomat) (u_char **, size_t *, size_t *, int,  | 
        ||
| 388 | const netsnmp_variable_list *,  | 
        ||
| 389 | const struct enum_list *, const char *,  | 
        ||
| 390 | const char *);  | 
        ||
| 391 | void (*printer) (char *, const netsnmp_variable_list *, const struct enum_list *, const char *, const char *); /* Value printing function */  | 
        ||
| 392 | char *description; /* description (a quoted string) */  | 
        ||
| 393 | char *reference; /* references (a quoted string) */  | 
        ||
| 394 | int reported; /* 1=report started in print_subtree... */  | 
        ||
| 395 | char *defaultValue;  | 
        ||
| 396 | };  | 
        ||
| 397 | |||
| 398 | |||
| 399 | |||
| 400 | |||
| 401 | netsnmp_pdu *snmp_pdu_create(int type);  | 
        ||
| 402 | netsnmp_pdu *snmp_clone_pdu(netsnmp_pdu *pdu);  | 
        ||
| 403 | netsnmp_pdu *snmp_fix_pdu( netsnmp_pdu *pdu, int idx);  | 
        ||
| 404 | void snmp_free_pdu( netsnmp_pdu *pdu);  | 
        ||
| 405 | |||
| 406 | |||
| 407 | void init_snmp(const char *);  | 
        ||
| 408 | void init_mib(void);  | 
        ||
| 409 | int get_node(const char *, oid *, size_t *);  | 
        ||
| 410 | void snmp_sess_init(netsnmp_session *);  | 
        ||
| 411 | struct tree *read_module(const char *);  | 
        ||
| 412 | |||
| 413 | |||
| 414 | |||
| 415 | /* Creation */ | 
        ||
| 416 | netsnmp_variable_list * | 
        ||
| 417 | snmp_pdu_add_variable(netsnmp_pdu *pdu,  | 
        ||
| 418 | const oid *name, size_t name_length,  | 
        ||
| 419 | u_char type,  | 
        ||
| 420 | const void *value, size_t len);  | 
        ||
| 421 | netsnmp_variable_list * | 
        ||
| 422 | snmp_varlist_add_variable(netsnmp_variable_list **varlist,  | 
        ||
| 423 | const oid *name, size_t name_length,  | 
        ||
| 424 | u_char type,  | 
        ||
| 425 | const void *value, size_t len);  | 
        ||
| 426 | netsnmp_variable_list * | 
        ||
| 427 | snmp_add_null_var(netsnmp_pdu *pdu,  | 
        ||
| 428 | const oid *name, size_t name_length);  | 
        ||
| 429 | netsnmp_variable_list * | 
        ||
| 430 | snmp_clone_varbind(netsnmp_variable_list *varlist);  | 
        ||
| 431 | |||
| 432 | /* Setting Values */ | 
        ||
| 433 | int snmp_set_var_value(netsnmp_variable_list *var,  | 
        ||
| 434 | const void *value, size_t len);  | 
        ||
| 435 | int snmp_set_var_objid(netsnmp_variable_list *var,  | 
        ||
| 436 | const oid *name, size_t name_length);  | 
        ||
| 437 | int snmp_set_var_typed_value(netsnmp_variable_list *var,  | 
        ||
| 438 | u_char type,  | 
        ||
| 439 | const void *value, size_t len);  | 
        ||
| 440 | int snmp_set_var_typed_integer(netsnmp_variable_list *var,  | 
        ||
| 441 | u_char type, long val);  | 
        ||
| 442 | |||
| 443 | /* Output */ | 
        ||
| 444 | void print_variable(const oid *objid, size_t objidlen,  | 
        ||
| 445 | const netsnmp_variable_list *variable);  | 
        ||
| 446 | void fprint_variable(FILE *fp,  | 
        ||
| 447 | const oid *objid, size_t objidlen,  | 
        ||
| 448 | const netsnmp_variable_list *variable);  | 
        ||
| 449 | int snprint_variable(char *buf, size_t buf_len,  | 
        ||
| 450 | const oid *objid, size_t objidlen,  | 
        ||
| 451 | const netsnmp_variable_list *variable);  | 
        ||
| 452 | |||
| 453 | void print_value(const oid *objid, size_t objidlen,  | 
        ||
| 454 | const netsnmp_variable_list *variable);  | 
        ||
| 455 | void fprint_value(FILE *fp,  | 
        ||
| 456 | const oid *objid, size_t objidlen,  | 
        ||
| 457 | const netsnmp_variable_list *variable);  | 
        ||
| 458 | int snprint_value(char *buf, size_t buf_len,  | 
        ||
| 459 | const oid *objid, size_t objidlen,  | 
        ||
| 460 | const netsnmp_variable_list *variable);  | 
        ||
| 461 | |||
| 462 | /* Deletion */ | 
        ||
| 463 | void snmp_free_var( netsnmp_variable_list *var); /* frees just this one */  | 
        ||
| 464 | void snmp_free_varbind(netsnmp_variable_list *varlist); /* frees all in list */  | 
        ||
| 465 | |||
| 466 | |||
| 467 | |||
| 468 | void snmp_sess_init(netsnmp_session *);  | 
        ||
| 469 | |||
| 470 | /* | 
        ||
| 471 |  * netsnmp_session *snmp_open(session) | 
        ||
| 472 |  *      netsnmp_session *session; | 
        ||
| 473 |  * | 
        ||
| 474 |  * Sets up the session with the snmp_session information provided | 
        ||
| 475 |  * by the user.  Then opens and binds the necessary UDP port. | 
        ||
| 476 |  * A handle to the created session is returned (this is different than | 
        ||
| 477 |  * the pointer passed to snmp_open()).  On any error, NULL is returned | 
        ||
| 478 |  * and snmp_errno is set to the appropriate error code. | 
        ||
| 479 |  */ | 
        ||
| 480 | netsnmp_session *snmp_open(netsnmp_session *);  | 
        ||
| 481 | |||
| 482 | /* | 
        ||
| 483 |  * int snmp_close(session) | 
        ||
| 484 |  *     netsnmp_session *session; | 
        ||
| 485 |  * | 
        ||
| 486 |  * Close the input session.  Frees all data allocated for the session, | 
        ||
| 487 |  * dequeues any pending requests, and closes any sockets allocated for | 
        ||
| 488 |  * the session.  Returns 0 on error, 1 otherwise. | 
        ||
| 489 |  * | 
        ||
| 490 |  * snmp_close_sessions() does the same thing for all open sessions | 
        ||
| 491 |  */ | 
        ||
| 492 | int snmp_close(netsnmp_session *);  | 
        ||
| 493 | int snmp_close_sessions(void);  | 
        ||
| 494 | |||
| 495 | |||
| 496 | /* | 
        ||
| 497 |  * int snmp_send(session, pdu) | 
        ||
| 498 |  *     netsnmp_session *session; | 
        ||
| 499 |  *     netsnmp_pdu      *pdu; | 
        ||
| 500 |  * | 
        ||
| 501 |  * Sends the input pdu on the session after calling snmp_build to create | 
        ||
| 502 |  * a serialized packet.  If necessary, set some of the pdu data from the | 
        ||
| 503 |  * session defaults.  Add a request corresponding to this pdu to the list | 
        ||
| 504 |  * of outstanding requests on this session, then send the pdu. | 
        ||
| 505 |  * Returns the request id of the generated packet if applicable, otherwise 1. | 
        ||
| 506 |  * On any error, 0 is returned. | 
        ||
| 507 |  * The pdu is freed by snmp_send() unless a failure occured. | 
        ||
| 508 |  */ | 
        ||
| 509 | int snmp_send(netsnmp_session *, netsnmp_pdu *);  | 
        ||
| 510 | |||
| 511 | /* | 
        ||
| 512 |  * int snmp_async_send(session, pdu, callback, cb_data) | 
        ||
| 513 |  *     netsnmp_session *session; | 
        ||
| 514 |  *     netsnmp_pdu      *pdu; | 
        ||
| 515 |  *     netsnmp_callback callback; | 
        ||
| 516 |  *     void   *cb_data; | 
        ||
| 517 |  * | 
        ||
| 518 |  * Sends the input pdu on the session after calling snmp_build to create | 
        ||
| 519 |  * a serialized packet.  If necessary, set some of the pdu data from the | 
        ||
| 520 |  * session defaults.  Add a request corresponding to this pdu to the list | 
        ||
| 521 |  * of outstanding requests on this session and store callback and data, | 
        ||
| 522 |  * then send the pdu. | 
        ||
| 523 |  * Returns the request id of the generated packet if applicable, otherwise 1. | 
        ||
| 524 |  * On any error, 0 is returned. | 
        ||
| 525 |  * The pdu is freed by snmp_send() unless a failure occured. | 
        ||
| 526 |  */ | 
        ||
| 527 | int snmp_async_send(netsnmp_session *, netsnmp_pdu *,  | 
        ||
| 528 | netsnmp_callback, void *);  | 
        ||
| 529 | |||
| 530 | |||
| 531 | /* | 
        ||
| 532 |  * void snmp_read(fdset) | 
        ||
| 533 |  *     fd_set  *fdset; | 
        ||
| 534 |  * | 
        ||
| 535 |  * Checks to see if any of the fd's set in the fdset belong to | 
        ||
| 536 |  * snmp.  Each socket with it's fd set has a packet read from it | 
        ||
| 537 |  * and snmp_parse is called on the packet received.  The resulting pdu | 
        ||
| 538 |  * is passed to the callback routine for that session.  If the callback | 
        ||
| 539 |  * routine returns successfully, the pdu and it's request are deleted. | 
        ||
| 540 |  */ | 
        ||
| 541 | void snmp_read(fd_set *);  | 
        ||
| 542 | |||
| 543 | /* | 
        ||
| 544 |  * snmp_read2() is similar to snmp_read(), but accepts a pointer to a | 
        ||
| 545 |  * large file descriptor set instead of a pointer to a regular file | 
        ||
| 546 |  * descriptor set. | 
        ||
| 547 |  */ | 
        ||
| 548 | void snmp_read2(netsnmp_large_fd_set *);  | 
        ||
| 549 | |||
| 550 | |||
| 551 | int snmp_synch_response(netsnmp_session *, netsnmp_pdu *,  | 
        ||
| 552 | netsnmp_pdu **);  | 
        ||
| 553 | |||
| 554 | /* | 
        ||
| 555 |  * int snmp_select_info(numfds, fdset, timeout, block) | 
        ||
| 556 |  * int *numfds; | 
        ||
| 557 |  * fd_set   *fdset; | 
        ||
| 558 |  * struct timeval *timeout; | 
        ||
| 559 |  * int *block; | 
        ||
| 560 |  * | 
        ||
| 561 |  * Returns info about what snmp requires from a select statement. | 
        ||
| 562 |  * numfds is the number of fds in the list that are significant. | 
        ||
| 563 |  * All file descriptors opened for SNMP are OR'd into the fdset. | 
        ||
| 564 |  * If activity occurs on any of these file descriptors, snmp_read | 
        ||
| 565 |  * should be called with that file descriptor set. | 
        ||
| 566 |  * | 
        ||
| 567 |  * The timeout is the latest time that SNMP can wait for a timeout.  The | 
        ||
| 568 |  * select should be done with the minimum time between timeout and any other | 
        ||
| 569 |  * timeouts necessary.  This should be checked upon each invocation of select. | 
        ||
| 570 |  * If a timeout is received, snmp_timeout should be called to check if the | 
        ||
| 571 |  * timeout was for SNMP.  (snmp_timeout is idempotent) | 
        ||
| 572 |  * | 
        ||
| 573 |  * Block is 1 if the select is requested to block indefinitely, rather than | 
        ||
| 574 |  * time out.  If block is input as 1, the timeout value will be treated as | 
        ||
| 575 |  * undefined, but it must be available for setting in snmp_select_info.  On | 
        ||
| 576 |  * return, if block is true, the value of timeout will be undefined. | 
        ||
| 577 |  * | 
        ||
| 578 |  * snmp_select_info returns the number of open sockets.  (i.e. The number | 
        ||
| 579 |  * of sessions open) | 
        ||
| 580 |  */ | 
        ||
| 581 | int snmp_select_info(int *, fd_set *, struct timeval *,  | 
        ||
| 582 | int *);  | 
        ||
| 583 | |||
| 584 | /* | 
        ||
| 585 |  * snmp_select_info2() is similar to snmp_select_info(), but accepts a | 
        ||
| 586 |  * pointer to a large file descriptor set instead of a pointer to a | 
        ||
| 587 |  * regular file descriptor set. | 
        ||
| 588 |  */ | 
        ||
| 589 | int snmp_select_info2(int *, netsnmp_large_fd_set *,  | 
        ||
| 590 | struct timeval *, int *);  | 
        ||
| 591 | |||
| 592 | |||
| 593 | /* | 
        ||
| 594 |  * void snmp_timeout(); | 
        ||
| 595 |  * | 
        ||
| 596 |  * snmp_timeout should be called whenever the timeout from snmp_select_info | 
        ||
| 597 |  * expires, but it is idempotent, so snmp_timeout can be polled (probably a | 
        ||
| 598 |  * cpu expensive proposition).  snmp_timeout checks to see if any of the | 
        ||
| 599 |  * sessions have an outstanding request that has timed out.  If it finds one | 
        ||
| 600 |  * (or more), and that pdu has more retries available, a new packet is formed | 
        ||
| 601 |  * from the pdu and is resent.  If there are no more retries available, the | 
        ||
| 602 |  * callback for the session is used to alert the user of the timeout. | 
        ||
| 603 |  */ | 
        ||
| 604 | |||
| 605 | void snmp_timeout(void);  | 
        ||
| 606 | |||
| 607 | /* | 
        ||
| 608 |  * snmp_error - return error data | 
        ||
| 609 |  * Inputs :  address of errno, address of snmp_errno, address of string | 
        ||
| 610 |  * Caller must free the string returned after use. | 
        ||
| 611 |  */ | 
        ||
| 612 | void snmp_error(netsnmp_session *, int *, int *, char **);  | 
        ||
| 613 | |||
| 614 | /* | 
        ||
| 615 |  * single session API. | 
        ||
| 616 |  * | 
        ||
| 617 |  * These functions perform similar actions as snmp_XX functions, | 
        ||
| 618 |  * but operate on a single session only. | 
        ||
| 619 |  * | 
        ||
| 620 |  * Synopsis: | 
        ||
| 621 | |||
| 622 |  void * sessp; | 
        ||
| 623 |  netsnmp_session session, *ss; | 
        ||
| 624 |  netsnmp_pdu *pdu, *response; | 
        ||
| 625 | |||
| 626 |  snmp_sess_init(&session); | 
        ||
| 627 |  session.retries = ... | 
        ||
| 628 |  session.remote_port = ... | 
        ||
| 629 |  sessp = snmp_sess_open(&session); | 
        ||
| 630 |  ss = snmp_sess_session(sessp); | 
        ||
| 631 |  if (ss == NULL) | 
        ||
| 632 |  exit(1); | 
        ||
| 633 |  ... | 
        ||
| 634 |  if (ss->community) free(ss->community); | 
        ||
| 635 |  ss->community = strdup(gateway); | 
        ||
| 636 |  ss->community_len = strlen(gateway); | 
        ||
| 637 |  ... | 
        ||
| 638 |  snmp_sess_synch_response(sessp, pdu, &response); | 
        ||
| 639 |  ... | 
        ||
| 640 |  snmp_sess_close(sessp); | 
        ||
| 641 | |||
| 642 |  * See also: | 
        ||
| 643 |  * snmp_sess_synch_response, in snmp_client.h. | 
        ||
| 644 | |||
| 645 |  * Notes: | 
        ||
| 646 |  *  1. Invoke snmp_sess_session after snmp_sess_open. | 
        ||
| 647 |  *  2. snmp_sess_session return value is an opaque pointer. | 
        ||
| 648 |  *  3. Do NOT free memory returned by snmp_sess_session. | 
        ||
| 649 |  *  4. Replace snmp_send(ss,pdu) with snmp_sess_send(sessp,pdu) | 
        ||
| 650 |  */ | 
        ||
| 651 | |||
| 652 | void *snmp_sess_open(netsnmp_session *);  | 
        ||
| 653 | void *snmp_sess_pointer(netsnmp_session *);  | 
        ||
| 654 | netsnmp_session *snmp_sess_session(void *);  | 
        ||
| 655 | |||
| 656 | |||
| 657 | /* | 
        ||
| 658 |  * use return value from snmp_sess_open as void * parameter | 
        ||
| 659 |  */ | 
        ||
| 660 | |||
| 661 | int snmp_sess_send(void *, netsnmp_pdu *);  | 
        ||
| 662 | int snmp_sess_async_send(void *, netsnmp_pdu *,  | 
        ||
| 663 | netsnmp_callback, void *);  | 
        ||
| 664 | int snmp_sess_select_info(void *, int *, fd_set *,  | 
        ||
| 665 | struct timeval *, int *);  | 
        ||
| 666 | int snmp_sess_select_info2(void *, int *,  | 
        ||
| 667 |                                        netsnmp_large_fd_set *, | 
        ||
| 668 | struct timeval *, int *);  | 
        ||
| 669 | /* | 
        ||
| 670 |  * Returns 0 if success, -1 if fail. | 
        ||
| 671 |  */ | 
        ||
| 672 | int snmp_sess_read(void *, fd_set *);  | 
        ||
| 673 | /* | 
        ||
| 674 |  * Similar to snmp_sess_read(), but accepts a pointer to a large file | 
        ||
| 675 |  * descriptor set instead of a pointer to a file descriptor set. | 
        ||
| 676 |  */ | 
        ||
| 677 | int snmp_sess_read2(void *,  | 
        ||
| 678 | netsnmp_large_fd_set *);  | 
        ||
| 679 | void snmp_sess_timeout(void *);  | 
        ||
| 680 | int snmp_sess_close(void *);  | 
        ||
| 681 | |||
| 682 | int snmp_sess_synch_response(void *, netsnmp_pdu *, netsnmp_pdu **);  | 
        ||
| 683 | |||
| 684 | |||
| 685 | struct snmp_pdu;  | 
        ||
| 686 | struct snmp_session;  | 
        ||
| 687 | struct variable_list;  | 
        ||
| 688 | |||
| 689 | struct synch_state {  | 
        ||
| 690 | int waiting;  | 
        ||
| 691 | int status;  | 
        ||
| 692 |   /* | 
        ||
| 693 |    * status codes | 
        ||
| 694 |    */ | 
        ||
| 695 | #define STAT_SUCCESS  0 | 
        ||
| 696 | #define STAT_ERROR  1 | 
        ||
| 697 | #define STAT_TIMEOUT 2 | 
        ||
| 698 | int reqid;  | 
        ||
| 699 | netsnmp_pdu *pdu;  | 
        ||
| 700 | };  | 
        ||
| 701 | |||
| 702 | void snmp_replace_var_types(netsnmp_variable_list *vbl,  | 
        ||
| 703 | u_char old_type,  | 
        ||
| 704 | u_char new_type);  | 
        ||
| 705 | void snmp_reset_var_buffers(netsnmp_variable_list *var);  | 
        ||
| 706 | void snmp_reset_var_types(netsnmp_variable_list *vbl,  | 
        ||
| 707 | u_char new_type);  | 
        ||
| 708 | int count_varbinds(netsnmp_variable_list *var_ptr);  | 
        ||
| 709 | int count_varbinds_of_type(netsnmp_variable_list *var_ptr,  | 
        ||
| 710 | u_char type);  | 
        ||
| 711 | netsnmp_variable_list *find_varbind_of_type(netsnmp_variable_list *  | 
        ||
| 712 | var_ptr, u_char type);  | 
        ||
| 713 | netsnmp_variable_list *find_varbind_in_list(netsnmp_variable_list *vblist,  | 
        ||
| 714 | oid *name, size_t len);  | 
        ||
| 715 | |||
| 716 | netsnmp_pdu *snmp_split_pdu(netsnmp_pdu *, int skipCount,  | 
        ||
| 717 | int copyCount);  | 
        ||
| 718 | |||
| 719 | unsigned long snmp_varbind_len(netsnmp_pdu *pdu);  | 
        ||
| 720 | int snmp_clone_var(netsnmp_variable_list *,  | 
        ||
| 721 | netsnmp_variable_list *);  | 
        ||
| 722 | const char *snmp_errstring(int);  | 
        ||
| 723 | int snmp_synch_response_cb(netsnmp_session *,  | 
        ||
| 724 | netsnmp_pdu *, netsnmp_pdu **,  | 
        ||
| 725 | snmp_callback);  | 
        ||
| 726 | int snmp_clone_mem(void **, const void *, unsigned);  | 
        ||
| 727 | |||
| 728 | |||
| 729 | void netsnmp_query_set_default_session(netsnmp_session *);  | 
        ||
| 730 | netsnmp_session *netsnmp_query_get_default_session( void );  | 
        ||
| 731 | int netsnmp_query_get( netsnmp_variable_list *, netsnmp_session *);  | 
        ||
| 732 | int netsnmp_query_getnext( netsnmp_variable_list *, netsnmp_session *);  | 
        ||
| 733 | int netsnmp_query_walk( netsnmp_variable_list *, netsnmp_session *);  | 
        ||
| 734 | int netsnmp_query_set( netsnmp_variable_list *, netsnmp_session *);  | 
        ||
| 735 | |||
| 736 | void snmp_sess_perror(const char *prog_string,  | 
        ||
| 737 | netsnmp_session *ss);  | 
        ||
| 738 | const char *snmp_pdu_type(int type);  | 
        ||
| 739 | |||
| 740 | #endif |