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