]>
Commit | Line | Data |
---|---|---|
1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ | |
2 | #pragma once | |
3 | ||
4 | #include "sd-device.h" | |
5 | ||
6 | #include "forward.h" | |
7 | #include "log.h" | |
8 | ||
9 | #define device_unref_and_replace(a, b) \ | |
10 | unref_and_replace_full(a, b, sd_device_ref, sd_device_unref) | |
11 | ||
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; \ | |
20 | tag = sd_device_get_tag_next(device)) | |
21 | ||
22 | #define FOREACH_DEVICE_CURRENT_TAG(device, tag) \ | |
23 | for (const char *tag = sd_device_get_current_tag_first(device); \ | |
24 | tag; \ | |
25 | tag = sd_device_get_current_tag_next(device)) | |
26 | ||
27 | #define FOREACH_DEVICE_SYSATTR(device, attr) \ | |
28 | for (const char *attr = sd_device_get_sysattr_first(device); \ | |
29 | attr; \ | |
30 | attr = sd_device_get_sysattr_next(device)) | |
31 | ||
32 | #define FOREACH_DEVICE_DEVLINK(device, devlink) \ | |
33 | for (const char *devlink = sd_device_get_devlink_first(device); \ | |
34 | devlink; \ | |
35 | devlink = sd_device_get_devlink_next(device)) | |
36 | ||
37 | #define _FOREACH_DEVICE_CHILD(device, child, suffix_ptr) \ | |
38 | for (sd_device *child = sd_device_get_child_first(device, suffix_ptr); \ | |
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 | ||
48 | #define FOREACH_DEVICE(enumerator, device) \ | |
49 | for (sd_device *device = sd_device_enumerator_get_device_first(enumerator); \ | |
50 | device; \ | |
51 | device = sd_device_enumerator_get_device_next(enumerator)) | |
52 | ||
53 | #define FOREACH_SUBSYSTEM(enumerator, device) \ | |
54 | for (sd_device *device = sd_device_enumerator_get_subsystem_first(enumerator); \ | |
55 | device; \ | |
56 | device = sd_device_enumerator_get_subsystem_next(enumerator)) | |
57 | ||
58 | #define log_device_full_errno_zerook(device, level, error, ...) \ | |
59 | ({ \ | |
60 | const char *_sysname = NULL; \ | |
61 | sd_device *_d = (device); \ | |
62 | int _level = (level), _e = (error); \ | |
63 | \ | |
64 | if (_d && _unlikely_(log_get_max_level() >= LOG_PRI(_level))) \ | |
65 | (void) sd_device_get_sysname(_d, &_sysname); \ | |
66 | log_object_internal(_level, _e, PROJECT_FILE, __LINE__, __func__, \ | |
67 | _sysname ? "DEVICE=" : NULL, _sysname, \ | |
68 | NULL, NULL, __VA_ARGS__); \ | |
69 | }) | |
70 | ||
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__) | |
79 | ||
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__) | |
83 | #define log_device_warning(device, ...) log_device_full(device, LOG_WARNING, __VA_ARGS__) | |
84 | #define log_device_error(device, ...) log_device_full(device, LOG_ERR, __VA_ARGS__) | |
85 | ||
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__) | |
89 | #define log_device_warning_errno(device, error, ...) log_device_full_errno(device, LOG_WARNING, error, __VA_ARGS__) | |
90 | #define log_device_error_errno(device, error, ...) log_device_full_errno(device, LOG_ERR, error, __VA_ARGS__) | |
91 | ||
92 | int devname_from_devnum(mode_t mode, dev_t devnum, char **ret); | |
93 | int devname_from_stat_rdev(const struct stat *st, char **ret); | |
94 | int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret_devname); | |
95 | ||
96 | char** device_make_log_fields(sd_device *device); | |
97 | ||
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 | ||
106 | int device_get_seat(sd_device *device, const char **ret); | |
107 | ||
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) | |
111 | ||
112 | bool device_property_can_set(const char *property) _pure_; |