]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev/fido_id: implement --help
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 13 Mar 2023 10:39:44 +0000 (11:39 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 16 Mar 2023 15:46:44 +0000 (16:46 +0100)
src/udev/fido_id/fido_id.c

index f2fbc38003a697ae152837606893b33ed6f683b4..11f5320d2bb2c879af90f3ebcaf8afa2ccb679a7 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
+#include <getopt.h>
 #include <linux/hid.h>
 #include <stdio.h>
 #include <stdlib.h>
 #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);