2013-04-18 95 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变量并将其转换为文件指针,以便我可以将其用作我的输入文件指针参数。由于它最初是由“开放”操作创建的,因此似乎应该有办法做到这一点,但我无法使其工作。

任何人都可以帮忙吗?谢谢!

回答

2

文件描述符和FILE *指针不是一回事。指针是指向由C实现提供的不透明类型的指针 - 处理FILE *fopenfreadfwritefclose等)的API是标准C的一部分。另一方面,操作文件描述符使用常用于实现C级抽象的POSIX系统调用(open,read,write,close等)。

幸运的是,有些功能可以让你从另一个中获取一个。在你的情况下,你会想要使用fdopen(3)从文件描述符中获得FILE *。如果你想以另一种方式走,你想看看fileno(3)

+0

看起来像是有效的。非常感谢! – Alex