blob: bfadff079e971af94e27c744c65dcd7769c84d17 [file] [log] [blame]
// Copyright 2020 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_NAMESPACES_MOUNT_NAMESPACE_H_
#define LIBBRILLO_BRILLO_NAMESPACES_MOUNT_NAMESPACE_H_
#include "brillo/namespaces/platform.h"
#include <base/files/file_path.h>
#include <base/macros.h>
#include <brillo/brillo_export.h>
namespace brillo {
class BRILLO_EXPORT MountNamespaceInterface {
// An interface declaring the basic functionality of a mount namespace bound
// to a specific path. This basic functionality consists of reporting the
// namespace path.
public:
virtual ~MountNamespaceInterface() = default;
virtual const base::FilePath& path() const = 0;
};
class BRILLO_EXPORT UnownedMountNamespace : public MountNamespaceInterface {
// A class to store and retrieve the path of a persistent namespace. This
// class doesn't create nor destroy the namespace.
public:
explicit UnownedMountNamespace(const base::FilePath& ns_path)
: ns_path_(ns_path) {}
~UnownedMountNamespace() override;
const base::FilePath& path() const override { return ns_path_; }
private:
base::FilePath ns_path_;
DISALLOW_COPY_AND_ASSIGN(UnownedMountNamespace);
};
class BRILLO_EXPORT MountNamespace : public MountNamespaceInterface {
// A class to create a persistent mount namespace bound to a specific path.
// A new mount namespace is unshared from the mount namespace of the calling
// process when Create() is called; the namespace of the calling process
// remains unchanged. Recurring creation on a path is not allowed.
//
// Given that we cannot ensure that creation always succeeds this class is not
// fully RAII, but once the namespace is created (with Create()), it will be
// destroyed when the object goes out of scope.
public:
MountNamespace(const base::FilePath& ns_path, Platform* platform);
~MountNamespace() override;
bool Create();
bool Destroy();
const base::FilePath& path() const override { return ns_path_; }
private:
base::FilePath ns_path_;
Platform* platform_;
bool exists_;
DISALLOW_COPY_AND_ASSIGN(MountNamespace);
};
} // namespace brillo
#endif // LIBBRILLO_BRILLO_NAMESPACES_MOUNT_NAMESPACE_H_