16da73d15SChristian Brauner /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 26da73d15SChristian Brauner 36da73d15SChristian Brauner #ifndef _UAPI_LINUX_PIDFD_H 46da73d15SChristian Brauner #define _UAPI_LINUX_PIDFD_H 56da73d15SChristian Brauner 66da73d15SChristian Brauner #include <linux/types.h> 76da73d15SChristian Brauner #include <linux/fcntl.h> 85b08bd40SChristian Brauner #include <linux/ioctl.h> 96da73d15SChristian Brauner 106da73d15SChristian Brauner /* Flags for pidfd_open(). */ 116da73d15SChristian Brauner #define PIDFD_NONBLOCK O_NONBLOCK 1264bef697SOleg Nesterov #define PIDFD_THREAD O_EXCL 13*68db2727SChristian Brauner #ifdef __KERNEL__ 14*68db2727SChristian Brauner #include <linux/sched.h> 15*68db2727SChristian Brauner #define PIDFD_CLONE CLONE_PIDFD 16*68db2727SChristian Brauner #endif 176da73d15SChristian Brauner 18e1fb1dc0SChristian Brauner /* Flags for pidfd_send_signal(). */ 19e1fb1dc0SChristian Brauner #define PIDFD_SIGNAL_THREAD (1UL << 0) 20e1fb1dc0SChristian Brauner #define PIDFD_SIGNAL_THREAD_GROUP (1UL << 1) 21e1fb1dc0SChristian Brauner #define PIDFD_SIGNAL_PROCESS_GROUP (1UL << 2) 22e1fb1dc0SChristian Brauner 23cdda1f26SLuca Boccassi /* Flags for pidfd_info. */ 24cdda1f26SLuca Boccassi #define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ 25cdda1f26SLuca Boccassi #define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ 26cdda1f26SLuca Boccassi #define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ 277477d7dcSChristian Brauner #define PIDFD_INFO_EXIT (1UL << 3) /* Only returned if requested. */ 28cdda1f26SLuca Boccassi 29cdda1f26SLuca Boccassi #define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */ 30cdda1f26SLuca Boccassi 31f08d0c3aSLorenzo Stoakes /* 32f08d0c3aSLorenzo Stoakes * The concept of process and threads in userland and the kernel is a confusing 33f08d0c3aSLorenzo Stoakes * one - within the kernel every thread is a 'task' with its own individual PID, 34f08d0c3aSLorenzo Stoakes * however from userland's point of view threads are grouped by a single PID, 35f08d0c3aSLorenzo Stoakes * which is that of the 'thread group leader', typically the first thread 36f08d0c3aSLorenzo Stoakes * spawned. 37f08d0c3aSLorenzo Stoakes * 38f08d0c3aSLorenzo Stoakes * To cut the Gideon knot, for internal kernel usage, we refer to 39f08d0c3aSLorenzo Stoakes * PIDFD_SELF_THREAD to refer to the current thread (or task from a kernel 40f08d0c3aSLorenzo Stoakes * perspective), and PIDFD_SELF_THREAD_GROUP to refer to the current thread 41f08d0c3aSLorenzo Stoakes * group leader... 42f08d0c3aSLorenzo Stoakes */ 43f08d0c3aSLorenzo Stoakes #define PIDFD_SELF_THREAD -10000 /* Current thread. */ 44f08d0c3aSLorenzo Stoakes #define PIDFD_SELF_THREAD_GROUP -20000 /* Current thread group leader. */ 45f08d0c3aSLorenzo Stoakes 46f08d0c3aSLorenzo Stoakes /* 47f08d0c3aSLorenzo Stoakes * ...and for userland we make life simpler - PIDFD_SELF refers to the current 48f08d0c3aSLorenzo Stoakes * thread, PIDFD_SELF_PROCESS refers to the process thread group leader. 49f08d0c3aSLorenzo Stoakes * 50f08d0c3aSLorenzo Stoakes * For nearly all practical uses, a user will want to use PIDFD_SELF. 51f08d0c3aSLorenzo Stoakes */ 52f08d0c3aSLorenzo Stoakes #define PIDFD_SELF PIDFD_SELF_THREAD 53f08d0c3aSLorenzo Stoakes #define PIDFD_SELF_PROCESS PIDFD_SELF_THREAD_GROUP 54f08d0c3aSLorenzo Stoakes 55cdda1f26SLuca Boccassi struct pidfd_info { 56cdda1f26SLuca Boccassi /* 57cdda1f26SLuca Boccassi * This mask is similar to the request_mask in statx(2). 58cdda1f26SLuca Boccassi * 59cdda1f26SLuca Boccassi * Userspace indicates what extensions or expensive-to-calculate fields 60cdda1f26SLuca Boccassi * they want by setting the corresponding bits in mask. The kernel 61cdda1f26SLuca Boccassi * will ignore bits that it does not know about. 62cdda1f26SLuca Boccassi * 63cdda1f26SLuca Boccassi * When filling the structure, the kernel will only set bits 64cdda1f26SLuca Boccassi * corresponding to the fields that were actually filled by the kernel. 65cdda1f26SLuca Boccassi * This also includes any future extensions that might be automatically 66cdda1f26SLuca Boccassi * filled. If the structure size is too small to contain a field 67cdda1f26SLuca Boccassi * (requested or not), to avoid confusion the mask will not 68cdda1f26SLuca Boccassi * contain a bit for that field. 69cdda1f26SLuca Boccassi * 70cdda1f26SLuca Boccassi * As such, userspace MUST verify that mask contains the 71cdda1f26SLuca Boccassi * corresponding flags after the ioctl(2) returns to ensure that it is 72cdda1f26SLuca Boccassi * using valid data. 73cdda1f26SLuca Boccassi */ 74cdda1f26SLuca Boccassi __u64 mask; 75cdda1f26SLuca Boccassi /* 76cdda1f26SLuca Boccassi * The information contained in the following fields might be stale at the 77cdda1f26SLuca Boccassi * time it is received, as the target process might have exited as soon as 78cdda1f26SLuca Boccassi * the IOCTL was processed, and there is no way to avoid that. However, it 79cdda1f26SLuca Boccassi * is guaranteed that if the call was successful, then the information was 80cdda1f26SLuca Boccassi * correct and referred to the intended process at the time the work was 81cdda1f26SLuca Boccassi * performed. */ 82cdda1f26SLuca Boccassi __u64 cgroupid; 83cdda1f26SLuca Boccassi __u32 pid; 84cdda1f26SLuca Boccassi __u32 tgid; 85cdda1f26SLuca Boccassi __u32 ppid; 86cdda1f26SLuca Boccassi __u32 ruid; 87cdda1f26SLuca Boccassi __u32 rgid; 88cdda1f26SLuca Boccassi __u32 euid; 89cdda1f26SLuca Boccassi __u32 egid; 90cdda1f26SLuca Boccassi __u32 suid; 91cdda1f26SLuca Boccassi __u32 sgid; 92cdda1f26SLuca Boccassi __u32 fsuid; 93cdda1f26SLuca Boccassi __u32 fsgid; 947477d7dcSChristian Brauner __s32 exit_code; 95cdda1f26SLuca Boccassi }; 96cdda1f26SLuca Boccassi 975b08bd40SChristian Brauner #define PIDFS_IOCTL_MAGIC 0xFF 985b08bd40SChristian Brauner 995b08bd40SChristian Brauner #define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) 1005b08bd40SChristian Brauner #define PIDFD_GET_IPC_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 2) 1015b08bd40SChristian Brauner #define PIDFD_GET_MNT_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 3) 1025b08bd40SChristian Brauner #define PIDFD_GET_NET_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 4) 1035b08bd40SChristian Brauner #define PIDFD_GET_PID_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 5) 1045b08bd40SChristian Brauner #define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 6) 1055b08bd40SChristian Brauner #define PIDFD_GET_TIME_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 7) 1065b08bd40SChristian Brauner #define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) 1075b08bd40SChristian Brauner #define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) 1085b08bd40SChristian Brauner #define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) 109cdda1f26SLuca Boccassi #define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) 1105b08bd40SChristian Brauner 1116da73d15SChristian Brauner #endif /* _UAPI_LINUX_PIDFD_H */ 112