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