Приведение к указателю файла

Я настраиваю файловую систему FUSE, и мне нужно получить указатель на любые открытые файлы, чтобы я мог шифровать их по мере их записи. В системе FUSE используется специальная структура. Один из компонентов структуры называется fh и имеет тип uint64_t. Когда файл открывается, он фиксируется в переменной int, как вы можете видеть в следующем коде:

/* File open operation */
int bb_open(const char *path, struct fuse_file_info *fi)
{
    int fd;   
    fd = open(path, fi->flags);
    fi->fh = fd;
    return fd;
}

Эта fi-структура доступна мне в функции записи, и я надеюсь, что смогу использовать ее для создания указателя файла, который я могу передать своей функции шифрования. Вот код функции записи в том виде, в каком я его настроил на данный момент:

/* Write data to an open file */
int bb_write(const char *path, const char *buf, size_t size, off_t offset,
         struct fuse_file_info *fi)
{
    char* password;
    FILE* fp;
    //malloc and instantiate password
    fp = (FILE*) fi->fh; //my lame attempt to get a file pointer
    return encrypt(<inpFilePtr>, <outFilePtr>, 1, password);
}

Наконец, сигнатура моей функции шифрования выглядит так:

extern int encrypt(FILE* in, FILE* out, int action, char* key_str);

Я хотел бы взять эту переменную fi->fh и превратить ее в указатель файла, чтобы я мог использовать ее в качестве аргумента указателя входного файла. Поскольку изначально он был создан с помощью «открытой» операции, кажется, что должен быть способ сделать это, но я не могу заставить его работать.

Кто-нибудь может помочь? Спасибо!


person AndroidDev    schedule 18.04.2013    source источник


Ответы (1)


Файловые дескрипторы и указатели FILE * — это не одно и то же. Указатель FILE * — это указатель на непрозрачный тип, предоставленный вашей реализацией C. API, которые имеют дело с FILE * (fopen, fread, fwrite, fclose и т. д.), являются частью стандартного C. Дескрипторы файлов, с другой стороны, управляются при использовании системных вызовов POSIX (open, read, write, close и т. д.), которые часто используются для реализации абстракций уровня C.

К счастью, есть функции, которые позволяют получить одно из другого. В вашем случае вы захотите использовать fdopen(3), чтобы получить FILE * из файла дескриптор. Если вы хотите пойти другим путем, вам следует изучить fileno(3).

person Carl Norum    schedule 18.04.2013