summaryrefslogtreecommitdiff
path: root/minecctl/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'minecctl/server.c')
-rw-r--r--minecctl/server.c37
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;
}