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