我如何在FreeBSD syscall openat中获得绝对路径?

时间:2018-06-21 10:32:53

标签: c kernel freebsd

我正在编写一个简单的程序来挂接freebsd syscall。
 像这样

static int
openat_hook(struct thread *td, register struct openat_args *uap)
{
  uprintf("  SYS_openat: \"%s\", flags: %d, mode: %X\n", uap->path, uap->flags, uap->mode);
  return sys_openat(td, uap);
}

这不会打印绝对路径。

当我进入用户空间时,可以通过realpath获得绝对路径。
但是,我不知道如何在内核中获得绝对路径。

1 个答案:

答案 0 :(得分:1)

您无法(可靠地)获得路径。 openat()打开相对于目录的给定文件描述符的相对文件名。因此,您必须首先找出打开文件描述符的绝对路径。描述符的目录可能不再存在,可能不在程序文件系统名称空间之外(chroot,pivot_root,switch_root,containers等),或者可能在其上安装了某些内容。

在Linux下,/ proc / self / fd /是显示FD绝对路径的符号链接。因此,内核知道FD的绝对路径。 BSD可能有类似的东西供您用来获取FD的路径。但是即使如此,由于上述原因,该路径可能仍然无效。