From: Zbigniew Jędrzejewski-Szmek Date: Mon, 13 Mar 2023 10:39:44 +0000 (+0100) Subject: udev/fido_id: implement --help X-Git-Tag: v254-rc1~936^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4b0f96748411a1bef8bdc0bae6f9e9d316223028;p=thirdparty%2Fsystemd.git udev/fido_id: implement --help --- diff --git a/src/udev/fido_id/fido_id.c b/src/udev/fido_id/fido_id.c index f2fbc38003a..11f5320d2bb 100644 --- a/src/udev/fido_id/fido_id.c +++ b/src/udev/fido_id/fido_id.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -25,16 +26,43 @@ #include "string-util.h" #include "udev-util.h" +static const char *arg_device = NULL; + +static int parse_argv(int argc, char *argv[]) { + static const struct option options[] = { + { "help", no_argument, NULL, 'h' }, + {} + }; + int c; + + while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) + switch (c) { + case 'h': + printf("%s [OPTIONS...] SYSFS_PATH\n\n" + " -h --help Show this help text\n", + program_invocation_short_name); + return 0; + case '?': + return -EINVAL; + default: + assert_not_reached(); + } + + if (argc > 2) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Error: unexpected argument."); + + arg_device = argv[optind]; + return 1; +} + static int run(int argc, char **argv) { _cleanup_(sd_device_unrefp) struct sd_device *device = NULL; _cleanup_free_ char *desc_path = NULL; _cleanup_close_ int fd = -EBADF; - struct sd_device *hid_device; const char *sys_path; uint8_t desc[HID_MAX_DESCRIPTOR_SIZE]; ssize_t desc_len; - int r; log_set_target(LOG_TARGET_AUTO); @@ -42,17 +70,18 @@ static int run(int argc, char **argv) { log_parse_environment(); log_open(); - if (argc > 2) - return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Usage: %s [SYSFS_PATH]", program_invocation_short_name); + r = parse_argv(argc, argv); + if (r <= 0) + return r; - if (argc == 1) { - r = device_new_from_strv(&device, environ); + if (arg_device) { + r = sd_device_new_from_syspath(&device, arg_device); if (r < 0) - return log_error_errno(r, "Failed to get current device from environment: %m"); + return log_error_errno(r, "Failed to get device from syspath %s: %m", arg_device); } else { - r = sd_device_new_from_syspath(&device, argv[1]); + r = device_new_from_strv(&device, environ); if (r < 0) - return log_error_errno(r, "Failed to get device from syspath: %m"); + return log_error_errno(r, "Failed to get current device from environment: %m"); } r = sd_device_get_parent(device, &hid_device);