blob: 5ec53188aeeedffbd62eae00bc203461ce2a6f11 [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
Luis Hector Chavez479b95f2016-06-06 08:01:05 -07006#ifndef LIBCONTAINER_LIBCONTAINER_H_
7#define LIBCONTAINER_LIBCONTAINER_H_
Dylan Reid837c74a2016-01-22 17:25:21 -08008
Dylan Reid2bd9ea92016-04-07 20:57:47 -07009#include <stddef.h>
Dylan Reid0bb592b2016-11-09 13:34:11 -080010#include <sys/types.h>
Dylan Reid837c74a2016-01-22 17:25:21 -080011
12#ifdef __cplusplus
13extern "C" {
14#endif
15
16struct container_config;
17
18/* Create a container config. */
19struct container_config *container_config_create();
20
21/* Destroy a config create with container_config_create. */
22void container_config_destroy(struct container_config *c);
23
Mike Frysingerb22acdf2017-01-08 02:02:35 -050024/* config_root - Path to the root of the container itself. */
25int container_config_config_root(struct container_config *c,
26 const char *config_root);
27
28/* Get the configured container root path. */
29const char *container_config_get_config_root(const struct container_config *c);
30
Dylan Reid837c74a2016-01-22 17:25:21 -080031/* rootfs - Path to the root of the container's filesystem. */
32int container_config_rootfs(struct container_config *c, const char *rootfs);
33
Dylan Reid11456722016-05-02 11:24:50 -070034/* Get the configured rootfs path. */
35const char *container_config_get_rootfs(const struct container_config *c);
36
Luis Hector Chavezc240e7e2016-09-22 10:33:03 -070037/* rootfs_mount_flags - Flags that will be passed to the mount() call when
38 * mounting the root of the container's filesystem. */
39void container_config_rootfs_mount_flags(struct container_config *c,
40 unsigned long flags);
41
42/* Get the configured rootfs mount() flags. */
43unsigned long container_config_get_rootfs_mount_flags(
44 const struct container_config *c);
45
Keshav Santhanam0e4c3282016-07-14 10:25:16 -070046/* runfs - Path to where the container filesystem has been mounted. */
Luis Hector Chavezc32a2e62016-09-23 09:19:16 -070047int container_config_premounted_runfs(struct container_config *c,
48 const char *runfs);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -070049
50/* Get the pre-mounted runfs path. */
Luis Hector Chavezc32a2e62016-09-23 09:19:16 -070051const char *container_config_get_premounted_runfs(
52 const struct container_config *c);
Keshav Santhanam0e4c3282016-07-14 10:25:16 -070053
54/* The pid of the program will be written here. */
55int container_config_pid_file(struct container_config *c, const char *path);
56
57/* Get the pid file path. */
58const char *container_config_get_pid_file(const struct container_config *c);
59
Dylan Reid837c74a2016-01-22 17:25:21 -080060/* The program to run and args, e.g. "/sbin/init", "--second-stage". */
61int container_config_program_argv(struct container_config *c,
Dylan Reid17fd53f2016-11-18 19:14:41 -080062 const char **argv, size_t num_args);
Dylan Reid837c74a2016-01-22 17:25:21 -080063
Dylan Reid11456722016-05-02 11:24:50 -070064/* Get the number of command line args for the program to be run. */
65size_t container_config_get_num_program_args(const struct container_config *c);
66
67/* Get the program argument at the given index. */
68const char *container_config_get_program_arg(const struct container_config *c,
69 size_t index);
70
Dylan Reid1874feb2016-06-22 17:53:50 -070071/* Sets/Gets the uid the container will run as. */
72void container_config_uid(struct container_config *c, uid_t uid);
73uid_t container_config_get_uid(const struct container_config *c);
74
Dylan Reid837c74a2016-01-22 17:25:21 -080075/* Mapping of UIDs in the container, e.g. "0 100000 1024" */
76int container_config_uid_map(struct container_config *c, const char *uid_map);
77
Dylan Reid1874feb2016-06-22 17:53:50 -070078/* Sets/Gets the gid the container will run as. */
79void container_config_gid(struct container_config *c, gid_t gid);
80gid_t container_config_get_gid(const struct container_config *c);
81
Dylan Reid837c74a2016-01-22 17:25:21 -080082/* Mapping of GIDs in the container, e.g. "0 100000 1024" */
83int container_config_gid_map(struct container_config *c, const char *gid_map);
84
85/* Alt-Syscall table to use or NULL if none. */
86int container_config_alt_syscall_table(struct container_config *c,
87 const char *alt_syscall_table);
88
89/*
90 * Add a filesystem to mount in the new VFS namespace.
91 *
92 * c - The container config in which to add the mount.
93 * source - Mount source, e.g. "tmpfs" or "/data".
94 * destination - Mount point in the container, e.g. "/dev".
95 * type - Mount type, e.g. "tmpfs", "selinuxfs", or "devpts".
96 * data - Mount data for extra options, e.g. "newinstance" or "ptmxmode=0000".
Mike Frysinger412dbd22017-01-06 01:50:34 -050097 * flags - Mount flags as defined in mount(2).
Dylan Reid837c74a2016-01-22 17:25:21 -080098 * uid - uid to chown mount point to if created.
99 * gid - gid to chown mount point to if created.
100 * mode - Permissions of mount point if created.
101 * mount_in_ns - True if mount should happen in the process' vfs namespace.
102 * create - If true, create mount destination if it doesn't exist.
Mike Frysinger412dbd22017-01-06 01:50:34 -0500103 * loopback - If true, set up a loopback device and mount that.
Dylan Reid837c74a2016-01-22 17:25:21 -0800104 */
105int container_config_add_mount(struct container_config *c,
106 const char *name,
107 const char *source,
108 const char *destination,
109 const char *type,
110 const char *data,
111 int flags,
112 int uid,
113 int gid,
114 int mode,
115 int mount_in_ns,
Mike Frysinger412dbd22017-01-06 01:50:34 -0500116 int create,
117 int loopback);
Dylan Reid837c74a2016-01-22 17:25:21 -0800118
119/*
120 * Add a device node to create.
121 *
122 * c - The container config in which to add the mount.
123 * type - 'c' or 'b' for char or block respectively.
124 * path - Where to mknod, "/dev/zero".
125 * fs_permissions - Permissions to set on the node.
126 * major - Major device number.
127 * minor - Minor device number.
Dylan Reid355d5e42016-04-29 16:53:31 -0700128 * copy_minor - Overwrite minor with the minor of the existing device node. If
129 * this is true minor will be copied from an existing node. The |minor| param
130 * should be set to -1 in this case.
Dylan Reid837c74a2016-01-22 17:25:21 -0800131 * uid - User to own the device.
132 * gid - Group to own the device.
133 * read_allowed - If true allow reading from the device via "devices" cgroup.
134 * write_allowed - If true allow writing to the device via "devices" cgroup.
135 * modify_allowed - If true allow creation of the device via "devices" cgroup.
136 */
137int container_config_add_device(struct container_config *c,
138 char type,
139 const char *path,
140 int fs_permissions,
141 int major,
142 int minor,
Dylan Reid355d5e42016-04-29 16:53:31 -0700143 int copy_minor,
Dylan Reid837c74a2016-01-22 17:25:21 -0800144 int uid,
145 int gid,
146 int read_allowed,
147 int write_allowed,
148 int modify_allowed);
149
Dylan Reid2bd9ea92016-04-07 20:57:47 -0700150/*
151 * Set to cause the given setfiles command to be run whenever a mount is made
152 * in the parent mount namespace.
153 */
Luis Hector Chavez479b95f2016-06-06 08:01:05 -0700154int container_config_run_setfiles(struct container_config *c,
155 const char *setfiles_cmd);
Dylan Reid837c74a2016-01-22 17:25:21 -0800156
Dylan Reid11456722016-05-02 11:24:50 -0700157/* Get the setfiles command that is configured to be run. */
158const char *container_config_get_run_setfiles(const struct container_config *c);
159
Chinyue Chenfac909e2016-06-24 14:17:42 +0800160/* Set the CPU shares cgroup param for container. */
161int container_config_set_cpu_shares(struct container_config *c, int shares);
162
163/* Set the CFS CPU cgroup params for container. */
164int container_config_set_cpu_cfs_params(struct container_config *c,
165 int quota,
166 int period);
167
168/* Set the RT CPU cgroup params for container. */
169int container_config_set_cpu_rt_params(struct container_config *c,
170 int rt_runtime,
171 int rt_period);
172
Chinyue Chen4f3fd682016-07-01 14:11:42 +0800173int container_config_get_cpu_shares(struct container_config *c);
174int container_config_get_cpu_quota(struct container_config *c);
175int container_config_get_cpu_period(struct container_config *c);
176int container_config_get_cpu_rt_runtime(struct container_config *c);
177int container_config_get_cpu_rt_period(struct container_config *c);
178
Dylan Reid9e724af2016-07-21 09:58:07 -0700179/*
180 * Configure the owner of cgroups created for the container.
181 *
182 * This is needed so the container's cgroup namespace rootdir is accessible
183 * inside the container.
184 *
185 * cgroup_parent - Parent directory under which to create the cgroup.
186 * cgroup_owner - The uid that should own the cgroups that are created.
Dmitry Torokhov14eef722016-09-27 16:40:37 -0700187 * cgroup_group - The gid that should own the cgroups that are created.
Dylan Reid9e724af2016-07-21 09:58:07 -0700188 */
189int container_config_set_cgroup_parent(struct container_config *c,
190 const char *parent,
Dmitry Torokhov14eef722016-09-27 16:40:37 -0700191 uid_t cgroup_owner,
192 gid_t cgroup_group);
Dylan Reid9e724af2016-07-21 09:58:07 -0700193
194/* Get the parent cgroup directory from the config. Here for UT only. */
195const char *container_config_get_cgroup_parent(struct container_config *c);
196
Keshav Santhanam1b6bf672016-08-10 18:35:12 -0700197/* Enable sharing of the host's network namespace with the container */
198void container_config_share_host_netns(struct container_config *c);
199int get_container_config_share_host_netns(struct container_config *c);
200
Dylan Reidc4335842016-11-11 10:24:52 -0800201/*
202 * Configures the container so that any FDs open in the parent process are still
203 * visible to the child. Useful for apps that need stdin/stdout/stderr. Use
204 * with caution to avoid leaking other FDs into the namespaced app.
205 */
206void container_config_keep_fds_open(struct container_config *c);
207
Dylan Reid837c74a2016-01-22 17:25:21 -0800208/* Container manipulation. */
209struct container;
210
211/*
212 * Create a container based on the given config.
213 *
214 * name - Name of the directory holding the container config files.
215 * rundir - Where to build the temporary rootfs.
Dylan Reid837c74a2016-01-22 17:25:21 -0800216 */
217struct container *container_new(const char *name,
Dylan Reide040c6b2016-05-02 18:49:02 -0700218 const char *rundir);
Dylan Reid837c74a2016-01-22 17:25:21 -0800219
220/* Destroy a container created with container_new. */
221void container_destroy(struct container *c);
222
Dylan Reide040c6b2016-05-02 18:49:02 -0700223/* Start the container. Returns 0 on success.
224 * c - The container to run.
225 * config - Details of how the container should be run.
226 */
227int container_start(struct container *c,
228 const struct container_config *config);
Dylan Reid837c74a2016-01-22 17:25:21 -0800229
230/* Get the path to the root of the container. */
231const char *container_root(struct container *c);
232
233/* Get the pid of the init process in the container. */
234int container_pid(struct container *c);
235
236/* Wait for the container to exit. Returns 0 on success. */
237int container_wait(struct container *c);
238
239/* Kill the container's init process, then wait for it to exit. */
240int container_kill(struct container *c);
241
242#ifdef __cplusplus
243}; /* extern "C" */
244#endif
245
Luis Hector Chavez479b95f2016-06-06 08:01:05 -0700246#endif /* LIBCONTAINER_LIBCONTAINER_H_ */