diff options
Diffstat (limited to 'minecctl')
-rw-r--r-- | minecctl/mc-commands.c | 12 | ||||
-rw-r--r-- | minecctl/misc.c | 30 | ||||
-rw-r--r-- | minecctl/misc.h | 3 | ||||
-rw-r--r-- | minecctl/rcon-commands.c | 12 |
4 files changed, 27 insertions, 30 deletions
diff --git a/minecctl/mc-commands.c b/minecctl/mc-commands.c index 648af0e..49fea30 100644 --- a/minecctl/mc-commands.c +++ b/minecctl/mc-commands.c @@ -11,6 +11,7 @@ bool do_mc_pcount(struct cfg *cfg, unsigned *online, unsigned *max) { struct server *server; struct saddr *saddr; + const char *error; char buf[4096]; size_t plen, off; ssize_t r; @@ -19,19 +20,12 @@ bool do_mc_pcount(struct cfg *cfg, unsigned *online, unsigned *max) server = server_get_default(cfg); - fd = connect_any(&server->scfg.remotes, true); + fd = connect_any(&server->scfg.remotes, &saddr, &error); if (fd < 0) { - error("%s: unable to connect", server->name); + error("%s: unable to connect - %s", server->name, error); return false; } - /* FIXME: connect_any needs to indicate the address it used */ - saddr = list_first_entry(&server->scfg.remotes, 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"); diff --git a/minecctl/misc.c b/minecctl/misc.c index 6562b14..143b0cc 100644 --- a/minecctl/misc.c +++ b/minecctl/misc.c @@ -117,43 +117,43 @@ void strv_free(char **strv) xfree(strv); } -int connect_any(struct list_head *addrs, bool may_fail) +int connect_any(struct list_head *addrs, struct saddr **rsaddr, + const char **error) { struct saddr *saddr; - bool connected = false; int sfd; - /* FIXME: check callers and coordinate debug msg */ if (list_empty(addrs)) { - if (may_fail) - return -1; - else - die("No address to connect to"); + *error = "no address to connect to"; + return -1; } list_for_each_entry(saddr, addrs, list) { verbose("Attempting connection to %s", saddr->addrstr); - sfd = socket(saddr->st.ss_family, SOCK_STREAM | SOCK_CLOEXEC, - 0); - if (sfd < 0) - die("socket: %m"); + sfd = socket(saddr->st.ss_family, SOCK_STREAM | SOCK_CLOEXEC, 0); + if (sfd < 0) { + *error = "failed to create socket"; + return -1; + } socket_set_low_latency(sfd, true, true, true); if (connect(sfd, (struct sockaddr *)&saddr->st, saddr->addrlen) < 0) { close(sfd); + sfd = -1; continue; } - connected = true; + if (rsaddr) + *rsaddr = saddr; break; } - if (!connected && may_fail) + if (sfd < 0) { + *error = "failed to connect to remote host"; return -1; - else if (!connected) - die("Failed to connect to remote host"); + } return sfd; } diff --git a/minecctl/misc.h b/minecctl/misc.h index f29422c..c91271d 100644 --- a/minecctl/misc.h +++ b/minecctl/misc.h @@ -11,7 +11,8 @@ char *strv_join(char *const *strv); void strv_free(char **strv); -int connect_any(struct list_head *addrs, bool may_fail); +int connect_any(struct list_head *addrs, struct saddr **rsaddr, + const char **error); char *ask_password(); diff --git a/minecctl/rcon-commands.c b/minecctl/rcon-commands.c index be18bba..5e4ea08 100644 --- a/minecctl/rcon-commands.c +++ b/minecctl/rcon-commands.c @@ -99,6 +99,7 @@ static int rcon_login(struct cfg *cfg, struct server *server) char buf[4096]; int32_t rtype; const char *reply; + struct saddr *saddr; int fd = -1; assert_die(cfg && server, "invalid arguments"); @@ -108,11 +109,12 @@ static int rcon_login(struct cfg *cfg, struct server *server) goto error; } - fd = connect_any(&server->scfg.rcons, true); + fd = connect_any(&server->scfg.rcons, &saddr, &error); if (fd < 0) { - error("%s: unable to connect", server->name); + error("%s: unable to connect - %s", server->name, error); goto error; - } + } else + verbose("%s: connected to %s", server->name, saddr->addrstr); if (!server->scfg.rcon_password) server->scfg.rcon_password = ask_password(); @@ -122,8 +124,8 @@ static int rcon_login(struct cfg *cfg, struct server *server) goto error; } - send_msg(fd, buf, sizeof(buf), RCON_PACKET_LOGIN, server->scfg.rcon_password, - &rtype, &reply); + send_msg(fd, buf, sizeof(buf), RCON_PACKET_LOGIN, + server->scfg.rcon_password, &rtype, &reply); explicit_bzero(buf, sizeof(buf)); free_password(&server->scfg.rcon_password); |