1 /* SPDX-License-Identifier: GPL-2.0 */
3 #ifndef __IDMAP_UTILS_H
4 #define __IDMAP_UTILS_H
10 #include <linux/types.h>
18 #include <sys/types.h>
23 /* Maximum number of nested user namespaces in the kernel. */
24 #define MAX_USERNS_LEVEL 32
26 /* A few helpful macros. */
27 #define STRLITERALLEN(x) (sizeof(""x"") - 1)
29 #define INTTYPE_TO_STRLEN(type) \
30 (2 + (sizeof(type) <= 1 \
36 : sizeof(type) <= 8 ? 20 : sizeof(int[-2 * (sizeof(type) > 8)])))
38 #define syserror(format, ...) \
40 fprintf(stderr, "%m - " format "\n", ##__VA_ARGS__); \
44 #define syserror_set(__ret__, format, ...) \
46 typeof(__ret__) __internal_ret__ = (__ret__); \
47 errno = labs(__ret__); \
48 fprintf(stderr, "%m - " format "\n", ##__VA_ARGS__); \
52 typedef enum idmap_type_t {
58 idmap_type_t map_type;
70 struct userns_hierarchy {
77 #define list_for_each(__iterator, __list) \
78 for (__iterator = (__list)->next; __iterator != __list; __iterator = __iterator->next)
80 #define list_for_each_safe(__iterator, __list, __next) \
81 for (__iterator = (__list)->next, __next = __iterator->next; \
82 __iterator != __list; __iterator = __next, __next = __next->next)
84 static inline void list_init(struct list *list)
87 list->next = list->prev = list;
90 static inline int list_empty(const struct list *list)
92 return list == list->next;
95 static inline void __list_add(struct list *new, struct list *prev, struct list *next)
103 static inline void list_add_tail(struct list *head, struct list *list)
105 __list_add(list, head->prev, head);
108 static inline void list_del(struct list *list)
110 struct list *next, *prev;
118 extern pid_t do_clone(int (*fn)(void *), void *arg, int flags);
119 extern int get_userns_fd(unsigned long nsid, unsigned long hostid,
120 unsigned long range);
121 extern int get_userns_fd_from_idmap(struct list *idmap);
122 extern ssize_t read_nointr(int fd, void *buf, size_t count);
123 extern int wait_for_pid(pid_t pid);
124 extern ssize_t write_nointr(int fd, const void *buf, size_t count);
125 extern bool switch_ids(uid_t uid, gid_t gid);
126 extern int create_userns_hierarchy(struct userns_hierarchy *h);
127 extern int add_map_entry(struct list *head, __u32 id_host, __u32 id_ns,
128 __u32 range, idmap_type_t map_type);
130 #endif /* __IDMAP_UTILS_H */