blob: 2c30aee2954f15dc079070f7ecb16c0e184d859d [file] [log] [blame]
// Copyright 2021 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.
#include "fusebox/file_system.h"
namespace fusebox {
static void fs_init(void* userdata, struct fuse_conn_info* conn) {
static_cast<FileSystem*>(userdata)->Init(userdata, conn);
}
static void fs_destroy(void* userdata) {
static_cast<FileSystem*>(userdata)->Destroy(userdata);
}
inline FileSystem* fs(fuse_req_t req) {
return static_cast<FileSystem*>(fuse_req_userdata(req));
}
static void fs_lookup(fuse_req_t req, fuse_ino_t parent, const char* name) {
fs(req)->Lookup(std::make_unique<EntryRequest>(req), parent, name);
}
static void fs_forget(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup) {
fs(req)->Forget(std::make_unique<NoneRequest>(req), ino, nlookup);
}
static void fs_getattr(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
fs(req)->GetAttr(std::make_unique<AttrRequest>(req), ino, fi);
}
static void fs_setattr(fuse_req_t req,
fuse_ino_t ino,
struct stat* attr,
int to_set,
struct fuse_file_info* fi) {
fs(req)->SetAttr(std::make_unique<AttrRequest>(req), ino, attr, to_set, fi);
}
static void fs_mkdir(fuse_req_t req,
fuse_ino_t parent,
const char* name,
mode_t mode) {
fs(req)->MkDir(std::make_unique<EntryRequest>(req), parent, name, mode);
}
static void fs_unlink(fuse_req_t req, fuse_ino_t parent, const char* name) {
fs(req)->Unlink(std::make_unique<OkRequest>(req), parent, name);
}
static void fs_rmdir(fuse_req_t req, fuse_ino_t parent, const char* name) {
fs(req)->RmDir(std::make_unique<OkRequest>(req), parent, name);
}
static void fs_rename(fuse_req_t req,
fuse_ino_t parent,
const char* name,
fuse_ino_t new_parent,
const char* new_name) {
fs(req)->Rename(std::make_unique<OkRequest>(req), parent, name, new_parent,
new_name);
}
static void fs_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi) {
fs(req)->Open(std::make_unique<OpenRequest>(req), ino, fi);
}
static void fs_read(fuse_req_t req,
fuse_ino_t ino,
size_t size,
off_t off,
struct fuse_file_info* fi) {
fs(req)->Read(std::make_unique<BufferRequest>(req), ino, size, off, fi);
}
static void fs_write(fuse_req_t req,
fuse_ino_t ino,
const char* buf,
size_t size,
off_t off,
struct fuse_file_info* fi) {
fs(req)->Write(std::make_unique<WriteRequest>(req), ino, buf, size, off, fi);
}
static void fs_release(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
fs(req)->Release(std::make_unique<OkRequest>(req), ino, fi);
}
static void fs_opendir(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
fs(req)->OpenDir(std::make_unique<OpenRequest>(req), ino, fi);
}
static void fs_readdir(fuse_req_t req,
fuse_ino_t ino,
size_t size,
off_t off,
struct fuse_file_info* fi) {
fs(req)->ReadDir(std::make_unique<DirEntryRequest>(req, ino, size, off), ino,
off, fi);
}
static void fs_releasedir(fuse_req_t req,
fuse_ino_t ino,
struct fuse_file_info* fi) {
fs(req)->ReleaseDir(std::make_unique<OkRequest>(req), ino, fi);
}
static void fs_create(fuse_req_t req,
fuse_ino_t parent,
const char* name,
mode_t mode,
struct fuse_file_info* fi) {
fs(req)->Create(std::make_unique<CreateRequest>(req), parent, name, mode, fi);
}
// static
fuse_lowlevel_ops FileSystem::FuseOps() {
fuse_lowlevel_ops ops = {
.init = fs_init,
.destroy = fs_destroy,
.lookup = fs_lookup,
.forget = fs_forget,
.getattr = fs_getattr,
.setattr = fs_setattr,
.mkdir = fs_mkdir,
.unlink = fs_unlink,
.rmdir = fs_rmdir,
.rename = fs_rename,
.open = fs_open,
.read = fs_read,
.write = fs_write,
.release = fs_release,
.opendir = fs_opendir,
.readdir = fs_readdir,
.releasedir = fs_releasedir,
.create = fs_create,
};
return ops;
}
} // namespace fusebox