Файловая система Fuse ищет файлы / .Trash, /autorun.inf и /.xdg-volume-info - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь написать минимальный рабочий пример с библиотекой предохранителей.Желаемая файловая система должна иметь только один файл только для чтения.Проблема в том, что когда я инициализирую файловую систему 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

После последней строки программа зависает.


Ожидаемый результат - файловая система смонтирована в некотором каталоге, и я могу, например,перечислите содержимое каталога и посмотрите там единственный файл только для чтения.

...