]> git.proxmox.com Git - mirror_lxc.git/blame - src/lxc/macro.h
api_extensions: fix wrong licensing
[mirror_lxc.git] / src / lxc / macro.h
CommitLineData
279c45ee
CB
1/* liblxcapi
2 *
3 * Copyright © 2018 Christian Brauner <christian.brauner@ubuntu.com>.
4 * Copyright © 2018 Canonical Ltd.
5 *
3877934c
CB
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10
11 * This library is distributed in the hope that it will be useful,
279c45ee 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3877934c
CB
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this library; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
279c45ee
CB
19 */
20
21#ifndef __LXC_MACRO_H
22#define __LXC_MACRO_H
23
85de58d6 24#include <asm/types.h>
b3509169 25#include <limits.h>
85de58d6
CB
26#include <linux/if_link.h>
27#include <linux/loop.h>
28#include <linux/netlink.h>
29#include <linux/rtnetlink.h>
938980ba 30#include <linux/types.h>
245532a2 31#include <stdint.h>
2259663c 32#include <string.h>
85de58d6
CB
33#include <sys/mount.h>
34#include <sys/socket.h>
b1234129 35#include <sys/un.h>
2955a58a 36#include <unistd.h>
85de58d6 37
b3509169
CB
38#ifndef PATH_MAX
39#define PATH_MAX 4096
40#endif
41
279c45ee
CB
42/* Define __S_ISTYPE if missing from the C library. */
43#ifndef __S_ISTYPE
44#define __S_ISTYPE(mode, mask) (((mode)&S_IFMT) == (mask))
45#endif
46
ba2b6354
CB
47/* capabilities */
48#ifndef CAP_SYS_ADMIN
49#define CAP_SYS_ADMIN 21
50#endif
51
279c45ee
CB
52#ifndef CAP_SETFCAP
53#define CAP_SETFCAP 31
54#endif
55
56#ifndef CAP_MAC_OVERRIDE
57#define CAP_MAC_OVERRIDE 32
58#endif
59
60#ifndef CAP_MAC_ADMIN
61#define CAP_MAC_ADMIN 33
62#endif
279c45ee 63
279c45ee
CB
64#ifndef CAP_SETUID
65#define CAP_SETUID 7
66#endif
67
68#ifndef CAP_SETGID
69#define CAP_SETGID 6
70#endif
71
ba2b6354 72/* prctl */
1f207a5c
CB
73#ifndef PR_CAPBSET_READ
74#define PR_CAPBSET_READ 23
75#endif
76
ba2b6354 77#ifndef PR_CAPBSET_DROP
604ca1c0
CB
78#define PR_CAPBSET_DROP 24
79#endif
80
1f207a5c
CB
81/* Control the ambient capability set */
82#ifndef PR_CAP_AMBIENT
83#define PR_CAP_AMBIENT 47
84#endif
85
86#ifndef PR_CAP_AMBIENT_IS_SET
87#define PR_CAP_AMBIENT_IS_SET 1
88#endif
89
90#ifndef PR_CAP_AMBIENT_RAISE
91#define PR_CAP_AMBIENT_RAISE 2
92#endif
93
94#ifndef PR_CAP_AMBIENT_LOWER
95#define PR_CAP_AMBIENT_LOWER 3
96#endif
97
98#ifndef PR_CAP_AMBIENT_CLEAR_ALL
99#define PR_CAP_AMBIENT_CLEAR_ALL 4
100#endif
101
ba2b6354 102#ifndef PR_SET_NO_NEW_PRIVS
604ca1c0
CB
103#define PR_SET_NO_NEW_PRIVS 38
104#endif
105
ba2b6354 106#ifndef PR_GET_NO_NEW_PRIVS
604ca1c0
CB
107#define PR_GET_NO_NEW_PRIVS 39
108#endif
109
ba2b6354 110/* filesystem magic values */
279c45ee
CB
111#ifndef CGROUP_SUPER_MAGIC
112#define CGROUP_SUPER_MAGIC 0x27e0eb
113#endif
114
115#ifndef CGROUP2_SUPER_MAGIC
116#define CGROUP2_SUPER_MAGIC 0x63677270
117#endif
118
f26dc127
CB
119#ifndef NSFS_MAGIC
120#define NSFS_MAGIC 0x6e736673
121#endif
122
ba2b6354 123/* current overlayfs */
37ef15bb
CB
124#ifndef OVERLAY_SUPER_MAGIC
125#define OVERLAY_SUPER_MAGIC 0x794c7630
126#endif
127
ba2b6354
CB
128/* legacy overlayfs */
129#ifndef OVERLAYFS_SUPER_MAGIC
130#define OVERLAYFS_SUPER_MAGIC 0x794c764f
131#endif
132
f246d9b8
CB
133/* Calculate the number of chars needed to represent a given integer as a C
134 * string. Include room for '-' to indicate negative numbers and the \0 byte.
135 * This is based on systemd.
136 */
137#define INTTYPE_TO_STRLEN(type) \
138 (2 + (sizeof(type) <= 1 \
139 ? 3 \
140 : sizeof(type) <= 2 \
141 ? 5 \
142 : sizeof(type) <= 4 \
143 ? 10 \
144 : sizeof(type) <= 8 \
145 ? 20 \
146 : sizeof(int[-2 * (sizeof(type) > 8)])))
147
279c45ee 148/* Useful macros */
279c45ee
CB
149#define LXC_LINELEN 4096
150#define LXC_IDMAPLEN 4096
151#define LXC_MAX_BUFFER 4096
0c5ea884 152
279c45ee
CB
153/* /proc/ = 6
154 * +
0c5ea884 155 * <pid-as-str> = INTTYPE_TO_STRLEN(pid_t)
279c45ee
CB
156 * +
157 * /fd/ = 4
158 * +
0c5ea884 159 * <fd-as-str> = INTTYPE_TO_STRLEN(int)
279c45ee
CB
160 * +
161 * \0 = 1
162 */
0c9b1f82
CB
163#define LXC_PROC_PID_FD_LEN \
164 (6 + INTTYPE_TO_STRLEN(pid_t) + 4 + INTTYPE_TO_STRLEN(int) + 1)
165
166/* /proc/ = 6
167 * +
168 * <pid-as-str> = INTTYPE_TO_STRLEN(pid_t)
169 * +
170 * /status = 7
171 * +
172 * \0 = 1
173 */
174#define LXC_PROC_STATUS_LEN (6 + INTTYPE_TO_STRLEN(pid_t) + 7 + 1)
175
176/* /proc/ = 6
177 * +
178 * <pid-as-str> = INTTYPE_TO_STRLEN(pid_t)
179 * +
180 * /attr/ = 6
181 * +
182 * /current = 8
183 * +
184 * \0 = 1
185 */
186#define LXC_LSMATTRLEN (6 + INTTYPE_TO_STRLEN(pid_t) + 6 + 8 + 1)
0c5ea884 187
3c736187 188#define LXC_CMD_DATA_MAX (PATH_MAX * 2)
279c45ee
CB
189
190/* loop devices */
191#ifndef LO_FLAGS_AUTOCLEAR
192#define LO_FLAGS_AUTOCLEAR 4
193#endif
194
195#ifndef LOOP_CTL_GET_FREE
196#define LOOP_CTL_GET_FREE 0x4C82
197#endif
198
199/* memfd_create() */
200#ifndef MFD_CLOEXEC
201#define MFD_CLOEXEC 0x0001U
202#endif
203
204#ifndef MFD_ALLOW_SEALING
205#define MFD_ALLOW_SEALING 0x0002U
206#endif
207
208/**
209 * BUILD_BUG_ON - break compile if a condition is true.
210 * @condition: the condition which the compiler should know is false.
211 *
212 * If you have some code which relies on certain constants being equal, or
213 * other compile-time-evaluated condition, you should use BUILD_BUG_ON to
214 * detect if someone changes it.
215 *
216 * The implementation uses gcc's reluctance to create a negative array, but
217 * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments
218 * to inline functions). So as a fallback we use the optimizer; if it can't
219 * prove the condition is false, it will cause a link error on the undefined
220 * "__build_bug_on_failed". This error message can be harder to track down
221 * though, hence the two different methods.
222 */
223#ifndef __OPTIMIZE__
ba2b6354 224#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2 * !!(condition)]))
279c45ee
CB
225#else
226extern int __build_bug_on_failed;
ba2b6354
CB
227#define BUILD_BUG_ON(condition) \
228 do { \
229 ((void)sizeof(char[1 - 2 * !!(condition)])); \
230 if (condition) \
231 __build_bug_on_failed = 1; \
232 } while (0)
279c45ee
CB
233#endif
234
235#define lxc_iterate_parts(__iterator, __splitme, __separators) \
236 for (char *__p = NULL, *__it = strtok_r(__splitme, __separators, &__p); \
237 (__iterator = __it); \
238 __iterator = __it = strtok_r(NULL, __separators, &__p))
239
b81689a1
CB
240#define prctl_arg(x) ((unsigned long)x)
241
4fb34c04 242/* networking */
8df6fa99
CB
243#ifndef NETLINK_DUMP_STRICT_CHK
244#define NETLINK_DUMP_STRICT_CHK 12
245#endif
246
d38f5b17
CB
247#ifndef SOL_NETLINK
248#define SOL_NETLINK 270
249#endif
250
4fb34c04
CB
251#ifndef IFLA_LINKMODE
252#define IFLA_LINKMODE 17
253#endif
254
255#ifndef IFLA_LINKINFO
256#define IFLA_LINKINFO 18
257#endif
258
259#ifndef IFLA_NET_NS_PID
260#define IFLA_NET_NS_PID 19
261#endif
262
263#ifndef IFLA_INFO_KIND
264#define IFLA_INFO_KIND 1
265#endif
266
267#ifndef IFLA_VLAN_ID
268#define IFLA_VLAN_ID 1
269#endif
270
271#ifndef IFLA_INFO_DATA
272#define IFLA_INFO_DATA 2
273#endif
274
275#ifndef VETH_INFO_PEER
276#define VETH_INFO_PEER 1
277#endif
278
279#ifndef IFLA_MACVLAN_MODE
280#define IFLA_MACVLAN_MODE 1
281#endif
282
283#ifndef IFLA_NEW_NETNSID
284#define IFLA_NEW_NETNSID 45
285#endif
286
cc6119a0
CB
287#ifdef IFLA_IF_NETNSID
288#ifndef IFLA_TARGET_NETNSID
289#define IFLA_TARGET_NETNSID = IFLA_IF_NETNSID
290#endif
291#else
4fb34c04 292#define IFLA_IF_NETNSID 46
cc6119a0
CB
293#define IFLA_TARGET_NETNSID 46
294#endif
295
296#ifndef IFA_TARGET_NETNSID
297#define IFA_TARGET_NETNSID 10
4fb34c04
CB
298#endif
299
da5efb6f
CB
300#ifndef IFLA_STATS
301#define IFLA_STATS 7
302#endif
303
304#ifndef IFLA_STATS64
305#define IFLA_STATS64 23
306#endif
cc6119a0 307
873c6e87
CB
308#ifndef RTM_NEWNSID
309#define RTM_NEWNSID 88
310#endif
311
938980ba
CB
312#ifndef RTM_GETNSID
313#define RTM_GETNSID 90
314#endif
315
4e3ed0d1
CB
316#ifndef NLMSG_ERROR
317#define NLMSG_ERROR 0x2
318#endif
319
7b15813c
CB
320#ifndef MACVLAN_MODE_PRIVATE
321#define MACVLAN_MODE_PRIVATE 1
322#endif
323
324#ifndef MACVLAN_MODE_VEPA
325#define MACVLAN_MODE_VEPA 2
326#endif
327
328#ifndef MACVLAN_MODE_BRIDGE
329#define MACVLAN_MODE_BRIDGE 4
330#endif
331
332#ifndef MACVLAN_MODE_PASSTHRU
333#define MACVLAN_MODE_PASSTHRU 8
334#endif
335
cc6119a0
CB
336/* Attributes of RTM_NEWNSID/RTM_GETNSID messages */
337enum {
338 __LXC_NETNSA_NONE,
339#define __LXC_NETNSA_NSID_NOT_ASSIGNED -1
340 __LXC_NETNSA_NSID,
341 __LXC_NETNSA_PID,
342 __LXC_NETNSA_FD,
343 __LXC_NETNSA_MAX,
344};
345
b1234129
CB
346/* Length of abstract unix domain socket socket address. */
347#define LXC_AUDS_ADDR_LEN sizeof(((struct sockaddr_un *)0)->sun_path)
348
c881c810 349/* mount */
6e5655e0
CB
350#ifndef MS_PRIVATE
351#define MS_PRIVATE (1<<18)
c881c810
CB
352#endif
353
354#ifndef MS_SLAVE
355#define MS_SLAVE (1 << 19)
356#endif
357
6e5655e0
CB
358#ifndef MS_LAZYTIME
359#define MS_LAZYTIME (1<<25)
360#endif
361
362#ifndef MS_REC
363#define MS_REC 16384
364#endif
365
37ef15bb
CB
366/* open */
367#ifndef O_PATH
368#define O_PATH 010000000
369#endif
370
371#ifndef O_NOFOLLOW
372#define O_NOFOLLOW 00400000
373#endif
374
604ca1c0
CB
375/* sockets */
376#ifndef SOCK_CLOEXEC
377#define SOCK_CLOEXEC 02000000
378#endif
379
245532a2
CB
380/* pointer conversion macros */
381#define PTR_TO_INT(p) ((int)((intptr_t)(p)))
382#define INT_TO_PTR(u) ((void *)((intptr_t)(u)))
383
9234406b
CB
384#define PTR_TO_INTMAX(p) ((intmax_t)((intptr_t)(p)))
385#define INTMAX_TO_PTR(u) ((void *)((intptr_t)(u)))
386
b962868f
CB
387#define LXC_INVALID_UID ((uid_t)-1)
388#define LXC_INVALID_GID ((gid_t)-1)
389
36dee4a2
CB
390#define STRLITERALLEN(x) (sizeof(""x"") - 1)
391#define STRARRAYLEN(x) (sizeof(x) - 1)
392
7c4d9466
CB
393/* Maximum number of bytes sendfile() is able to send in one go. */
394#define LXC_SENDFILE_MAX 0x7ffff000
395
c74da4ab
CB
396#define steal_ptr(ptr) \
397 ({ \
398 typeof(ptr) _ptr_ = (ptr); \
399 (ptr) = NULL; \
400 _ptr_; \
401 })
402
279c45ee 403#endif /* __LXC_MACRO_H */