diff options
Diffstat (limited to 'minecctl/server.c')
-rw-r--r-- | minecctl/server.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/minecctl/server.c b/minecctl/server.c index 93882f1..582c4fd 100644 --- a/minecctl/server.c +++ b/minecctl/server.c @@ -8,70 +8,77 @@ #include "server.h" #include "misc.h" -void server_read_config(struct cfg *cfg, struct server *server) +#define INVALID(msg) do { *error = (msg); return false; } while(0) + +bool server_read_config(struct cfg *cfg, struct server *server, + unsigned *lineno, const char **error) { - unsigned lineno; - const char *error; char buf[4096]; size_t off = 0; ssize_t r; int dfd; int fd; - if (!server || !server->scfg.filename || server->file_read) - return; + if (!server || !server->scfg.filename || server->file_read || + !lineno || !error) + return false; + *lineno = 0; server->file_read = true; dfd = open(cfg->cfgdir, O_DIRECTORY | O_PATH | O_CLOEXEC); if (dfd < 0) - die("Failed to open %s: %m", cfg->cfgdir); + INVALID("failed to open configuration directory"); fd = openat(dfd, server->scfg.filename, O_RDONLY | O_CLOEXEC); if (fd < 0) - die("Failed to open %s: %m", server->scfg.filename); + INVALID("failed to open configuration file"); close(dfd); while (true) { r = read(fd, buf + off, sizeof(buf) - off - 1); if (r < 0) - die("Failed to read %s: %m", server->scfg.filename); + INVALID("failed to read configuration file"); else if (r == 0) break; off += r; if (off == sizeof(buf) - 1) - die("Failed to read %s: file too large", - server->scfg.filename); + INVALID("invalid, file too large"); } buf[off] = '\0'; close(fd); - if (!scfg_parse(&server->scfg, buf, NULL, &lineno, &error)) - die("Unable to parse %s, line %u: %s", server->scfg.filename, - lineno, error); + if (!scfg_parse(&server->scfg, buf, NULL, lineno, error)) + return false; if (!server->scfg.rcon_password) - verbose("rcon password not found in %s", server->scfg.filename); + verbose("rcon password not set"); if (list_empty(&server->scfg.rcons)) verbose("rcon address not found in %s", server->scfg.filename); if (list_empty(&server->scfg.remotes)) verbose("mc server address not found in %s", server->scfg.filename); + + return true; } struct server *server_get_default(struct cfg *cfg) { struct server *server; + unsigned lineno; + const char *error; server = list_first_entry_or_null(&cfg->servers, struct server, list); if (!server) die("No servers defined"); - server_read_config(cfg, server); + /* FIXME: error msg */ + if (!server_read_config(cfg, server, &lineno, &error)) + return NULL; return server; } |