/* SPDX-License-Identifier: GPL-2.0-or-later */
-#include <getopt.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <unistd.h>
#include "device-util.h"
#include "fd-util.h"
#include "fdset.h"
+#include "format-table.h"
+#include "glyph-util.h"
#include "hash-funcs.h"
+#include "help-util.h"
#include "lock-util.h"
+#include "options.h"
#include "path-util.h"
#include "pidref.h"
-#include "pretty-print.h"
#include "process-util.h"
#include "signal-util.h"
#include "sort-util.h"
STATIC_DESTRUCTOR_REGISTER(arg_cmdline, strv_freep);
static int help(void) {
- _cleanup_free_ char *link = NULL;
+ _cleanup_(table_unrefp) Table *options = NULL;
int r;
- r = terminal_urlify_man("udevadm", "8", &link);
+ r = option_parser_get_help_table_ns("udevadm-lock", &options);
if (r < 0)
- return log_oom();
+ return r;
- printf("%s [OPTIONS...] COMMAND\n"
- "%s [OPTIONS...] --print\n"
- "\n%sLock a block device and run a command.%s\n\n"
- " -h --help Print this message\n"
- " -V --version Print version of the program\n"
- " -d --device=DEVICE Block device to lock\n"
- " -b --backing=FILE File whose backing block device to lock\n"
- " -t --timeout=SECS Block at most the specified time waiting for lock\n"
- " -p --print Only show which block device the lock would be taken on\n"
- "\nSee the %s for details.\n",
- program_invocation_short_name,
- program_invocation_short_name,
- ansi_highlight(),
- ansi_normal(),
- link);
+ help_cmdline("lock [OPTIONS...] COMMAND");
+ help_cmdline("lock [OPTIONS...] --print");
+ help_abstract("Lock a block device and run a command.");
+ help_section("Options:");
+ r = table_print_or_warn(options);
+ if (r < 0)
+ return r;
+ help_man_page_reference("udevadm", "8");
return 0;
}
static int parse_argv(int argc, char *argv[]) {
-
- static const struct option options[] = {
- { "help", no_argument, NULL, 'h' },
- { "version", no_argument, NULL, 'V' },
- { "device", required_argument, NULL, 'd' },
- { "backing", required_argument, NULL, 'b' },
- { "timeout", required_argument, NULL, 't' },
- { "print", no_argument, NULL, 'p' },
- {}
- };
-
- int c, r;
+ int r;
assert(argc >= 0);
assert(argv);
- /* Resetting to 0 forces the invocation of an internal initialization routine of getopt_long()
- * that checks for GNU extensions in optstring ('-' or '+' at the beginning). */
- optind = 0;
- while ((c = getopt_long(argc, argv, arg_print ? "hVd:b:t:p" : "+hVd:b:t:p", options, NULL)) >= 0)
+ OptionParser opts = { argc, argv, OPTION_PARSER_STOP_AT_FIRST_NONOPTION, "udevadm-lock" };
+ FOREACH_OPTION(c, &opts, /* on_error= */ return c)
switch (c) {
- case 'h':
+ OPTION_NAMESPACE("udevadm-lock"): {}
+
+ OPTION_COMMON_HELP:
return help();
- case 'V':
+ OPTION('V', "version", NULL, "Show package version"):
return print_version();
- case 'd':
- case 'b': {
+ OPTION('d', "device", "DEVICE", "Block device to lock"): {} /* fall through */
+ OPTION('b', "backing", "FILE", "File whose backing block device to lock"): {
_cleanup_free_ char *s = NULL;
- char ***l = c == 'd' ? &arg_devices : &arg_backing;
+ char ***l = opts.opt->short_code == 'd' ? &arg_devices : &arg_backing;
- r = path_make_absolute_cwd(optarg, &s);
+ r = path_make_absolute_cwd(opts.arg, &s);
if (r < 0)
- return log_error_errno(r, "Failed to make path '%s' absolute: %m", optarg);
+ return log_error_errno(r, "Failed to make path '%s' absolute: %m", opts.arg);
path_simplify(s);
break;
}
- case 't':
- r = parse_sec(optarg, &arg_timeout_usec);
+ OPTION('t', "timeout", "SECS", "Block at most the specified time waiting for lock"):
+ r = parse_sec(opts.arg, &arg_timeout_usec);
if (r < 0)
- return log_error_errno(r, "Failed to parse --timeout= parameter: %s", optarg);
+ return log_error_errno(r, "Failed to parse --timeout= parameter: %s", opts.arg);
break;
- case 'p':
+ OPTION('p', "print", NULL, "Only show which block device the lock would be taken on"):
arg_print = true;
break;
-
- case '?':
- return -EINVAL;
-
- default:
- assert_not_reached();
}
+ char **args = option_parser_get_args(&opts);
if (arg_print) {
- if (optind != argc)
+ if (!strv_isempty(args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No arguments expected.");
} else {
- if (optind + 1 > argc)
+ if (strv_isempty(args))
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Too few arguments, command to execute.");
- arg_cmdline = strv_copy(argv + optind);
+ arg_cmdline = strv_copy(args);
if (!arg_cmdline)
return log_oom();
}