| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ |
| 2 | #ifndef __LINUX_NSFS_H |
| 3 | #define __LINUX_NSFS_H |
| 4 | |
| 5 | #include <linux/ioctl.h> |
| 6 | #include <linux/types.h> |
| 7 | |
| 8 | #define NSIO 0xb7 |
| 9 | |
| 10 | /* Returns a file descriptor that refers to an owning user namespace */ |
| 11 | #define NS_GET_USERNS _IO(NSIO, 0x1) |
| 12 | /* Returns a file descriptor that refers to a parent namespace */ |
| 13 | #define NS_GET_PARENT _IO(NSIO, 0x2) |
| 14 | /* Returns the type of namespace (CLONE_NEW* value) referred to by |
| 15 | file descriptor */ |
| 16 | #define NS_GET_NSTYPE _IO(NSIO, 0x3) |
| 17 | /* Get owner UID (in the caller's user namespace) for a user namespace */ |
| 18 | #define NS_GET_OWNER_UID _IO(NSIO, 0x4) |
| 19 | /* Translate pid from target pid namespace into the caller's pid namespace. */ |
| 20 | #define NS_GET_PID_FROM_PIDNS _IOR(NSIO, 0x6, int) |
| 21 | /* Return thread-group leader id of pid in the callers pid namespace. */ |
| 22 | #define NS_GET_TGID_FROM_PIDNS _IOR(NSIO, 0x7, int) |
| 23 | /* Translate pid from caller's pid namespace into a target pid namespace. */ |
| 24 | #define NS_GET_PID_IN_PIDNS _IOR(NSIO, 0x8, int) |
| 25 | /* Return thread-group leader id of pid in the target pid namespace. */ |
| 26 | #define NS_GET_TGID_IN_PIDNS _IOR(NSIO, 0x9, int) |
| 27 | |
| 28 | struct mnt_ns_info { |
| 29 | __u32 size; |
| 30 | __u32 nr_mounts; |
| 31 | __u64 mnt_ns_id; |
| 32 | }; |
| 33 | |
| 34 | #define MNT_NS_INFO_SIZE_VER0 16 /* size of first published struct */ |
| 35 | |
| 36 | /* Get information about namespace. */ |
| 37 | #define NS_MNT_GET_INFO _IOR(NSIO, 10, struct mnt_ns_info) |
| 38 | /* Get next namespace. */ |
| 39 | #define NS_MNT_GET_NEXT _IOR(NSIO, 11, struct mnt_ns_info) |
| 40 | /* Get previous namespace. */ |
| 41 | #define NS_MNT_GET_PREV _IOR(NSIO, 12, struct mnt_ns_info) |
| 42 | |
| 43 | /* Retrieve namespace identifiers. */ |
| 44 | #define NS_GET_MNTNS_ID _IOR(NSIO, 5, __u64) |
| 45 | #define NS_GET_ID _IOR(NSIO, 13, __u64) |
| 46 | |
| 47 | enum init_ns_ino { |
| 48 | IPC_NS_INIT_INO = 0xEFFFFFFFU, |
| 49 | UTS_NS_INIT_INO = 0xEFFFFFFEU, |
| 50 | USER_NS_INIT_INO = 0xEFFFFFFDU, |
| 51 | PID_NS_INIT_INO = 0xEFFFFFFCU, |
| 52 | CGROUP_NS_INIT_INO = 0xEFFFFFFBU, |
| 53 | TIME_NS_INIT_INO = 0xEFFFFFFAU, |
| 54 | NET_NS_INIT_INO = 0xEFFFFFF9U, |
| 55 | MNT_NS_INIT_INO = 0xEFFFFFF8U, |
| 56 | #ifdef __KERNEL__ |
| 57 | MNT_NS_ANON_INO = 0xEFFFFFF7U, |
| 58 | #endif |
| 59 | }; |
| 60 | |
| 61 | struct nsfs_file_handle { |
| 62 | __u64 ns_id; |
| 63 | __u32 ns_type; |
| 64 | __u32 ns_inum; |
| 65 | }; |
| 66 | |
| 67 | #define NSFS_FILE_HANDLE_SIZE_VER0 16 /* sizeof first published struct */ |
| 68 | #define NSFS_FILE_HANDLE_SIZE_LATEST sizeof(struct nsfs_file_handle) /* sizeof latest published struct */ |
| 69 | |
| 70 | enum init_ns_id { |
| 71 | IPC_NS_INIT_ID = 1ULL, |
| 72 | UTS_NS_INIT_ID = 2ULL, |
| 73 | USER_NS_INIT_ID = 3ULL, |
| 74 | PID_NS_INIT_ID = 4ULL, |
| 75 | CGROUP_NS_INIT_ID = 5ULL, |
| 76 | TIME_NS_INIT_ID = 6ULL, |
| 77 | NET_NS_INIT_ID = 7ULL, |
| 78 | MNT_NS_INIT_ID = 8ULL, |
| 79 | #ifdef __KERNEL__ |
| 80 | NS_LAST_INIT_ID = MNT_NS_INIT_ID, |
| 81 | #endif |
| 82 | }; |
| 83 | |
| 84 | enum ns_type { |
| 85 | TIME_NS = (1ULL << 7), /* CLONE_NEWTIME */ |
| 86 | MNT_NS = (1ULL << 17), /* CLONE_NEWNS */ |
| 87 | CGROUP_NS = (1ULL << 25), /* CLONE_NEWCGROUP */ |
| 88 | UTS_NS = (1ULL << 26), /* CLONE_NEWUTS */ |
| 89 | IPC_NS = (1ULL << 27), /* CLONE_NEWIPC */ |
| 90 | USER_NS = (1ULL << 28), /* CLONE_NEWUSER */ |
| 91 | PID_NS = (1ULL << 29), /* CLONE_NEWPID */ |
| 92 | NET_NS = (1ULL << 30), /* CLONE_NEWNET */ |
| 93 | }; |
| 94 | |
| 95 | /** |
| 96 | * struct ns_id_req - namespace ID request structure |
| 97 | * @size: size of this structure |
| 98 | * @spare: reserved for future use |
| 99 | * @filter: filter mask |
| 100 | * @ns_id: last namespace id |
| 101 | * @user_ns_id: owning user namespace ID |
| 102 | * |
| 103 | * Structure for passing namespace ID and miscellaneous parameters to |
| 104 | * statns(2) and listns(2). |
| 105 | * |
| 106 | * For statns(2) @param represents the request mask. |
| 107 | * For listns(2) @param represents the last listed mount id (or zero). |
| 108 | */ |
| 109 | struct ns_id_req { |
| 110 | __u32 size; |
| 111 | __u32 spare; |
| 112 | __u64 ns_id; |
| 113 | struct /* listns */ { |
| 114 | __u32 ns_type; |
| 115 | __u32 spare2; |
| 116 | __u64 user_ns_id; |
| 117 | }; |
| 118 | }; |
| 119 | |
| 120 | /* |
| 121 | * Special @user_ns_id value that can be passed to listns() |
| 122 | */ |
| 123 | #define LISTNS_CURRENT_USER 0xffffffffffffffff /* Caller's userns */ |
| 124 | |
| 125 | /* List of all ns_id_req versions. */ |
| 126 | #define NS_ID_REQ_SIZE_VER0 32 /* sizeof first published struct */ |
| 127 | |
| 128 | #endif /* __LINUX_NSFS_H */ |
| 129 | |