blob: 491c3c0639c38c7af8d215e34ee46645dc883109 [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 {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070024 char* source;
25 char* target;
26 char* filesystemtype;
27 unsigned long mountflags;
28 const void* data;
Dylan Reid837c74a2016-01-22 17:25:21 -080029};
30static struct mount_args mount_call_args[5];
31static int mount_called;
32
33struct mknod_args {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070034 char* pathname;
35 mode_t mode;
36 dev_t dev;
Dylan Reid837c74a2016-01-22 17:25:21 -080037};
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;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070043static const char* minijail_alt_syscall_table;
Dylan Reid837c74a2016-01-22 17:25:21 -080044static 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;
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070053static char* mkdtemp_root;
Dylan Reid837c74a2016-01-22 17:25:21 -080054
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 {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070058 struct container_cgroup cg;
59 int freeze_ret;
60 int thaw_ret;
61 int deny_all_devs_ret;
62 int add_device_ret;
63 int set_cpu_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080064
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070065 int init_called_count;
66 int deny_all_devs_called_count;
Dylan Reid837c74a2016-01-22 17:25:21 -080067
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070068 int add_dev_allow[MAX_ADD_DEVICE_CALLS];
69 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
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070077 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 Chavez31735bc2017-09-15 08:17:10 -070086static int mock_freeze(const struct container_cgroup* cg) {
87 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
88 return mcg->freeze_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080089}
90
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070091static int mock_thaw(const struct container_cgroup* cg) {
92 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
93 return mcg->thaw_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -080094}
95
Luis Hector Chavez31735bc2017-09-15 08:17:10 -070096static int mock_deny_all_devices(const struct container_cgroup* cg) {
97 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
98 ++mcg->deny_all_devs_called_count;
99 return mcg->deny_all_devs_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800100}
101
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700102static int mock_add_device(const struct container_cgroup* cg,
103 int allow,
104 int major,
105 int minor,
106 int read,
107 int write,
108 int modify,
109 char type) {
110 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
Dylan Reid355d5e42016-04-29 16:53:31 -0700111
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700112 if (mcg->add_dev_called_count >= MAX_ADD_DEVICE_CALLS)
113 return mcg->add_device_ret;
114 mcg->add_dev_allow[mcg->add_dev_called_count] = allow;
115 mcg->add_dev_major[mcg->add_dev_called_count] = major;
116 mcg->add_dev_minor[mcg->add_dev_called_count] = minor;
117 mcg->add_dev_read[mcg->add_dev_called_count] = read;
118 mcg->add_dev_write[mcg->add_dev_called_count] = write;
119 mcg->add_dev_modify[mcg->add_dev_called_count] = modify;
120 mcg->add_dev_type[mcg->add_dev_called_count] = type;
121 mcg->add_dev_called_count++;
122 return mcg->add_device_ret;
Dylan Reid837c74a2016-01-22 17:25:21 -0800123}
124
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700125static int mock_set_cpu_shares(const struct container_cgroup* cg, int shares) {
126 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
127 mcg->set_cpu_shares_count++;
128 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800129}
130
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700131static int mock_set_cpu_quota(const struct container_cgroup* cg, int quota) {
132 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
133 mcg->set_cpu_quota_count++;
134 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800135}
136
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700137static int mock_set_cpu_period(const struct container_cgroup* cg, int period) {
138 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
139 mcg->set_cpu_period_count++;
140 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800141}
142
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700143static int mock_set_cpu_rt_runtime(const struct container_cgroup* cg,
144 int rt_runtime) {
145 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
146 mcg->set_cpu_rt_runtime_count++;
147 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800148}
149
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700150static int mock_set_cpu_rt_period(const struct container_cgroup* cg,
151 int rt_period) {
152 struct mock_cgroup* mcg = (struct mock_cgroup*)cg;
153 mcg->set_cpu_rt_period_count++;
154 return mcg->set_cpu_ret;
Chinyue Chenfac909e2016-06-24 14:17:42 +0800155}
156
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700157struct container_cgroup* container_cgroup_new(const char* name,
158 const char* cgroup_root,
159 const char* cgroup_parent,
160 uid_t uid,
161 gid_t gid) {
162 gmcg.cg.name = strdup(name);
163 return &gmcg.cg;
Dylan Reid837c74a2016-01-22 17:25:21 -0800164}
165
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700166void container_cgroup_destroy(struct container_cgroup* c) {
167 free(c->name);
Dylan Reid837c74a2016-01-22 17:25:21 -0800168}
169
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700170TEST(premounted_runfs) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700171 char premounted_runfs[] = "/tmp/cgtest_run/root";
172 struct container_config* config = container_config_create();
173 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700174
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700175 container_config_premounted_runfs(config, premounted_runfs);
176 const char* result = container_config_get_premounted_runfs(config);
177 ASSERT_EQ(0, strcmp(result, premounted_runfs));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700178
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700179 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700180}
181
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700182TEST(pid_file_path) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700183 char pid_file_path[] = "/tmp/cgtest_run/root/container.pid";
184 struct container_config* config = container_config_create();
185 ASSERT_NE(nullptr, config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700186
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700187 container_config_pid_file(config, pid_file_path);
188 const char* result = container_config_get_pid_file(config);
189 ASSERT_EQ(0, strcmp(result, pid_file_path));
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700190
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700191 container_config_destroy(config);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -0700192}
193
Dylan Reid837c74a2016-01-22 17:25:21 -0800194/* Start of tests. */
195FIXTURE(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700196 struct container_config* config;
197 struct container* container;
198 int mount_flags;
199 char* rootfs;
Dylan Reid837c74a2016-01-22 17:25:21 -0800200};
201
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700202FIXTURE_SETUP(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700203 char temp_template[] = "/tmp/cgtestXXXXXX";
204 char rundir_template[] = "/tmp/cgtest_runXXXXXX";
205 char* rundir;
206 char path[256];
207 const char* pargs[] = {
208 "/sbin/init",
209 };
Dylan Reid837c74a2016-01-22 17:25:21 -0800210
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700211 memset(&mount_call_args, 0, sizeof(mount_call_args));
212 mount_called = 0;
213 memset(&mknod_call_args, 0, sizeof(mknod_call_args));
214 mkdtemp_root = nullptr;
Dylan Reid837c74a2016-01-22 17:25:21 -0800215
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700216 memset(&gmcg, 0, sizeof(gmcg));
217 static const struct cgroup_ops cgops = {
218 .freeze = mock_freeze,
219 .thaw = mock_thaw,
220 .deny_all_devices = mock_deny_all_devices,
221 .add_device = mock_add_device,
222 .set_cpu_shares = mock_set_cpu_shares,
223 .set_cpu_quota = mock_set_cpu_quota,
224 .set_cpu_period = mock_set_cpu_period,
225 .set_cpu_rt_runtime = mock_set_cpu_rt_runtime,
226 .set_cpu_rt_period = mock_set_cpu_rt_period,
227 };
228 gmcg.cg.ops = &cgops;
Dylan Reid837c74a2016-01-22 17:25:21 -0800229
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700230 self->rootfs = strdup(mkdtemp(temp_template));
Dylan Reid837c74a2016-01-22 17:25:21 -0800231
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700232 kill_called = 0;
233 minijail_alt_syscall_table = nullptr;
234 minijail_ipc_called = 0;
235 minijail_vfs_called = 0;
236 minijail_net_called = 0;
237 minijail_pids_called = 0;
238 minijail_run_as_init_called = 0;
239 minijail_user_called = 0;
240 minijail_wait_called = 0;
241 minijail_reset_signal_mask_called = 0;
242 mount_ret = 0;
243 stat_rdev_ret = makedev(2, 3);
Dylan Reid837c74a2016-01-22 17:25:21 -0800244
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700245 snprintf(path, sizeof(path), "%s/dev", self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800246
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700247 self->mount_flags = MS_NOSUID | MS_NODEV | MS_NOEXEC;
Dylan Reid837c74a2016-01-22 17:25:21 -0800248
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700249 self->config = container_config_create();
250 container_config_rootfs(self->config, self->rootfs);
251 container_config_program_argv(self->config, pargs, 1);
252 container_config_alt_syscall_table(self->config, "testsyscalltable");
253 container_config_add_mount(self->config,
254 "testtmpfs",
255 "tmpfs",
256 "/tmp",
257 "tmpfs",
258 nullptr,
259 nullptr,
260 self->mount_flags,
261 0,
262 1000,
263 1000,
264 0x666,
265 0,
266 1);
267 container_config_add_device(self->config,
268 'c',
269 "/dev/foo",
270 S_IRWXU | S_IRWXG,
271 245,
272 2,
273 0,
274 1000,
275 1001,
276 1,
277 1,
278 0);
279 /* test dynamic minor on /dev/null */
280 container_config_add_device(self->config,
281 'c',
282 "/dev/null",
283 S_IRWXU | S_IRWXG,
284 1,
285 -1,
286 1,
287 1000,
288 1001,
289 1,
290 1,
291 0);
Dylan Reid837c74a2016-01-22 17:25:21 -0800292
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700293 container_config_set_cpu_shares(self->config, TEST_CPU_SHARES);
294 container_config_set_cpu_cfs_params(
295 self->config, TEST_CPU_QUOTA, TEST_CPU_PERIOD);
296 /* Invalid params, so this won't be applied. */
297 container_config_set_cpu_rt_params(self->config, 20000, 20000);
Chinyue Chenfac909e2016-06-24 14:17:42 +0800298
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700299 rundir = mkdtemp(rundir_template);
300 self->container = container_new("containerUT", rundir);
301 ASSERT_NE(nullptr, self->container);
Dylan Reid837c74a2016-01-22 17:25:21 -0800302}
303
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700304FIXTURE_TEARDOWN(container_test) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700305 char path[256];
306 int i;
Dylan Reid837c74a2016-01-22 17:25:21 -0800307
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700308 container_destroy(self->container);
309 snprintf(path, sizeof(path), "rm -rf %s", self->rootfs);
310 EXPECT_EQ(0, system(path));
311 free(self->rootfs);
Dylan Reid837c74a2016-01-22 17:25:21 -0800312
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700313 for (i = 0; i < mount_called; i++) {
314 free(mount_call_args[i].source);
315 free(mount_call_args[i].target);
316 free(mount_call_args[i].filesystemtype);
317 }
318 free(mknod_call_args.pathname);
319 free(mkdtemp_root);
Dylan Reid837c74a2016-01-22 17:25:21 -0800320}
321
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700322TEST_F(container_test, test_mount_tmp_start) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700323 char* path;
Dylan Reid837c74a2016-01-22 17:25:21 -0800324
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700325 EXPECT_EQ(0, container_start(self->container, self->config));
326 EXPECT_EQ(2, mount_called);
327 EXPECT_EQ(0, strcmp(mount_call_args[1].source, "tmpfs"));
328 EXPECT_LT(0, asprintf(&path, "%s/root/tmp", mkdtemp_root));
329 EXPECT_EQ(0, strcmp(mount_call_args[1].target, path));
330 free(path);
331 EXPECT_EQ(0, strcmp(mount_call_args[1].filesystemtype, "tmpfs"));
332 EXPECT_EQ(mount_call_args[1].mountflags,
333 static_cast<unsigned long>(self->mount_flags));
334 EXPECT_EQ(mount_call_args[1].data, nullptr);
Dylan Reid837c74a2016-01-22 17:25:21 -0800335
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700336 EXPECT_EQ(1, minijail_ipc_called);
337 EXPECT_EQ(1, minijail_vfs_called);
338 EXPECT_EQ(1, minijail_net_called);
339 EXPECT_EQ(1, minijail_pids_called);
340 EXPECT_EQ(1, minijail_user_called);
341 EXPECT_EQ(1, minijail_run_as_init_called);
342 EXPECT_EQ(1, gmcg.deny_all_devs_called_count);
Dylan Reid837c74a2016-01-22 17:25:21 -0800343
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700344 EXPECT_EQ(1, gmcg.add_dev_allow[0]);
345 EXPECT_EQ(245, gmcg.add_dev_major[0]);
346 EXPECT_EQ(2, gmcg.add_dev_minor[0]);
347 EXPECT_EQ(1, gmcg.add_dev_read[0]);
348 EXPECT_EQ(1, gmcg.add_dev_write[0]);
349 EXPECT_EQ(0, gmcg.add_dev_modify[0]);
350 EXPECT_EQ('c', gmcg.add_dev_type[0]);
Dylan Reid355d5e42016-04-29 16:53:31 -0700351
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700352 EXPECT_EQ(1, gmcg.add_dev_allow[1]);
353 EXPECT_EQ(1, gmcg.add_dev_major[1]);
354 EXPECT_EQ(3, gmcg.add_dev_minor[1]);
355 EXPECT_EQ(1, gmcg.add_dev_read[1]);
356 EXPECT_EQ(1, gmcg.add_dev_write[1]);
357 EXPECT_EQ(0, gmcg.add_dev_modify[1]);
358 EXPECT_EQ('c', gmcg.add_dev_type[1]);
Dylan Reid837c74a2016-01-22 17:25:21 -0800359
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700360 EXPECT_LT(0, asprintf(&path, "%s/root/dev/null", mkdtemp_root));
361 EXPECT_EQ(0, strcmp(mknod_call_args.pathname, path));
362 free(path);
363 EXPECT_EQ(mknod_call_args.mode,
364 static_cast<mode_t>(S_IRWXU | S_IRWXG | S_IFCHR));
365 EXPECT_EQ(mknod_call_args.dev, makedev(1, 3));
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800366
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700367 EXPECT_EQ(1, gmcg.set_cpu_shares_count);
368 EXPECT_EQ(TEST_CPU_SHARES, container_config_get_cpu_shares(self->config));
369 EXPECT_EQ(1, gmcg.set_cpu_quota_count);
370 EXPECT_EQ(TEST_CPU_QUOTA, container_config_get_cpu_quota(self->config));
371 EXPECT_EQ(1, gmcg.set_cpu_period_count);
372 EXPECT_EQ(TEST_CPU_PERIOD, container_config_get_cpu_period(self->config));
373 EXPECT_EQ(0, gmcg.set_cpu_rt_runtime_count);
374 EXPECT_EQ(0, container_config_get_cpu_rt_runtime(self->config));
375 EXPECT_EQ(0, gmcg.set_cpu_rt_period_count);
376 EXPECT_EQ(0, container_config_get_cpu_rt_period(self->config));
Chinyue Chenfac909e2016-06-24 14:17:42 +0800377
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700378 ASSERT_NE(nullptr, minijail_alt_syscall_table);
379 EXPECT_EQ(0, strcmp(minijail_alt_syscall_table, "testsyscalltable"));
Dylan Reid837c74a2016-01-22 17:25:21 -0800380
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700381 EXPECT_EQ(0, container_wait(self->container));
382 EXPECT_EQ(1, minijail_wait_called);
383 EXPECT_EQ(1, minijail_reset_signal_mask_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800384}
385
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700386TEST_F(container_test, test_kill_container) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700387 EXPECT_EQ(0, container_start(self->container, self->config));
388 EXPECT_EQ(0, container_kill(self->container));
389 EXPECT_EQ(1, kill_called);
390 EXPECT_EQ(SIGKILL, kill_sig);
391 EXPECT_EQ(1, minijail_wait_called);
Dylan Reid837c74a2016-01-22 17:25:21 -0800392}
393
394/* libc stubs so the UT doesn't need root to call mount, etc. */
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700395extern "C" {
396
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700397int mount(const char* source,
398 const char* target,
399 const char* filesystemtype,
400 unsigned long mountflags,
401 const void* data) {
402 if (mount_called >= 5)
403 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800404
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700405 mount_call_args[mount_called].source = strdup(source);
406 mount_call_args[mount_called].target = strdup(target);
407 mount_call_args[mount_called].filesystemtype = strdup(filesystemtype);
408 mount_call_args[mount_called].mountflags = mountflags;
409 mount_call_args[mount_called].data = data;
410 ++mount_called;
411 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800412}
413
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700414int umount(const char* target) {
415 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800416}
417
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700418#ifdef __USE_EXTERN_INLINES
419/* Some environments use an inline version of mknod. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700420int __xmknod(int ver, const char* pathname, __mode_t mode, __dev_t* dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700421#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700422int mknod(const char* pathname, mode_t mode, dev_t dev)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700423#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800424{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700425 mknod_call_args.pathname = strdup(pathname);
426 mknod_call_args.mode = mode;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700427#ifdef __USE_EXTERN_INLINES
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700428 mknod_call_args.dev = *dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700429#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700430 mknod_call_args.dev = dev;
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700431#endif
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700432 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800433}
434
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700435int chown(const char* path, uid_t owner, gid_t group) {
436 return 0;
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700437}
Dylan Reid837c74a2016-01-22 17:25:21 -0800438
Luis Hector Chavez836d7b22017-09-14 15:11:15 -0700439int kill(pid_t pid, int sig) {
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700440 ++kill_called;
441 kill_sig = sig;
442 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800443}
444
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700445#ifdef __USE_EXTERN_INLINES
446/* Some environments use an inline version of stat. */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700447int __xstat(int ver, const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700448#else
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700449int stat(const char* path, struct stat* buf)
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700450#endif
Dylan Reid837c74a2016-01-22 17:25:21 -0800451{
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700452 buf->st_rdev = stat_rdev_ret;
453 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800454}
455
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700456int chmod(const char* path, mode_t mode) {
457 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800458}
459
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700460char* mkdtemp(char* template_string) {
461 mkdtemp_root = strdup(template_string);
462 return template_string;
Dylan Reid837c74a2016-01-22 17:25:21 -0800463}
464
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700465int mkdir(const char* pathname, mode_t mode) {
466 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800467}
468
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700469int rmdir(const char* pathname) {
470 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800471}
472
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700473int unlink(const char* pathname) {
474 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800475}
476
477/* Minijail stubs */
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700478struct minijail* minijail_new(void) {
479 return (struct minijail*)0x55;
Chinyue Chen03c54ae2016-06-29 12:29:10 +0800480}
481
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700482void minijail_destroy(struct minijail* j) {}
483
484int minijail_mount(struct minijail* j,
485 const char* src,
486 const char* dest,
487 const char* type,
488 unsigned long flags) {
489 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800490}
491
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700492void minijail_namespace_vfs(struct minijail* j) {
493 ++minijail_vfs_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800494}
495
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700496void minijail_namespace_ipc(struct minijail* j) {
497 ++minijail_ipc_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800498}
499
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700500void minijail_namespace_net(struct minijail* j) {
501 ++minijail_net_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800502}
503
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700504void minijail_namespace_pids(struct minijail* j) {
505 ++minijail_pids_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800506}
507
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700508void minijail_namespace_user(struct minijail* j) {
509 ++minijail_user_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800510}
511
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700512int minijail_uidmap(struct minijail* j, const char* uidmap) {
513 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800514}
515
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700516int minijail_gidmap(struct minijail* j, const char* gidmap) {
517 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800518}
519
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700520int minijail_enter_pivot_root(struct minijail* j, const char* dir) {
521 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800522}
523
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700524void minijail_run_as_init(struct minijail* j) {
525 ++minijail_run_as_init_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800526}
527
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700528int minijail_run_pid_pipes_no_preload(struct minijail* j,
529 const char* filename,
530 char* const argv[],
531 pid_t* pchild_pid,
532 int* pstdin_fd,
533 int* pstdout_fd,
534 int* pstderr_fd) {
535 *pchild_pid = INIT_TEST_PID;
536 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800537}
538
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700539int minijail_write_pid_file(struct minijail* j, const char* path) {
540 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800541}
542
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700543int minijail_wait(struct minijail* j) {
544 ++minijail_wait_called;
545 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800546}
547
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700548int minijail_use_alt_syscall(struct minijail* j, const char* table) {
549 minijail_alt_syscall_table = table;
550 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800551}
552
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700553int minijail_add_to_cgroup(struct minijail* j, const char* cg_path) {
554 return 0;
Dylan Reid837c74a2016-01-22 17:25:21 -0800555}
556
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700557void minijail_reset_signal_mask(struct minijail* j) {
558 ++minijail_reset_signal_mask_called;
Dylan Reid837c74a2016-01-22 17:25:21 -0800559}
560
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700561void minijail_skip_remount_private(struct minijail* j) {}
Dylan Reid837c74a2016-01-22 17:25:21 -0800562
Luis Hector Chavez31735bc2017-09-15 08:17:10 -0700563} // extern "C"
Luis Hector Chavezf9b16872017-09-14 14:22:15 -0700564
Dylan Reid837c74a2016-01-22 17:25:21 -0800565TEST_HARNESS_MAIN