]> jfr.im git - irc/quakenet/newserv.git/blob - nterfacer/esockets.h
Merge.
[irc/quakenet/newserv.git] / nterfacer / esockets.h
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