libcgroup_sys/
lib.rs

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    // error.h
111    pub fn cgroup_strerror(code: c_int) -> *const c_char;
112    pub fn cgroup_get_last_errno() -> c_int;
113
114    // init.h
115    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    // iterators.h
121    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    // groups.h
189    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    // tasks.h
293    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    // config.h
301    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}