]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd/sd-device/device-util.h
136d399d7eb84a3ad779a9a6efaa0fd6ba7ec794
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
9 #define device_unref_and_replace(a, b) \
10 unref_and_replace_full(a, b, sd_device_ref, sd_device_unref)
12 #define FOREACH_DEVICE_PROPERTY(device, key, value) \
13 for (const char *value, *key = sd_device_get_property_first(device, &value); \
15 key = sd_device_get_property_next(device, &value))
17 #define FOREACH_DEVICE_TAG(device, tag) \
18 for (const char *tag = sd_device_get_tag_first(device); \
20 tag = sd_device_get_tag_next(device))
22 #define FOREACH_DEVICE_CURRENT_TAG(device, tag) \
23 for (const char *tag = sd_device_get_current_tag_first(device); \
25 tag = sd_device_get_current_tag_next(device))
27 #define FOREACH_DEVICE_SYSATTR(device, attr) \
28 for (const char *attr = sd_device_get_sysattr_first(device); \
30 attr = sd_device_get_sysattr_next(device))
32 #define FOREACH_DEVICE_DEVLINK(device, devlink) \
33 for (const char *devlink = sd_device_get_devlink_first(device); \
35 devlink = sd_device_get_devlink_next(device))
37 #define _FOREACH_DEVICE_CHILD(device, child, suffix_ptr) \
38 for (sd_device *child = sd_device_get_child_first(device, suffix_ptr); \
40 child = sd_device_get_child_next(device, suffix_ptr))
42 #define FOREACH_DEVICE_CHILD(device, child) \
43 _FOREACH_DEVICE_CHILD(device, child, NULL)
45 #define FOREACH_DEVICE_CHILD_WITH_SUFFIX(device, child, suffix) \
46 _FOREACH_DEVICE_CHILD(device, child, &suffix)
48 #define FOREACH_DEVICE(enumerator, device) \
49 for (sd_device *device = sd_device_enumerator_get_device_first(enumerator); \
51 device = sd_device_enumerator_get_device_next(enumerator))
53 #define FOREACH_SUBSYSTEM(enumerator, device) \
54 for (sd_device *device = sd_device_enumerator_get_subsystem_first(enumerator); \
56 device = sd_device_enumerator_get_subsystem_next(enumerator))
58 #define log_device_full_errno_zerook(device, level, error, ...) \
60 const char *_sysname = NULL; \
61 sd_device *_d = (device); \
62 int _level = (level), _e = (error); \
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__); \
71 #define log_device_full_errno(device, level, error, ...) \
73 int _error = (error); \
74 ASSERT_NON_ZERO(_error); \
75 log_device_full_errno_zerook(device, level, _error, __VA_ARGS__); \
78 #define log_device_full(device, level, ...) (void) log_device_full_errno_zerook(device, level, 0, __VA_ARGS__)
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__)
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__)
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
);
96 char** device_make_log_fields(sd_device
*device
);
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__))
102 int device_is_devtype(sd_device
*device
, const char *devtype
);
104 int device_is_subsystem_devtype(sd_device
*device
, const char *subsystem
, const char *devtype
);
106 int device_get_seat(sd_device
*device
, const char **ret
);
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)
112 bool device_property_can_set(const char *property
) _pure_
;