Index: head/usr.sbin/ctld/ctld.8 =================================================================== --- head/usr.sbin/ctld/ctld.8 +++ head/usr.sbin/ctld/ctld.8 @@ -27,7 +27,7 @@ .\" .\" $FreeBSD$ .\" -.Dd March 23, 2018 +.Dd March 31, 2020 .Dt CTLD 8 .Os .Sh NAME @@ -38,6 +38,10 @@ .Op Fl d .Op Fl f Ar config-file .Op Fl u +.Nm +.Fl t +.Op Fl f Ar config-file +.Op Fl u .Sh DESCRIPTION The .Nm @@ -90,6 +94,8 @@ put itself in the background. The daemon will also not fork and will exit after processing one connection. This option is only intended for debugging the target. +.It Fl t +Test the configuration file for validity and exit. .It Fl u Use UCL configuration file format instead of the traditional non-UCL format. .El Index: head/usr.sbin/ctld/ctld.c =================================================================== --- head/usr.sbin/ctld/ctld.c +++ head/usr.sbin/ctld/ctld.c @@ -69,6 +69,7 @@ { fprintf(stderr, "usage: ctld [-d][-u][-f config-file]\n"); + fprintf(stderr, " ctld -t [-u][-f config-file]\n"); exit(1); } @@ -2663,14 +2664,18 @@ const char *config_path = DEFAULT_CONFIG_PATH; int debug = 0, ch, error; bool dont_daemonize = false; + bool test_config = false; bool use_ucl = false; - while ((ch = getopt(argc, argv, "duf:R")) != -1) { + while ((ch = getopt(argc, argv, "dtuf:R")) != -1) { switch (ch) { case 'd': dont_daemonize = true; debug++; break; + case 't': + test_config = true; + break; case 'u': use_ucl = true; break; @@ -2701,6 +2706,10 @@ if (newconf == NULL) log_errx(1, "configuration error; exiting"); + + if (test_config) + return (0); + if (debug > 0) { oldconf->conf_debug = debug; newconf->conf_debug = debug;