]> jfr.im git - irc/quakenet/newserv.git/blame - nterfacer/esockets.h
BUILD: add require-all build mode
[irc/quakenet/newserv.git] / nterfacer / esockets.h
CommitLineData
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
49typedef 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
56struct buffer;
57struct esocket;
58
59typedef int (*parse_event)(struct esocket *sock);
60
61typedef int (*line_event)(struct esocket *sock, char *newline);
62
63typedef 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
72typedef 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
79typedef struct esocket_out_buffer {
80 struct esocket_packet *head;
81 struct esocket_packet *end;
82 unsigned short count;
83} out_buffer;
84
85typedef void (*esocket_event)(struct esocket *socket);
86
87typedef 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
94typedef 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
115struct esocket *esocket_add(int fd, char socket_type, struct esocket_events *events, unsigned short token);
116struct esocket *find_esocket_from_fd(int fd);
117void esocket_poll_event(int fd, short events);
118void esocket_disconnect(struct esocket *active);
119int buffer_parse_ascii(struct esocket *sock);
120int esocket_read(struct esocket *sock);
121int esocket_write(struct esocket *sock, char *buffer, int bytes);
bb4b25ee 122int esocket_write_line(struct esocket *sock, char *format, ...) __attribute__ ((format (printf, 2, 3)));
18f8bd28
CP
123unsigned short esocket_token(void);
124struct esocket *find_esocket_from_fd(int fd);
125void esocket_clean_by_token(unsigned short token);
d4897ed9 126void switch_buffer_mode(struct esocket *sock, unsigned char *serverkey, unsigned char *serveriv, unsigned char *clientkey, unsigned char *clientiv);
18f8bd28
CP
127void esocket_disconnect_when_complete(struct esocket *active);
128int 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