summaryrefslogtreecommitdiff
path: root/minecctl/minecctl-rcon.c
diff options
context:
space:
mode:
Diffstat (limited to 'minecctl/minecctl-rcon.c')
-rw-r--r--minecctl/minecctl-rcon.c80
1 files changed, 49 insertions, 31 deletions
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, &current, &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);
}