summaryrefslogtreecommitdiff
path: root/minecctl/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'minecctl/server.c')
-rw-r--r--minecctl/server.c87
1 files changed, 17 insertions, 70 deletions
diff --git a/minecctl/server.c b/minecctl/server.c
index aca69a0..21df7f4 100644
--- a/minecctl/server.c
+++ b/minecctl/server.c
@@ -7,8 +7,6 @@
#include "minecctl.h"
#include "server.h"
#include "misc.h"
-#include "config-parser.h"
-#include "server-config-options.h"
void server_read_config(struct cfg *cfg, struct server *server)
{
@@ -17,9 +15,8 @@ void server_read_config(struct cfg *cfg, struct server *server)
ssize_t r;
int dfd;
int fd;
- char *pos = buf;
- if (!server || !server->filename || server->file_read)
+ if (!server || !server->scfg.filename || server->file_read)
return;
server->file_read = true;
@@ -28,73 +25,39 @@ void server_read_config(struct cfg *cfg, struct server *server)
if (dfd < 0)
die("Failed to open %s: %m", cfg->cfgdir);
- fd = openat(dfd, server->filename, O_RDONLY | O_CLOEXEC);
+ fd = openat(dfd, server->scfg.filename, O_RDONLY | O_CLOEXEC);
if (fd < 0)
- die("Failed to open %s: %m", server->filename);
+ die("Failed to open %s: %m", server->scfg.filename);
close(dfd);
while (true) {
r = read(fd, buf + off, sizeof(buf) - off - 1);
if (r < 0)
- die("Failed to read %s: %m", server->filename);
+ die("Failed to read %s: %m", server->scfg.filename);
else if (r == 0)
break;
off += r;
if (off == sizeof(buf) - 1)
die("Failed to read %s: file too large",
- server->filename);
+ server->scfg.filename);
}
buf[off] = '\0';
close(fd);
- if (!config_parse_header(SERVER_CFG_HEADER, &pos))
- die("Unable to parse %s: invalid/missing header",
- server->filename);
+ if (!scfg_parse(&server->scfg, buf, NULL))
+ die("Unable to parse %s", server->scfg.filename);
- /* FIXME: this will cause superflous DNS lookups of other cfg entries */
- while (true) {
- int key;
- const char *keyname;
- struct cfg_value value;
-
- if (!config_parse_line(server->filename, &pos, scfg_key_map,
- &key, &keyname, &value, false))
- break;
-
- switch (key) {
- case SCFG_KEY_RCON:
- if (!list_empty(&server->rcon_addrs))
- die("rcon address defined twice in %s",
- server->filename);
- list_replace(&value.saddrs, &server->rcon_addrs);
- break;
- case SCFG_KEY_RCON_PASSWORD:
- if (server->rcon_password)
- die("rcon password defined twice in %s",
- server->filename);
- server->rcon_password = xstrdup(value.str);
- break;
- case SCFG_KEY_REMOTE:
- if (!list_empty(&server->mc_addrs))
- die("rcon address defined twice in %s",
- server->filename);
- list_replace(&value.saddrs, &server->mc_addrs);
- default:
- continue;
- }
- }
-
- if (!server->rcon_password)
- verbose("rcon password not found in %s", server->filename);
+ if (!server->scfg.rcon_password)
+ verbose("rcon password not found in %s", server->scfg.filename);
- if (list_empty(&server->rcon_addrs))
- verbose("rcon address not found in %s", server->filename);
+ if (list_empty(&server->scfg.rcons))
+ verbose("rcon address not found in %s", server->scfg.filename);
- if (list_empty(&server->mc_addrs))
- verbose("mc server address not found in %s", server->filename);
+ if (list_empty(&server->scfg.remotes))
+ verbose("mc server address not found in %s", server->scfg.filename);
}
struct server *server_get_default(struct cfg *cfg)
@@ -144,8 +107,7 @@ void server_load_all_known(struct cfg *cfg)
if (!is_valid_server_config_filename(dent, NULL))
continue;
- server = server_new();
- server->filename = xstrdup(dent->d_name);
+ server = server_new(dent->d_name);
suffix = strrchr(dent->d_name, '.');
assert_die(suffix, "Error parsing filename");
@@ -168,32 +130,17 @@ void server_free_all(struct cfg *cfg)
void server_free(struct server *server)
{
- struct saddr *saddr, *tmp;
-
+ scfg_delete(&server->scfg);
xfree(server->name);
- xfree(server->filename);
- free_password(&server->rcon_password);
-
- list_for_each_entry_safe(saddr, tmp, &server->rcon_addrs, list) {
- list_del(&saddr->list);
- xfree(saddr);
- }
-
- list_for_each_entry_safe(saddr, tmp, &server->mc_addrs, list) {
- list_del(&saddr->list);
- xfree(saddr);
- }
-
xfree(server);
}
-struct server *server_new()
+struct server *server_new(const char *filename)
{
struct server *server;
server = zmalloc(sizeof(*server));
- INIT_LIST_HEAD(&server->rcon_addrs);
- INIT_LIST_HEAD(&server->mc_addrs);
+ scfg_init(&server->scfg, filename);
INIT_LIST_HEAD(&server->list);
return server;