]>
Commit | Line | Data |
---|---|---|
1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ | |
2 | ||
3 | #include <pthread.h> | |
4 | #include <stdio.h> | |
5 | ||
6 | #include "libudev.h" | |
7 | ||
8 | #include "tests.h" | |
9 | ||
10 | #define handle_error_errno(error, msg) \ | |
11 | ({ \ | |
12 | errno = ABS(error); \ | |
13 | perror(msg); \ | |
14 | EXIT_FAILURE; \ | |
15 | }) | |
16 | ||
17 | static void* thread(void *p) { | |
18 | struct udev_device **d = p; | |
19 | ||
20 | *d = udev_device_unref(*d); | |
21 | ||
22 | return NULL; | |
23 | } | |
24 | ||
25 | int main(int argc, char *argv[]) { | |
26 | struct udev_device *loopback; | |
27 | struct udev_list_entry *entry, *e; | |
28 | pthread_t t; | |
29 | int r; | |
30 | ||
31 | loopback = udev_device_new_from_syspath(NULL, "/sys/class/net/lo"); | |
32 | if (!loopback) { | |
33 | if (errno == ENODEV) | |
34 | return log_tests_skipped_errno(errno, "Loopback device not found"); | |
35 | ||
36 | return handle_error_errno(errno, "Failed to create loopback device object"); | |
37 | } | |
38 | ||
39 | entry = udev_device_get_properties_list_entry(loopback); | |
40 | udev_list_entry_foreach(e, entry) | |
41 | printf("%s=%s\n", udev_list_entry_get_name(e), udev_list_entry_get_value(e)); | |
42 | ||
43 | r = pthread_create(&t, NULL, thread, &loopback); | |
44 | if (r != 0) | |
45 | return handle_error_errno(r, "Failed to create thread"); | |
46 | ||
47 | r = pthread_join(t, NULL); | |
48 | if (r != 0) | |
49 | return handle_error_errno(r, "Failed to wait thread finished"); | |
50 | ||
51 | if (loopback) | |
52 | return handle_error_errno(r, "loopback device is not unref()ed"); | |
53 | ||
54 | return 0; | |
55 | } |