From 380d67bada7544f5f10cecc8c9dff7ed2f79e187 Mon Sep 17 00:00:00 2001 From: Aargh Rai Date: Wed, 27 May 2026 11:24:56 +0530 Subject: server.c --- assets/bb.webp | Bin 538 -> 0 bytes assets/bk.webp | Bin 1028 -> 0 bytes assets/bn.webp | Bin 740 -> 0 bytes assets/board.js | 6 +- assets/bp.png | Bin 692 -> 0 bytes assets/bq.png | Bin 1563 -> 0 bytes assets/br.webp | Bin 274 -> 0 bytes assets/pieces/bb.webp | Bin 0 -> 538 bytes assets/pieces/bk.webp | Bin 0 -> 1028 bytes assets/pieces/bn.webp | Bin 0 -> 740 bytes assets/pieces/bp.png | Bin 0 -> 692 bytes assets/pieces/bq.png | Bin 0 -> 1563 bytes assets/pieces/br.webp | Bin 0 -> 274 bytes assets/pieces/wb.webp | Bin 0 -> 834 bytes assets/pieces/wk.webp | Bin 0 -> 946 bytes assets/pieces/wn.png | Bin 0 -> 1263 bytes assets/pieces/wp.png | Bin 0 -> 898 bytes assets/pieces/wq.webp | Bin 0 -> 1388 bytes assets/pieces/wr.png | Bin 0 -> 748 bytes assets/wb.webp | Bin 834 -> 0 bytes assets/wk.webp | Bin 946 -> 0 bytes assets/wn.png | Bin 1263 -> 0 bytes assets/wp.png | Bin 898 -> 0 bytes assets/wq.webp | Bin 1388 -> 0 bytes assets/wr.png | Bin 748 -> 0 bytes build.c | 53 ++++++++++++++++-- shell.nix | 10 ++++ src/server.c | 151 +++++++++++++++++++++++++++++++++++++++++++++++++- 28 files changed, 210 insertions(+), 10 deletions(-) delete mode 100644 assets/bb.webp delete mode 100644 assets/bk.webp delete mode 100644 assets/bn.webp delete mode 100644 assets/bp.png delete mode 100644 assets/bq.png delete mode 100644 assets/br.webp create mode 100644 assets/pieces/bb.webp create mode 100644 assets/pieces/bk.webp create mode 100644 assets/pieces/bn.webp create mode 100644 assets/pieces/bp.png create mode 100644 assets/pieces/bq.png create mode 100644 assets/pieces/br.webp create mode 100644 assets/pieces/wb.webp create mode 100644 assets/pieces/wk.webp create mode 100644 assets/pieces/wn.png create mode 100644 assets/pieces/wp.png create mode 100644 assets/pieces/wq.webp create mode 100644 assets/pieces/wr.png delete mode 100644 assets/wb.webp delete mode 100644 assets/wk.webp delete mode 100644 assets/wn.png delete mode 100644 assets/wp.png delete mode 100644 assets/wq.webp delete mode 100644 assets/wr.png create mode 100644 shell.nix diff --git a/assets/bb.webp b/assets/bb.webp deleted file mode 100644 index f780b4d..0000000 Binary files a/assets/bb.webp and /dev/null differ diff --git a/assets/bk.webp b/assets/bk.webp deleted file mode 100644 index 23d2e3b..0000000 Binary files a/assets/bk.webp and /dev/null differ diff --git a/assets/bn.webp b/assets/bn.webp deleted file mode 100644 index 68a6d63..0000000 Binary files a/assets/bn.webp and /dev/null differ diff --git a/assets/board.js b/assets/board.js index fdfeb28..6e20344 100644 --- a/assets/board.js +++ b/assets/board.js @@ -11,7 +11,7 @@ const assets = [ "bb.webp", "bn.webp", "bp.png" -].map(x => "./assets/" + x); +].map(x => "./assets/pieces/" + x); let hoveringPiece = -1; const bitboards = [ @@ -112,8 +112,8 @@ function addMoves(moves) { window.onload = () => { const socket = new WebSocket("ws://localhost:3456"); - socket.addEventListener("moves", (event) => addMoves(event.data)); - // socket.addEventListener("do_move", (event) => addMoves(event.data)); + socket.onmessage = e => console.log(e.data); + socket.onopen = () => socket.send("hello"); const output = document.getElementById("output"); const board = document.getElementById("board"); diff --git a/assets/bp.png b/assets/bp.png deleted file mode 100644 index fa57435..0000000 Binary files a/assets/bp.png and /dev/null differ diff --git a/assets/bq.png b/assets/bq.png deleted file mode 100644 index 6334dd4..0000000 Binary files a/assets/bq.png and /dev/null differ diff --git a/assets/br.webp b/assets/br.webp deleted file mode 100644 index 8d078e1..0000000 Binary files a/assets/br.webp and /dev/null differ diff --git a/assets/pieces/bb.webp b/assets/pieces/bb.webp new file mode 100644 index 0000000..f780b4d Binary files /dev/null and b/assets/pieces/bb.webp differ diff --git a/assets/pieces/bk.webp b/assets/pieces/bk.webp new file mode 100644 index 0000000..23d2e3b Binary files /dev/null and b/assets/pieces/bk.webp differ diff --git a/assets/pieces/bn.webp b/assets/pieces/bn.webp new file mode 100644 index 0000000..68a6d63 Binary files /dev/null and b/assets/pieces/bn.webp differ diff --git a/assets/pieces/bp.png b/assets/pieces/bp.png new file mode 100644 index 0000000..fa57435 Binary files /dev/null and b/assets/pieces/bp.png differ diff --git a/assets/pieces/bq.png b/assets/pieces/bq.png new file mode 100644 index 0000000..6334dd4 Binary files /dev/null and b/assets/pieces/bq.png differ diff --git a/assets/pieces/br.webp b/assets/pieces/br.webp new file mode 100644 index 0000000..8d078e1 Binary files /dev/null and b/assets/pieces/br.webp differ diff --git a/assets/pieces/wb.webp b/assets/pieces/wb.webp new file mode 100644 index 0000000..5020e5e Binary files /dev/null and b/assets/pieces/wb.webp differ diff --git a/assets/pieces/wk.webp b/assets/pieces/wk.webp new file mode 100644 index 0000000..72fdcf7 Binary files /dev/null and b/assets/pieces/wk.webp differ diff --git a/assets/pieces/wn.png b/assets/pieces/wn.png new file mode 100644 index 0000000..a03ccac Binary files /dev/null and b/assets/pieces/wn.png differ diff --git a/assets/pieces/wp.png b/assets/pieces/wp.png new file mode 100644 index 0000000..d968278 Binary files /dev/null and b/assets/pieces/wp.png differ diff --git a/assets/pieces/wq.webp b/assets/pieces/wq.webp new file mode 100644 index 0000000..bfbd57a Binary files /dev/null and b/assets/pieces/wq.webp differ diff --git a/assets/pieces/wr.png b/assets/pieces/wr.png new file mode 100644 index 0000000..69811d8 Binary files /dev/null and b/assets/pieces/wr.png differ diff --git a/assets/wb.webp b/assets/wb.webp deleted file mode 100644 index 5020e5e..0000000 Binary files a/assets/wb.webp and /dev/null differ diff --git a/assets/wk.webp b/assets/wk.webp deleted file mode 100644 index 72fdcf7..0000000 Binary files a/assets/wk.webp and /dev/null differ diff --git a/assets/wn.png b/assets/wn.png deleted file mode 100644 index a03ccac..0000000 Binary files a/assets/wn.png and /dev/null differ diff --git a/assets/wp.png b/assets/wp.png deleted file mode 100644 index d968278..0000000 Binary files a/assets/wp.png and /dev/null differ diff --git a/assets/wq.webp b/assets/wq.webp deleted file mode 100644 index bfbd57a..0000000 Binary files a/assets/wq.webp and /dev/null differ diff --git a/assets/wr.png b/assets/wr.png deleted file mode 100644 index 69811d8..0000000 Binary files a/assets/wr.png and /dev/null differ diff --git a/build.c b/build.c index 7ab787f..7e5e892 100644 --- a/build.c +++ b/build.c @@ -6,6 +6,14 @@ #include #include +void print_cmd(char** args) { + int i = 0; + while (args[i] != NULL) { + printf("%s ", args[i++]); + } + printf("\n"); +} + // https://github.com/tsoding/nob.h/blob/0a08926d8094fc4ae678155c5d73ae21d1f96f3f/nob.h#L2413 int needs_rebuild(char* bin_file, char* source_file) { struct stat statbuf = {0}; @@ -28,26 +36,39 @@ int main(int argc, char** argv) { if (needs_rebuild(argv[0], __FILE__)) { if (fork() == 0) { char* args[] = {"gcc", __FILE__, "-o", argv[0], NULL}; + print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); + print_cmd(argv); execvp(argv[0], argv); } } + if (fork() == 0) { + char* args[] = {"mkdir", "-p", "output", NULL}; + print_cmd(args); + execvp(args[0], args); + return 0; + } else { + wait(NULL); + } + if (argc > 1) { if (strcmp(argv[1], "test") == 0) { printf("Test mode\n"); if (fork() == 0) { - char* args[] = {"gcc", "generate/find_tests.c", "-o", "find_tests.o", NULL}; + char* args[] = {"gcc", "generate/find_tests.c", "-o", "output/find_tests.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } if (fork() == 0) { - char* args[] = {"./find_tests.o", NULL}; + char* args[] = {"./output/find_tests.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } else { @@ -55,28 +76,48 @@ int main(int argc, char** argv) { } printf("\n"); if (fork() == 0) { - char* args[] = {"gcc", "tests/main.c", "-o", "test.o", NULL}; + char* args[] = {"gcc", "tests/main.c", "-o", "output/test.o", NULL}; + print_cmd(args); + execvp(args[0], args); + return 0; + } else { + wait(NULL); + } + + char* args[] = {"./output/test.o", NULL}; + print_cmd(args); + execvp(args[0], args); + return 0; + } + if (strcmp(argv[1], "server") == 0) { + printf("Server mode\n"); + if (fork() == 0) { + char* args[] = {"gcc", "src/server.c", "-lcrypto", "-o", "output/server.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } - char* args[] = {"./test.o", NULL}; + char* args[] = {"./output/server.o", "./output/main.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } } if (fork() == 0) { - char* args[] = {"gcc", "src/main.c", "-o", "main.o", NULL}; + char* args[] = {"gcc", "src/main.c", "-o", "output/main.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } - char* args[] = {"./main.o", NULL}; + char* args[] = {"./output/main.o", NULL}; + print_cmd(args); execvp(args[0], args); return 0; } diff --git a/shell.nix b/shell.nix new file mode 100644 index 0000000..9d0bdbb --- /dev/null +++ b/shell.nix @@ -0,0 +1,10 @@ +{ pkgs ? import {} }: + +pkgs.mkShell { + packages = with pkgs; [ + gcc + openssl + pkg-config + gnumake + ]; +} diff --git a/src/server.c b/src/server.c index 8409611..8de6d01 100644 --- a/src/server.c +++ b/src/server.c @@ -1,5 +1,154 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#define PORT 3456 -int main() { +static const char *GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; +static const char b64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789+/"; +void base64_encode( + const unsigned char *in, + size_t len, + char *out +) { + size_t i, j = 0; + + for (i = 0; i < len; i += 3) { + unsigned v = in[i] << 16; + + if (i + 1 < len) v |= in[i + 1] << 8; + if (i + 2 < len) v |= in[i + 2]; + + out[j++] = b64[(v >> 18) & 63]; + out[j++] = b64[(v >> 12) & 63]; + + out[j++] = (i + 1 < len) ? b64[(v >> 6) & 63] : '='; + out[j++] = (i + 2 < len) ? b64[v & 63] : '='; + } + + out[j] = 0; +} + +void websocket_accept_key(const char *client_key, char *output) { + char buf[256]; + snprintf(buf, sizeof(buf), "%s%s", client_key, GUID); + + unsigned char hash[SHA_DIGEST_LENGTH]; + SHA1((unsigned char *)buf, strlen(buf), hash); + base64_encode(hash, SHA_DIGEST_LENGTH, output); +} + +char *find_websocket_key(char *req) { + char *p = strstr(req, "Sec-WebSocket-Key:"); + + if (!p) return NULL; + + p += strlen("Sec-WebSocket-Key:"); + + while (*p == ' ') p++; + + static char key[128]; + int i = 0; + while (*p && *p != '\r' && *p != '\n') + key[i++] = *p++; + + key[i] = 0; + return key; +} + +int main(void) { + int server_fd = socket(AF_INET, SOCK_STREAM, 0); + int opt = 1; + + setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + struct sockaddr_in addr = { + .sin_family = AF_INET, + .sin_addr.s_addr = INADDR_ANY, + .sin_port = htons(PORT) + }; + + bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)); + listen(server_fd, 16); + printf("Listening on %d\n", PORT); + + for (;;) { + int client = accept(server_fd, NULL, NULL); + + if (client < 0) continue; + char req[4096]; + + int n = recv(client, req, sizeof(req) - 1, 0); + if (n <= 0) { + close(client); + continue; + } + + req[n] = 0; + + char *key = find_websocket_key(req); + + if (!key) { + close(client); + continue; + } + + char accept_key[128]; + + websocket_accept_key(key, accept_key); + char response[512]; + + snprintf( + response, + sizeof(response), + "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept: %s\r\n" + "\r\n", + accept_key + ); + + send(client, response, strlen(response), 0); + printf("WebSocket connected\n"); + + for (;;) { + unsigned char hdr[2]; + + if (recv(client, hdr, 2, MSG_WAITALL) != 2) + break; + + unsigned opcode = hdr[0] & 0x0F; + unsigned len = hdr[1] & 0x7F; + if (opcode == 0x8) break; + if (len >= 126) break; + + unsigned char mask[4]; + recv(client, mask, 4, MSG_WAITALL); + + unsigned char payload[126]; + recv(client, payload, len, MSG_WAITALL); + + for (unsigned i = 0; i < len; i++) + payload[i] ^= mask[i % 4]; + + printf("Message: %.*s\n", len, payload); + + unsigned char out[128]; + out[0] = 0x81; + out[1] = len; + + memcpy(out + 2, payload, len); + send(client, out, len + 2, 0); + } + close(client); + } } -- cgit v1.2.3