2 votes

Comment puis-je obtenir le chemin absolu dans un syscall openat FreeBSD ?

J'écris un programme simple pour accrocher le syscall de freebsd.
Comme ceci

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);
}

Ceci n'imprime pas un chemin absolu.

Quand je suis dans l'espace utilisateur, je peux obtenir le chemin absolu par realpath.
Mais, je ne sais pas comment obtenir un chemin absolu dans le noyau.

1voto

Vous ne pouvez pas obtenir (de manière fiable) le chemin. openat() ouvre un nom de fichier relatif par rapport au descripteur de fichier donné d'un répertoire. Donc vous devriez d'abord trouver le chemin absolu d'un descripteur de fichier ouvert. Le répertoire du descripteur peut ne plus exister, être en dehors de l'espace de nom du système de fichiers des programmes (chroot, pivot_root, switch_root, containers,... en sont la cause) ou quelque chose peut être monté dessus.

Sous Linux, /proc/self/fd/ est un lien symbolique indiquant le chemin absolu du FD. Ainsi, le noyau connaît en quelque sorte le chemin absolu d'un FD. BSD pourrait avoir une chose similaire à utiliser pour obtenir le chemin d'un FD. Mais même dans ce cas, le chemin peut ne pas être valide pour les raisons données ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X