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

Filed under:
|
|
|

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

Related posts about linux

Related posts about unix