xref: /linux/tools/testing/selftests/filesystems/utils.h (revision c68946ee7eb7fb5dc19c8d11f7e4e696c8ee6508)
1*c68946eeSChristian Brauner /* SPDX-License-Identifier: GPL-2.0 */
2*c68946eeSChristian Brauner 
3*c68946eeSChristian Brauner #ifndef __IDMAP_UTILS_H
4*c68946eeSChristian Brauner #define __IDMAP_UTILS_H
5*c68946eeSChristian Brauner 
6*c68946eeSChristian Brauner #ifndef _GNU_SOURCE
7*c68946eeSChristian Brauner #define _GNU_SOURCE
8*c68946eeSChristian Brauner #endif
9*c68946eeSChristian Brauner #include <errno.h>
10*c68946eeSChristian Brauner #include <linux/types.h>
11*c68946eeSChristian Brauner #include <sched.h>
12*c68946eeSChristian Brauner #include <signal.h>
13*c68946eeSChristian Brauner #include <stdbool.h>
14*c68946eeSChristian Brauner #include <stdio.h>
15*c68946eeSChristian Brauner #include <stdlib.h>
16*c68946eeSChristian Brauner #include <string.h>
17*c68946eeSChristian Brauner #include <syscall.h>
18*c68946eeSChristian Brauner #include <sys/capability.h>
19*c68946eeSChristian Brauner #include <sys/fsuid.h>
20*c68946eeSChristian Brauner #include <sys/types.h>
21*c68946eeSChristian Brauner #include <unistd.h>
22*c68946eeSChristian Brauner 
23*c68946eeSChristian Brauner extern int get_userns_fd(unsigned long nsid, unsigned long hostid,
24*c68946eeSChristian Brauner 			 unsigned long range);
25*c68946eeSChristian Brauner 
26*c68946eeSChristian Brauner extern int caps_down(void);
27*c68946eeSChristian Brauner 
28*c68946eeSChristian Brauner extern bool switch_ids(uid_t uid, gid_t gid);
29*c68946eeSChristian Brauner 
30*c68946eeSChristian Brauner static inline bool switch_userns(int fd, uid_t uid, gid_t gid, bool drop_caps)
31*c68946eeSChristian Brauner {
32*c68946eeSChristian Brauner 	if (setns(fd, CLONE_NEWUSER))
33*c68946eeSChristian Brauner 		return false;
34*c68946eeSChristian Brauner 
35*c68946eeSChristian Brauner 	if (!switch_ids(uid, gid))
36*c68946eeSChristian Brauner 		return false;
37*c68946eeSChristian Brauner 
38*c68946eeSChristian Brauner 	if (drop_caps && !caps_down())
39*c68946eeSChristian Brauner 		return false;
40*c68946eeSChristian Brauner 
41*c68946eeSChristian Brauner 	return true;
42*c68946eeSChristian Brauner }
43*c68946eeSChristian Brauner 
44*c68946eeSChristian Brauner #endif /* __IDMAP_UTILS_H */
45