#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);
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);