1extern crate libc;
2use libc::{c_int, c_short, c_void, c_char, pid_t, uid_t, gid_t, mode_t, int64_t, uint64_t};
3use std::mem;
4
5pub const ECGEOF: c_int = 50023;
6pub const ECGFAIL: c_int = 50013;
7pub const ECGROUPNOTEQUAL: c_int = 50017;
8pub const ECGCONTROLLERNOTEQUAL: c_int = 50018;
9pub const FILENAME_MAX: usize = 4096;
10pub const CG_VALUE_MAX: usize = 100;
11
12#[allow(non_camel_case_types)]
13pub enum cgroup {}
14#[allow(non_camel_case_types)]
15pub enum cgroup_controller {}
16
17#[repr(C)]
18#[derive(Copy)]
19pub struct controller_data {
20 pub name: [c_char; FILENAME_MAX],
21 pub hierarchy: c_int,
22 pub num_cgroups: c_int,
23 pub enabled: c_int,
24}
25
26impl Clone for controller_data {
27 fn clone(&self) -> Self {
28 *self
29 }
30}
31
32impl Default for controller_data {
33 fn default() -> Self {
34 unsafe { mem::zeroed() }
35 }
36}
37
38#[repr(C)]
39#[derive(Copy)]
40pub struct cgroup_stat {
41 pub name: [c_char; FILENAME_MAX],
42 pub value: [c_char; CG_VALUE_MAX],
43}
44
45impl Clone for cgroup_stat {
46 fn clone(&self) -> Self {
47 *self
48 }
49}
50
51impl Default for cgroup_stat {
52 fn default() -> Self {
53 unsafe { mem::zeroed() }
54 }
55}
56
57#[repr(C)]
58#[derive(Copy)]
59pub struct cgroup_mount_point {
60 pub name: [c_char; FILENAME_MAX],
61 pub path: [c_char; FILENAME_MAX],
62}
63
64impl Clone for cgroup_mount_point {
65 fn clone(&self) -> Self {
66 *self
67 }
68}
69
70impl Default for cgroup_mount_point {
71 fn default() -> Self {
72 unsafe { mem::zeroed() }
73 }
74}
75
76#[allow(non_camel_case_types)]
77#[repr(C)]
78#[derive(Copy,Clone)]
79pub enum group_walk_type {
80 CGROUP_WALK_TYPE_PRE_DIR = 0x1,
81 CGROUP_WALK_TYPE_POST_DIR = 0x2,
82}
83
84#[allow(non_camel_case_types)]
85#[repr(C)]
86#[derive(Copy,Clone)]
87pub enum cgroup_file_type {
88 CGROUP_FILE_TYPE_FILE,
89 CGROUP_FILE_TYPE_DIR,
90 CGROUP_FILE_TYPE_OTHER,
91}
92
93#[repr(C)]
94#[derive(Copy,Clone)]
95pub struct cgroup_file_info {
96 pub file_type: cgroup_file_type,
97 pub path: *const c_char,
98 pub parent: *const c_char,
99 pub full_path: *const c_char,
100 pub depth: c_short,
101}
102
103impl Default for cgroup_file_info {
104 fn default() -> Self {
105 unsafe { mem::zeroed() }
106 }
107}
108
109extern "C" {
110 pub fn cgroup_strerror(code: c_int) -> *const c_char;
112 pub fn cgroup_get_last_errno() -> c_int;
113
114 pub fn cgroup_init() -> c_int;
116 pub fn cgroup_get_subsys_mount_point(controller: *const c_char,
117 mount_point: *const *const c_char)
118 -> c_int;
119
120 pub fn cgroup_walk_tree_begin(controller: *const c_char,
122 base_path: *const c_char,
123 depth: c_int,
124 handle: *const *const c_void,
125 info: *mut cgroup_file_info,
126 base_level: *const c_int)
127 -> c_int;
128 pub fn cgroup_walk_tree_next(depth: c_int,
129 handle: *const *const c_void,
130 info: *mut cgroup_file_info,
131 base_level: c_int)
132 -> c_int;
133 pub fn cgroup_walk_tree_end(handle: *const *const c_void) -> c_int;
134 pub fn cgroup_walk_tree_set_flags(handle: *const *const c_void, flags: c_int) -> c_int;
135
136 pub fn cgroup_read_value_begin(controller: *const c_char,
137 path: *const c_char,
138 name: *mut c_char,
139 h: *const *const c_void,
140 buffer: *mut c_char,
141 max: c_int)
142 -> c_int;
143 pub fn cgroup_read_value_next(handle: *const *const c_void,
144 buffer: *mut c_char,
145 max: c_int)
146 -> c_int;
147 pub fn cgroup_read_value_end(handle: *const *const c_void) -> c_int;
148
149 pub fn cgroup_read_stats_begin(controller: *const c_char,
150 path: *const c_char,
151 handle: *const *const c_void,
152 stat: *mut cgroup_stat)
153 -> c_int;
154 pub fn cgroup_read_stats_next(handle: *const *const c_void, stat: *mut cgroup_stat) -> c_int;
155 pub fn cgroup_read_stats_end(handle: *const *const c_void) -> c_int;
156
157 pub fn cgroup_get_task_begin(cgroup: *const c_char,
158 controller: *const c_char,
159 handle: *const *const c_void,
160 pid: *mut pid_t)
161 -> c_int;
162 pub fn cgroup_get_task_next(handle: *const *const c_void, pid: *mut pid_t) -> c_int;
163 pub fn cgroup_get_task_end(handle: *const *const c_void) -> c_int;
164
165 pub fn cgroup_get_controller_begin(handle: *const *const c_void,
166 info: *mut cgroup_mount_point)
167 -> c_int;
168 pub fn cgroup_get_controller_next(handle: *const *const c_void,
169 info: *mut cgroup_mount_point)
170 -> c_int;
171 pub fn cgroup_get_controller_end(handle: *const *const c_void) -> c_int;
172
173 pub fn cgroup_get_all_controller_begin(handle: *const *const c_void,
174 info: *mut controller_data)
175 -> c_int;
176 pub fn cgroup_get_all_controller_next(handle: *const *const c_void,
177 info: *mut controller_data)
178 -> c_int;
179 pub fn cgroup_get_all_controller_end(handle: *const *const c_void) -> c_int;
180
181
182 pub fn cgroup_get_subsys_mount_point_begin(controller: *const c_char,
183 handle: *const *const c_void,
184 path: *mut c_char);
185 pub fn cgroup_get_subsys_mount_point_next(handle: *const *const c_void, path: *mut c_char);
186 pub fn cgroup_get_subsys_mount_point_end(handle: *const *const c_void);
187
188 pub fn cgroup_new_cgroup(name: *const c_char) -> *mut cgroup;
190 pub fn cgroup_add_controller(cgroup: *const cgroup,
191 name: *const c_char)
192 -> *const cgroup_controller;
193 pub fn cgroup_get_controller(cgroup: *const cgroup,
194 name: *const c_char)
195 -> *const cgroup_controller;
196 pub fn cgroup_free(cgroup: *const *const cgroup);
197 pub fn cgroup_free_controllers(cgroup: *const cgroup);
198 pub fn cgroup_create_cgroup(cgroup: *const cgroup, ignore_ownership: c_int) -> c_int;
199 pub fn cgroup_create_cgroup_from_parent(cgroup: *const cgroup,
200 ignore_ownership: c_int)
201 -> c_int;
202 pub fn cgroup_modify_cgroup(cgroup: *const cgroup) -> c_int;
203 pub fn cgroup_delete_cgroup(cgroup: *const cgroup, ignore_ownership: c_int) -> c_int;
204 pub fn cgroup_delete_cgroup_ext(cgroup: *const cgroup, flags: c_int) -> c_int;
205 pub fn cgroup_get_cgroup(cgroup: *const cgroup) -> c_int;
206 pub fn cgroup_copy_cgroup(dst: *const cgroup, src: *const cgroup) -> c_int;
207 pub fn cgroup_compare_cgroup(cgroup_a: *const cgroup, cgroup_b: *const cgroup) -> c_int;
208 pub fn cgroup_compare_controllers(cgca: *const cgroup_controller,
209 cgcb: *const cgroup_controller)
210 -> c_int;
211 pub fn cgroup_set_uid_gid(cgroup: *const cgroup,
212 tasks_uid: uid_t,
213 tasks_gid: gid_t,
214 control_uid: uid_t,
215 control_gid: gid_t)
216 -> c_int;
217 pub fn cgroup_get_uid_gid(cgroup: *const cgroup,
218 tasks_uid: *mut uid_t,
219 tasks_gid: *mut gid_t,
220 control_uid: *mut uid_t,
221 control_gid: *mut gid_t)
222 -> c_int;
223 pub fn cgroup_set_permissions(cgroup: *const cgroup,
224 control_dperm: mode_t,
225 control_fperm: mode_t,
226 task_fperm: mode_t);
227 pub fn cgroup_add_value_string(controller: *const cgroup_controller,
228 name: *const c_char,
229 value: *const c_char)
230 -> c_int;
231 pub fn cgroup_add_value_int64(controller: *const cgroup_controller,
232 name: *const c_char,
233 value: int64_t)
234 -> c_int;
235 pub fn cgroup_add_value_uint64(controller: *const cgroup_controller,
236 name: *const c_char,
237 value: uint64_t)
238 -> c_int;
239 pub fn cgroup_add_value_bool(controller: *const cgroup_controller,
240 name: *const c_char,
241 value: bool)
242 -> c_int;
243 pub fn cgroup_get_value_string(controller: *const cgroup_controller,
244 name: *const c_char,
245 value: *const *const c_char)
246 -> c_int;
247 pub fn cgroup_get_value_int64(controller: *const cgroup_controller,
248 name: *const c_char,
249 value: *const int64_t)
250 -> c_int;
251 pub fn cgroup_get_value_uint64(controller: *const cgroup_controller,
252 name: *const c_char,
253 value: *const uint64_t)
254 -> c_int;
255 pub fn cgroup_get_value_bool(controller: *const cgroup_controller,
256 name: *const c_char,
257 value: *const bool)
258 -> c_int;
259 pub fn cgroup_set_value_string(controller: *const cgroup_controller,
260 name: *const c_char,
261 value: *const c_char)
262 -> c_int;
263 pub fn cgroup_set_value_int64(controller: *const cgroup_controller,
264 name: *const c_char,
265 value: int64_t)
266 -> c_int;
267 pub fn cgroup_set_value_uint64(controller: *const cgroup_controller,
268 name: *const c_char,
269 value: uint64_t)
270 -> c_int;
271 pub fn cgroup_set_value_bool(controller: *const cgroup_controller,
272 name: *const c_char,
273 value: bool)
274 -> c_int;
275 pub fn cgroup_get_value_name_count(controller: *const cgroup_controller) -> c_int;
276 pub fn cgroup_get_value_name(controller: *const cgroup_controller,
277 index: c_int)
278 -> *const c_char;
279 pub fn cgroup_get_procs(name: *const c_char,
280 controller: *const c_char,
281 pids: *const *const pid_t,
282 size: *mut c_int)
283 -> c_int;
284 pub fn cg_chmod_recursive(cgroup: *const cgroup,
285 dir_mode: mode_t,
286 dirm_change: c_int,
287 file_mode: mode_t,
288 filem_change: c_int)
289 -> c_int;
290 pub fn cgroup_get_cgroup_name(cgroup: *const cgroup) -> *const c_char;
291
292 pub fn cgroup_attach_task(cgroup: *const cgroup) -> c_int;
294 pub fn cgroup_attach_task_pid(cgroup: *const cgroup, tid: pid_t) -> c_int;
295 pub fn cgroup_get_current_controller_path(pid: pid_t,
296 controller: *const c_char,
297 current_path: *const *const c_char)
298 -> c_int;
299
300 pub fn cgroup_config_load_config(pathname: *const c_char) -> c_int;
302 pub fn cgroup_unload_cgroups() -> c_int;
303 pub fn cgroup_config_unload_config(pathname: *const c_char, flags: c_int) -> c_int;
304 pub fn cgroup_config_set_default(new_default: *mut cgroup) -> c_int;
305 pub fn cgroup_init_templates_cache(pathname: *const c_char) -> c_int;
306 pub fn cgroup_reload_cached_templates(pathname: *const c_char) -> c_int;
307 pub fn cgroup_config_create_template_group(cgroup: *mut cgroup,
308 template_name: *mut c_char,
309 flags: c_int)
310 -> c_int;
311}