我正在开发一个带有mp3的目录的FUSE应用程序,并将文件系统安装在具有以下结构的另一个目录中(根据它们的标记):
Artist1
|
-----> Album11
|
-----> Track01
-----> Track02
-----> Track03
-----> Track04
-----> Track05
-----> Album12
....
Artist2
|
-----> Album21
-----> Album22
....
Artist3
.....
我正在使用sqlite3数据库来保存指向真实文件的链接。艺术家和专辑元素是文件夹,轨道元素是真实元素的链接。
我已经完成了为艺术家和专辑创建文件夹。但现在我有一个问题。
我有这个:
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);
}
.....
}
现在,当我进入track目录时,会收到一条消息,告诉我该函数未实现(链接函数)。我必须实现哪些功能才能知道链接指向的位置?或者我在哪里填写指针的方向?
谢谢!
答案 0 :(得分:4)
这似乎对我有用:
添加int my_readlink(const char *path, char *buf, size_t size)
成员,struct fuse_operations
成员.readlink
应指向此功能。对于符号链接路径,您的函数应使用零终止字符串填充缓冲区buf
,该字符串是链接目标的路径。不要写超过size
个字节。例如。做类似的事情:
strncpy(buf, "/target/path", size);
在my_getattr()
函数(struct fuse_operations
成员.getattr
应指向)中,对于符号链接路径,请在第2个参数(struct stat * stbuf
)中设置:
stbuf->st_mod
至S_IFLNK | 0777
stbuf->st_nlink
至1
stbuf->st_size
到目标路径的长度(不包括长度中字符串的零终结符)答案 1 :(得分:1)
您需要实现readdir
功能,请参阅:
答案 2 :(得分:1)
要实现符号链接,您需要实现readlink()
函数 - 使用以空字符结尾的字符串填充提供的缓冲区,该字符串是链接的目标。