From 99b2c70137fef05a5a18f439b9010ddba455f5cb Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sat, 27 Jun 2020 15:18:45 +0200 Subject: Create a shared mc protocol implementation and use it in the proxy and cmd line tool --- minecctl/mc-commands.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 minecctl/mc-commands.c (limited to 'minecctl/mc-commands.c') diff --git a/minecctl/mc-commands.c b/minecctl/mc-commands.c new file mode 100644 index 0000000..0ac20d0 --- /dev/null +++ b/minecctl/mc-commands.c @@ -0,0 +1,77 @@ +#include + +#include "utils.h" +#include "minecctl.h" +#include "server.h" +#include "mc-commands.h" +#include "misc.h" +#include "mc-protocol.h" + +bool +do_mc_pcount(struct cfg *cfg, unsigned *online, unsigned *max) +{ + struct server *server; + struct saddr *saddr; + char buf[4096]; + size_t plen, off; + ssize_t r; + bool rv = false; + int fd; + + server = server_get_default(cfg); + + fd = connect_any(&server->mc_addrs, true); + if (fd < 0) { + error("%s: unable to connect", server->name); + return false; + } + + /* FIXME: connect_any needs to indicate the address it used */ + saddr = list_first_entry(&server->mc_addrs, struct saddr, list); + if (!saddr) { + error("No saddr"); + goto out; + } + + if (!mc_protocol_create_status_request(buf, sizeof(buf), &plen, saddr)) { + error("Failed to create req"); + goto out; + } + + /* FIXME: do proper checks for EINTR etc */ + off = 0; + while (off < plen) { + r = write(fd, buf + off, plen - off); + if (r <= 0) { + error("write failed: %zi (%m)", r); + goto out; + } + off += r; + } + + off = 0; + while (off < sizeof(buf)) { + r = read(fd, buf + off, sizeof(buf) - off); + if (r <= 0) { + error("Read failed %zi: %m", r); + goto out; + } + + off += r; + + if (mc_is_handshake_complete(buf, off)) { + rv = true; + break; + } + } + + if (!mc_protocol_parse_status_reply(buf, off, online, max)) { + error("Failed to get player count"); + return false; + } + +out: + close(fd); + return rv; +} + -- cgit v1.2.3