]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
57fa1d09 TG |
2 | #pragma once |
3 | ||
023e75df ZJS |
4 | #include "sd-device.h" |
5 | ||
5cdf13c7 | 6 | #include "forward.h" |
ac790e8b | 7 | #include "log.h" |
ac790e8b | 8 | |
d6985e76 YW |
9 | #define device_unref_and_replace(a, b) \ |
10 | unref_and_replace_full(a, b, sd_device_ref, sd_device_unref) | |
11 | ||
9194c1e6 ZJS |
12 | #define FOREACH_DEVICE_PROPERTY(device, key, value) \ |
13 | for (const char *value, *key = sd_device_get_property_first(device, &value); \ | |
14 | key; \ | |
15 | key = sd_device_get_property_next(device, &value)) | |
16 | ||
17 | #define FOREACH_DEVICE_TAG(device, tag) \ | |
18 | for (const char *tag = sd_device_get_tag_first(device); \ | |
19 | tag; \ | |
57fa1d09 TG |
20 | tag = sd_device_get_tag_next(device)) |
21 | ||
9194c1e6 | 22 | #define FOREACH_DEVICE_CURRENT_TAG(device, tag) \ |
a1af8372 | 23 | for (const char *tag = sd_device_get_current_tag_first(device); \ |
9194c1e6 | 24 | tag; \ |
e77b146f LP |
25 | tag = sd_device_get_current_tag_next(device)) |
26 | ||
9194c1e6 ZJS |
27 | #define FOREACH_DEVICE_SYSATTR(device, attr) \ |
28 | for (const char *attr = sd_device_get_sysattr_first(device); \ | |
29 | attr; \ | |
57fa1d09 TG |
30 | attr = sd_device_get_sysattr_next(device)) |
31 | ||
9194c1e6 | 32 | #define FOREACH_DEVICE_DEVLINK(device, devlink) \ |
a1af8372 | 33 | for (const char *devlink = sd_device_get_devlink_first(device); \ |
9194c1e6 | 34 | devlink; \ |
57fa1d09 | 35 | devlink = sd_device_get_devlink_next(device)) |
96df036f | 36 | |
ec9b4f2b | 37 | #define _FOREACH_DEVICE_CHILD(device, child, suffix_ptr) \ |
9194c1e6 | 38 | for (sd_device *child = sd_device_get_child_first(device, suffix_ptr); \ |
ec9b4f2b YW |
39 | child; \ |
40 | child = sd_device_get_child_next(device, suffix_ptr)) | |
41 | ||
42 | #define FOREACH_DEVICE_CHILD(device, child) \ | |
43 | _FOREACH_DEVICE_CHILD(device, child, NULL) | |
44 | ||
45 | #define FOREACH_DEVICE_CHILD_WITH_SUFFIX(device, child, suffix) \ | |
46 | _FOREACH_DEVICE_CHILD(device, child, &suffix) | |
47 | ||
9194c1e6 | 48 | #define FOREACH_DEVICE(enumerator, device) \ |
a1af8372 | 49 | for (sd_device *device = sd_device_enumerator_get_device_first(enumerator); \ |
9194c1e6 | 50 | device; \ |
96df036f TG |
51 | device = sd_device_enumerator_get_device_next(enumerator)) |
52 | ||
9194c1e6 | 53 | #define FOREACH_SUBSYSTEM(enumerator, device) \ |
a1af8372 | 54 | for (sd_device *device = sd_device_enumerator_get_subsystem_first(enumerator); \ |
9194c1e6 | 55 | device; \ |
96df036f | 56 | device = sd_device_enumerator_get_subsystem_next(enumerator)) |
b0cba0ca | 57 | |
8d1c9489 | 58 | #define log_device_full_errno_zerook(device, level, error, ...) \ |
b0cba0ca | 59 | ({ \ |
38d1555d | 60 | const char *_sysname = NULL; \ |
b0cba0ca | 61 | sd_device *_d = (device); \ |
8d1c9489 | 62 | int _level = (level), _e = (error); \ |
b0cba0ca | 63 | \ |
46d4149d | 64 | if (_d && _unlikely_(log_get_max_level() >= LOG_PRI(_level))) \ |
b0cba0ca | 65 | (void) sd_device_get_sysname(_d, &_sysname); \ |
8d1c9489 | 66 | log_object_internal(_level, _e, PROJECT_FILE, __LINE__, __func__, \ |
b0cba0ca | 67 | _sysname ? "DEVICE=" : NULL, _sysname, \ |
ab54f12b | 68 | NULL, NULL, __VA_ARGS__); \ |
b0cba0ca YW |
69 | }) |
70 | ||
8d1c9489 ZJS |
71 | #define log_device_full_errno(device, level, error, ...) \ |
72 | ({ \ | |
73 | int _error = (error); \ | |
74 | ASSERT_NON_ZERO(_error); \ | |
75 | log_device_full_errno_zerook(device, level, _error, __VA_ARGS__); \ | |
76 | }) | |
77 | ||
78 | #define log_device_full(device, level, ...) (void) log_device_full_errno_zerook(device, level, 0, __VA_ARGS__) | |
ab54f12b | 79 | |
9194c1e6 ZJS |
80 | #define log_device_debug(device, ...) log_device_full(device, LOG_DEBUG, __VA_ARGS__) |
81 | #define log_device_info(device, ...) log_device_full(device, LOG_INFO, __VA_ARGS__) | |
82 | #define log_device_notice(device, ...) log_device_full(device, LOG_NOTICE, __VA_ARGS__) | |
ab54f12b | 83 | #define log_device_warning(device, ...) log_device_full(device, LOG_WARNING, __VA_ARGS__) |
9194c1e6 | 84 | #define log_device_error(device, ...) log_device_full(device, LOG_ERR, __VA_ARGS__) |
ab54f12b | 85 | |
9194c1e6 ZJS |
86 | #define log_device_debug_errno(device, error, ...) log_device_full_errno(device, LOG_DEBUG, error, __VA_ARGS__) |
87 | #define log_device_info_errno(device, error, ...) log_device_full_errno(device, LOG_INFO, error, __VA_ARGS__) | |
88 | #define log_device_notice_errno(device, error, ...) log_device_full_errno(device, LOG_NOTICE, error, __VA_ARGS__) | |
ab54f12b | 89 | #define log_device_warning_errno(device, error, ...) log_device_full_errno(device, LOG_WARNING, error, __VA_ARGS__) |
9194c1e6 | 90 | #define log_device_error_errno(device, error, ...) log_device_full_errno(device, LOG_ERR, error, __VA_ARGS__) |
f79fdea6 | 91 | |
4fe46c34 | 92 | int devname_from_devnum(mode_t mode, dev_t devnum, char **ret); |
5cdf13c7 | 93 | int devname_from_stat_rdev(const struct stat *st, char **ret); |
bca4dc29 | 94 | int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret_devname); |
e808a1d1 DDM |
95 | |
96 | char** device_make_log_fields(sd_device *device); | |
3b34580d | 97 | |
ab1bd9da YW |
98 | int device_in_subsystem_strv(sd_device *device, char * const *subsystems); |
99 | #define device_in_subsystem(device, ...) \ | |
100 | device_in_subsystem_strv(device, STRV_MAKE(__VA_ARGS__)) | |
101 | ||
102 | int device_is_devtype(sd_device *device, const char *devtype); | |
103 | ||
104 | int device_is_subsystem_devtype(sd_device *device, const char *subsystem, const char *devtype); | |
105 | ||
2012d6d7 YW |
106 | int device_get_seat(sd_device *device, const char **ret); |
107 | ||
ab1bd9da YW |
108 | int device_sysname_startswith_strv(sd_device *device, char * const *prefixes, const char **ret_suffix); |
109 | #define device_sysname_startswith(device, ...) \ | |
110 | device_sysname_startswith_strv(device, STRV_MAKE(__VA_ARGS__), NULL) | |
513ca8b6 | 111 | |
e548ca38 | 112 | bool device_property_can_set(const char *property) _pure_; |