blob: f83d6b3edacd7432d772bc7e5bc50d1a1e13c8b8 [file] [log] [blame]
// Copyright 2018 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 ARC_CONTAINER_APPFUSE_APPFUSE_MOUNT_H_
#define ARC_CONTAINER_APPFUSE_APPFUSE_MOUNT_H_
#include <stdint.h>
#include <sys/types.h>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/memory/weak_ptr.h>
#include "arc/container/appfuse/data_filter.h"
namespace arc {
namespace appfuse {
// AppfuseMount represents a mountpoint for each appfuse mount.
class AppfuseMount {
public:
class Delegate {
public:
virtual ~Delegate() = default;
// Called when this mount stops functioning because of an error.
virtual void OnAppfuseMountAborted(AppfuseMount* mount) = 0;
};
AppfuseMount(const base::FilePath& mount_root,
uid_t uid,
int mount_id,
Delegate* delegate);
AppfuseMount(const AppfuseMount&) = delete;
AppfuseMount& operator=(const AppfuseMount&) = delete;
~AppfuseMount();
uid_t uid() const { return uid_; }
int mount_id() const { return mount_id_; }
// Mounts an appfuse file system and returns the filtered /dev/fuse FD
// associated with the mounted appfuse file system.
base::ScopedFD Mount();
// Unmounts the appfuse file system and returns true on success.
bool Unmount();
// Opens a file in the appfuse file system.
base::ScopedFD OpenFile(int file_id, int flags);
private:
void OnDataFilterStopped();
const base::FilePath mount_root_;
const uid_t uid_;
const int mount_id_;
Delegate* const delegate_;
const base::FilePath mount_point_;
DataFilter data_filter_;
base::WeakPtrFactory<AppfuseMount> weak_ptr_factory_;
};
} // namespace appfuse
} // namespace arc
#endif // ARC_CONTAINER_APPFUSE_APPFUSE_MOUNT_H_