aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPlex <thinkplex@riseup.net>2022-02-04 19:16:30 +0100
committerPlex <thinkplex@riseup.net>2022-02-04 19:16:30 +0100
commit28b41ee492805971632e1d65ab9f855ce837767b (patch)
tree8fee2d3206bb74fd1117536576a391a8d1725e33
parentc71e08d9daa3444318c6f768894b97b1b6d65bc9 (diff)
Factored the usage() function
-rw-r--r--.cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idxbin0 -> 2354 bytes
-rw-r--r--.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idxbin0 -> 746 bytes
-rw-r--r--.cache/clangd/index/mcping.c.7D35BB1188AA7031.idxbin0 -> 1204 bytes
-rw-r--r--.cache/clangd/index/mctypes.c.AA2499938795B8BA.idxbin0 -> 2714 bytes
-rw-r--r--.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idxbin0 -> 2140 bytes
-rw-r--r--.vimspector.json76
-rw-r--r--Makefile10
-rw-r--r--compile_commands.json108
-rw-r--r--include/mcnetwork.h8
-rw-r--r--include/mctypes.h (renamed from mctypes.h)5
-rw-r--r--mcnetwork.c84
-rw-r--r--mcping.c18
-rw-r--r--mctypes.c42
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
new file mode 100644
index 0000000..4be19e7
--- /dev/null
+++ b/.cache/clangd/index/mcnetwork.c.B508600D61ADFA6B.idx
Binary files differ
diff --git a/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx b/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx
new file mode 100644
index 0000000..bfe1868
--- /dev/null
+++ b/.cache/clangd/index/mcnetwork.h.887D4E662A2D9D8B.idx
Binary files differ
diff --git a/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx b/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx
new file mode 100644
index 0000000..5e800aa
--- /dev/null
+++ b/.cache/clangd/index/mcping.c.7D35BB1188AA7031.idx
Binary files differ
diff --git a/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx b/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx
new file mode 100644
index 0000000..d998593
--- /dev/null
+++ b/.cache/clangd/index/mctypes.c.AA2499938795B8BA.idx
Binary files differ
diff --git a/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx b/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx
new file mode 100644
index 0000000..37d98da
--- /dev/null
+++ b/.cache/clangd/index/mctypes.h.7136FA4A3E0277AB.idx
Binary files differ
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
+ }
+ }
+ }
+ }
+}
diff --git a/Makefile b/Makefile
index 3119e48..51f04a8 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
+}
diff --git a/mcping.c b/mcping.c
index 8735141..037dcc5 100644
--- a/mcping.c
+++ b/mcping.c
@@ -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)
diff --git a/mctypes.c b/mctypes.c
index c4df793..3be3209 100644
--- a/mctypes.c
+++ b/mctypes.c
@@ -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);
+}