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