]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd/sd-device/device-util.h
device-util: Declare iterator variables inline
[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
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 96int devname_from_devnum(mode_t mode, dev_t devnum, char **ret);
778912a6
YW
97static 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 101int device_open_from_devnum(mode_t mode, dev_t devnum, int flags, char **ret);
e808a1d1
DDM
102
103char** device_make_log_fields(sd_device *device);