cgroup_sys/
lib.rs

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