From 06a2edfc72a894054ed710d338504242f15d6071 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Fri, 26 Jun 2020 03:23:41 +0200 Subject: Make the server handling in minecctl saner --- minecctl/minecctl-rcon.c | 80 +++++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 31 deletions(-) (limited to 'minecctl/minecctl-rcon.c') diff --git a/minecctl/minecctl-rcon.c b/minecctl/minecctl-rcon.c index fd880f5..b97e03e 100644 --- a/minecctl/minecctl-rcon.c +++ b/minecctl/minecctl-rcon.c @@ -13,6 +13,7 @@ #include "minecctl.h" #include "minecctl-rcon.h" #include "rcon-protocol.h" +#include "misc.h" static void send_packet(int sfd, const char *buf, size_t len) @@ -101,31 +102,34 @@ send_msg(int sfd, char *buf, size_t len, enum rcon_packet_type type, } static int -rcon_login(struct cfg *cfg) +rcon_login(struct cfg *cfg, struct server *server) { char buf[4096]; int32_t rtype; const char *reply; int fd; - assert_die(cfg, "invalid arguments"); + assert_die(cfg && server, "invalid arguments"); - if (!cfg->password) - cfg->password = ask_password(); + if (list_empty(&server->rcon_addrs)) + info("server rcon addrs empty"); - if (!cfg->password) - die("Can't login - no password"); + fd = connect_any(&server->rcon_addrs, false); + + if (!server->rcon_password) + server->rcon_password = ask_password(); - fd = connect_any(&cfg->addrs, false); + if (!server->rcon_password) + die("Can't login - no password"); - send_msg(fd, buf, sizeof(buf), RCON_PACKET_LOGIN, cfg->password, + send_msg(fd, buf, sizeof(buf), RCON_PACKET_LOGIN, server->rcon_password, &rtype, &reply); /* An rcon password isn't exactly super-secret, but can't hurt */ explicit_bzero(buf, sizeof(buf)); - explicit_bzero(cfg->password, strlen(cfg->password)); - xfree(cfg->password); - cfg->password = NULL; + explicit_bzero(server->rcon_password, strlen(server->rcon_password)); + xfree(server->rcon_password); + server->rcon_password = NULL; if (rtype == RCON_PACKET_LOGIN_OK) info("Login ok"); @@ -233,10 +237,14 @@ do_status(struct cfg *cfg) { unsigned epacks, apacks; unsigned bannedplayers, bannedips; int fd; + struct server *server; - assert_die(cfg, "invalid arguments"); + if (list_empty(&cfg->servers)) + die("No servers defined"); - fd = rcon_login(cfg); + server = list_first_entry(&cfg->servers, struct server, list); + read_server_config(server); + fd = rcon_login(cfg, server); if (get_one_status(fd, buf, sizeof(buf), "seed", 1, "Seed : [ %[^]]]", &reply, tbuf)) @@ -311,10 +319,15 @@ get_player_count(int fd, unsigned *current, unsigned *max) void do_stop(struct cfg *cfg) { int fd; + struct server *server; + + if (list_empty(&cfg->servers)) + die("No servers defined"); - assert_die(cfg, "invalid arguments"); + server = list_first_entry(&cfg->servers, struct server, list); + read_server_config(server); + fd = rcon_login(cfg, server); - fd = rcon_login(cfg); if (cfg->force_stop) { unsigned current, _unused_ max; @@ -349,10 +362,15 @@ void do_pcount(struct cfg *cfg) { int fd; unsigned current, max; + struct server *server; + + if (list_empty(&cfg->servers)) + die("No servers defined"); - assert_die(cfg, "invalid arguments"); + server = list_first_entry(&cfg->servers, struct server, list); + read_server_config(server); + fd = rcon_login(cfg, server); - fd = rcon_login(cfg); if (get_player_count(fd, ¤t, &max)) info("Players: %u/%u", current, max); else @@ -364,23 +382,19 @@ do_console(struct cfg *cfg) { char *prompt; char *cmd; - const char *sname; int fd; + struct server *server; - assert_die(cfg, "invalid arguments"); - - fd = rcon_login(cfg); + if (list_empty(&cfg->servers)) + die("No servers defined"); - if (cfg->server) - sname = cfg->server->shortname; - else if (cfg->addrstr) - sname = cfg->addrstr; - else - die("can't find server name"); + server = list_first_entry(&cfg->servers, struct server, list); + read_server_config(server); + fd = rcon_login(cfg, server); prompt = alloca(strlen(program_invocation_short_name) + - STRLEN(" (") + strlen(sname) + STRLEN("): ") + 1); - sprintf(prompt, "%s (%s): ", program_invocation_short_name, sname); + STRLEN(" (") + strlen(server->shortname) + STRLEN("): ") + 1); + sprintf(prompt, "%s (%s): ", program_invocation_short_name, server->shortname); while (true) { char *tmp; @@ -415,10 +429,14 @@ do_console(struct cfg *cfg) void do_command(struct cfg *cfg) { int fd; + struct server *server; - assert_die(cfg, "invalid arguments"); + if (list_empty(&cfg->servers)) + die("No servers defined"); - fd = rcon_login(cfg); + server = list_first_entry(&cfg->servers, struct server, list); + read_server_config(server); + fd = rcon_login(cfg, server); send_cmd(fd, cfg->cmdstr); } -- cgit v1.2.3