| 1 | /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | 
|---|
| 2 |  | 
|---|
| 3 | #ifndef _UAPI_LINUX_PIDFD_H | 
|---|
| 4 | #define _UAPI_LINUX_PIDFD_H | 
|---|
| 5 |  | 
|---|
| 6 | #include <linux/types.h> | 
|---|
| 7 | #include <linux/fcntl.h> | 
|---|
| 8 | #include <linux/ioctl.h> | 
|---|
| 9 |  | 
|---|
| 10 | /* Flags for pidfd_open().  */ | 
|---|
| 11 | #define PIDFD_NONBLOCK	O_NONBLOCK | 
|---|
| 12 | #define PIDFD_THREAD	O_EXCL | 
|---|
| 13 | #ifdef __KERNEL__ | 
|---|
| 14 | #include <linux/sched.h> | 
|---|
| 15 | #define PIDFD_STALE CLONE_PIDFD | 
|---|
| 16 | #endif | 
|---|
| 17 |  | 
|---|
| 18 | /* Flags for pidfd_send_signal(). */ | 
|---|
| 19 | #define PIDFD_SIGNAL_THREAD		(1UL << 0) | 
|---|
| 20 | #define PIDFD_SIGNAL_THREAD_GROUP	(1UL << 1) | 
|---|
| 21 | #define PIDFD_SIGNAL_PROCESS_GROUP	(1UL << 2) | 
|---|
| 22 |  | 
|---|
| 23 | /* Flags for pidfd_info. */ | 
|---|
| 24 | #define PIDFD_INFO_PID			(1UL << 0) /* Always returned, even if not requested */ | 
|---|
| 25 | #define PIDFD_INFO_CREDS		(1UL << 1) /* Always returned, even if not requested */ | 
|---|
| 26 | #define PIDFD_INFO_CGROUPID		(1UL << 2) /* Always returned if available, even if not requested */ | 
|---|
| 27 | #define PIDFD_INFO_EXIT			(1UL << 3) /* Only returned if requested. */ | 
|---|
| 28 | #define PIDFD_INFO_COREDUMP		(1UL << 4) /* Only returned if requested. */ | 
|---|
| 29 |  | 
|---|
| 30 | #define PIDFD_INFO_SIZE_VER0		64 /* sizeof first published struct */ | 
|---|
| 31 |  | 
|---|
| 32 | /* | 
|---|
| 33 | * Values for @coredump_mask in pidfd_info. | 
|---|
| 34 | * Only valid if PIDFD_INFO_COREDUMP is set in @mask. | 
|---|
| 35 | * | 
|---|
| 36 | * Note, the @PIDFD_COREDUMP_ROOT flag indicates that the generated | 
|---|
| 37 | * coredump should be treated as sensitive and access should only be | 
|---|
| 38 | * granted to privileged users. | 
|---|
| 39 | */ | 
|---|
| 40 | #define PIDFD_COREDUMPED	(1U << 0) /* Did crash and... */ | 
|---|
| 41 | #define PIDFD_COREDUMP_SKIP	(1U << 1) /* coredumping generation was skipped. */ | 
|---|
| 42 | #define PIDFD_COREDUMP_USER	(1U << 2) /* coredump was done as the user. */ | 
|---|
| 43 | #define PIDFD_COREDUMP_ROOT	(1U << 3) /* coredump was done as root. */ | 
|---|
| 44 |  | 
|---|
| 45 | /* | 
|---|
| 46 | * ...and for userland we make life simpler - PIDFD_SELF refers to the current | 
|---|
| 47 | * thread, PIDFD_SELF_PROCESS refers to the process thread group leader. | 
|---|
| 48 | * | 
|---|
| 49 | * For nearly all practical uses, a user will want to use PIDFD_SELF. | 
|---|
| 50 | */ | 
|---|
| 51 | #define PIDFD_SELF		PIDFD_SELF_THREAD | 
|---|
| 52 | #define PIDFD_SELF_PROCESS	PIDFD_SELF_THREAD_GROUP | 
|---|
| 53 |  | 
|---|
| 54 | struct pidfd_info { | 
|---|
| 55 | /* | 
|---|
| 56 | * This mask is similar to the request_mask in statx(2). | 
|---|
| 57 | * | 
|---|
| 58 | * Userspace indicates what extensions or expensive-to-calculate fields | 
|---|
| 59 | * they want by setting the corresponding bits in mask. The kernel | 
|---|
| 60 | * will ignore bits that it does not know about. | 
|---|
| 61 | * | 
|---|
| 62 | * When filling the structure, the kernel will only set bits | 
|---|
| 63 | * corresponding to the fields that were actually filled by the kernel. | 
|---|
| 64 | * This also includes any future extensions that might be automatically | 
|---|
| 65 | * filled. If the structure size is too small to contain a field | 
|---|
| 66 | * (requested or not), to avoid confusion the mask will not | 
|---|
| 67 | * contain a bit for that field. | 
|---|
| 68 | * | 
|---|
| 69 | * As such, userspace MUST verify that mask contains the | 
|---|
| 70 | * corresponding flags after the ioctl(2) returns to ensure that it is | 
|---|
| 71 | * using valid data. | 
|---|
| 72 | */ | 
|---|
| 73 | __u64 mask; | 
|---|
| 74 | /* | 
|---|
| 75 | * The information contained in the following fields might be stale at the | 
|---|
| 76 | * time it is received, as the target process might have exited as soon as | 
|---|
| 77 | * the IOCTL was processed, and there is no way to avoid that. However, it | 
|---|
| 78 | * is guaranteed that if the call was successful, then the information was | 
|---|
| 79 | * correct and referred to the intended process at the time the work was | 
|---|
| 80 | * performed. */ | 
|---|
| 81 | __u64 cgroupid; | 
|---|
| 82 | __u32 pid; | 
|---|
| 83 | __u32 tgid; | 
|---|
| 84 | __u32 ppid; | 
|---|
| 85 | __u32 ruid; | 
|---|
| 86 | __u32 rgid; | 
|---|
| 87 | __u32 euid; | 
|---|
| 88 | __u32 egid; | 
|---|
| 89 | __u32 suid; | 
|---|
| 90 | __u32 sgid; | 
|---|
| 91 | __u32 fsuid; | 
|---|
| 92 | __u32 fsgid; | 
|---|
| 93 | __s32 exit_code; | 
|---|
| 94 | __u32 coredump_mask; | 
|---|
| 95 | __u32 __spare1; | 
|---|
| 96 | }; | 
|---|
| 97 |  | 
|---|
| 98 | #define PIDFS_IOCTL_MAGIC 0xFF | 
|---|
| 99 |  | 
|---|
| 100 | #define PIDFD_GET_CGROUP_NAMESPACE            _IO(PIDFS_IOCTL_MAGIC, 1) | 
|---|
| 101 | #define PIDFD_GET_IPC_NAMESPACE               _IO(PIDFS_IOCTL_MAGIC, 2) | 
|---|
| 102 | #define PIDFD_GET_MNT_NAMESPACE               _IO(PIDFS_IOCTL_MAGIC, 3) | 
|---|
| 103 | #define PIDFD_GET_NET_NAMESPACE               _IO(PIDFS_IOCTL_MAGIC, 4) | 
|---|
| 104 | #define PIDFD_GET_PID_NAMESPACE               _IO(PIDFS_IOCTL_MAGIC, 5) | 
|---|
| 105 | #define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE  _IO(PIDFS_IOCTL_MAGIC, 6) | 
|---|
| 106 | #define PIDFD_GET_TIME_NAMESPACE              _IO(PIDFS_IOCTL_MAGIC, 7) | 
|---|
| 107 | #define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) | 
|---|
| 108 | #define PIDFD_GET_USER_NAMESPACE              _IO(PIDFS_IOCTL_MAGIC, 9) | 
|---|
| 109 | #define PIDFD_GET_UTS_NAMESPACE               _IO(PIDFS_IOCTL_MAGIC, 10) | 
|---|
| 110 | #define PIDFD_GET_INFO                        _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) | 
|---|
| 111 |  | 
|---|
| 112 | #endif /* _UAPI_LINUX_PIDFD_H */ | 
|---|
| 113 |  | 
|---|