2013-04-18 3 views
1

Я настраиваю файловую систему 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; 
} 

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

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

Может ли кто-нибудь помочь? Благодаря!

ответ

2

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

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

+0

Похоже, что это работает. Огромное спасибо! – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^