/*
 *  util_funcs.h:  utilitiy functions for extensible groups.
 */
#ifndef _MIBGROUP_UTIL_FUNCS_H
#define _MIBGROUP_UTIL_FUNCS_H

config_require(util_funcs/header_generic);
config_require(util_funcs/header_simple_table);

#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#include "util_funcs/header_generic.h"
#include "util_funcs/header_simple_table.h"

#ifdef __cplusplus
extern "C" {
#endif

#include "struct.h"

typedef struct prefix_info
{
   struct prefix_info *next_info;
   unsigned long ipAddressPrefixOnLinkFlag;
   unsigned long ipAddressPrefixAutonomousFlag;
   char in6p[40];
}prefix_cbx;
#ifndef WIN32
typedef struct 
{
 prefix_cbx **list_head;
}netsnmp_prefix_listen_info;
#endif
int             shell_command(struct extensible *);
int             exec_command(struct extensible *);
struct extensible *get_exten_instance(struct extensible *, size_t);
int             get_exec_output(struct extensible *);
#if defined(WIN32) && !defined(cygwin)
int             get_exec_pipes(const char *cmd, int *fdIn, int *fdOut,
                               HANDLE *pid);
#else
int             get_exec_pipes(const char *cmd, int *fdIn, int *fdOut,
                               pid_t *pid);
#endif
WriteMethod     clear_cache;
void            print_mib_oid(oid *, size_t);
void            sprint_mib_oid(char *, const oid *, size_t);
int             checkmib(struct variable *, oid *, size_t *, int, size_t *,
                         WriteMethod ** write_method, int);
char           *find_field(char *, int);
int             parse_miboid(const char *, oid *);
void            string_append_int(char *, int);
void            wait_on_exec(struct extensible *);
const char     *make_tempfile(void);

prefix_cbx *net_snmp_create_prefix_info(unsigned long OnLinkFlag,
                                        unsigned long AutonomousFlag,
                                        char *in6ptr);
#ifndef WIN32
int net_snmp_find_prefix_info(prefix_cbx **head,
                              char *address,
                              prefix_cbx *node_to_find);
int net_snmp_update_prefix_info(prefix_cbx **head,
                                prefix_cbx *node_to_update);
int net_snmp_search_update_prefix_info(prefix_cbx **head,
                                       prefix_cbx *node_to_use,
                                       int functionality);
int net_snmp_delete_prefix_info(prefix_cbx **head,
                                char *address);
#endif

struct netsnmp_linux_link_settings {
    uint32_t   speed;
    uint8_t    duplex;
};

int netsnmp_get_link_settings(struct netsnmp_linux_link_settings *nlls,
                              int fd, const char *name);

#define NIP6(addr) \
        ntohs((addr).s6_addr16[0]), \
        ntohs((addr).s6_addr16[1]), \
        ntohs((addr).s6_addr16[2]), \
        ntohs((addr).s6_addr16[3]), \
        ntohs((addr).s6_addr16[4]), \
        ntohs((addr).s6_addr16[5]), \
        ntohs((addr).s6_addr16[6]), \
        ntohs((addr).s6_addr16[7])

#define     satosin(x)      ((struct sockaddr_in *) &(x))
#define     SOCKADDR(x)     (satosin(x)->sin_addr.s_addr)

#include "util_funcs/MIB_STATS_CACHE_TIMEOUT.h"

typedef void   *mib_table_t;
typedef int     (RELOAD) (mib_table_t);
typedef int     (COMPARE) (const void *, const void *);
mib_table_t     Initialise_Table(int, int, RELOAD*, COMPARE*);
int             Search_Table(mib_table_t, void *, int);
int             Add_Entry(mib_table_t, void *);
void           *Retrieve_Table_Data(mib_table_t, int *);

#ifdef __cplusplus
}
#endif

#endif                          /* _MIBGROUP_UTIL_FUNCS_H */
