diff --git a/man/systemd-cgls.xml b/man/systemd-cgls.xml
index 60cf6fa41a..59ce20e469 100644
--- a/man/systemd-cgls.xml
+++ b/man/systemd-cgls.xml
@@ -31,7 +31,7 @@
systemd-cgls
OPTIONS
|
- UNIT
+ UNIT
diff --git a/man/systemd-escape.xml b/man/systemd-escape.xml
index 7a0fd062cf..b0d77aec69 100644
--- a/man/systemd-escape.xml
+++ b/man/systemd-escape.xml
@@ -25,7 +25,12 @@
systemd-escape
OPTIONS
- STRING
+ STRING
+
+
+ systemd-escape
+ OPTIONS
+
diff --git a/src/battery-check/battery-check.c b/src/battery-check/battery-check.c
index 13dc8960f2..1ad4bbf584 100644
--- a/src/battery-check/battery-check.c
+++ b/src/battery-check/battery-check.c
@@ -2,22 +2,22 @@
#include /* IWYU pragma: keep */
+#include "sd-json.h"
#include "sd-messages.h"
#include "alloc-util.h"
+#include "ansi-color.h"
#include "battery-util.h"
#include "build.h"
#include "fd-util.h"
-#include "format-table.h"
#include "glyph-util.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "plymouth-util.h"
-#include "pretty-print.h"
#include "proc-cmdline.h"
#include "terminal-util.h"
#include "time-util.h"
+#include "verbs.h"
#define BATTERY_LOW_MESSAGE \
"Battery level critically low. Please connect your charger or the system will power off in 10 seconds."
@@ -26,32 +26,11 @@
static bool arg_doit = true;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-battery-check", "8", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s\n\n"
- "%sCheck battery level to see whether there's enough charge.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-battery-check\0",
+ "Check battery level to see whether there's enough charge.",
+ .man_pages = "systemd-battery-check.8\0",
+);
static int plymouth_send_message(const char *mode, const char *message) {
_cleanup_free_ char *plymouth_message = NULL;
@@ -87,10 +66,13 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-battery-check");
OPTION_COMMON_VERSION:
return version();
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) != 0)
diff --git a/src/binfmt/binfmt.c b/src/binfmt/binfmt.c
index 4e24b35db7..e919e874f6 100644
--- a/src/binfmt/binfmt.c
+++ b/src/binfmt/binfmt.c
@@ -3,6 +3,8 @@
#include
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
#include "binfmt-util.h"
#include "build.h"
@@ -11,20 +13,27 @@
#include "errno-util.h"
#include "fd-util.h"
#include "fileio.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "pager.h"
#include "path-util.h"
#include "pretty-print.h"
#include "string-util.h"
#include "strv.h"
+#include "verbs.h"
static CatFlags arg_cat_flags = CAT_CONFIG_OFF;
static PagerFlags arg_pager_flags = 0;
static bool arg_unregister = false;
+COMMAND(
+ "systemd-binfmt\0",
+ "Register binary formats with the kernel.",
+ .argspec = "[CONFIGURATION FILE…]\0",
+ .man_pages = "systemd-binfmt.service.8\0",
+ .pager_flags = &arg_pager_flags,
+);
+
static int delete_rule(const char *rulename) {
const char *fn = strjoina("/proc/sys/fs/binfmt_misc/", rulename);
return write_string_file(fn, "-1", WRITE_STRING_FILE_DISABLE_BUFFER);
@@ -107,33 +116,6 @@ static int cat_config(char **files) {
return cat_files(NULL, files, arg_cat_flags);
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-binfmt.service", "8", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [CONFIGURATION FILE...]\n"
- "\n%sRegisters binary formats with the kernel.%s\n"
- "\nOptions:\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0);
@@ -144,7 +126,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
FOREACH_OPTION_OR_RETURN(c, &opts)
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-binfmt");
OPTION_COMMON_VERSION:
return version();
@@ -164,6 +146,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_LONG("unregister", NULL, "Unregister all existing entries"):
arg_unregister = true;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
char **args = option_parser_get_args(&opts);
diff --git a/src/cgls/cgls.c b/src/cgls/cgls.c
index cdb47ba8bd..ec452789bb 100644
--- a/src/cgls/cgls.c
+++ b/src/cgls/cgls.c
@@ -3,25 +3,24 @@
#include
#include "sd-bus.h"
+#include "sd-json.h"
#include "alloc-util.h"
#include "build.h"
#include "bus-util.h"
#include "cgroup-show.h"
#include "cgroup-util.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "output-mode.h"
#include "pager.h"
#include "parse-util.h"
#include "path-util.h"
-#include "pretty-print.h"
#include "runtime-scope.h"
#include "string-util.h"
#include "strv.h"
#include "unit-name.h"
+#include "verbs.h"
static PagerFlags arg_pager_flags = 0;
static OutputFlags arg_output_flags = 0;
@@ -38,32 +37,13 @@ static const char* arg_machine = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_names, strv_freep);
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-cgls", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [CGROUP...]\n\n"
- "%sRecursively show control group contents.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-cgls\0",
+ "Recursively show control group contents.",
+ .argspec = "[CGROUP…]\0" "--unit|--user-unit UNIT…\0",
+ .man_pages = "systemd-cgls.1\0",
+ .pager_flags = &arg_pager_flags,
+);
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 1);
@@ -76,7 +56,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-cgls");
OPTION_COMMON_VERSION:
return version();
@@ -153,6 +133,9 @@ static int parse_argv(int argc, char *argv[]) {
if (strv_extend(&arg_names, opts.arg) < 0) /* push arg */
return log_oom();
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (arg_machine && arg_show_unit != SHOW_UNIT_NONE)
diff --git a/src/cgtop/cgtop.c b/src/cgtop/cgtop.c
index 974a946142..f77b26d65b 100644
--- a/src/cgtop/cgtop.c
+++ b/src/cgtop/cgtop.c
@@ -3,28 +3,29 @@
#include
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
+#include "ansi-color.h"
#include "build.h"
#include "cgroup-show.h"
#include "cgroup-util.h"
#include "cpu-set-util.h"
#include "fd-util.h"
#include "fileio.h"
-#include "format-table.h"
#include "hashmap.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
#include "parse-util.h"
#include "path-util.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "procfs-util.h"
#include "sort-util.h"
#include "string-table.h"
#include "terminal-util.h"
#include "time-util.h"
+#include "verbs.h"
#include "virt.h"
typedef struct Group {
@@ -89,6 +90,13 @@ static PidsCount arg_count = COUNT_PIDS;
static Order arg_order = ORDER_CPU;
static CPUType arg_cpu_type = CPU_PERCENTAGE;
+COMMAND(
+ "systemd-cgtop\0",
+ "Show top control groups by their resource usage.",
+ .argspec = "[CGROUP]\0",
+ .man_pages = "systemd-cgtop.1\0",
+);
+
static const char *order_table[_ORDER_MAX] = {
[ORDER_PATH] = "path",
[ORDER_TASKS] = "tasks",
@@ -684,33 +692,6 @@ static void display(Hashmap *a) {
}
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-cgtop", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [CGROUP]\n\n"
- "%sShow top control groups by their resource usage.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 1);
assert(argv);
@@ -722,7 +703,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-cgtop");
OPTION_COMMON_VERSION:
return version();
@@ -822,6 +803,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_COMMON_MACHINE:
arg_machine = opts.arg;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
size_t n_args = option_parser_get_n_args(&opts);
diff --git a/src/delta/delta.c b/src/delta/delta.c
index 27dfc105ee..dbbbf47cc8 100644
--- a/src/delta/delta.c
+++ b/src/delta/delta.c
@@ -2,55 +2,55 @@
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
+#include "ansi-color.h"
#include "build.h"
#include "chase.h"
#include "dirent-util.h"
#include "errno-util.h"
#include "extract-word.h"
#include "fd-util.h"
-#include "format-table.h"
#include "fs-util.h"
#include "glyph-util.h"
#include "hashmap.h"
#include "log.h"
#include "main-func.h"
#include "nulstr-util.h"
-#include "options.h"
#include "pager.h"
#include "parse-argument.h"
#include "path-util.h"
#include "pidref.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "stat-util.h"
#include "string-util.h"
#include "strv.h"
+#include "verbs.h"
-static const char prefixes[] =
- "/etc\0"
- "/run\0"
- "/usr/local/lib\0"
- "/usr/local/share\0"
- "/usr/lib\0"
+#define PREFIXES \
+ "/etc\0" \
+ "/run\0" \
+ "/usr/local/lib\0" \
+ "/usr/local/share\0" \
+ "/usr/lib\0" \
"/usr/share\0"
- ;
-static const char suffixes[] =
- "sysctl.d\0"
- "tmpfiles.d\0"
- "modules-load.d\0"
- "binfmt.d\0"
- "systemd/system\0"
+#define SUFFIXES \
+ "sysctl.d\0" \
+ "tmpfiles.d\0" \
+ "modules-load.d\0" \
+ "binfmt.d\0" \
+ "systemd/system\0" \
+ "systemd/user\0" \
+ "systemd/system-preset\0" \
+ "systemd/user-preset\0" \
+ "udev/rules.d\0" \
+ "modprobe.d\0"
+
+#define HAVE_DROPINS \
+ "systemd/system\0" \
"systemd/user\0"
- "systemd/system-preset\0"
- "systemd/user-preset\0"
- "udev/rules.d\0"
- "modprobe.d\0";
-
-static const char have_dropins[] =
- "systemd/system\0"
- "systemd/user\0";
static PagerFlags arg_pager_flags = 0;
static int arg_diff = -1;
@@ -67,6 +67,14 @@ static enum {
(SHOW_MASKED | SHOW_EQUIVALENT | SHOW_REDIRECTED | SHOW_OVERRIDDEN | SHOW_EXTENDED)
} arg_flags = 0;
+COMMAND(
+ "systemd-delta\0",
+ "Find overridden configuration files.",
+ .argspec = "[SUFFIX…]\0",
+ .man_pages = "systemd-delta.1\0",
+ .pager_flags = &arg_pager_flags,
+);
+
static int equivalent(const char *a, const char *b) {
_cleanup_free_ char *x = NULL, *y = NULL;
int r;
@@ -377,10 +385,10 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
assert(!startswith(suffix, "/"));
assert(!strstr(suffix, "//"));
- bool dropins = nulstr_contains(have_dropins, suffix);
+ bool dropins = nulstr_contains(HAVE_DROPINS, suffix);
_cleanup_ordered_hashmap_free_ OrderedHashmap *top = NULL, *bottom = NULL, *drops = NULL;
- NULSTR_FOREACH(p, prefixes) {
+ NULSTR_FOREACH(p, PREFIXES) {
_cleanup_free_ char *t = NULL;
t = path_join(p, suffix);
@@ -423,7 +431,7 @@ static int process_suffix(const char *suffix, const char *onlyprefix) {
static int process_suffixes(const char *onlyprefix) {
int n_found = 0, r;
- NULSTR_FOREACH(n, suffixes) {
+ NULSTR_FOREACH(n, SUFFIXES) {
r = process_suffix(n, onlyprefix);
if (r < 0)
return r;
@@ -441,7 +449,7 @@ static int process_suffix_chop(const char *arg) {
return process_suffix(arg, NULL);
/* Strip prefix from the suffix */
- NULSTR_FOREACH(p, prefixes) {
+ NULSTR_FOREACH(p, PREFIXES) {
const char *suffix;
suffix = startswith(arg, p);
@@ -458,31 +466,6 @@ static int process_suffix_chop(const char *arg) {
"Invalid suffix specification %s.", arg);
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-delta", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [SUFFIX...]\n\n"
- "Find overridden configuration files.\n\n",
- program_invocation_short_name);
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_flags(const char *flag_str, int flags) {
for (;;) {
_cleanup_free_ char *word = NULL;
@@ -524,7 +507,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-delta");
OPTION_COMMON_VERSION:
return version();
@@ -548,6 +531,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
return r;
arg_diff = r;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
*ret_args = option_parser_get_args(&opts);
diff --git a/src/detect-virt/detect-virt.c b/src/detect-virt/detect-virt.c
index eac8125452..56be6d8477 100644
--- a/src/detect-virt/detect-virt.c
+++ b/src/detect-virt/detect-virt.c
@@ -1,18 +1,17 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#include "alloc-util.h"
-#include "ansi-color.h"
+#include "sd-json.h"
+
#include "build.h"
#include "confidential-virt.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
-#include "pretty-print.h"
#include "string-table.h"
+#include "verbs.h"
#include "virt.h"
static bool arg_quiet = false;
+
static enum {
ANY_VIRTUALIZATION,
ONLY_VM,
@@ -22,32 +21,11 @@ static enum {
ONLY_CVM,
} arg_mode = ANY_VIRTUALIZATION;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-detect-virt", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...]\n"
- "\n%sDetect execution in a virtualized environment.%s\n"
- "\nOptions:\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-detect-virt\0",
+ "Detect execution in a virtualized environment.",
+ .man_pages = "systemd-detect-virt.1\0",
+);
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
@@ -58,7 +36,7 @@ static int parse_argv(int argc, char *argv[]) {
FOREACH_OPTION_OR_RETURN(c, &opts)
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-detect-virt");
OPTION_COMMON_VERSION:
return version();
@@ -92,6 +70,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("list-cvm", NULL, "List all known and detectable types of confidential virtualization"):
return DUMP_STRING_TABLE(confidential_virtualization, ConfidentialVirtualization, _CONFIDENTIAL_VIRTUALIZATION_MAX);
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) > 0)
diff --git a/src/escape/escape-tool.c b/src/escape/escape-tool.c
index faeeb02dd8..8446528d11 100644
--- a/src/escape/escape-tool.c
+++ b/src/escape/escape-tool.c
@@ -2,19 +2,19 @@
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
#include "build.h"
#include "fileio.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "path-util.h"
-#include "pretty-print.h"
#include "string-util.h"
#include "strv.h"
#include "unit-def.h"
#include "unit-name.h"
+#include "verbs.h"
static enum {
ACTION_ESCAPE,
@@ -27,32 +27,12 @@ static bool arg_path = false;
static bool arg_instance = false;
static bool arg_stdin = false;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-escape", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [NAME...]\n\n"
- "%sEscape strings for usage in systemd unit names.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-escape\0",
+ "Escape strings for usage in systemd unit names.",
+ .argspec = "STRING…\0" "--stdin\0",
+ .man_pages = "systemd-escape.1\0",
+);
static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0);
@@ -64,7 +44,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-escape");
OPTION_COMMON_VERSION:
return version();
@@ -106,6 +86,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"When escaping/unescaping assume the string is a path"):
arg_path = true;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (arg_stdin && option_parser_get_n_args(&opts) > 0)
diff --git a/src/firstboot/firstboot.c b/src/firstboot/firstboot.c
index a76b4c755e..504fc23ebd 100644
--- a/src/firstboot/firstboot.c
+++ b/src/firstboot/firstboot.c
@@ -5,6 +5,7 @@
#include "sd-bus.h"
#include "sd-id128.h"
+#include "sd-json.h"
#include "sd-varlink.h"
#include "alloc-util.h"
@@ -26,10 +27,8 @@
#include "fd-util.h"
#include "fileio.h"
#include "firstboot-util.h"
-#include "format-table.h"
#include "fs-util.h"
#include "glyph-util.h"
-#include "help-util.h"
#include "hostname-setup.h"
#include "hostname-util.h"
#include "image-policy.h"
@@ -43,7 +42,6 @@
#include "main-func.h"
#include "memory-util.h"
#include "mount-util.h"
-#include "options.h"
#include "os-util.h"
#include "parse-argument.h"
#include "password-quality-util.h"
@@ -60,6 +58,7 @@
#include "tmpfile-util.h"
#include "user-util.h"
#include "vconsole-util.h"
+#include "verbs.h"
static char *arg_root = NULL;
static char *arg_image = NULL;
@@ -110,6 +109,12 @@ STATIC_DESTRUCTOR_REGISTER(arg_kernel_cmdline, freep);
STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep);
STATIC_DESTRUCTOR_REGISTER(arg_label_context, mac_label_context_freep);
+COMMAND(
+ "systemd-firstboot\0",
+ "Configure basic settings of the system.",
+ .man_pages = "systemd-firstboot.1\0",
+);
+
static bool welcome_done = false;
static void print_welcome(int rfd, sd_varlink **mute_console_link) {
@@ -1378,26 +1383,6 @@ static int process_reset(int rfd) {
return 0;
}
-static int help(void) {
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- help_cmdline("[OPTIONS...]");
- help_abstract("Configures basic settings of the system.");
- help_section("Options");
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- help_man_page_reference("systemd-firstboot", "1");
- return 0;
-}
-
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
@@ -1409,7 +1394,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-firstboot");
OPTION_COMMON_VERSION:
return version();
@@ -1628,6 +1613,9 @@ static int parse_argv(int argc, char *argv[]) {
OPTION_LONG("reset", NULL, "Remove existing files"):
arg_reset = true;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (arg_delete_root_password && (arg_copy_root_password || arg_root_password || arg_prompt_root_password))
diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c
index c172153bc2..5b16679452 100644
--- a/src/hwdb/hwdb.c
+++ b/src/hwdb/hwdb.c
@@ -1,21 +1,25 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
-#include "alloc-util.h"
+#include "sd-json.h"
+
#include "build.h"
#include "dlopen-note.h"
-#include "format-table.h"
#include "hwdb-util.h"
#include "label-util.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
-#include "pretty-print.h"
#include "verbs.h"
static const char *arg_hwdb_bin_dir = NULL;
static const char *arg_root = NULL;
static bool arg_strict = false;
+COMMAND(
+ "systemd-hwdb\0",
+ "Update or query the hardware database.",
+ .man_pages = "systemd-hwdb.8\0",
+);
+
VERB(verb_query, "query", "MODALIAS", 2, 2, 0,
"Query database and print result");
static int verb_query(int argc, char *argv[], uintptr_t _data, void *userdata) {
@@ -31,51 +35,7 @@ static int verb_update(int argc, char *argv[], uintptr_t _data, void *userdata)
return hwdb_update(arg_root, arg_hwdb_bin_dir, arg_strict, false);
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL, *verbs = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-hwdb", "8", &link);
- if (r < 0)
- return log_oom();
-
- r = verbs_get_help_table(&verbs);
- if (r < 0)
- return r;
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- (void) table_sync_column_widths(0, verbs, options);
-
- printf("%s [OPTIONS...] COMMAND ...\n\n"
- "%sUpdate or query the hardware database.%s\n"
- "\n%sCommands:%s\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal(),
- ansi_underline(),
- ansi_normal());
-
- r = table_print_or_warn(verbs);
- if (r < 0)
- return r;
-
- printf("\n%sOptions:%s\n",
- ansi_underline(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
-VERB_COMMON_HELP_HIDDEN(help);
+VERB_COMMON_HELP_AUTO_HIDDEN("systemd-hwdb");
static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0);
@@ -88,7 +48,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-hwdb");
OPTION_COMMON_VERSION:
return version();
@@ -106,6 +66,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Generate in " UDEVLIBEXECDIR " instead of /etc/udev"):
arg_hwdb_bin_dir = UDEVLIBEXECDIR;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
*ret_args = option_parser_get_args(&opts);
diff --git a/src/imds/imds-tool.c b/src/imds/imds-tool.c
index e46d335cca..5791e41c6e 100644
--- a/src/imds/imds-tool.c
+++ b/src/imds/imds-tool.c
@@ -4,6 +4,7 @@
#include
#include
+#include "sd-json.h"
#include "sd-varlink.h"
#include "alloc-util.h"
@@ -17,7 +18,6 @@
#include "format-table.h"
#include "format-util.h"
#include "fs-util.h"
-#include "help-util.h"
#include "hexdecoct.h"
#include "imds-tool.h"
#include "imds-tool-metrics.h"
@@ -28,13 +28,13 @@
#include "json-util.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
#include "pcrextend-util.h"
#include "string-util.h"
#include "strv.h"
#include "time-util.h"
#include "tmpfile-util.h"
+#include "verbs.h"
static enum {
ACTION_SUMMARY,
@@ -51,25 +51,12 @@ static bool arg_refresh_usec_set = false;
STATIC_DESTRUCTOR_REGISTER(arg_key, freep);
-static int help(void) {
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- help_cmdline("[OPTIONS...] [KEY]");
- help_abstract("IMDS data acquisition.");
-
- help_section("Options");
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- help_man_page_reference("systemd-imds", "1");
- return 0;
-}
+COMMAND(
+ "systemd-imds\0",
+ "IMDS data acquisition.",
+ .argspec = "[KEY]\0",
+ .man_pages = "systemd-imds.1\0",
+);
static int parse_argv(int argc, char *argv[]) {
int r;
@@ -83,7 +70,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-imds");
OPTION_COMMON_VERSION:
return version();
@@ -139,6 +126,9 @@ static int parse_argv(int argc, char *argv[]) {
" and place them in /run/credstore/"):
arg_action = ACTION_IMPORT;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
char **args = option_parser_get_args(&opts);
diff --git a/src/journal/bsod.c b/src/journal/bsod.c
index 78093844fa..5e63a7dd52 100644
--- a/src/journal/bsod.c
+++ b/src/journal/bsod.c
@@ -5,60 +5,36 @@
#include
#include "sd-journal.h"
+#include "sd-json.h"
#include "alloc-util.h"
+#include "ansi-color.h"
#include "build.h"
#include "dlopen-note.h"
#include "fd-util.h"
#include "fileio.h"
-#include "format-table.h"
#include "io-util.h"
#include "log.h"
#include "logs-show.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
-#include "pretty-print.h"
#include "qrcode-util.h"
#include "signal-util.h"
#include "stdio-util.h"
#include "terminal-util.h"
+#include "verbs.h"
static bool arg_continuous = false;
static char *arg_tty = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_tty, freep);
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-bsod", "8", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...]\n\n"
- "%sFilter the journal to fetch the first message from the current boot with an\n"
- "emergency log level and display it as a string and a QR code.%s\n"
- "\n%sOptions:%s\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal(),
- ansi_underline(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-bsod\0",
+ "Filter the journal to fetch the first message from the current boot with an emergency "
+ "log level and display it as a string and a QR code.",
+ .man_pages = "systemd-bsod.8\0",
+);
static int acquire_first_emergency_log_message(char **ret) {
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
@@ -255,7 +231,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-bsod");
OPTION_COMMON_VERSION:
return version();
@@ -269,6 +245,9 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) > 0)
diff --git a/src/journal/cat.c b/src/journal/cat.c
index b2b1689ff2..67591d7e83 100644
--- a/src/journal/cat.c
+++ b/src/journal/cat.c
@@ -1,26 +1,23 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include
-#include
#include
#include
#include "sd-journal.h"
+#include "sd-json.h"
-#include "alloc-util.h"
#include "build.h"
#include "env-util.h"
#include "fd-util.h"
-#include "format-table.h"
#include "format-util.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
-#include "pretty-print.h"
#include "string-util.h"
#include "strv.h"
#include "syslog-util.h"
+#include "verbs.h"
static const char *arg_identifier = NULL;
static const char *arg_namespace = NULL;
@@ -28,32 +25,12 @@ static int arg_priority = LOG_INFO;
static int arg_stderr_priority = -1;
static bool arg_level_prefix = true;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-cat", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] COMMAND ...\n\n"
- "%sExecute process with stdout/stderr connected to the journal.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-cat\0",
+ "Execute process with stdout/stderr connected to the journal.",
+ .argspec = "[COMMAND…]\0",
+ .man_pages = "systemd-cat.1\0",
+);
static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0);
@@ -66,7 +43,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-cat");
OPTION_COMMON_VERSION:
return version();
@@ -101,6 +78,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
"Connect to specified journal namespace"):
arg_namespace = empty_to_null(opts.arg);
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
*ret_args = option_parser_get_args(&opts);
diff --git a/src/login/inhibit.c b/src/login/inhibit.c
index 78c784c30f..8345620980 100644
--- a/src/login/inhibit.c
+++ b/src/login/inhibit.c
@@ -6,6 +6,7 @@
#include
#include "sd-bus.h"
+#include "sd-json.h"
#include "alloc-util.h"
#include "build.h"
@@ -17,12 +18,10 @@
#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "pager.h"
#include "parse-argument.h"
#include "pidref.h"
#include "polkit-agent.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "runtime-scope.h"
#include "signal-util.h"
@@ -30,6 +29,7 @@
#include "strv.h"
#include "terminal-util.h"
#include "user-util.h"
+#include "verbs.h"
static const char *arg_what = NULL;
static const char *arg_who = NULL;
@@ -45,6 +45,16 @@ static enum {
ACTION_LIST
} arg_action = ACTION_INHIBIT;
+COMMAND(
+ "systemd-inhibit\0",
+ "Execute a process while inhibiting shutdown/sleep/idle.",
+ .argspec =
+ "COMMAND…\0"
+ "--list\0",
+ .man_pages = "systemd-inhibit.1\0",
+ .pager_flags = &arg_pager_flags,
+);
+
static int inhibit(sd_bus *bus, sd_bus_error *error) {
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
int r;
@@ -168,33 +178,6 @@ static int print_inhibitors(sd_bus *bus) {
return 0;
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-inhibit", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] COMMAND ...\n\n"
- "%sExecute a process while inhibiting shutdown/sleep/idle.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argc >= 0);
assert(argv);
@@ -207,7 +190,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-inhibit");
OPTION_COMMON_VERSION:
return version();
@@ -255,6 +238,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
OPTION_LONG("list", NULL, "List active inhibitors"):
arg_action = ACTION_LIST;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
char **args = option_parser_get_args(&opts);
diff --git a/src/mute-console/mute-console.c b/src/mute-console/mute-console.c
index b64c66e14f..7ea1fcf17b 100644
--- a/src/mute-console/mute-console.c
+++ b/src/mute-console/mute-console.c
@@ -4,57 +4,34 @@
#include "sd-bus.h"
#include "sd-event.h"
+#include "sd-json.h"
#include "sd-varlink.h"
#include "alloc-util.h"
-#include "ansi-color.h"
#include "build.h"
#include "bus-error.h"
#include "bus-locator.h"
#include "bus-util.h"
#include "daemon-util.h"
#include "errno-util.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
-#include "pretty-print.h"
#include "printk-util.h"
#include "varlink-io.systemd.MuteConsole.h"
#include "varlink-util.h"
+#include "verbs.h"
#include "virt.h"
static bool arg_mute_pid1 = true;
static bool arg_mute_kernel = true;
static bool arg_varlink = false;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-mute-console", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...]\n\n"
- "%sMute status output to the console.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-mute-console\0",
+ "Mute status output to the console.",
+ .man_pages = "systemd-mute-console.1\0",
+);
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
@@ -67,7 +44,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-mute-console");
OPTION_COMMON_VERSION:
return version();
@@ -83,6 +60,9 @@ static int parse_argv(int argc, char *argv[]) {
if (r < 0)
return r;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
r = sd_varlink_invocation(SD_VARLINK_ALLOW_ACCEPT);
diff --git a/src/oom/oomd.c b/src/oom/oomd.c
index 7f1a4d0550..4bf29e7af6 100644
--- a/src/oom/oomd.c
+++ b/src/oom/oomd.c
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include "sd-event.h"
+#include "sd-json.h"
#include "alloc-util.h"
#include "build.h"
@@ -9,43 +10,22 @@
#include "cgroup-util.h"
#include "daemon-util.h"
#include "fileio.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
#include "oomd-conf.h"
#include "oomd-manager.h"
#include "oomd-manager-bus.h"
-#include "options.h"
#include "parse-util.h"
-#include "pretty-print.h"
#include "psi-util.h"
+#include "verbs.h"
static bool arg_dry_run = false;
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-oomd", "8", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...]\n\n"
- "Run the userspace out-of-memory (OOM) killer.\n\n",
- program_invocation_short_name);
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-oomd\0",
+ "Run the userspace out-of-memory (OOM) killer.",
+ .man_pages = "systemd-oomd.8\0",
+);
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
@@ -57,7 +37,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-oomd");
OPTION_COMMON_VERSION:
return version();
@@ -74,6 +54,9 @@ static int parse_argv(int argc, char *argv[]) {
opts.arg,
BUS_IMPLEMENTATIONS(&manager_object,
&log_control_object));
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) > 0)
diff --git a/src/path/path-tool.c b/src/path/path-tool.c
index 29696501d0..37c136e472 100644
--- a/src/path/path-tool.c
+++ b/src/path/path-tool.c
@@ -2,24 +2,32 @@
#include
+#include "sd-json.h"
#include "sd-path.h"
#include "alloc-util.h"
+#include "ansi-color.h"
#include "build.h"
#include "errno-util.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "pager.h"
-#include "pretty-print.h"
#include "sort-util.h"
#include "string-util.h"
#include "strv.h"
+#include "verbs.h"
static const char *arg_suffix = NULL;
static PagerFlags arg_pager_flags = 0;
+COMMAND(
+ "systemd-path\0",
+ "Show system and user paths.",
+ .argspec = "[NAME…]\0",
+ .man_pages = "systemd-path.1\0",
+ .pager_flags = &arg_pager_flags,
+);
+
static const char* const path_table[_SD_PATH_MAX] = {
[SD_PATH_TEMPORARY] = "temporary",
[SD_PATH_TEMPORARY_LARGE] = "temporary-large",
@@ -173,33 +181,6 @@ static int print_path(const char *n) {
"Path %s not known.", n);
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-path", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] [NAME...]\n\n"
- "%sShow system and user paths.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[], char ***ret_args) {
assert(argc >= 0);
assert(argv);
@@ -210,7 +191,7 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-path");
OPTION_COMMON_VERSION:
return version();
@@ -222,6 +203,9 @@ static int parse_argv(int argc, char *argv[], char ***ret_args) {
OPTION_COMMON_NO_PAGER:
arg_pager_flags |= PAGER_DISABLE;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
*ret_args = option_parser_get_args(&opts);
diff --git a/src/ptyfwd/ptyfwd-tool.c b/src/ptyfwd/ptyfwd-tool.c
index e7b531c873..243d84e92d 100644
--- a/src/ptyfwd/ptyfwd-tool.c
+++ b/src/ptyfwd/ptyfwd-tool.c
@@ -2,22 +2,22 @@
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
#include "build.h"
#include "event-util.h"
#include "fd-util.h"
-#include "format-table.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "parse-argument.h"
#include "pidref.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "ptyfwd.h"
#include "string-util.h"
#include "strv.h"
#include "terminal-util.h"
+#include "verbs.h"
static bool arg_quiet = false;
static bool arg_read_only = false;
@@ -27,35 +27,12 @@ static char *arg_title = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_background, freep);
STATIC_DESTRUCTOR_REGISTER(arg_title, freep);
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-pty-forward", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] COMMAND ...\n"
- "\n%sRun command with a custom terminal background color or title.%s\n"
- "\n%sOptions:%s\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal(),
- ansi_underline(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
+COMMAND(
+ "systemd-pty-forward\0",
+ "Run command with a custom terminal background color or title.",
+ .argspec = "COMMAND…\0",
+ .man_pages = "systemd-pty-forward.1\0",
+);
static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argc >= 0);
@@ -69,7 +46,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-pty-forward");
OPTION_COMMON_VERSION:
return version();
@@ -93,6 +70,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
if (r < 0)
return r;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) == 0)
diff --git a/src/socket-activate/socket-activate.c b/src/socket-activate/socket-activate.c
index fa60131ba9..8b4ea230b5 100644
--- a/src/socket-activate/socket-activate.c
+++ b/src/socket-activate/socket-activate.c
@@ -5,6 +5,7 @@
#include
#include "sd-daemon.h"
+#include "sd-json.h"
#include "alloc-util.h"
#include "build.h"
@@ -14,19 +15,17 @@
#include "errno-util.h"
#include "escape.h"
#include "fd-util.h"
-#include "format-table.h"
#include "format-util.h"
#include "log.h"
#include "main-func.h"
-#include "options.h"
#include "pidfd-util.h"
#include "pidref.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "socket-netlink.h"
#include "socket-util.h"
#include "string-util.h"
#include "strv.h"
+#include "verbs.h"
static char **arg_listen = NULL;
static bool arg_accept = false;
@@ -36,6 +35,14 @@ static char **arg_fdnames = NULL;
static bool arg_inetd = false;
static bool arg_now = false;
+COMMAND(
+ "systemd-socket-activate\0",
+ "Listen on sockets and launch child on connection.",
+ .argspec = "COMMAND…\0",
+ .footer = "Note: file descriptors from sd_listen_fds() will be passed through.",
+ .man_pages = "systemd-socket-activate.1\0",
+);
+
static int add_epoll(int epoll_fd, int fd) {
struct epoll_event ev = {
.events = EPOLLIN,
@@ -320,37 +327,6 @@ static int install_chld_handler(void) {
return 0;
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-socket-activate", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...] COMMAND ...\n"
- "\n%sListen on sockets and launch child on connection.%s\n"
- "\n%sOptions:%s\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal(),
- ansi_underline(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nNote: file descriptors from sd_listen_fds() will be passed through.\n"
- "\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[], char ***remaining_args) {
assert(argc >= 0);
assert(argv);
@@ -363,7 +339,7 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-socket-activate");
OPTION_COMMON_VERSION:
return version();
@@ -441,6 +417,9 @@ static int parse_argv(int argc, char *argv[], char ***remaining_args) {
"Start instantly instead of waiting for connection"):
arg_now = true;
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
*remaining_args = option_parser_get_args(&opts);
diff --git a/src/tty-ask-password-agent/tty-ask-password-agent.c b/src/tty-ask-password-agent/tty-ask-password-agent.c
index c725ef66a8..343fffaef1 100644
--- a/src/tty-ask-password-agent/tty-ask-password-agent.c
+++ b/src/tty-ask-password-agent/tty-ask-password-agent.c
@@ -12,6 +12,8 @@
#include
#include
+#include "sd-json.h"
+
#include "alloc-util.h"
#include "ask-password-api.h"
#include "build.h"
@@ -24,16 +26,13 @@
#include "exit-status.h"
#include "fd-util.h"
#include "fileio.h"
-#include "format-table.h"
#include "format-util.h"
#include "inotify-util.h"
#include "io-util.h"
#include "main-func.h"
#include "mkdir.h"
-#include "options.h"
#include "path-util.h"
#include "pidref.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "set.h"
#include "signal-util.h"
@@ -43,6 +42,7 @@
#include "strv.h"
#include "terminal-util.h"
#include "time-util.h"
+#include "verbs.h"
#include "wall.h"
static enum {
@@ -58,6 +58,12 @@ static char *arg_device = NULL;
STATIC_DESTRUCTOR_REGISTER(arg_device, freep);
+COMMAND(
+ "systemd-tty-ask-password-agent\0",
+ "Process system password requests.",
+ .man_pages = "systemd-tty-ask-password-agent.1\0",
+);
+
static int send_passwords(const char *socket_name, char **passwords) {
int r;
@@ -442,33 +448,6 @@ static int process_and_watch_password_files(bool watch) {
return 0;
}
-static int help(void) {
- _cleanup_free_ char *link = NULL;
- _cleanup_(table_unrefp) Table *options = NULL;
- int r;
-
- r = terminal_urlify_man("systemd-tty-ask-password-agent", "1", &link);
- if (r < 0)
- return log_oom();
-
- r = option_parser_get_help_table(&options);
- if (r < 0)
- return r;
-
- printf("%s [OPTIONS...]\n"
- "\n%sProcess system password requests.%s\n\n",
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal());
-
- r = table_print_or_warn(options);
- if (r < 0)
- return r;
-
- printf("\nSee the %s for details.\n", link);
- return 0;
-}
-
static int parse_argv(int argc, char *argv[]) {
assert(argc >= 0);
assert(argv);
@@ -480,7 +459,7 @@ static int parse_argv(int argc, char *argv[]) {
switch (c) {
OPTION_COMMON_HELP:
- return help();
+ return command_print_help("systemd-tty-ask-password-agent");
OPTION_COMMON_VERSION:
return version();
@@ -519,6 +498,9 @@ static int parse_argv(int argc, char *argv[]) {
return r;
}
break;
+
+ OPTION_COMMON_INTROSPECT_CLI:
+ return introspect_cli(SD_JSON_FORMAT_OFF);
}
if (option_parser_get_n_args(&opts) > 0)
diff --git a/test/units/TEST-74-AUX-UTILS.introspect-cli.sh b/test/units/TEST-74-AUX-UTILS.introspect-cli.sh
index 8e8789bd31..f7a880859c 100755
--- a/test/units/TEST-74-AUX-UTILS.introspect-cli.sh
+++ b/test/units/TEST-74-AUX-UTILS.introspect-cli.sh
@@ -3,9 +3,46 @@
set -eux
set -o pipefail
-# Just a smoke test for the introspection code
-for i in systemd-ac-power systemd-analyze systemd-ask-password systemd-dissect \
- systemd-id128 systemd-notify homectl resolvectl timedatectl varlinkctl; do
+# Some commands are in $PATH, others are in our private directory.
+# Check the other location too.
+PATH=$PATH:/usr/lib/systemd
+
+# A smoke test for the introspection code
+INTROSPECTABLE=(
+ homectl
+ resolvectl
+ systemd-ac-power
+ systemd-analyze
+ systemd-ask-password
+ systemd-backlight
+ systemd-battery-check
+ systemd-binfmt
+ systemd-bsod
+ systemd-cat
+ systemd-cgls
+ systemd-cgtop
+ systemd-delta
+ systemd-detect-virt
+ systemd-dissect
+ systemd-escape
+ systemd-firstboot
+ systemd-hwdb
+ systemd-id128
+ systemd-imds
+ systemd-inhibit
+ systemd-mute-console
+ systemd-notify
+ systemd-oomd
+ systemd-path
+ systemd-pty-forward
+ systemd-socket-activate
+ systemd-tty-ask-password-agent
+ systemd-veritysetup
+ timedatectl
+ varlinkctl
+)
+
+for i in "${INTROSPECTABLE[@]}"; do
command -v "$i" >/dev/null || continue
$i --introspect-cli | jq -e \
@@ -17,14 +54,11 @@ for i in systemd-ac-power systemd-analyze systemd-ask-password systemd-dissect \
$i --intro | grep -e --help
done
-# Those are not in $PATH and do not do regular option parsing, so the option must
-# be given verbatim
-for i in /usr/lib/systemd/systemd-backlight /usr/lib/systemd/systemd-veritysetup; do
- [[ -x "$i" ]] || continue
-
- $i --introspect-cli | jq -e \
- '.mediaType == "application/vnd.io.systemd.cli-introspection-0"'
-done
+# systemd-hwdb defines verbs, check that they are described
+if command -v systemd-hwdb >/dev/null; then
+ systemd-hwdb --introspect-cli | jq -e \
+ '.commands[0].verbs | map(.names[0]) | contains(["query", "update"])'
+fi
# systemd-id128 defines verbs, check that they are described
systemd-id128 --introspect-cli | jq -e \