]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-device/device-util.h
man/systemd-sysext: list ephemeral/ephemeral-import in the list of options
[thirdparty/systemd.git] / src / libsystemd / sd-device / device-util.h
CommitLineData
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 92int devname_from_devnum(mode_t mode, dev_t devnum, char **ret);
5cdf13c7 93int devname_from_stat_rdev(const struct stat *st, char **ret);
bca4dc29 94int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret_devname);
e808a1d1
DDM
95
96char** device_make_log_fields(sd_device *device);
3b34580d 97
ab1bd9da
YW
98int 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
102int device_is_devtype(sd_device *device, const char *devtype);
103
104int device_is_subsystem_devtype(sd_device *device, const char *subsystem, const char *devtype);
105
2012d6d7
YW
106int device_get_seat(sd_device *device, const char **ret);
107
ab1bd9da
YW
108int 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 112bool device_property_can_set(const char *property) _pure_;