Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

  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
  741.