udev/fido_id: implement --help

This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2023-03-16 16:46:44 +01:00
parent 66026fca95
commit 4b0f967484
+38 -9
View File
@@ -8,6 +8,7 @@
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <linux/hid.h>
#include <stdio.h>
#include <stdlib.h>
@@ -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);