diff --git a/src/udev/fido_id/fido_id.c b/src/udev/fido_id/fido_id.c index f2fbc38003..11f5320d2b 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) { + if (arg_device) { + r = sd_device_new_from_syspath(&device, arg_device); + if (r < 0) + return log_error_errno(r, "Failed to get device from syspath %s: %m", arg_device); + } else { r = device_new_from_strv(&device, environ); if (r < 0) return log_error_errno(r, "Failed to get current device from environment: %m"); - } else { - r = sd_device_new_from_syspath(&device, argv[1]); - if (r < 0) - return log_error_errno(r, "Failed to get device from syspath: %m"); } r = sd_device_get_parent(device, &hid_device);