1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
#include <sys/types.h>
#define PACKET_VERSION 1
#define DNSNAME_MAX 20
struct gg_packet {
u_int8_t ver;
u_int8_t type;
/* XXX nicer way for _SIZE ... ? */
#define PACKET_NEWCONN 0
#define PACKET_NEWCONN_SIZE (2 + sizeof((struct packet *)0)->pdat.newconn)
#define PACKET_DELCONN 1
#define PACKET_DELCONN_SIZE (2 + sizeof((struct packet *)0)->pdat.delconn)
#define PACKET_DATA 2
#define PACKET_DATA_SIZE (2 + sizeof((struct packet *)0)->pdat.data)
#define PACKET_NAME 3
#define PACKET_NAME_SIZE ((2 + sizeof((struct packet *)0)->pdat.name) - DNSNAME_MAX)
union {
struct newconn {
u_int16_t id;
u_int32_t src;
u_int32_t dst;
u_int8_t proto;
u_int8_t size;
} newconn;
struct delconn {
u_int16_t id;
} delconn;
struct data {
u_int16_t connid;
u_int8_t size;
} data;
struct name {
u_int32_t addr;
u_int8_t len;
u_char fqdn[DNSNAME_MAX];
} name;
} pdat;
#define newconn_id pdat.newconn.id
#define newconn_src pdat.newconn.src
#define newconn_dst pdat.newconn.dst
#define newconn_proto pdat.newconn.proto
#define newconn_size pdat.newconn.size
#define delconn_id pdat.delconn.id
#define data_connid pdat.data.connid
#define data_size pdat.data.size
#define name_addr pdat.name.addr
#define name_len pdat.name.len
#define name_fqdn pdat.name.fqdn
};
struct gg_server {
const char *ip;
int port;
struct event *ev;
int sock;
int (*handle_conn)(struct gg_server *, int, struct sockaddr_in *);
int (*handle_packet)(struct gg_server *, struct gg_packet *);
};
struct gg_client {
const char *ip;
int port;
struct event *ev;
int sock;
int (*handle_conn)(struct gg_client *, int);
int (*handle_packet)(struct gg_client *, struct gg_packet *);
};
struct gg_server *gg_server_start(struct event_base *, char *, int,
int (*handle_conn)(struct gg_server *, int, struct sockaddr_in *),
int (*handle_packet)(struct gg_server *, struct gg_packet *));
int gg_server_send(struct gg_server *, int, struct gg_packet *);
void gg_server_stop(struct gg_server *);
struct gg_client *gg_client_connect(struct event_base *, char *, int,
int (*handle_conn)(struct gg_client *, int),
int (*handle_packet)(struct gg_client *, struct gg_packet *));
int gg_client_send(struct gg_client *, struct gg_packet *);
void gg_client_disconnect(struct gg_client *);
void *xmalloc(size_t);
void *xcalloc(size_t, size_t);
void fd_nonblock(int);
|