#pragma once

//#ifdef __cplusplus
//extern "C" {
//#endif

//#include <sys/time.h>
//#include <stdint.h>

struct bpf_program
{
 char a[4096];
};

struct pcap_t
{
 char a[4096];
};

typedef unsigned int bpf_u_int32;

typedef struct my_timeval {
  int tv_sec;
  int tv_usec;
} my_timeval;

struct pcap_pkthdr {
	struct my_timeval ts;	/* time stamp */
	bpf_u_int32 caplen;	/* length of portion present */
	bpf_u_int32 len;	/* length this packet (off wire) */
};

typedef enum {
       PCAP_D_INOUT = 0,
       PCAP_D_IN,
       PCAP_D_OUT
} pcap_direction_t;


struct pcap_addr {
	struct pcap_addr *next;
	struct sockaddr *addr;		/* address */
	struct sockaddr *netmask;	/* netmask for that address */
	struct sockaddr *broadaddr;	/* broadcast address for that address */
	struct sockaddr *dstaddr;	/* P2P destination address for that address */
};

struct pcap_if {
	struct pcap_if *next;
	char *name;		/* name to hand to "pcap_open_live()" */
	char *description;	/* textual description of interface, or NULL */
	struct pcap_addr *addresses;
	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */
};

typedef struct pcap_if pcap_if_t;
typedef struct pcap_addr pcap_addr_t;



typedef unsigned char u_char;


#define PCAP_ERRBUF_SIZE 256

#define DLT_NULL	0	/* BSD loopback encapsulation */
#define DLT_EN10MB	1	/* Ethernet (10Mb) */
#define DLT_EN3MB	2	/* Experimental Ethernet (3Mb) */
#define DLT_AX25	3	/* Amateur Radio AX.25 */
#define DLT_PRONET	4	/* Proteon ProNET Token Ring */
#define DLT_CHAOS	5	/* Chaos */
#define DLT_IEEE802	6	/* 802.5 Token Ring */
#define DLT_ARCNET	7	/* ARCNET, with BSD-style header */
#define DLT_SLIP	8	/* Serial Line IP */
#define DLT_PPP		9	/* Point-to-point Protocol */
#define DLT_FDDI	10	/* FDDI */
#define DLT_LINUX_SLL   113

#define PCAP_NETMASK_UNKNOWN	0xffffffff

typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *,
			     const u_char *);

extern int	(*pcap_loop )(pcap_t *, int, pcap_handler, u_char *);

extern int	(*pcap_breakloop )(pcap_t *);

extern pcap_t*	(*pcap_create)(const char *, char *);

extern int	(*pcap_set_snaplen) (pcap_t *, int);
extern int	(*pcap_set_promisc) (pcap_t *, int);
extern int	(*pcap_can_set_rfmon) (pcap_t *);
extern int	(*pcap_set_rfmon )(pcap_t *, int);
extern int	(*pcap_set_timeout)(pcap_t *, int);
extern int	(*pcap_set_buffer_size)(pcap_t *, int);
extern int	(*pcap_activate)(pcap_t *);

extern int	(*pcap_setfilter)(pcap_t *, struct bpf_program *);
extern int 	(*pcap_setdirection)(pcap_t *, pcap_direction_t);

extern int	(*pcap_datalink)(pcap_t *);

extern void	(*pcap_freecode)(struct bpf_program *);

extern int	(*pcap_compile)(pcap_t *, struct bpf_program *, const char *, int,
	    bpf_u_int32);

extern char*   (*pcap_geterr)(pcap_t *);
extern int	(*pcap_sendpacket)(pcap_t *, const u_char *, int);

extern char* (*pcap_lookupdev)(char *);

extern int	(*pcap_findalldevs)(pcap_if_t **, char *);

inline int pcap_set_immediate_mode(pcap_t *,int)
{
	return 0;
}



//#ifdef __cplusplus
//}
//#endif

int init_pcap();