diff options
Diffstat (limited to 'minecctl/server.c')
-rw-r--r-- | minecctl/server.c | 87 |
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; |