Re: Equivalent of openat() on osx?
Re: Equivalent of openat() on osx?
- Subject: Re: Equivalent of openat() on osx?
- From: Anatol Pomozov <email@hidden>
- Date: Sat, 04 Jun 2011 19:49:24 -0700
On Tue, May 3, 2011 at 9:13 AM, Anatol Pomozov <email@hidden> wrote:
> Hi,
>
> I am porting a Linux program to macosx (target is 10.6 version) and
> the program uses openat/unlinkat/... functions. Although these
> functions are not in POSIX, they are widely used on *nixes and the
> part proposal the next POSIX.
>
> My question what is the best equivalent for the opentat() functions
> that can be used in multithreaded application. Currently I use
> something like this:
>
>
> int openat(int dirfd, const char *pathname, int flags, ...)
> {
> int fd;
>
> if(fchdir(dirfd) < 0) {
> perror("fchdir");
> return -1;
> }
> fd = open(pathname, flags, mode);
> // chdir to the original CWD
> return fd;
> }
>
> But this is not a perfect solution - current working directory is
> shared among all threads, it means that openat() may affect other
> threads. Is there an equivalent of this implementation without
> changing the current directory?
After using openat() function implementation based on chdir I found
that this is not the best solution. chdir sets process-wide working
directory and this means that you need to protect all open/stat/lstat
and other functions that might use relative paths. Otherwise you'll
have race condition. This is just too much hassle.
I decided to go with the following function implementation that IMHO better:
int openat(int dirfd, const char *pathname, int flags, ...)
{
char fullpath[MAXPATHLEN];
fcntl(dirfd, F_GETPATH, fullpath);
strlcat(fullpath, "/", MAXPATHLEN);
strlcat(fullpath, pathname, MAXPATHLEN);
// Use fullpath here
}
The idea is to get the path to the file descriptor that is used as a base.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden