Я пытаюсь написать минимальный рабочий пример с библиотекой предохранителей.Желаемая файловая система должна иметь только один файл только для чтения.Проблема в том, что когда я инициализирую файловую систему fuse, она пытается получить атрибуты /.Trash
, /autorun.inf
и /.xdg-volume-info
.После этого он несколько раз пытается получить атрибуты корневого каталога и единственного файла, который есть в файловой системе.После этого он пытается получить атрибуты /autorun.inf и затем зависает.
Я использую fuse 3.4.1, который я установил из исходного кода, используя сборку meson.Я уже пытался запустить пример из библиотеки под названием hello_fuse.c, но у меня возникает та же проблема.Для написания этого кода я следовал этому учебнику.
Операция чтения (читает содержимое каталога):
static int do_readdir(const char *path, void *buffer, fuse_fill_dir_t filler,
off_t offset, fuse_file_info *fi, enum fuse_readdir_flags)
{
std::cout << "do_readdir is called on " << path << std::endl;
if (!dir_exists(path))
{
std::cout << "Entry doesn't exist" << std::endl
<< std::endl;
return -ENOENT;
}
filler(buffer, ".", nullptr, 0, FUSE_FILL_DIR_PLUS);
filler(buffer, "..", nullptr, 0, FUSE_FILL_DIR_PLUS);
if (strcmp(path, "/") == 0)
{
filler(buffer, "file_1.txt", nullptr, 0, FUSE_FILL_DIR_PLUS);
}
return 0;
}
Операция чтения (читает содержимоефайла)
static int do_read(const char *path, char *buffer, size_t size, off_t offset, fuse_file_info *fi)
{
std::cout << "do_read is called on " << path << std::endl
<< std::endl;
if (!file_exists(path))
{
std::cout << "Entry doesn't exist" << std::endl
<< std::endl;
return -ENOENT;
}
if (strlen(file_1_content) - offset < size)
{
size = strlen(file_1_content) - offset;
}
memcpy(buffer, file_1_content + offset, size);
return size;
}
Операция получения атрибутов (предоставляет атрибуты записи файловой системы)
static int do_getattr(const char *path, struct stat *st, fuse_file_info *fi)
{
std::cout << "do_getattr is called on " << path << std::endl
<< std::endl;
bool not_exists = !file_exists(path) && !dir_exists(path);
if (not_exists)
{
std::cout << "Entry doesn't exist" << std::endl
<< std::endl;
return -ENOENT;
}
st->st_uid = getuid();
st->st_gid = getgid();
st->st_atim.tv_sec = time(nullptr);
st->st_mtim.tv_sec = time(nullptr);
if (dir_exists(path))
{
st->st_mode = S_IFDIR | 0777;
st->st_nlink = 2;
}
else
{
st->st_mode = S_IFREG | 0777;
st->st_nlink = 1;
st->st_size = strlen(file_1_content);
}
return 0;
}
Другой код:
static struct fuse_operations operations = {
getattr : do_getattr,
read : do_read,
readdir : do_readdir,
};
int main(int argc, char *argv[])
{
std::cout << "Start mounting" << std::endl
<< std::endl;
return fuse_main(argc, argv, &operations, nullptr);
}
Вот выводпрограммы:
Start mounting
do_getattr is called on /.Trash
Entry doesn't exist
do_getattr is called on /.xdg-volume-info
Entry doesn't exist
do_getattr is called on /
do_readdir is called on /
do_getattr is called on /autorun.inf
Entry doesn't exist
do_getattr is called on /file_1.txt
do_getattr is called on /
do_readdir is called on /
do_getattr is called on /
.........................
do_readdir is called on /
do_getattr is called on /autorun.inf
Entry doesn't exist
После последней строки программа зависает.
Ожидаемый результат - файловая система смонтирована в некотором каталоге, и я могу, например,перечислите содержимое каталога и посмотрите там единственный файл только для чтения.