问题描述
|
我正在开发一个FUSE应用程序,该应用程序使用一个带有mp3 \的目录,并将文件系统挂载到具有以下结构的另一个目录中(根据其标签):
Artist1
|
-----> Album11
|
-----> Track01
-----> Track02
-----> Track03
-----> Track04
-----> Track05
-----> Album12
....
Artist2
|
-----> Album21
-----> Album22
....
Artist3
.....
我正在使用sqlite3数据库维护指向实际文件的链接。 Artist和Album元素是文件夹,tracks元素是指向真实文件夹的链接。
我已经实现了为艺术家和专辑创建文件夹。但是现在我有一个问题。
我有这个:
static int getattr(...) {
....
else if ( level == 0 || level == 1 || level == 2 )
{
// Estamos en el primer nivel. Son artistas,y por lo tanto,carpetas.
stbuf->st_mode = S_IFDIR | 0755;
stbuf->st_nlink = 2;
lstat(path,stbuf);
}
else if (level == 3) {
// Estamos en el tercer nivel. Son canciones,por lo que son enlaces
stbuf->st_mode = S_IFLNK | 0755;
stbuf->st_nlink = 2;
lstat(path,stbuf);
}
.....
}
现在,当我将它们放在tracks目录中时,会收到一条消息,告诉我该功能尚未实现(链接功能)。我必须实现哪个功能才能知道链接指向何处?还是我必须在哪里填充指针的方向?
谢谢!
解决方法
这似乎为我工作:
添加一个
int my_readlink(const char *path,char *buf,size_t size)
函数,您的struct fuse_operations
成员.readlink
应该指向该函数。对于符号链接路径,您的函数应在缓冲区buf
中填充一个以零结尾的字符串,该字符串是链接目标的路径。写的字节数不要超过6个字节。例如。做类似的事情:
strncpy(buf,\"/target/path\",size);
在您的my_getattr()
函数中(struct fuse_operations
成员.getattr
应该指向该函数),对于符号链接路径,在第二个参数(struct stat * stbuf
)中进行设置:
stbuf->st_mod
至S_IFLNK | 0777
stbuf->st_nlink
至1
目标路径长度的<16>(长度不包含字符串的零终止符)
,要实现符号链接,您需要实现readlink()
函数-您在提供的缓冲区中填充一个以空终止的字符串,该字符串是链接的目标。
,您需要实现readdir
函数,请参见:
libfuse:fuse_operations结构参考