blob: ffb529cbf333ffc453a85474f7f6516d75f233f4 [file] [log] [blame]
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -07001// Copyright (c) 2012 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#include "shill/minijail.h"
6
Jorge Lucangeli Obesccd5c852012-12-19 18:08:40 -08007#include <sys/types.h>
8#include <sys/wait.h>
9
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070010using std::vector;
11
12namespace shill {
13
14static base::LazyInstance<Minijail> g_minijail = LAZY_INSTANCE_INITIALIZER;
15
16Minijail::Minijail() {}
17
18Minijail::~Minijail() {}
19
20// static
21Minijail *Minijail::GetInstance() {
22 return g_minijail.Pointer();
23}
24
25struct minijail *Minijail::New() {
26 return minijail_new();
27}
28
29void Minijail::Destroy(struct minijail *jail) {
30 minijail_destroy(jail);
31}
32
33bool Minijail::DropRoot(struct minijail *jail, const char *user) {
34 // |user| is copied so the only reason either of these calls can fail
35 // is ENOMEM.
36 return !minijail_change_user(jail, user) &&
37 !minijail_change_group(jail, user);
38}
39
40void Minijail::UseCapabilities(struct minijail *jail, uint64_t capmask) {
41 minijail_use_caps(jail, capmask);
42}
43
44bool Minijail::Run(struct minijail *jail,
45 vector<char *> args, pid_t *pid) {
46 return minijail_run_pid(jail, args[0], args.data(), pid) == 0;
47}
48
Jorge Lucangeli Obesccd5c852012-12-19 18:08:40 -080049bool Minijail::RunSync(struct minijail *jail,
50 vector<char *> args, int *status) {
51 pid_t pid;
52 if (Run(jail, args, &pid) && waitpid(pid, status, 0) == pid) {
53 return true;
54 }
55
56 return false;
57}
58
Jorge Lucangeli Obes8c1706f2012-08-30 15:30:48 -070059bool Minijail::RunPipe(struct minijail *jail,
60 vector<char *> args, pid_t *pid, int *stdin) {
61 return minijail_run_pid_pipe(jail, args[0], args.data(), pid, stdin) == 0;
62}
63
Christopher Wiley8fa357c2013-02-21 11:35:58 -080064bool Minijail::RunPipes(struct minijail *jail, vector<char *> args, pid_t *pid,
65 int *stdin, int *stdout, int *stderr) {
66 return minijail_run_pid_pipes(jail, args[0], args.data(),
67 pid, stdin, stdout, stderr) == 0;
68}
69
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070070bool Minijail::RunAndDestroy(struct minijail *jail,
71 vector<char *> args, pid_t *pid) {
72 bool res = Run(jail, args, pid);
73 Destroy(jail);
74 return res;
75}
76
Jorge Lucangeli Obesccd5c852012-12-19 18:08:40 -080077bool Minijail::RunSyncAndDestroy(struct minijail *jail,
78 vector<char *> args, int *status) {
79 bool res = RunSync(jail, args, status);
80 Destroy(jail);
81 return res;
82}
83
Jorge Lucangeli Obes8c1706f2012-08-30 15:30:48 -070084bool Minijail::RunPipeAndDestroy(struct minijail *jail,
85 vector<char *> args, pid_t *pid, int *stdin) {
86 bool res = RunPipe(jail, args, pid, stdin);
87 Destroy(jail);
88 return res;
89}
90
Christopher Wiley8fa357c2013-02-21 11:35:58 -080091bool Minijail::RunPipesAndDestroy(struct minijail *jail,
92 vector<char *> args, pid_t *pid, int *stdin,
93 int *stdout, int *stderr) {
94 bool res = RunPipes(jail, args, pid, stdin, stdout, stderr);
95 Destroy(jail);
96 return res;
97}
98
Jorge Lucangeli Obesad43cc62012-04-11 16:25:43 -070099} // namespace shill