Get directory path by fd
Posted
by tylerl
on Stack Overflow
See other posts from Stack Overflow
or by tylerl
Published on 2010-03-21T04:13:27Z
Indexed on
2010/03/21
4:21 UTC
Read the original article
Hit count: 387
I've run into the need to be able refer to a directory by path given its file descriptor in Linux. The path doesn't have to be canonical, it just has to be functional so that I can pass it to other functions. So, taking the same parameters as passed to a function like fstatat()
, I need to be able to call a function like getxattr()
which doesn't have a f-XYZ-at()
variant.
So far I've come up with these solutions; though none are particularly elegant.
The simplest solution is to avoid the problem by calling openat()
and then using a function like fgetxattr()
. This works, but not in every situation. So another method is needed to fill the gaps.
The next solution involves looking up the information in proc:
if (!access("/proc/self/fd",X_OK)) {
sprintf(path,"/proc/self/fd/%i/",fd);
}
This, of course, totally breaks on systems without proc, including some chroot environments.
The last option, a more portable but potentially-race-condition-prone solution, looks like this:
DIR* save = opendir(".");
fchdir(fd);
getcwd(path,PATH_MAX);
fchdir(dirfd(save));
closedir(save);
The obvious problem here is that in a multithreaded app, changing the working directory around could have side effects.
However, the fact that it works is compelling: if I can get the path of a directory by calling fchdir()
followed by getcwd()
, why shouldn't I be able to just get the information directly: fgetcwd()
or something. Clearly the kernel is tracking the necessary information.
So how do I get to it?
© Stack Overflow or respective owner