/src/systemd/src/basic/errno-util.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
2 | | #pragma once |
3 | | |
4 | | #include <string.h> |
5 | | |
6 | | #include "forward.h" |
7 | | |
8 | | /* strerror(3) says that glibc uses a maximum length of 1024 bytes. */ |
9 | | #define ERRNO_BUF_LEN 1024 |
10 | | |
11 | | /* Note: the lifetime of the compound literal is the immediately surrounding block, |
12 | | * see C11 §6.5.2.5, and |
13 | | * https://stackoverflow.com/questions/34880638/compound-literal-lifetime-and-if-blocks |
14 | | * |
15 | | * Note that we use the GNU variant of strerror_r() here. */ |
16 | | #define STRERROR(errnum) strerror_r(ABS(errnum), (char[ERRNO_BUF_LEN]){}, ERRNO_BUF_LEN) |
17 | | |
18 | | /* A helper to print an error message or message for functions that return 0 on EOF. |
19 | | * Note that we can't use ({ … }) to define a temporary variable, so errnum is |
20 | | * evaluated twice. */ |
21 | | #define STRERROR_OR_EOF(errnum) ((errnum) != 0 ? STRERROR(errnum) : "Unexpected EOF") |
22 | | |
23 | 0 | static inline void _reset_errno_(int *saved_errno) { |
24 | 0 | if (*saved_errno < 0) /* Invalidated by UNPROTECT_ERRNO? */ |
25 | 0 | return; |
26 | 0 |
|
27 | 0 | errno = *saved_errno; |
28 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:_reset_errno_ Unexecuted instantiation: udev-builtin-dissect_image.c:_reset_errno_ Unexecuted instantiation: udev-builtin-net_driver.c:_reset_errno_ Unexecuted instantiation: udev-ctrl.c:_reset_errno_ Unexecuted instantiation: udev-error.c:_reset_errno_ Unexecuted instantiation: udev-format.c:_reset_errno_ Unexecuted instantiation: udev-manager.c:_reset_errno_ Unexecuted instantiation: udev-node.c:_reset_errno_ Unexecuted instantiation: udev-rules.c:_reset_errno_ Unexecuted instantiation: udev-watch.c:_reset_errno_ Unexecuted instantiation: udev-worker.c:_reset_errno_ |
29 | | |
30 | | #define PROTECT_ERRNO \ |
31 | | _cleanup_(_reset_errno_) _unused_ int _saved_errno_ = errno |
32 | | |
33 | | #define UNPROTECT_ERRNO \ |
34 | | do { \ |
35 | | errno = _saved_errno_; \ |
36 | | _saved_errno_ = -1; \ |
37 | | } while (false) |
38 | | |
39 | | #define LOCAL_ERRNO(value) \ |
40 | | PROTECT_ERRNO; \ |
41 | | errno = ABS(value) |
42 | | |
43 | | #define return_with_errno(r, err) \ |
44 | | do { \ |
45 | | errno = ABS(err); \ |
46 | | return r; \ |
47 | | } while (false) |
48 | | |
49 | 0 | static inline int negative_errno(void) { |
50 | | /* This helper should be used to shut up gcc if you know 'errno' is |
51 | | * negative. Instead of "return -errno;", use "return negative_errno();" |
52 | | * It will suppress bogus gcc warnings in case it assumes 'errno' might |
53 | | * be 0 and thus the caller's error-handling might not be triggered. */ |
54 | 0 | assert_return(errno > 0, -EINVAL); |
55 | 0 | return -errno; |
56 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:negative_errno Unexecuted instantiation: udev-builtin-dissect_image.c:negative_errno Unexecuted instantiation: udev-builtin-net_driver.c:negative_errno Unexecuted instantiation: udev-ctrl.c:negative_errno Unexecuted instantiation: udev-error.c:negative_errno Unexecuted instantiation: udev-format.c:negative_errno Unexecuted instantiation: udev-manager.c:negative_errno Unexecuted instantiation: udev-node.c:negative_errno Unexecuted instantiation: udev-rules.c:negative_errno Unexecuted instantiation: udev-watch.c:negative_errno Unexecuted instantiation: udev-worker.c:negative_errno |
57 | | |
58 | 0 | static inline int RET_NERRNO(int ret) { |
59 | | |
60 | | /* Helper to wrap system calls in to make them return negative errno errors. This brings system call |
61 | | * error handling in sync with how we usually handle errors in our own code, i.e. with immediate |
62 | | * returning of negative errno. Usage is like this: |
63 | | * |
64 | | * … |
65 | | * r = RET_NERRNO(unlink(t)); |
66 | | * … |
67 | | * |
68 | | * or |
69 | | * |
70 | | * … |
71 | | * fd = RET_NERRNO(open("/etc/fstab", O_RDONLY|O_CLOEXEC)); |
72 | | * … |
73 | | */ |
74 | |
|
75 | 0 | if (ret < 0) |
76 | 0 | return negative_errno(); |
77 | | |
78 | 0 | return ret; |
79 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:RET_NERRNO Unexecuted instantiation: udev-builtin-dissect_image.c:RET_NERRNO Unexecuted instantiation: udev-builtin-net_driver.c:RET_NERRNO Unexecuted instantiation: udev-ctrl.c:RET_NERRNO Unexecuted instantiation: udev-error.c:RET_NERRNO Unexecuted instantiation: udev-format.c:RET_NERRNO Unexecuted instantiation: udev-manager.c:RET_NERRNO Unexecuted instantiation: udev-node.c:RET_NERRNO Unexecuted instantiation: udev-rules.c:RET_NERRNO Unexecuted instantiation: udev-watch.c:RET_NERRNO Unexecuted instantiation: udev-worker.c:RET_NERRNO |
80 | | |
81 | | /* Collect possible errors in <acc>, so that the first error can be returned. |
82 | | * Returns (possibly updated) <acc>. */ |
83 | | #define RET_GATHER(acc, err) \ |
84 | 0 | ({ \ |
85 | 0 | int *__a = &(acc), __e = (err); \ |
86 | 0 | if (*__a >= 0 && __e < 0) \ |
87 | 0 | *__a = __e; \ |
88 | 0 | *__a; \ |
89 | 0 | }) |
90 | | |
91 | 0 | static inline int errno_or_else(int fallback) { |
92 | 0 | /* To be used when invoking library calls where errno handling is not defined clearly: we return |
93 | 0 | * errno if it is set, and the specified error otherwise. The idea is that the caller initializes |
94 | 0 | * errno to zero before doing an API call, and then uses this helper to retrieve a somewhat useful |
95 | 0 | * error code */ |
96 | 0 | if (errno > 0) |
97 | 0 | return -errno; |
98 | 0 |
|
99 | 0 | return -ABS(fallback); |
100 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:errno_or_else Unexecuted instantiation: udev-builtin-dissect_image.c:errno_or_else Unexecuted instantiation: udev-builtin-net_driver.c:errno_or_else Unexecuted instantiation: udev-ctrl.c:errno_or_else Unexecuted instantiation: udev-error.c:errno_or_else Unexecuted instantiation: udev-format.c:errno_or_else Unexecuted instantiation: udev-manager.c:errno_or_else Unexecuted instantiation: udev-node.c:errno_or_else Unexecuted instantiation: udev-rules.c:errno_or_else Unexecuted instantiation: udev-watch.c:errno_or_else Unexecuted instantiation: udev-worker.c:errno_or_else |
101 | | |
102 | | /* abs(3) says: Trying to take the absolute value of the most negative integer is not defined. */ |
103 | | #define _DEFINE_ABS_WRAPPER(name) \ |
104 | 0 | static inline bool ERRNO_IS_##name(intmax_t r) { \ |
105 | 0 | if (r == INTMAX_MIN) \ |
106 | 0 | return false; \ |
107 | 0 | return ERRNO_IS_NEG_##name(-ABS(r)); \ |
108 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-error.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-error.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-error.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-error.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-error.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-error.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-error.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-error.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-error.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-error.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-format.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-format.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-format.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-format.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-format.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-format.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-format.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-format.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-format.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-format.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-manager.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-manager.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-manager.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-manager.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-manager.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-manager.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-manager.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-node.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-node.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-node.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-node.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-node.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-node.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-node.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-node.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-node.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-node.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-rules.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-rules.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-rules.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-rules.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-rules.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-rules.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-rules.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-watch.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-watch.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-watch.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-watch.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-watch.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-watch.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-watch.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_XATTR_ABSENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_DEVICE_ABSENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_TRANSIENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_DISCONNECT Unexecuted instantiation: udev-worker.c:ERRNO_IS_ACCEPT_AGAIN Unexecuted instantiation: udev-worker.c:ERRNO_IS_RESOURCE Unexecuted instantiation: udev-worker.c:ERRNO_IS_NOT_SUPPORTED Unexecuted instantiation: udev-worker.c:ERRNO_IS_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-worker.c:ERRNO_IS_PRIVILEGE Unexecuted instantiation: udev-worker.c:ERRNO_IS_DISK_SPACE Unexecuted instantiation: udev-worker.c:ERRNO_IS_XATTR_ABSENT |
109 | | |
110 | | /* For send()/recv() or read()/write(). */ |
111 | 0 | static inline bool ERRNO_IS_NEG_TRANSIENT(intmax_t r) { |
112 | 0 | return IN_SET(r, |
113 | 0 | -EAGAIN, |
114 | 0 | -EINTR); |
115 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_TRANSIENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_TRANSIENT |
116 | | _DEFINE_ABS_WRAPPER(TRANSIENT); |
117 | | |
118 | | /* Hint #1: ENETUNREACH happens if we try to connect to "non-existing" special IP addresses, such as ::5. |
119 | | * |
120 | | * Hint #2: The kernel sends e.g., EHOSTUNREACH or ENONET to userspace in some ICMP error cases. See the |
121 | | * icmp_err_convert[] in net/ipv4/icmp.c in the kernel sources. |
122 | | * |
123 | | * Hint #3: When asynchronous connect() on TCP fails because the host never acknowledges a single packet, |
124 | | * kernel tells us that with ETIMEDOUT, see tcp(7). */ |
125 | 0 | static inline bool ERRNO_IS_NEG_DISCONNECT(intmax_t r) { |
126 | 0 | return IN_SET(r, |
127 | 0 | -ECONNABORTED, |
128 | 0 | -ECONNREFUSED, |
129 | 0 | -ECONNRESET, |
130 | 0 | -EHOSTDOWN, |
131 | 0 | -EHOSTUNREACH, |
132 | 0 | -ENETDOWN, |
133 | 0 | -ENETRESET, |
134 | 0 | -ENETUNREACH, |
135 | 0 | -ENONET, |
136 | 0 | -ENOPROTOOPT, |
137 | 0 | -ENOTCONN, |
138 | 0 | -EPIPE, |
139 | 0 | -EPROTO, |
140 | 0 | -ESHUTDOWN, |
141 | 0 | -ETIMEDOUT); |
142 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_DISCONNECT Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_DISCONNECT |
143 | | _DEFINE_ABS_WRAPPER(DISCONNECT); |
144 | | |
145 | | /* Transient errors we might get on accept() that we should ignore. As per error handling comment in |
146 | | * the accept(2) man page. */ |
147 | 0 | static inline bool ERRNO_IS_NEG_ACCEPT_AGAIN(intmax_t r) { |
148 | 0 | return ERRNO_IS_NEG_DISCONNECT(r) || |
149 | 0 | ERRNO_IS_NEG_TRANSIENT(r) || |
150 | 0 | r == -EOPNOTSUPP; |
151 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_ACCEPT_AGAIN Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_ACCEPT_AGAIN |
152 | | _DEFINE_ABS_WRAPPER(ACCEPT_AGAIN); |
153 | | |
154 | | /* Resource exhaustion, could be our fault or general system trouble */ |
155 | 0 | static inline bool ERRNO_IS_NEG_RESOURCE(intmax_t r) { |
156 | 0 | return IN_SET(r, |
157 | 0 | -EMFILE, |
158 | 0 | -ENFILE, |
159 | 0 | -ENOMEM); |
160 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_RESOURCE Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_RESOURCE |
161 | | _DEFINE_ABS_WRAPPER(RESOURCE); |
162 | | |
163 | | /* Seven different errors for "operation/system call/socket feature not supported" */ |
164 | 0 | static inline bool ERRNO_IS_NEG_NOT_SUPPORTED(intmax_t r) { |
165 | 0 | return IN_SET(r, |
166 | 0 | -EOPNOTSUPP, |
167 | 0 | -ENOTTY, |
168 | 0 | -ENOSYS, |
169 | 0 | -EAFNOSUPPORT, |
170 | 0 | -EPFNOSUPPORT, |
171 | 0 | -EPROTONOSUPPORT, |
172 | 0 | -ESOCKTNOSUPPORT, |
173 | 0 | -ENOPROTOOPT); |
174 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_NOT_SUPPORTED Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_NOT_SUPPORTED |
175 | | _DEFINE_ABS_WRAPPER(NOT_SUPPORTED); |
176 | | |
177 | | /* ioctl() with unsupported command/arg might additionally return EINVAL */ |
178 | 0 | static inline bool ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED(intmax_t r) { |
179 | 0 | return ERRNO_IS_NEG_NOT_SUPPORTED(r) || r == -EINVAL; |
180 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_IOCTL_NOT_SUPPORTED |
181 | | _DEFINE_ABS_WRAPPER(IOCTL_NOT_SUPPORTED); |
182 | | |
183 | | /* Two different errors for access problems */ |
184 | 0 | static inline bool ERRNO_IS_NEG_PRIVILEGE(intmax_t r) { |
185 | 0 | return IN_SET(r, |
186 | 0 | -EACCES, |
187 | 0 | -EPERM); |
188 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_PRIVILEGE Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_PRIVILEGE |
189 | | _DEFINE_ABS_WRAPPER(PRIVILEGE); |
190 | | |
191 | | /* Three different errors for "not enough disk space" */ |
192 | 0 | static inline bool ERRNO_IS_NEG_DISK_SPACE(intmax_t r) { |
193 | 0 | return IN_SET(r, |
194 | 0 | -ENOSPC, |
195 | 0 | -EDQUOT, |
196 | 0 | -EFBIG); |
197 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_DISK_SPACE Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_DISK_SPACE |
198 | | _DEFINE_ABS_WRAPPER(DISK_SPACE); |
199 | | |
200 | | /* Three different errors for "this device does not quite exist" */ |
201 | 0 | static inline bool ERRNO_IS_NEG_DEVICE_ABSENT(intmax_t r) { |
202 | 0 | return IN_SET(r, |
203 | 0 | -ENODEV, |
204 | 0 | -ENXIO, |
205 | 0 | -ENOENT); |
206 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_DEVICE_ABSENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_DEVICE_ABSENT |
207 | | _DEFINE_ABS_WRAPPER(DEVICE_ABSENT); |
208 | | |
209 | | /* Quite often we want to handle cases where the backing FS doesn't support extended attributes at all and |
210 | | * where it simply doesn't have the requested xattr the same way */ |
211 | 0 | static inline bool ERRNO_IS_NEG_XATTR_ABSENT(intmax_t r) { |
212 | 0 | return r == -ENODATA || |
213 | 0 | ERRNO_IS_NEG_NOT_SUPPORTED(r); |
214 | 0 | } Unexecuted instantiation: udev-builtin-btrfs.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-builtin-dissect_image.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-builtin-net_driver.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-ctrl.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-error.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-format.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-manager.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-node.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-rules.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-watch.c:ERRNO_IS_NEG_XATTR_ABSENT Unexecuted instantiation: udev-worker.c:ERRNO_IS_NEG_XATTR_ABSENT |
215 | | _DEFINE_ABS_WRAPPER(XATTR_ABSENT); |