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