]>
Commit | Line | Data |
---|---|---|
18f8bd28 | 1 | /* |
d4897ed9 CP |
2 | Easy async socket library |
3 | Copyright (C) 2004-2007 Chris Porter. | |
18f8bd28 CP |
4 | */ |
5 | ||
6 | #ifndef __esockets_H | |
7 | #define __esockets_H | |
8 | ||
d4897ed9 CP |
9 | #include "../lib/rijndael.h" |
10 | #include "../lib/sha2.h" | |
893267ed | 11 | #include "../lib/hmac.h" |
946af548 | 12 | #include "../lib/cbc.h" |
d4897ed9 | 13 | #include "library.h" |
9be751b7 | 14 | #include <sys/types.h> |
632cc7de | 15 | #include <ctype.h> |
18f8bd28 CP |
16 | |
17 | #define ESOCKET_UNIX_DOMAIN ESOCKET_LISTENING | |
18 | #define ESOCKET_UNIX_DOMAIN_CONNECTED ESOCKET_INCOMING | |
19 | #define ESOCKET_TCP_LISTENING ESOCKET_LISTENING | |
20 | #define ESOCKET_INCOMING_TCP ESOCKET_INCOMING | |
21 | #define ESOCKET_OUTGOING_TCP ESOCKET_OUTGOING | |
22 | #define ESOCKET_OUTGOING_TCP_CONNECTED ESOCKET_OUTGOING_CONNECTED | |
23 | ||
24 | #define ESOCKET_LISTENING 1 | |
25 | #define ESOCKET_OUTGOING 2 | |
26 | #define ESOCKET_INCOMING 3 | |
27 | #define ESOCKET_OUTGOING_CONNECTED 4 | |
28 | ||
29 | #define ST_CONNECTING 1 | |
30 | #define ST_CONNECTED 2 | |
31 | #define ST_LISTENING 3 | |
32 | #define ST_DISCONNECT 4 | |
33 | #define ST_BLANK 5 | |
34 | ||
35 | #define BLANK_TOKEN 0 | |
36 | ||
37 | #define BUF_CONT -1 | |
38 | #define BUF_OVERFLOW -2 | |
5757e1ef | 39 | #define BUF_ERROR -3 |
d4897ed9 CP |
40 | #define BUF_RESET -4 |
41 | ||
42 | #define PARSE_ASCII 0 | |
43 | #define PARSE_CRYPTO 1 | |
18f8bd28 CP |
44 | |
45 | #define MAX_BUFSIZE 50000 | |
46 | ||
d4897ed9 | 47 | #define USED_MAC_LEN 16 |
18f8bd28 CP |
48 | |
49 | typedef unsigned short packet_t; | |
50 | ||
51 | #define MAX_BINARY_LINE_SIZE MAX_BUFSIZE | |
d4897ed9 | 52 | #define MAX_ASCII_LINE_SIZE MAX_BINARY_LINE_SIZE - 10 - USED_MAC_LEN |
18f8bd28 | 53 | |
701500af | 54 | #define MAX_OUT_QUEUE_SIZE 5000 |
18f8bd28 CP |
55 | |
56 | struct buffer; | |
57 | struct esocket; | |
58 | ||
59 | typedef int (*parse_event)(struct esocket *sock); | |
60 | ||
61 | typedef int (*line_event)(struct esocket *sock, char *newline); | |
62 | ||
63 | typedef struct esocket_in_buffer { | |
d4897ed9 CP |
64 | char *data; |
65 | int size; | |
66 | short mode; | |
67 | unsigned char *cryptobuf; | |
68 | int cryptobufsize; | |
69 | short mac; | |
18f8bd28 CP |
70 | } in_buffer; |
71 | ||
72 | typedef struct esocket_packet { | |
73 | char *line; | |
74 | packet_t size; | |
a690fb9f | 75 | packet_t startpos; |
18f8bd28 CP |
76 | struct esocket_packet *next; |
77 | } esocket_packet; | |
78 | ||
79 | typedef struct esocket_out_buffer { | |
80 | struct esocket_packet *head; | |
81 | struct esocket_packet *end; | |
82 | unsigned short count; | |
83 | } out_buffer; | |
84 | ||
85 | typedef void (*esocket_event)(struct esocket *socket); | |
86 | ||
87 | typedef struct esocket_events { | |
88 | esocket_event on_connect; | |
89 | esocket_event on_accept; | |
90 | esocket_event on_disconnect; | |
91 | line_event on_line; | |
92 | } esocket_events; | |
93 | ||
94 | typedef struct esocket { | |
95 | int fd; | |
96 | struct esocket_in_buffer in; | |
97 | struct esocket_out_buffer out; | |
98 | char socket_type; | |
99 | char socket_status; | |
100 | struct esocket_events events; | |
101 | struct esocket *next; | |
102 | unsigned short token; | |
103 | void *tag; | |
d4897ed9 | 104 | |
80d91dd6 CP |
105 | unsigned char clientrawkey[32], serverrawkey[32]; |
106 | unsigned char clienthmackey[32], serverhmackey[32]; | |
107 | u_int64_t clientseqno, serverseqno; | |
108 | u_int64_t clientkeyno, serverkeyno; | |
109 | ||
d4897ed9 CP |
110 | hmacsha256 clienthmac; |
111 | rijndaelcbc *clientcrypto; | |
112 | rijndaelcbc *servercrypto; | |
18f8bd28 CP |
113 | } esocket; |
114 | ||
115 | struct esocket *esocket_add(int fd, char socket_type, struct esocket_events *events, unsigned short token); | |
116 | struct esocket *find_esocket_from_fd(int fd); | |
117 | void esocket_poll_event(int fd, short events); | |
118 | void esocket_disconnect(struct esocket *active); | |
119 | int buffer_parse_ascii(struct esocket *sock); | |
120 | int esocket_read(struct esocket *sock); | |
121 | int esocket_write(struct esocket *sock, char *buffer, int bytes); | |
bb4b25ee | 122 | int esocket_write_line(struct esocket *sock, char *format, ...) __attribute__ ((format (printf, 2, 3))); |
18f8bd28 CP |
123 | unsigned short esocket_token(void); |
124 | struct esocket *find_esocket_from_fd(int fd); | |
125 | void esocket_clean_by_token(unsigned short token); | |
d4897ed9 | 126 | void switch_buffer_mode(struct esocket *sock, unsigned char *serverkey, unsigned char *serveriv, unsigned char *clientkey, unsigned char *clientiv); |
18f8bd28 CP |
127 | void esocket_disconnect_when_complete(struct esocket *active); |
128 | int esocket_raw_write(struct esocket *sock, char *buffer, int bytes); | |
129 | ||
632cc7de CP |
130 | #ifndef BYTE_ORDER |
131 | #ifndef _BYTE_ORDER | |
132 | #ifndef __BYTE_ORDER | |
133 | #error No byte order defined! | |
134 | #else | |
135 | #define BYTE_ORDER __BYTE_ORDER | |
136 | #endif | |
137 | #else | |
138 | #define BYTE_ORDER _BYTE_ORDER | |
139 | #endif | |
140 | #endif | |
141 | ||
60deb130 CP |
142 | #ifndef htonq |
143 | #if BYTE_ORDER == BIG_ENDIAN | |
144 | #define htonq(x) x | |
145 | #define ntohq(x) x | |
146 | #else | |
147 | #define htonq(x) ntohq(x) | |
148 | #define ntohq(x) (((u_int64_t)htonl((x)>>32))|(((u_int64_t)htonl(x))<<32)) | |
149 | #endif | |
150 | #endif | |
151 | ||
18f8bd28 CP |
152 | #endif |
153 | ||
154 |