4 #include "tport_internal.h"
8 #define WEBSOCKET_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
9 #define B64BUFFLEN 1024
11 #include <sys/types.h>
13 #include <arpa/inet.h>
15 #include <sys/socket.h>
18 #pragma warning(disable:4996)
28 #include <openssl/ssl.h>
29 #include <openssl/err.h>
31 #if defined(_MSC_VER) || defined(__APPLE__) || defined(__FreeBSD__) || (defined(__SVR4) && defined(__sun))
32 #define __bswap_64(x) \
34 ((x<<40) & 0x00FF000000000000) | \
35 ((x<<24) & 0x0000FF0000000000) | \
36 ((x<<8) & 0x000000FF00000000) | \
37 ((x>>8) & 0x00000000FF000000) | \
38 ((x>>24) & 0x0000000000FF0000) | \
39 ((x>>40) & 0x000000000000FF00) | \
44 #define strncasecmp _strnicmp
47 #define snprintf _snprintf
50 #define WS_SSIZE_T __int64
51 #elif _MSC_VER >= 1400
52 #define WS_SSIZE_T __int32 __w64
54 #define WS_SSIZE_T __int32
56 typedef WS_SSIZE_T ssize_t;
61 const SSL_METHOD *ssl_method;
70 typedef int ws_socket_t;
72 typedef SOCKET ws_socket_t;
74 #define ws_sock_invalid (ws_socket_t)-1
81 WS_DATA_TOO_BIG = 1009
85 WSOC_CONTINUATION = 0x0,
93 typedef struct wsh_s {
114 int secure_established;
115 int logical_established;
120 size_t write_buffer_len;
122 ssize_t payload_size_max;
125 ssize_t ws_send_buf(wsh_t *wsh, ws_opcode_t oc);
126 ssize_t ws_feed_buf(wsh_t *wsh,
void *data,
size_t bytes);
128 int establish_logical_layer(wsh_t *wsh);
129 ssize_t ws_raw_read(wsh_t *wsh,
void *data,
size_t bytes,
int block);
130 ssize_t ws_raw_write(wsh_t *wsh,
void *data,
size_t bytes);
131 ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc,
uint8_t **data);
132 ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc,
void *data,
size_t bytes);
133 void ws_set_global_payload_size_max(ssize_t bytes);
134 int ws_init(wsh_t *wsh, ws_socket_t sock, SSL_CTX *ssl_ctx,
int close_sock,
int block,
int stay_open);
135 ssize_t ws_close(wsh_t *wsh,
int16_t reason);
136 void ws_destroy(wsh_t *wsh);
138 void deinit_ssl(
void);
140 int xp_is_blocking(
int errcode);
141 void wss_log_errors(
unsigned level,
char const *s,
unsigned long e);
146 static inline uint64_t get_unaligned_uint64(
const void *p)
148 const struct {
uint64_t d; } __attribute__((packed)) *pp = p;