blob: 5fb55ff89f609f6e55274720a9d672a9d47c1993 [file] [log] [blame]
Dylan Reid837c74a2016-01-22 17:25:21 -08001/* Copyright 2016 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
Dylan Reid837c74a2016-01-22 17:25:21 -08006#include <errno.h>
7#include <signal.h>
8#include <sys/mount.h>
9#include <sys/stat.h>
10#include <sys/types.h>
11#include <unistd.h>
12
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070013#include "libcontainer/test_harness.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080014
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070015#include "libcontainer/container_cgroup.h"
16#include "libcontainer/libcontainer.h"
Dylan Reid837c74a2016-01-22 17:25:21 -080017
18static const pid_t INIT_TEST_PID = 5555;
Chinyue Chen4f3fd682016-07-01 14:11:42 +080019static const int TEST_CPU_SHARES = 200;
20static const int TEST_CPU_QUOTA = 20000;
21static const int TEST_CPU_PERIOD = 50000;
Dylan Reid837c74a2016-01-22 17:25:21 -080022
23struct mount_args {
24 char *source;
25 char *target;
26 char *filesystemtype;
27 unsigned long mountflags;
28 const void *data;
29};
30static struct mount_args mount_call_args[5];
31static int mount_called;
32
33struct mknod_args {
34 char *pathname;
35 mode_t mode;
36 dev_t dev;
37};
38static struct mknod_args mknod_call_args;
Chinyue Chen03c54ae2016-06-29 12:29:10 +080039static dev_t stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080040
41static int kill_called;
42static int kill_sig;
43static const char *minijail_alt_syscall_table;
44static int minijail_ipc_called;
45static int minijail_vfs_called;
46static int minijail_net_called;
47static int minijail_pids_called;
48static int minijail_run_as_init_called;
49static int minijail_user_called;
50static int minijail_wait_called;
51static int minijail_reset_signal_mask_called;
52static int mount_ret;
53static char *mkdtemp_root;
54
55/* global mock cgroup. */
Dylan Reid355d5e42016-04-29 16:53:31 -070056#define MAX_ADD_DEVICE_CALLS 2
Dylan Reid837c74a2016-01-22 17:25:21 -080057struct mock_cgroup {
58 struct container_cgroup cg;
59 int freeze_ret;
60 int thaw_ret;
61 int deny_all_devs_ret;
62 int add_device_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +080063 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080064
65 int init_called_count;
66 int deny_all_devs_called_count;
67
Dylan Reid4843d6b2017-03-31 18:14:30 -070068 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
Dylan Reid355d5e42016-04-29 16:53:31 -070069 int add_dev_major[MAX_ADD_DEVICE_CALLS];
70 int add_dev_minor[MAX_ADD_DEVICE_CALLS];
71 int add_dev_read[MAX_ADD_DEVICE_CALLS];
72 int add_dev_write[MAX_ADD_DEVICE_CALLS];
73 int add_dev_modify[MAX_ADD_DEVICE_CALLS];
74 char add_dev_type[MAX_ADD_DEVICE_CALLS];
75 int add_dev_called_count;
Chinyue Chenfac909e2016-06-24 14:17:42 +080076
77 int set_cpu_shares_count;
78 int set_cpu_quota_count;
79 int set_cpu_period_count;
80 int set_cpu_rt_runtime_count;
81 int set_cpu_rt_period_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080082};
83
84static struct mock_cgroup gmcg;
85
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070086static int mock_freeze(const struct container_cgroup *cg) {
Dylan Reid837c74a2016-01-22 17:25:21 -080087 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
88 return mcg->freeze_ret;
89}
90
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070091static int mock_thaw(const struct container_cgroup *cg) {
Dylan Reid837c74a2016-01-22 17:25:21 -080092 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
93 return mcg->thaw_ret;
94}
95
Luis Hector Chavez836d7b22017-09-14 15:11:15 -070096static int mock_deny_all_devices(const struct container_cgroup *cg) {
Dylan Reid837c74a2016-01-22 17:25:21 -080097 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
98 ++mcg->deny_all_devs_called_count;
99 return mcg->deny_all_devs_ret;
100}
101
Dylan Reid4843d6b2017-03-31 18:14:30 -0700102static int mock_add_device(const struct container_cgroup *cg, int allow,
103 int major, int minor, int read, int write,
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700104 int modify, char type) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800105 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700106
107 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
108 return mcg->add_device_ret;
Dylan Reid4843d6b2017-03-31 18:14:30 -0700109 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
Dylan Reid355d5e42016-04-29 16:53:31 -0700110 mcg->add_dev_major[mcg->add_dev_called_count] = major;
111 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
112 mcg->add_dev_read[mcg->add_dev_called_count] = read;
113 mcg->add_dev_write[mcg->add_dev_called_count] = write;
114 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
115 mcg->add_dev_type[mcg->add_dev_called_count] = type;
116 mcg->add_dev_called_count++;
Dylan Reid837c74a2016-01-22 17:25:21 -0800117 return mcg->add_device_ret;
118}
119
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700120static int mock_set_cpu_shares(const struct container_cgroup *cg, int shares) {
Chinyue Chenfac909e2016-06-24 14:17:42 +0800121 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
122 mcg->set_cpu_shares_count++;
123 return mcg->set_cpu_ret;
124}
125
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700126static int mock_set_cpu_quota(const struct container_cgroup *cg, int quota) {
Chinyue Chenfac909e2016-06-24 14:17:42 +0800127 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
128 mcg->set_cpu_quota_count++;
129 return mcg->set_cpu_ret;
130}
131
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700132static int mock_set_cpu_period(const struct container_cgroup *cg, int period) {
Chinyue Chenfac909e2016-06-24 14:17:42 +0800133 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
134 mcg->set_cpu_period_count++;
135 return mcg->set_cpu_ret;
136}
137
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700138static int mock_set_cpu_rt_runtime(const struct container_cgroup *cg,
139 int rt_runtime) {
Chinyue Chenfac909e2016-06-24 14:17:42 +0800140 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
141 mcg->set_cpu_rt_runtime_count++;
142 return mcg->set_cpu_ret;
143}
144
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700145static int mock_set_cpu_rt_period(const struct container_cgroup *cg,
146 int rt_period) {
Chinyue Chenfac909e2016-06-24 14:17:42 +0800147 struct mock_cgroup *mcg = (struct mock_cgroup *)cg;
148 mcg->set_cpu_rt_period_count++;
149 return mcg->set_cpu_ret;
150}
151
Dylan Reid837c74a2016-01-22 17:25:21 -0800152struct container_cgroup *container_cgroup_new(const char *name,
Keshav Santhanam998fd7d2016-07-12 13:33:00 -0700153 const char *cgroup_root,
Dylan Reida9966422016-07-21 10:11:34 -0700154 const char *cgroup_parent,
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700155 uid_t uid, gid_t gid) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800156 gmcg.cg.name = strdup(name);
157 return &gmcg.cg;
158}
159
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700160void container_cgroup_destroy(struct container_cgroup *c) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800161 free(c->name);
162}
163
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700164TEST(premounted_runfs) {
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700165 char premounted_runfs[] = "/tmp/cgtest_run/root";
166 struct container_config *config = container_config_create();
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700167 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700168
169 container_config_premounted_runfs(config, premounted_runfs);
170 const char *result = container_config_get_premounted_runfs(config);
171 ASSERT_EQ(0, strcmp(result, premounted_runfs));
172
173 container_config_destroy(config);
174}
175
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700176TEST(pid_file_path) {
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700177 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
178 struct container_config *config = container_config_create();
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700179 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700180
181 container_config_pid_file(config, pid_file_path);
182 const char *result = container_config_get_pid_file(config);
183 ASSERT_EQ(0, strcmp(result, pid_file_path));
184
185 container_config_destroy(config);
186}
187
Dylan Reid837c74a2016-01-22 17:25:21 -0800188/* Start of tests. */
189FIXTURE(container_test) {
190 struct container_config *config;
191 struct container *container;
192 int mount_flags;
193 char *rootfs;
194};
195
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700196FIXTURE_SETUP(container_test) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800197 char temp_template[] = "/tmp/cgtestXXXXXX";
198 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
199 char *rundir;
200 char path[256];
Dylan Reid17fd53f2016-11-18 19:14:41 -0800201 const char *pargs[] = {
Dylan Reid837c74a2016-01-22 17:25:21 -0800202 "/sbin/init",
203 };
204
205 memset(&mount_call_args, 0, sizeof(mount_call_args));
206 mount_called = 0;
207 memset(&mknod_call_args, 0, sizeof(mknod_call_args));
208 mkdtemp_root = NULL;
209
210 memset(&gmcg, 0, sizeof(gmcg));
211 static const struct cgroup_ops cgops = {
212 .freeze = mock_freeze,
213 .thaw = mock_thaw,
214 .deny_all_devices = mock_deny_all_devices,
215 .add_device = mock_add_device,
Chinyue Chenfac909e2016-06-24 14:17:42 +0800216 .set_cpu_shares = mock_set_cpu_shares,
217 .set_cpu_quota = mock_set_cpu_quota,
218 .set_cpu_period = mock_set_cpu_period,
219 .set_cpu_rt_runtime = mock_set_cpu_rt_runtime,
220 .set_cpu_rt_period = mock_set_cpu_rt_period,
Dylan Reid837c74a2016-01-22 17:25:21 -0800221 };
222 gmcg.cg.ops = &cgops;
223
224 self->rootfs = strdup(mkdtemp(temp_template));
225
226 kill_called = 0;
227 minijail_alt_syscall_table = NULL;
228 minijail_ipc_called = 0;
229 minijail_vfs_called = 0;
230 minijail_net_called = 0;
231 minijail_pids_called = 0;
232 minijail_run_as_init_called = 0;
233 minijail_user_called = 0;
234 minijail_wait_called = 0;
235 minijail_reset_signal_mask_called = 0;
236 mount_ret = 0;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800237 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800238
239 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800240
241 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
242
243 self->config = container_config_create();
244 container_config_rootfs(self->config, self->rootfs);
245 container_config_program_argv(self->config, pargs, 1);
246 container_config_alt_syscall_table(self->config, "testsyscalltable");
247 container_config_add_mount(self->config,
248 "testtmpfs",
249 "tmpfs",
250 "/tmp",
251 "tmpfs",
252 NULL,
Mike Frysinger05e594e2017-01-10 02:11:08 -0500253 NULL,
Dylan Reid837c74a2016-01-22 17:25:21 -0800254 self->mount_flags,
Mike Frysinger412dbd22017-01-06 01:50:34 -0500255 0,
Dylan Reid837c74a2016-01-22 17:25:21 -0800256 1000,
257 1000,
258 0x666,
259 0,
260 1);
261 container_config_add_device(self->config,
262 'c',
263 "/dev/foo",
264 S_IRWXU | S_IRWXG,
265 245,
266 2,
Dylan Reid355d5e42016-04-29 16:53:31 -0700267 0,
268 1000,
269 1001,
270 1,
271 1,
272 0);
273 /* test dynamic minor on /dev/null */
274 container_config_add_device(self->config,
275 'c',
276 "/dev/null",
277 S_IRWXU | S_IRWXG,
278 1,
279 -1,
280 1,
Dylan Reid837c74a2016-01-22 17:25:21 -0800281 1000,
282 1001,
283 1,
284 1,
285 0);
286
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800287 container_config_set_cpu_shares(self->config, TEST_CPU_SHARES);
288 container_config_set_cpu_cfs_params(
289 self->config, TEST_CPU_QUOTA, TEST_CPU_PERIOD);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800290 /* Invalid params, so this won't be applied. */
291 container_config_set_cpu_rt_params(self->config, 20000, 20000);
292
Dylan Reid837c74a2016-01-22 17:25:21 -0800293 rundir = mkdtemp(rundir_template);
Dylan Reide040c6b2016-05-02 18:49:02 -0700294 self->container = container_new("containerUT", rundir);
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700295 ASSERT_NE(nullptr, self->container);
Dylan Reid837c74a2016-01-22 17:25:21 -0800296}
297
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700298FIXTURE_TEARDOWN(container_test) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800299 char path[256];
300 int i;
301
302 container_destroy(self->container);
303 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
304 EXPECT_EQ(0, system(path));
305 free(self->rootfs);
306
307 for (i = 0; i < mount_called; i++) {
308 free(mount_call_args[i].source);
309 free(mount_call_args[i].target);
310 free(mount_call_args[i].filesystemtype);
311 }
312 free(mknod_call_args.pathname);
313 free(mkdtemp_root);
314}
315
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700316TEST_F(container_test, test_mount_tmp_start) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800317 char *path;
318
Dylan Reide040c6b2016-05-02 18:49:02 -0700319 EXPECT_EQ(0, container_start(self->container, self->config));
Dylan Reid837c74a2016-01-22 17:25:21 -0800320 EXPECT_EQ(2, mount_called);
321 EXPECT_EQ(0, strcmp(mount_call_args[1].source, "tmpfs"));
322 EXPECT_LT(0, asprintf(&path, "%s/root/tmp", mkdtemp_root));
323 EXPECT_EQ(0, strcmp(mount_call_args[1].target, path));
324 free(path);
325 EXPECT_EQ(0, strcmp(mount_call_args[1].filesystemtype,
326 "tmpfs"));
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700327 EXPECT_EQ(mount_call_args[1].mountflags,
328 static_cast<unsigned long>(self->mount_flags));
329 EXPECT_EQ(mount_call_args[1].data, nullptr);
Dylan Reid837c74a2016-01-22 17:25:21 -0800330
331 EXPECT_EQ(1, minijail_ipc_called);
332 EXPECT_EQ(1, minijail_vfs_called);
333 EXPECT_EQ(1, minijail_net_called);
334 EXPECT_EQ(1, minijail_pids_called);
335 EXPECT_EQ(1, minijail_user_called);
336 EXPECT_EQ(1, minijail_run_as_init_called);
337 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
338
Dylan Reid4843d6b2017-03-31 18:14:30 -0700339 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700340 EXPECT_EQ(245, gmcg.add_dev_major[0]);
341 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
342 EXPECT_EQ(1, gmcg.add_dev_read[0]);
343 EXPECT_EQ(1, gmcg.add_dev_write[0]);
344 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
345 EXPECT_EQ('c', gmcg.add_dev_type[0]);
346
Dylan Reid4843d6b2017-03-31 18:14:30 -0700347 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700348 EXPECT_EQ(1, gmcg.add_dev_major[1]);
349 EXPECT_EQ(3, gmcg.add_dev_minor[1]);
350 EXPECT_EQ(1, gmcg.add_dev_read[1]);
351 EXPECT_EQ(1, gmcg.add_dev_write[1]);
352 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
353 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800354
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800355 EXPECT_LT(0, asprintf(&path, "%s/root/dev/null", mkdtemp_root));
356 EXPECT_EQ(0, strcmp(mknod_call_args.pathname, path));
357 free(path);
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700358 EXPECT_EQ(mknod_call_args.mode,
359 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800360 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
361
Chinyue Chenfac909e2016-06-24 14:17:42 +0800362 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800363 EXPECT_EQ(TEST_CPU_SHARES,
364 container_config_get_cpu_shares(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800365 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800366 EXPECT_EQ(TEST_CPU_QUOTA,
367 container_config_get_cpu_quota(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800368 EXPECT_EQ(1, gmcg.set_cpu_period_count);
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800369 EXPECT_EQ(TEST_CPU_PERIOD,
370 container_config_get_cpu_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800371 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800372 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800373 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800374 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800375
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700376 ASSERT_NE(nullptr, minijail_alt_syscall_table);
Dylan Reid837c74a2016-01-22 17:25:21 -0800377 EXPECT_EQ(0, strcmp(minijail_alt_syscall_table,
378 "testsyscalltable"));
379
380 EXPECT_EQ(0, container_wait(self->container));
381 EXPECT_EQ(1, minijail_wait_called);
382 EXPECT_EQ(1, minijail_reset_signal_mask_called);
383}
384
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700385TEST_F(container_test, test_kill_container) {
Dylan Reide040c6b2016-05-02 18:49:02 -0700386 EXPECT_EQ(0, container_start(self->container, self->config));
Dylan Reid837c74a2016-01-22 17:25:21 -0800387 EXPECT_EQ(0, container_kill(self->container));
388 EXPECT_EQ(1, kill_called);
389 EXPECT_EQ(SIGKILL, kill_sig);
390 EXPECT_EQ(1, minijail_wait_called);
391}
392
393/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700394extern "C" {
395
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700396int mount(const char *source, const char *target, const char *filesystemtype,
397 unsigned long mountflags, const void *data) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800398 if (mount_called >= 5)
399 return 0;
400
401 mount_call_args[mount_called].source = strdup(source);
402 mount_call_args[mount_called].target = strdup(target);
403 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
404 mount_call_args[mount_called].mountflags = mountflags;
405 mount_call_args[mount_called].data = data;
406 ++mount_called;
407 return 0;
408}
409
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700410int umount(const char *target) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800411 return 0;
412}
413
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700414#ifdef __USE_EXTERN_INLINES
415/* Some environments use an inline version of mknod. */
416int __xmknod(int ver, const char *pathname, __mode_t mode, __dev_t *dev)
417#else
Dylan Reid837c74a2016-01-22 17:25:21 -0800418int mknod(const char *pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700419#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800420{
421 mknod_call_args.pathname = strdup(pathname);
422 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700423#ifdef __USE_EXTERN_INLINES
424 mknod_call_args.dev = *dev;
425#else
Dylan Reid837c74a2016-01-22 17:25:21 -0800426 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700427#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800428 return 0;
429}
430
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700431int chown(const char *path, uid_t owner, gid_t group) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800432 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700433}
Dylan Reid837c74a2016-01-22 17:25:21 -0800434
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700435int kill(pid_t pid, int sig) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800436 ++kill_called;
437 kill_sig = sig;
438 return 0;
439}
440
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700441#ifdef __USE_EXTERN_INLINES
442/* Some environments use an inline version of stat. */
443int __xstat(int ver, const char *path, struct stat *buf)
444#else
Dylan Reid837c74a2016-01-22 17:25:21 -0800445int stat(const char *path, struct stat *buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700446#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800447{
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800448 buf->st_rdev = stat_rdev_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800449 return 0;
450}
451
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700452int chmod(const char *path, mode_t mode) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800453 return 0;
454}
455
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700456char *mkdtemp(char *template_string) {
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700457 mkdtemp_root = strdup(template_string);
458 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800459}
460
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700461int mkdir(const char *pathname, mode_t mode) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800462 return 0;
463}
464
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700465int rmdir(const char *pathname) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800466 return 0;
467}
468
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700469int unlink(const char *pathname) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800470 return 0;
471}
472
473/* Minijail stubs */
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700474struct minijail *minijail_new(void) {
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800475 return (struct minijail *)0x55;
476}
477
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700478void minijail_destroy(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800479}
480
481int minijail_mount(struct minijail *j, const char *src, const char *dest,
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700482 const char *type, unsigned long flags) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800483 return 0;
484}
485
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700486void minijail_namespace_vfs(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800487 ++minijail_vfs_called;
488}
489
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700490void minijail_namespace_ipc(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800491 ++minijail_ipc_called;
492}
493
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700494void minijail_namespace_net(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800495 ++minijail_net_called;
496}
497
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700498void minijail_namespace_pids(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800499 ++minijail_pids_called;
500}
501
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700502void minijail_namespace_user(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800503 ++minijail_user_called;
504}
505
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700506int minijail_uidmap(struct minijail *j, const char *uidmap) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800507 return 0;
508}
509
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700510int minijail_gidmap(struct minijail *j, const char *gidmap) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800511 return 0;
512}
513
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700514int minijail_enter_pivot_root(struct minijail *j, const char *dir) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800515 return 0;
516}
517
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700518void minijail_run_as_init(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800519 ++minijail_run_as_init_called;
520}
521
522int minijail_run_pid_pipes_no_preload(struct minijail *j, const char *filename,
523 char *const argv[], pid_t *pchild_pid,
524 int *pstdin_fd, int *pstdout_fd,
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700525 int *pstderr_fd) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800526 *pchild_pid = INIT_TEST_PID;
527 return 0;
528}
529
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700530int minijail_write_pid_file(struct minijail *j, const char *path) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800531 return 0;
532}
533
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700534int minijail_wait(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800535 ++minijail_wait_called;
536 return 0;
537}
538
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700539int minijail_use_alt_syscall(struct minijail *j, const char *table) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800540 minijail_alt_syscall_table = table;
541 return 0;
542}
543
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700544int minijail_add_to_cgroup(struct minijail *j, const char *cg_path) {
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800545 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800546}
547
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700548void minijail_reset_signal_mask(struct minijail *j) {
Dylan Reid837c74a2016-01-22 17:25:21 -0800549 ++minijail_reset_signal_mask_called;
550}
551
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700552void minijail_skip_remount_private(struct minijail *j) {
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800553}
554
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700555} // extern "C"
556
Dylan Reid837c74a2016-01-22 17:25:21 -0800557TEST_HARNESS_MAIN