// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBBRILLO_BRILLO_MINIJAIL_MINIJAIL_H_
#define LIBBRILLO_BRILLO_MINIJAIL_MINIJAIL_H_
#include <vector>
extern "C" {
#include <linux/capability.h>
#include <sys/types.h>
}
#include <libminijail.h>
#include "base/macros.h"
namespace brillo {
// A Minijail abstraction allowing Minijail mocking in tests.
class Minijail {
public:
virtual ~Minijail();
// This is a singleton -- use Minijail::GetInstance()->Foo().
static Minijail* GetInstance();
// minijail_new
virtual struct minijail* New();
// minijail_destroy
virtual void Destroy(struct minijail* jail);
// minijail_change_uid/minijail_change_gid
virtual void DropRoot(struct minijail* jail, uid_t uid, gid_t gid);
// minijail_change_user/minijail_change_group
virtual bool DropRoot(struct minijail* jail,
const char* user,
const char* group);
// minijail_namespace_pids
virtual void EnterNewPidNamespace(struct minijail* jail);
// minijail_mount_tmp
virtual void MountTmp(struct minijail* jail);
// minijail_use_seccomp_filter/minijail_no_new_privs/
// minijail_parse_seccomp_filters
virtual void UseSeccompFilter(struct minijail* jail, const char* path);
// minijail_use_caps
virtual void UseCapabilities(struct minijail* jail, uint64_t capmask);
// minijail_reset_signal_mask
virtual void ResetSignalMask(struct minijail* jail);
// minijail_enter
virtual void Enter(struct minijail* jail);
// minijail_run_pid
virtual bool Run(struct minijail* jail, std::vector<char*> args, pid_t* pid);
// minijail_run_pid and waitpid
virtual bool RunSync(struct minijail* jail,
std::vector<char*> args,
int* status);
// minijail_run_pid_pipes, with |pstdout_fd| and |pstderr_fd| set to NULL.
virtual bool RunPipe(struct minijail* jail,
std::vector<char*> args,
pid_t* pid,
int* stdin);
// minijail_run_pid_pipes
virtual bool RunPipes(struct minijail* jail,
std::vector<char*> args,
pid_t* pid,
int* stdin,
int* stdout,
int* stderr);
// Run() and Destroy()
virtual bool RunAndDestroy(struct minijail* jail,
std::vector<char*> args,
pid_t* pid);
// RunSync() and Destroy()
virtual bool RunSyncAndDestroy(struct minijail* jail,
std::vector<char*> args,
int* status);
// RunPipe() and Destroy()
virtual bool RunPipeAndDestroy(struct minijail* jail,
std::vector<char*> args,
pid_t* pid,
int* stdin);
// RunPipes() and Destroy()
virtual bool RunPipesAndDestroy(struct minijail* jail,
std::vector<char*> args,
pid_t* pid,
int* stdin,
int* stdout,
int* stderr);
protected:
Minijail();
private:
DISALLOW_COPY_AND_ASSIGN(Minijail);
};
} // namespace brillo
#endif // LIBBRILLO_BRILLO_MINIJAIL_MINIJAIL_H_