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 pub fn cgroup_strerror(code: c_int) -> *const c_char;
75 pub fn cgroup_get_last_errno() -> c_int;
76
77 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 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 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 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 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}