/*
 * snmp_client.h
 */
/***********************************************************
	Copyright 1988, 1989 by Carnegie Mellon University

                      All Rights Reserved

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in 
supporting documentation, and that the name of CMU not be
used in advertising or publicity pertaining to distribution of the
software without specific, written prior permission.  

CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
******************************************************************/

#ifndef SNMP_CLIENT_H
#define SNMP_CLIENT_H

#ifdef __cplusplus
extern          "C" {
#endif


    struct snmp_pdu;
    struct snmp_session;
    struct variable_list;

    struct synch_state {
        int             waiting;
        int             status;
        /*
         * status codes 
         */
#define STAT_SUCCESS	0
#define STAT_ERROR	1
#define STAT_TIMEOUT 2
        int             reqid;
        netsnmp_pdu    *pdu;
    };

    int             snmp_set_var_value(netsnmp_variable_list *,
                                       const void *, size_t);
    int             snmp_set_var_objid(netsnmp_variable_list * vp,
                                       const oid * objid,
                                       size_t name_length);
    int             snmp_set_var_typed_value(netsnmp_variable_list *
                                             newvar, u_char type,
                                             const void * val_str,
                                             size_t val_len);
    int             snmp_set_var_typed_integer(netsnmp_variable_list * newvar,
                                               u_char type, long val);
    void            snmp_replace_var_types(netsnmp_variable_list * vbl,
                                           u_char old_type,
                                           u_char new_type);
    void            snmp_reset_var_buffers(netsnmp_variable_list * var);
    void            snmp_reset_var_types(netsnmp_variable_list * vbl,
                                         u_char new_type);
    int             count_varbinds(netsnmp_variable_list * var_ptr);
    int             count_varbinds_of_type(netsnmp_variable_list * var_ptr,
                                           u_char type);
    netsnmp_variable_list *find_varbind_of_type(netsnmp_variable_list *
                                                var_ptr, u_char type);
    netsnmp_variable_list *find_varbind_in_list(netsnmp_variable_list *vblist,
                                                oid *name, size_t len);

    netsnmp_variable_list *snmp_add_null_var(netsnmp_pdu *, const oid *, size_t);
    netsnmp_pdu    *snmp_pdu_create(int);
    netsnmp_pdu    *snmp_fix_pdu(netsnmp_pdu *, int);
    netsnmp_pdu    *snmp_clone_pdu(netsnmp_pdu *);
    netsnmp_pdu    *snmp_split_pdu(netsnmp_pdu *, int skipCount,
                                   int copyCount);

    unsigned long   snmp_varbind_len(netsnmp_pdu *pdu);
    int             snmp_clone_var(netsnmp_variable_list *,
                                   netsnmp_variable_list *);
    netsnmp_variable_list *snmp_clone_varbind(netsnmp_variable_list *);
    const char     *snmp_errstring(int);
    int             snmp_synch_response(netsnmp_session *, netsnmp_pdu *,
                                        netsnmp_pdu **);
    int             snmp_synch_response_cb(netsnmp_session *,
                                           netsnmp_pdu *, netsnmp_pdu **,
                                           snmp_callback);
    int             snmp_clone_mem(void **, void *, unsigned);

    /*
     * single session API - see snmp_api.h for full details 
     */
    int             snmp_sess_synch_response(void *, netsnmp_pdu *,
                                             netsnmp_pdu **);

void              netsnmp_query_set_default_session(netsnmp_session *);
netsnmp_session * netsnmp_query_get_default_session( void );
int netsnmp_query_get(     netsnmp_variable_list *, netsnmp_session *);
int netsnmp_query_getnext( netsnmp_variable_list *, netsnmp_session *);
int netsnmp_query_walk(    netsnmp_variable_list *, netsnmp_session *);
int netsnmp_query_set(     netsnmp_variable_list *, netsnmp_session *);

#ifdef __cplusplus
}
#endif
#endif                          /* SNMP_CLIENT_H */
