#ifndef _WS_H #define _WS_H #define MAXLEN 0x10000 #define WEBSOCKET_GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" #define B64BUFFLEN 1024 #include #include #include #include #include #include #include #include #include #include #include #include //#include "sha1.h" #include struct globals_s { const SSL_METHOD *ssl_method; SSL_CTX *ssl_ctx; char cert[512]; char key[512]; }; extern struct globals_s globals; typedef int ws_socket_t; #define ws_sock_invalid -1 typedef enum { WS_NONE = 0, WS_NORMAL = 1000, WS_PROTO_ERR = 1002, WS_DATA_TOO_BIG = 1009 } ws_cause_t; typedef enum { WSOC_CONTINUATION = 0x0, WSOC_TEXT = 0x1, WSOC_BINARY = 0x2, WSOC_CLOSE = 0x8, WSOC_PING = 0x9, WSOC_PONG = 0xA } ws_opcode_t; typedef struct wsh_s { ws_socket_t sock; char *buffer; size_t buflen; ssize_t datalen; char *payload; ssize_t plen; ssize_t rplen; SSL *ssl; int handshake; uint8_t down; int secure; } wsh_t; ssize_t ws_raw_read(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_raw_write(wsh_t *wsh, void *data, size_t bytes); ssize_t ws_read_frame(wsh_t *wsh, ws_opcode_t *oc, uint8_t **data); ssize_t ws_write_frame(wsh_t *wsh, ws_opcode_t oc, void *data, size_t bytes); int ws_init(wsh_t *wsh, ws_socket_t sock, size_t buflen, int secure); ssize_t ws_close(wsh_t *wsh, int16_t reason); void init_ssl(void); void deinit_ssl(void); static inline uint64_t get_unaligned_uint64(const void *p) { const struct { uint64_t d; } __attribute__((packed)) *pp = p; return pp->d; } #endif