如何使用 dentry_path_raw()

Mel*_*lab 5 c string linux-kernel

我正在为 Linux 编写内核模块,其目的是需要从dentry结构派生绝对路径。我知道该函数char *dentry_path_raw(struct dentry *dentry, char *buf, int buflen)可用于从dentry结构中检索绝对路径。我的问题是我不知道如何使用它。

缓冲区应该是存储路径的地方,但它需要缓冲区的长度。如果没有完整的路径,我怎么知道长度应该是多少?

我将需要将它获得的路径与几个硬编码的路径名进行比较,但是我如何使用缓冲区来做到这一点?这是否有效:

char *path_of_file = dentry_path_raw(my_dentry, my_buffer, buflen);
char *test_path = "/root/file";
if (path_of_file == test_path) {
    return 0;
} else {
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

Tsy*_*rev 4

path = dentry_path_raw(dentry, buffer, buflen);
Run Code Online (Sandbox Code Playgroud)

构建从结束buffer到开始的路径。也就是说,buffer[buflen - 1]设置为 '\0' 并且结果path指针将大于或等于buffer

在没有完整路径的情况下,我如何知道长度应该是多少?

即使函数本身也不知道路径的长度,直到它完全写入为止。只需选择具有一定长度的缓冲区并调用函数即可。路径长度的良好猜测是PATH_MAX。如果函数发现长度不足,则返回错误代码ERR_PTR(-ENAMETOOLONG)

至于路径比较,strcmp(path, test_path)可以使用simple。如果知道 的长度test_path,可以将其与 的长度进行比较path,可以简单计算,然后使用 memcmp:

if(test_path_len == ((buffer + buflen - 1) - path)
    && !memcmp(path, test_path, test_path_len)) // paths are equal
Run Code Online (Sandbox Code Playgroud)

请注意,dentry_path_raw相对于文件系统挂载点的目录项的返回路径包含该目录项。因此,只有当 dentry 包含在根文件系统中时,它才是绝对路径。