diff options
author | Plex <thinkplex@riseup.net> | 2022-02-04 19:16:30 +0100 |
---|---|---|
committer | Plex <thinkplex@riseup.net> | 2022-02-04 19:16:30 +0100 |
commit | 28b41ee492805971632e1d65ab9f855ce837767b (patch) | |
tree | 8fee2d3206bb74fd1117536576a391a8d1725e33 | |
parent | c71e08d9daa3444318c6f768894b97b1b6d65bc9 (diff) |
Factored the usage() function
-rw-r--r-- | .cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idx | bin | 0 -> 2354 bytes | |||
-rw-r--r-- | .cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx | bin | 0 -> 746 bytes | |||
-rw-r--r-- | .cache/clangd/index/mcping.c.7D35BB1188AA7031.idx | bin | 0 -> 1204 bytes | |||
-rw-r--r-- | .cache/clangd/index/mctypes.c.AA2499938795B8BA.idx | bin | 0 -> 2714 bytes | |||
-rw-r--r-- | .cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx | bin | 0 -> 2140 bytes | |||
-rw-r--r-- | .vimspector.json | 76 | ||||
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | compile_commands.json | 108 | ||||
-rw-r--r-- | include/mcnetwork.h | 8 | ||||
-rw-r--r-- | include/mctypes.h (renamed from mctypes.h) | 5 | ||||
-rw-r--r-- | mcnetwork.c | 84 | ||||
-rw-r--r-- | mcping.c | 18 | ||||
-rw-r--r-- | mctypes.c | 42 |
13 files changed, 335 insertions, 16 deletions
diff --git a/.cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idx b/.cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idx Binary files differnew file mode 100644 index 0000000..4be19e7 --- /dev/null +++ b/.cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idx diff --git a/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx b/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx Binary files differnew file mode 100644 index 0000000..bfe1868 --- /dev/null +++ b/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx diff --git a/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx b/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx Binary files differnew file mode 100644 index 0000000..5e800aa --- /dev/null +++ b/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx diff --git a/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx b/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx Binary files differnew file mode 100644 index 0000000..d998593 --- /dev/null +++ b/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx diff --git a/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx b/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx Binary files differnew file mode 100644 index 0000000..37d98da --- /dev/null +++ b/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx diff --git a/.vimspector.json b/.vimspector.json new file mode 100644 index 0000000..5b5be4e --- /dev/null +++ b/.vimspector.json @@ -0,0 +1,76 @@ +{ + "configurations": { + "ping herobrine": { + "adapter": "vscode-cpptools", + "configuration": { + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/mcping", + "args": [ + "137.74.234.16:2001" + ], + "cwd": "${workspaceRoot}/test", + "externalConsole": true, + "stopAtEntry": true, + "MIMode": "gdb", + "logging": { + "engineLogging": false + } + } + }, + "ping seisan": { + "adapter": "vscode-cpptools", + "configuration": { + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/mcping", + "args": [ + "mc.seisan.fr" + ], + "cwd": "${workspaceRoot}/test", + "externalConsole": true, + "stopAtEntry": true, + "MIMode": "gdb", + "logging": { + "engineLogging": false + } + } + }, + "ping localhost": { + "adapter": "vscode-cpptools", + "configuration": { + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/mcping", + "args": [ + "localhost" + ], + "cwd": "${workspaceRoot}/test", + "externalConsole": true, + "stopAtEntry": true, + "MIMode": "gdb", + "logging": { + "engineLogging": false + } + } + }, + "ping query": { + "adapter": "vscode-cpptools", + "configuration": { + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/mcping", + "args": [ + "${address}" + ], + "cwd": "${workspaceRoot}/test", + "externalConsole": true, + "stopAtEntry": true, + "MIMode": "gdb", + "logging": { + "engineLogging": false + } + } + } + } +} @@ -1,5 +1,6 @@ CC=clang -CFLAGS=-Wall -g +CFLAGS=-Wall -g -I./include +PREFIX=~/.local mcping: mcping.c mctypes.o mcnetwork.o $(CC) $(CFLAGS) $^ -o $@ @@ -7,8 +8,15 @@ mcping: mcping.c mctypes.o mcnetwork.o %.o: %.c %.h $(CC) $(CFLAGS) -c $< +test: mcping + ./mcping 137.74.234.16:2001 | jq '.players' + ./mcping mc.seisan.fr | jq '.players' + lint: indent -kr -ts4 *.c clean: rm -f *.o *~ + +install: mcping + cp $^ $(PREFIX)/bin diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..17682cf --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,108 @@ +[ + { + "arguments": [ + "/usr/lib/llvm/13/bin/clang", + "-Wall", + "-g", + "-I./include", + "-c", + "-o", + "mctypes.o", + "mctypes.c" + ], + "directory": "/home/kruezenberg/mc-comm", + "file": "/home/kruezenberg/mc-comm/mctypes.c", + "output": "/home/kruezenberg/mc-comm/mctypes.o" + }, + { + "arguments": [ + "/usr/lib/llvm/13/bin/clang", + "-Wall", + "-g", + "-I./include", + "-c", + "-o", + "mcnetwork.o", + "mcnetwork.c" + ], + "directory": "/home/kruezenberg/mc-comm", + "file": "/home/kruezenberg/mc-comm/mcnetwork.c", + "output": "/home/kruezenberg/mc-comm/mcnetwork.o" + }, + { + "arguments": [ + "/usr/lib/llvm/13/bin/clang", + "-c", + "-Wall", + "-g", + "-I./include", + "mctypes.o", + "mcnetwork.o", + "-o", + "mcping", + "mcping.c" + ], + "directory": "/home/kruezenberg/mc-comm", + "file": "/home/kruezenberg/mc-comm/mcping.c", + "output": "/home/kruezenberg/mc-comm/mcping" + }, + { + "arguments": [ + "/usr/lib/llvm/13/bin/clang-13", + "-cc1", + "-triple", + "x86_64-pc-linux-gnu", + "-emit-obj", + "-mrelax-all", + "--mrelax-relocations", + "-disable-free", + "-disable-llvm-verifier", + "-discard-value-names", + "-main-file-name", + "-mrelocation-model", + "static", + "-mframe-pointer=all", + "-fmath-errno", + "-fno-rounding-math", + "-mconstructor-aliases", + "-munwind-tables", + "-target-cpu", + "x86-64", + "-tune-cpu", + "generic", + "-debug-info-kind=constructor", + "-dwarf-version=4", + "-debugger-tuning=gdb", + "-fcoverage-compilation-dir=/home/kruezenberg/mc-comm", + "-resource-dir", + "/usr/lib/llvm/13/bin/../../../../lib/clang/13.0.0", + "-I", + "./include", + "-internal-isystem", + "/usr/lib/llvm/13/bin/../../../../lib/clang/13.0.0/include", + "-internal-isystem", + "/usr/local/include", + "-internal-isystem", + "/usr/lib/gcc/x86_64-pc-linux-gnu/11.2.0/../../../../x86_64-pc-linux-gnu/include", + "-internal-externc-isystem", + "/include", + "-internal-externc-isystem", + "/usr/include", + "-Wall", + "-fdebug-compilation-dir=/home/kruezenberg/mc-comm", + "-ferror-limit", + "19", + "-fgnuc-version=4.2.1", + "-fcolor-diagnostics", + "-D__GCC_HAVE_DWARF2_CFI_ASM=1", + "-x", + "c", + "-o", + "/tmp/mcping-08ccd4.o", + "mcping.c" + ], + "directory": "/home/kruezenberg/mc-comm", + "file": "/home/kruezenberg/mc-comm/mcping.c", + "output": "/tmp/mcping-08ccd4.o" + } +] diff --git a/include/mcnetwork.h b/include/mcnetwork.h new file mode 100644 index 0000000..d3faaa1 --- /dev/null +++ b/include/mcnetwork.h @@ -0,0 +1,8 @@ +#include <sys/socket.h> +#include "mctypes.h" + +void connect_mc_server_ping(int socket, char* address, unsigned short port); +void send_handshake(int socket, int protocol, char* address, unsigned short port, int next_state); +void send_packet(int socket, int packet_id, size_t raw_size, void* raw_data); +packet recv_packet(int socket); +varint recv_varint(int socket); diff --git a/mctypes.h b/include/mctypes.h index 9b2de0d..2541b93 100644 --- a/mctypes.h +++ b/include/mctypes.h @@ -34,9 +34,12 @@ varint to_varint(unsigned int x); size_t size_varint(varint x); size_t serialize_handshake(handshake hs, void **buf); -size_t serialize_packet(packet p, void **buf); +size_t serialize_packet(const packet p, void **buf); varint deserialize_varint(void **raw); string deserialize_string(void **raw); +void free_packet(packet p); +void free_handshake(handshake h); + #endif // MCTYPES_H diff --git a/mcnetwork.c b/mcnetwork.c new file mode 100644 index 0000000..00cdf6c --- /dev/null +++ b/mcnetwork.c @@ -0,0 +1,84 @@ +#include "mcnetwork.h" + +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <unistd.h> + +#include "mctypes.h" + +void send_handshake(int socket, int protocol, char* address, + unsigned short port, int next_state) +{ + void* raw_handshake; + size_t handshake_size; + handshake hs = { to_varint(protocol), + { to_varint(strlen(address)), address }, port, to_varint(next_state) }; + handshake_size = serialize_handshake(hs, &raw_handshake); + send_packet(socket, 0x0, handshake_size, raw_handshake); + free_handshake(hs); +} + +void send_packet(int socket, int packet_id, size_t raw_size, void* raw_data) +{ + void* raw_packet; + size_t p_size; + packet p = { to_varint(raw_size + size_varint(to_varint(packet_id))), + to_varint(packet_id), raw_data }; + p_size = serialize_packet(p, &raw_packet); + free_packet(p); + + if (send(socket, raw_packet, p_size, 0) < 0) + perror("packet failed"); +} + +void connect_mc_server_ping(int socket, char* address, unsigned short port) +{ + struct addrinfo* mc_info = malloc(sizeof(struct addrinfo)); + memset(mc_info, 0, sizeof(struct addrinfo)); + struct addrinfo hints; + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_INET; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_TCP; + + if (getaddrinfo(address, "80", &hints, &mc_info) != 0) + exit(1); + + struct sockaddr_in mc_sock; + mc_sock.sin_family = AF_INET; + mc_sock.sin_port = htons(port); + memcpy(&mc_sock.sin_addr, mc_info->ai_addr->sa_data + 2, + mc_info->ai_addrlen); // stupidity + + freeaddrinfo(mc_info); + + if (connect(socket, (struct sockaddr*)&mc_sock, sizeof(mc_sock)) < 0) + exit(1); +} + +varint recv_varint(int s) +{ + unsigned long i = 0; + varint v = NULL; + do { + v = reallocarray(v, i, sizeof(u_int8_t)); + recv(s, v + i, 1, 0); + i++; + } while ((v[i - 1] & 0x80) != 0); + return v; +} + +packet recv_packet(int socket) +{ + packet p; + size_t data_size; + p.length = recv_varint(socket); + p.id = recv_varint(socket); + data_size = from_varint(p.length) - size_varint(p.id); + p.data = malloc(data_size); + recv(socket, p.data, data_size, MSG_WAITALL); + return p; +} @@ -7,6 +7,16 @@ #include "mctypes.h" #include "mcnetwork.h" + +void usage(const char *program_name){ + printf("Usage: %s [-p PROTOCOL]... ADDRESS[:PORT]\n\ + Pings a Minecraft server using the Server List Ping protocol.\n\n\ + -h display this help and exit\n\ + -p PROTOCOL uses specified protocol number.\n" + , program_name); +} + + int main(int argc, char *argv[]) { char *port_s, *address; @@ -16,8 +26,7 @@ int main(int argc, char *argv[]) while ((opt = getopt(argc, argv, "hp:")) != -1) { switch (opt) { case 'h': - printf - ("Usage: mcping [-p PROTOCOL] ADDRESS[:PORT]\nPings a Minecraft server using the PING protocol.\n\n -h\t\t\tdisplay this help and exit\n -p PROTOCOL\tUses specified protocol number.\n"); + usage(argv[0]); exit(EXIT_SUCCESS); case 'p': protocol_ver = atoi(optarg); @@ -28,8 +37,7 @@ int main(int argc, char *argv[]) } } if (optind >= argc) { - printf - ("Usage: mcping [-p PROTOCOL] ADDRESS[:PORT]\nPings a Minecraft server using the PING protocol.\n\n -h\t\tdisplay this help and exit\n -p PROTOCOL\tUses specified protocol number.\n"); + usage(argv[0]); exit(EXIT_FAILURE); } address = argv[optind]; @@ -47,7 +55,7 @@ int main(int argc, char *argv[]) if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror("bad socket\n"); - connect_mc_server(s, address, port); + connect_mc_server_ping(s, address, port); send_handshake(s, protocol_ver, address, port, 1); send_packet(s, 0x0, 0, NULL); // request packet (0x0 with no fields) @@ -1,24 +1,28 @@ #include "mctypes.h" #include <stdlib.h> #include <string.h> +#include <stdio.h> varint to_varint(unsigned int x) { - varint n = malloc(sizeof(u_int8_t)); - unsigned int size = 1; + varint n = NULL; + unsigned int size = 0; while (1) { n = reallocarray(n, size, sizeof(u_int8_t)); - n[size - 1] = x & 0x7F; + if(n == NULL){ + exit(1); + } + n[size] = x & 0x7F; x >>= 7; if (x == 0) return n; - n[size - 1] |= 0x80; + n[size] |= 0x80; size++; } return n; } -int from_varint(varint x) +int from_varint(const varint x) { unsigned int offset = 0; unsigned int res = 0; @@ -31,7 +35,7 @@ int from_varint(varint x) return (int) res; } -size_t size_varint(varint x) +size_t size_varint(const varint x) { size_t v_size; for (v_size = 1; (x[v_size - 1] & 0x80) != 0; v_size++); @@ -42,11 +46,11 @@ size_t serialize_handshake(handshake hs, void **buf) { size_t size = 0; size_t varint_s; - *buf = malloc(size); + // *buf = malloc(size); varint_s = size_varint(hs.protocol_version); *buf = realloc(*buf, size + varint_s); - memcpy(*buf + size, hs.protocol_version, varint_s); + memmove(*buf + size, hs.protocol_version, varint_s); size += varint_s; varint_s = size_varint(hs.server_address.length); @@ -71,7 +75,7 @@ size_t serialize_handshake(handshake hs, void **buf) return size; } -size_t serialize_packet(packet p, void **buf) +size_t serialize_packet(const packet p, void **buf) { size_t v_size = size_varint(p.length); size_t p_size = from_varint(p.length) + v_size; // total size of packet @@ -93,21 +97,41 @@ size_t serialize_packet(packet p, void **buf) varint deserialize_varint(void **raw) { varint v = NULL; + // void *f = *raw; unsigned short i = 0; do { v = reallocarray(v, i+1, sizeof(u_int8_t)); + if(v == NULL){ + exit(1); + } memcpy(v+i, *raw, sizeof(u_int8_t)); (*raw)++; i++; } while ((v[i-1] & 0x80) != 0); + // free(f); return v; } string deserialize_string(void **raw) { string s; + // void *f = *raw; s.length = deserialize_varint(raw); s.content = malloc(from_varint(s.length)); memcpy(s.content, *raw, from_varint(s.length)); return s; }; + +void free_packet(packet p) +{ + free(p.length); + free(p.id); + free(p.data); +} + +void free_handshake(handshake h) +{ + free(h.protocol_version); + free(h.server_address.length); + free(h.next_state); +} |