1 /**
2  * D header file for GNU/Linux.
3  *
4  * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
5  * Authors:   Arun Chandrasekaran <aruncxy@gmail.com>
6  */
7 module core.sys.linux.sys.prctl;
8 
9 version (linux):
10 extern (C):
11 @system:
12 @nogc:
13 nothrow:
14 
15 enum: uint
16 {
17     PR_SET_PDEATHSIG                    = 1,
18     PR_GET_PDEATHSIG                    = 2,
19 
20     PR_GET_DUMPABLE                     = 3,
21     PR_SET_DUMPABLE                     = 4,
22 
23     PR_GET_UNALIGN                      = 5,
24     PR_SET_UNALIGN                      = 6,
25 
26     PR_UNALIGN_NOPRINT                  = 1,
27     PR_UNALIGN_SIGBUS                   = 2,
28 
29     PR_GET_KEEPCAPS                     = 7,
30     PR_SET_KEEPCAPS                     = 8,
31 
32     PR_GET_FPEMU                        = 9,
33     PR_SET_FPEMU                        = 10,
34     PR_FPEMU_NOPRINT                    = 1,
35     PR_FPEMU_SIGFPE                     = 2,
36 
37     PR_GET_FPEXC                        = 11,
38     PR_SET_FPEXC                        = 12,
39     PR_FP_EXC_SW_ENABLE                 = 0x80,
40     PR_FP_EXC_DIV                       = 0x010000,
41     PR_FP_EXC_OVF                       = 0x020000,
42     PR_FP_EXC_UND                       = 0x040000,
43     PR_FP_EXC_RES                       = 0x080000,
44     PR_FP_EXC_INV                       = 0x100000,
45     PR_FP_EXC_DISABLED                  = 0,
46     PR_FP_EXC_NONRECOV                  = 1,
47     PR_FP_EXC_ASYNC                     = 2,
48     PR_FP_EXC_PRECISE                   = 3,
49 
50     PR_GET_TIMING                       = 13,
51     PR_SET_TIMING                       = 14,
52     PR_TIMING_STATISTICAL               = 0,
53     PR_TIMING_TIMESTAMP                 = 1,
54 
55     PR_SET_NAME                         = 15,
56     PR_GET_NAME                         = 16,
57 
58     PR_GET_ENDIAN                       = 19,
59     PR_SET_ENDIAN                       = 20,
60     PR_ENDIAN_BIG                       = 0,
61     PR_ENDIAN_LITTLE                    = 1,
62     PR_ENDIAN_PPC_LITTLE                = 2,
63 
64     PR_GET_SECCOMP                      = 21,
65     PR_SET_SECCOMP                      = 22,
66 
67     PR_CAPBSET_READ                     = 23,
68     PR_CAPBSET_DROP                     = 24,
69 
70     PR_GET_TSC                          = 25,
71     PR_SET_TSC                          = 26,
72     PR_TSC_ENABLE                       = 1,
73     PR_TSC_SIGSEGV                      = 2,
74 
75     PR_GET_SECUREBITS                   = 27,
76     PR_SET_SECUREBITS                   = 28,
77 
78 
79     PR_SET_TIMERSLACK                   = 29,
80     PR_GET_TIMERSLACK                   = 30,
81 
82     PR_TASK_PERF_EVENTS_DISABLE         = 31,
83     PR_TASK_PERF_EVENTS_ENABLE          = 32,
84 
85 
86     PR_MCE_KILL                         = 33,
87     PR_MCE_KILL_CLEAR                   = 0,
88     PR_MCE_KILL_SET                     = 1,
89 
90     PR_MCE_KILL_LATE                    = 0,
91     PR_MCE_KILL_EARLY                   = 1,
92     PR_MCE_KILL_DEFAULT                 = 2,
93 
94     PR_MCE_KILL_GET                     = 34,
95 
96     PR_SET_MM                           = 35,
97     PR_SET_MM_START_CODE                = 1,
98     PR_SET_MM_END_CODE                  = 2,
99     PR_SET_MM_START_DATA                = 3,
100     PR_SET_MM_END_DATA                  = 4,
101     PR_SET_MM_START_STACK               = 5,
102     PR_SET_MM_START_BRK                 = 6,
103     PR_SET_MM_BRK                       = 7,
104     PR_SET_MM_ARG_START                 = 8,
105     PR_SET_MM_ARG_END                   = 9,
106     PR_SET_MM_ENV_START                 = 10,
107     PR_SET_MM_ENV_END                   = 11,
108     PR_SET_MM_AUXV                      = 12,
109     PR_SET_MM_EXE_FILE                  = 13,
110     PR_SET_MM_MAP                       = 14,
111     PR_SET_MM_MAP_SIZE                  = 15,
112 
113     PR_SET_PTRACER                      = 0x59616d61,
114     PR_SET_PTRACER_ANY                  = (cast (uint)-1),
115 
116     PR_SET_CHILD_SUBREAPER              = 36,
117     PR_GET_CHILD_SUBREAPER              = 37,
118 
119     PR_SET_NO_NEW_PRIVS                 = 38,
120     PR_GET_NO_NEW_PRIVS                 = 39,
121 
122     PR_GET_TID_ADDRESS                  = 40,
123 
124     PR_SET_THP_DISABLE                  = 41,
125     PR_GET_THP_DISABLE                  = 42,
126 }
127 
128 struct prctl_mm_map
129 {
130     ulong    start_code;
131     ulong    end_code;
132     ulong    start_data;
133     ulong    end_data;
134     ulong    start_brk;
135     ulong    brk;
136     ulong    start_stack;
137     ulong    arg_start;
138     ulong    arg_end;
139     ulong    env_start;
140     ulong    env_end;
141     ulong*   auxv;
142     uint     auxv_size;
143     uint     exe_fd;
144 }
145 
146 int prctl(int option, size_t arg2, size_t arg3, size_t arg4, size_t arg5);
147 
148 //
149 // Example usage to set and get the task name.
150 //
151 // byte[16] oldname = cast(byte[]) "1234567890123456";
152 // oldname[oldname.length-1] = 0;
153 // prctl(PR_SET_NAME, cast(size_t) oldname.ptr, cast(size_t) null, cast(size_t) null, cast(size_t) null);
154 // byte[16] newname;
155 // prctl(PR_GET_NAME, cast(size_t) newname.ptr, cast(size_t) null, cast(size_t) null, cast(size_t) null);
156 // int i;
157 // foreach (b; newname)
158 // {
159 //         assert(b == oldname[i]);
160 //             i++;
161 // }
162 // writeln(cast(string) newname);
163