【问题标题】:How can i get the absolute path in a FreeBSD syscall openat?如何在 FreeBSD 系统调用 openat 中获取绝对路径?
【发布时间】:2018-11-30 15:46:23
【问题描述】:

我正在编写一个简单的程序来挂钩 freebsd 系统调用。
像这样

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 获取绝对路径。
但是,我不知道如何在内核中获得绝对路径。

【问题讨论】:

  • 那么realpath是怎么做到的呢?
  • @AndrewHenle 在kdump中,这个函数叫__getcwd,我在syscall表中找到了,但是找不到这个函数的实现,

标签: c kernel freebsd


【解决方案1】:

您无法(可靠地)获得路径。 openat() 打开相对于目录的给定文件描述符的相对文件名。因此,您必须首先找出打开文件描述符的绝对路径。描述符的目录可能不再存在,可能在程序文件系统命名空间之外(chroot、pivot_root、switch_root、容器......导致)或者可能挂载了一些东西。

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

【讨论】:

  • 最有可能的是,open( ... ) 被实现为openat( AT_FDCWD, ... ),所以大多数对sys_openat() 的调用实际上很可能是简单的open() 调用。如果不能可靠地获取文件描述符所引用的文件的路径,openat() 调用本身就会变得不可靠。
  • @AndrewHenle 内核有一个句柄,用于返回底层文件系统的打开文件描述符。句柄是可靠的,但可能没有有效路径。例如int fd=opendir("/tmp")。然后挂载 -t tmpfs tmpfs /tmp。 fd 的路径是什么? "/tmp" 现在指向不同的文件系统,但 openat(fd, "foo") 将在旧文件系统上打开一个文件。 -- 关于使用 openat(AT_FDCWD, ...) 的 open() 是正确的。你可以抓住这些情况。您根本无法使其可靠,因为有些案例没有有效路径。
猜你喜欢
  • 2011-01-14
  • 2011-02-19
  • 2015-11-16
  • 1970-01-01
  • 2019-08-16
  • 2014-05-24
  • 2010-09-21
  • 2014-09-12
相关资源
最近更新 更多