1 /* SPDX-License-Identifier: GPL-2.0+ */
3 * Copyright © 2003-2004 Greg Kroah-Hartman <greg@kroah.com>
12 #include <sys/signalfd.h>
15 #include "string-util.h"
19 static const char *arg_action
= "add";
20 static int arg_resolve_names
= 1;
21 static char arg_syspath
[UTIL_PATH_SIZE
] = {};
23 static int help(void) {
25 printf("%s test [OPTIONS] DEVPATH\n\n"
26 "Test an event run.\n\n"
27 " -h --help Show this help\n"
28 " -V --version Show package version\n"
29 " -a --action=ACTION Set action string\n"
30 " -N --resolve-names=early|late|never When to resolve names\n"
31 , program_invocation_short_name
);
36 static int parse_argv(int argc
, char *argv
[]) {
37 static const struct option options
[] = {
38 { "action", required_argument
, NULL
, 'a' },
39 { "resolve-names", required_argument
, NULL
, 'N' },
40 { "version", no_argument
, NULL
, 'V' },
41 { "help", no_argument
, NULL
, 'h' },
47 while ((c
= getopt_long(argc
, argv
, "a:N:Vh", options
, NULL
)) >= 0)
53 if (streq (optarg
, "early")) {
54 arg_resolve_names
= 1;
55 } else if (streq (optarg
, "late")) {
56 arg_resolve_names
= 0;
57 } else if (streq (optarg
, "never")) {
58 arg_resolve_names
= -1;
60 log_error("resolve-names must be early, late or never");
65 return print_version();
71 assert_not_reached("Unknown option");
75 log_error("syspath parameter missing.");
79 /* add /sys if needed */
80 if (!startswith(argv
[optind
], "/sys"))
81 strscpyl(arg_syspath
, sizeof(arg_syspath
), "/sys", argv
[optind
], NULL
);
83 strscpy(arg_syspath
, sizeof(arg_syspath
), argv
[optind
]);
88 int test_main(int argc
, char *argv
[], void *userdata
) {
89 _cleanup_(udev_rules_unrefp
) struct udev_rules
*rules
= NULL
;
90 _cleanup_(udev_device_unrefp
) struct udev_device
*dev
= NULL
;
91 _cleanup_(udev_event_unrefp
) struct udev_event
*event
= NULL
;
92 struct udev_list_entry
*entry
;
93 sigset_t mask
, sigmask_orig
;
96 log_set_max_level(LOG_DEBUG
);
98 r
= parse_argv(argc
, argv
);
102 printf("This program is for debugging only, it does not run any program\n"
103 "specified by a RUN key. It may show incorrect results, because\n"
104 "some values may be different, or not available at a simulation run.\n"
107 sigprocmask(SIG_SETMASK
, NULL
, &sigmask_orig
);
111 rules
= udev_rules_new(arg_resolve_names
);
113 log_error("Failed to read udev rules.");
118 dev
= udev_device_new_from_synthetic_event(NULL
, arg_syspath
, arg_action
);
120 r
= log_error_errno(errno
, "Failed to open device '%s': %m", arg_syspath
);
124 /* don't read info from the db */
125 udev_device_set_info_loaded(dev
);
127 event
= udev_event_new(dev
);
130 sigprocmask(SIG_SETMASK
, &mask
, &sigmask_orig
);
132 udev_event_execute_rules(event
,
133 60 * USEC_PER_SEC
, 20 * USEC_PER_SEC
,
137 udev_list_entry_foreach(entry
, udev_device_get_properties_list_entry(dev
))
138 printf("%s=%s\n", udev_list_entry_get_name(entry
), udev_list_entry_get_value(entry
));
140 udev_list_entry_foreach(entry
, udev_list_get_entry(&event
->run_list
)) {
141 char program
[UTIL_PATH_SIZE
];
143 udev_event_apply_format(event
, udev_list_entry_get_name(entry
), program
, sizeof(program
), false);
144 printf("run: '%s'\n", program
);