From 769457c165488fb8059ecb843a1c200f69dce95d Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Tue, 30 Jun 2020 08:54:52 +0200 Subject: Centralize scfg validation and use in minecctl to implement a lint command --- minecctl/minecctl-commands.h | 5 +++++ minecctl/minecctl.c | 12 ++++++++++-- minecctl/misc-commands.c | 24 ++++++++++++++++++++++++ minecctl/misc-commands.h | 2 ++ 4 files changed, 41 insertions(+), 2 deletions(-) (limited to 'minecctl') diff --git a/minecctl/minecctl-commands.h b/minecctl/minecctl-commands.h index e8bb132..b1729f0 100644 --- a/minecctl/minecctl-commands.h +++ b/minecctl/minecctl-commands.h @@ -4,6 +4,7 @@ enum commands { CMD_INVALID = 0, CMD_LIST, + CMD_LINT, CMD_STATUS, CMD_PING, CMD_STOP, @@ -21,6 +22,10 @@ static struct command_list { .name = "list", .cmd = CMD_LIST, }, + { + .name = "lint", + .cmd = CMD_LINT, + }, { .name = "status", .cmd = CMD_STATUS, diff --git a/minecctl/minecctl.c b/minecctl/minecctl.c index 231b150..69286fc 100644 --- a/minecctl/minecctl.c +++ b/minecctl/minecctl.c @@ -69,7 +69,7 @@ _noreturn_ static void usage(bool no_error) " -m, --mc-address=ADDR connect to Minecraft server at ADDR\n" " (only relevant for some commands, can also\n" " use environment variable MC_ADDRESS)\n" - " -c, --cfgdir=DIR look for server configurations in DIR\n" + " -c, --cfgdir=DIR look for server configuration files in DIR\n" " (default: %s)\n" " -f, --force stop server even if it has players\n" " -v, --verbose enable extra logging\n" @@ -77,6 +77,7 @@ _noreturn_ static void usage(bool no_error) "\n" "Valid commands:\n" " list list known servers\n" + " lint check validity of server configuration files\n" " status [SERVER] show status of SERVER (or all known servers)\n" " ping [SERVER] check if SERVER is running\n" " stop [SERVER] stop SERVER\n" @@ -225,6 +226,13 @@ static void parse_command(struct cfg *cfg, char *const *argv) } cfg->cmd = do_list; break; + case CMD_LINT: + if (*argv) { + error("Too many arguments"); + usage(false); + } + cfg->cmd = do_lint; + break; case CMD_STOPALL: if (*argv) { error("Too many arguments"); @@ -300,7 +308,7 @@ static void parse_cmdline(struct cfg *cfg, int argc, char *const *argv) cfg->cfgdir = DEFAULT_CFG_DIR; - /* FIXME: add lint and debug options */ + /* FIXME: add debug option */ while (true) { int option_index = 0; diff --git a/minecctl/misc-commands.c b/minecctl/misc-commands.c index f20cac5..1268138 100644 --- a/minecctl/misc-commands.c +++ b/minecctl/misc-commands.c @@ -17,6 +17,30 @@ bool do_list(struct cfg *cfg) return true; } +bool do_lint(struct cfg *cfg) +{ + struct server *server; + bool rv = true; + + /* server->scfg.filename check excludes servers created from cmdline */ + list_for_each_entry(server, &cfg->servers, list) { + if (!server->scfg.filename) + continue; + + info("%s", server->name); + + /* FIXME: should return bool */ + server_read_config(cfg, server); + + if (!scfg_validate(&server->scfg)) { + error("%s: invalid", server->name); + rv = false; + } + } + + return rv; +} + bool do_pcount(struct cfg *cfg) { unsigned x, y; diff --git a/minecctl/misc-commands.h b/minecctl/misc-commands.h index 1a4363f..eb03fd9 100644 --- a/minecctl/misc-commands.h +++ b/minecctl/misc-commands.h @@ -3,6 +3,8 @@ bool do_list(struct cfg *cfg); +bool do_lint(struct cfg *cfg); + bool do_pcount(struct cfg *cfg); #endif -- cgit v1.2.3