diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/engine.c | 25 | ||||
| -rw-r--r-- | src/logger/logger.h | 11 | ||||
| -rw-r--r-- | src/server.c | 34 | ||||
| -rw-r--r-- | src/server/base64.c | 2 | ||||
| -rw-r--r-- | src/server/ws_key.c | 8 |
5 files changed, 49 insertions, 31 deletions
diff --git a/src/engine.c b/src/engine.c index 52aa83b..187be28 100644 --- a/src/engine.c +++ b/src/engine.c @@ -40,19 +40,20 @@ int main(void) { get_moves(&moves, position); send_queue(tx, "Sending", 8); - char buf[128]; - for (int i = 0; i <= moves.length / 32; i++) { - for (int ii = 0; ii < 32; ii++) { - if (moves.length <= 4 * i + ii) continue; - struct sqrstr from_str = sqr_to_str(moves.moves[4 * i + ii].from); - struct sqrstr to_str = sqr_to_str(moves.moves[4 * i + ii].to); - buf[4 * ii + 0] = from_str.data[0]; - buf[4 * ii + 1] = from_str.data[1]; - buf[4 * ii + 2] = to_str.data[0]; - buf[4 * ii + 3] = to_str.data[1]; - buf[4 * ii + 4] = 0; + char buf[65]; + int k = 0; + for (int i = 0; i < moves.length; i++) { + struct sqrstr from_str = sqr_to_str(moves.moves[i].from); + struct sqrstr to_str = sqr_to_str(moves.moves[i].to); + buf[k++] = from_str.data[0]; + buf[k++] = from_str.data[1]; + buf[k++] = to_str.data[0]; + buf[k++] = to_str.data[1]; + if (k == 64) { + buf[k] = 0; + send_queue(tx, buf, sizeof(buf)); + k = 0; } - send_queue(tx, buf, sizeof(buf)); } } diff --git a/src/logger/logger.h b/src/logger/logger.h index 5c82985..abcdb6d 100644 --- a/src/logger/logger.h +++ b/src/logger/logger.h @@ -5,19 +5,22 @@ #define LOG_LEVEL 3 #endif +#ifndef HAS_LOG_MODULE #ifndef LOG_MODULE #define HAS_LOG_MODULE 0 #define LOG_MODULE "" #else #define HAS_LOG_MODULE 1 #endif +#endif #if LOG_LEVEL >= 3 #define log_infof(...) do { \ char log_buf[1024]; \ int n = 1; \ + log_buf[0] = 'i'; \ if (HAS_LOG_MODULE == 1) { \ - n = snprintf(log_buf, 1024, "i(%s) ", LOG_MODULE); \ + n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \ } \ snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \ send_log(logging, log_buf, 1024); \ @@ -28,8 +31,9 @@ #define log_warnf(...) do { \ char log_buf[1024]; \ int n = 1; \ + log_buf[0] = 'w'; \ if (HAS_LOG_MODULE == 1) { \ - n = snprintf(log_buf, 1024, "w(%s) ", LOG_MODULE); \ + n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \ } \ snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \ send_log(logging, log_buf, 1024); \ @@ -40,8 +44,9 @@ #define log_errof(...) do { \ char log_buf[1024]; \ int n = 1; \ + log_buf[0] = 'e'; \ if (HAS_LOG_MODULE == 1) { \ - n = snprintf(log_buf, 1024, "e(%s) ", LOG_MODULE); \ + n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \ } \ snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \ send_log(logging, log_buf, 1024); \ diff --git a/src/server.c b/src/server.c index 1886712..80ba5ce 100644 --- a/src/server.c +++ b/src/server.c @@ -1,8 +1,4 @@ -#include <arpa/inet.h> -#include <netinet/in.h> -#include <openssl/sha.h> -#include <stdio.h> -#include <string.h> +#include <errno.h> #include <sys/socket.h> #include <sys/wait.h> #include <assert.h> @@ -10,13 +6,12 @@ #define LOG_MODULE "server" #include "logger/logger.h" +#include "string.h" #define PORT 3456 -#include "server/base64.c" #include "server/ws_key.c" #include "server/comms.c" -#include "ipc.c" mqd_t logging, tx, rx; int handle_client(int client); @@ -48,6 +43,7 @@ int main(void) { log_infof("Listening on %d", PORT); + // https://websocket.org/guides/websocket-protocol/ while(1) { int client = accept(server_fd, NULL, NULL); @@ -101,9 +97,16 @@ int main(void) { int handle_client(int client) { unsigned char hdr[2]; + int recvn; - if (recv(client, hdr, 2, MSG_WAITALL) != 2) { - log_warnf("{%d} recv close", client) + if ((recvn = recv(client, hdr, 2, MSG_WAITALL)) != 2) { + if (recvn == -1) { + char buf[256]; + if (strerror_r(errno, buf, sizeof(buf)) == 0) { + log_warnf("recv: %s", buf); + } + } + log_warnf("{%d} recv close %d", client, recvn); return 0; } @@ -129,11 +132,6 @@ int handle_client(int client) { return 1; } - if (len >= 126) { - log_infof("{%d} unsupported length %u", client, len); - return 0; - } - unsigned char mask[4]; recv(client, mask, 4, MSG_WAITALL); @@ -149,14 +147,18 @@ int handle_client(int client) { unsigned char out[1024]; out[0] = 0x81; + int shift; for (int i = 0; i < response.count; i++) { struct str item = response.data[i]; - out[1] = item.len; - assert(item.len <= 1022); + assert(item.len <= 125); + log_infof("Replying %d: %.*s", client, item.len, item.msg) + out[1] = item.len; + shift = 2; memcpy(out + 2, item.msg, item.len); send(client, out, item.len + 2, 0); } + log_infof("Replying %d: END-TRANSMISSION", client) char end_transmission[] = "END-TRANSMISSION"; int n = strlen(end_transmission); out[1] = n; diff --git a/src/server/base64.c b/src/server/base64.c index 3400cfb..7e52eb9 100644 --- a/src/server/base64.c +++ b/src/server/base64.c @@ -1,3 +1,5 @@ +#include <stddef.h> + static const char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" diff --git a/src/server/ws_key.c b/src/server/ws_key.c index ca66b81..015605e 100644 --- a/src/server/ws_key.c +++ b/src/server/ws_key.c @@ -1,3 +1,11 @@ +#include <openssl/sha.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <string.h> +#include <stdio.h> + +#include "./base64.c" + static const char *GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; void websocket_accept_key(const char *client_key, char *output) { |
