summaryrefslogtreecommitdiff
path: root/shared
diff options
context:
space:
mode:
Diffstat (limited to 'shared')
-rw-r--r--shared/config-parser.c142
-rw-r--r--shared/config-parser.h2
2 files changed, 144 insertions, 0 deletions
diff --git a/shared/config-parser.c b/shared/config-parser.c
index ee30156..6c2d33d 100644
--- a/shared/config-parser.c
+++ b/shared/config-parser.c
@@ -221,6 +221,148 @@ static char *systemd_object_path(const char *service)
return r;
}
+/* FIXME: Add a strict argument */
+bool scfg_validate(struct server_config *scfg)
+{
+ struct saddr *saddr;
+ uint16_t port;
+
+ if (!scfg) {
+ error("invalid arguments");
+ return false;
+ }
+
+ if (!scfg->filename) {
+ error("filename not set");
+ return false;
+ }
+
+ if (!list_empty(&scfg->dnslookups)) {
+ error("%s: pending DNS requests",
+ scfg->filename);
+ return false;
+ }
+
+ if (scfg->stop_method == SERVER_STOP_METHOD_RCON &&
+ list_empty(&scfg->rcons)) {
+ error("%s: rcon stop method missing rcon address",
+ scfg->filename);
+ return false;
+ }
+
+ if (scfg->stop_method == SERVER_STOP_METHOD_RCON &&
+ !scfg->rcon_password) {
+ error("%s: rcon stop method missing rcon password",
+ scfg->filename);
+ return false;
+ }
+
+ if ((scfg->start_method == SERVER_START_METHOD_SYSTEMD ||
+ scfg->stop_method == SERVER_STOP_METHOD_SYSTEMD)) {
+ if (!scfg->systemd_service || !scfg->systemd_obj) {
+ error("%s: systemd start/stop method missing "
+ "systemd service", scfg->filename);
+ return false;
+ } else {
+ if (scfg->systemd_service || scfg->systemd_obj) {
+ error("%s: systemd service set but not used",
+ scfg->filename);
+ return false;
+ }
+ }
+ }
+
+ if (scfg->idle_timeout > 0 &&
+ scfg->stop_method == SERVER_STOP_METHOD_UNDEFINED) {
+ error("%s: idle_timeout set but missing stop method",
+ scfg->filename);
+ return false;
+ }
+
+ switch (scfg->type) {
+ case SERVER_TYPE_ANNOUNCE:
+ if (scfg->announce_port == 0) {
+ error("%s: missing announce port", scfg->filename);
+ return false;
+ }
+
+ if (scfg->start_method != SERVER_START_METHOD_UNDEFINED) {
+ error("%s: can't set start_method for announce server",
+ scfg->filename);
+ return false;
+ }
+
+ if (scfg->start_exec) {
+ error("%s: can't set start_exec for announce server",
+ scfg->filename);
+ return false;
+ }
+
+ if (!list_empty(&scfg->locals)) {
+ error("%s: can't set local addresses for announce server",
+ scfg->filename);
+ return false;
+ }
+
+ if (!list_empty(&scfg->remotes)) {
+ error("%s: can't set remote addresses for announce server",
+ scfg->filename);
+ return false;
+ }
+
+ break;
+
+ case SERVER_TYPE_PROXY:
+ if (scfg->announce_port == 0) {
+ error("%s: can't set announce port for proxy server",
+ scfg->filename);
+ return false;
+ }
+
+ if (list_empty(&scfg->locals)) {
+ error("%s: missing local addresses for proxy server",
+ scfg->filename);
+ return false;
+ }
+
+ if (list_empty(&scfg->remotes)) {
+ error("%s: missing remote addresses for proxy server",
+ scfg->filename);
+ return false;
+ }
+
+ list_for_each_entry(saddr, &scfg->locals, list) {
+ port = saddr_port(saddr);
+
+ if (port == 0) {
+ error("%s: invalid local port", scfg->filename);
+ return false;
+ }
+
+ if (scfg->announce_port == 0)
+ scfg->announce_port = port;
+ else if (scfg->announce_port != port) {
+ error("%s: multiple local ports", scfg->filename);
+ return false;
+ }
+ }
+
+ if (scfg->announce_port == 0) {
+ error("%s: can't determine which port to announce",
+ scfg->filename);
+ return false;
+ }
+
+ break;
+
+ default:
+ error("%s: can't determine server type", scfg->filename);
+ return false;
+ }
+
+ return true;
+}
+
#define INVALID(fmt, ...) \
do { \
verbose("%s: " fmt, scfg->filename __VA_OPT__(,) __VA_ARGS__); \
diff --git a/shared/config-parser.h b/shared/config-parser.h
index 2220221..2990349 100644
--- a/shared/config-parser.h
+++ b/shared/config-parser.h
@@ -85,6 +85,8 @@ struct cfg_value {
};
};
+bool scfg_validate(struct server_config *scfg);
+
bool scfg_parse(struct server_config *scfg, char *buf,
notification_cb_t notification_cb);