site_archiver@lists.apple.com Delivered-To: darwin-dev@lists.apple.com Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=ICZwadwDHhEIpGI8Z7Ow9S1cBR6Ib9EnWq6KLwhtnZ4=; b=LxGLuXF7ys/su17lpumTHR+EUMPgZ0XaywpXjbJQqx39Yy2u/2wyw9R5CgVepfJ/3S Y8k4kslC+uPGQwwK6l0mNuiwgJyxW36RYS15UPp2xKV+Jd4WQ2wCNKUPdOJF9vmPwVCR Dbo4m+sDgbtNaDrZ/HrET4/8TpDdJI8sYnWaI= Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=IwH6Q1O16Jz8sNcfazj6KYQdJTm5V2PI/3N3Yvv+H2MeOdBbHQ7GhhS3lvzBmxx4ka 1KCWGYuJbJyAF3Y+gNegmxEBOW7LOQZTWIg1BAT1ORzE6vYRw1LlfOelby4ffarfPo3d QyuEb1IEMks5GYIHohhpUTEFVHXodErFhjAsA= Hi On Tue, May 3, 2011 at 10:45 AM, Tilghman Lesher <tilghman@meg.abyt.es> wrote:
On Tuesday 03 May 2011 11:13:09 Anatol Pomozov wrote:
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?
If you aren't using chroot(2) (or moving directories) in your application, you can do this. Wrap calls to opendir(2) and closedir(2), mapping descriptors to directory paths (and disposing of them), then in your *at() functions, remap the relative pathname back to an absolute pathname. You're right that this isn't a perfect compromise, but I think it should work, with the caveats above.
Alternatively, you can use a global mutex in your *at functions, ensuring that only one thread is accessing the environment path, but that potentially creates a major bottleneck.
Yeah, currently I use a global mutex in my *at() functions. It works fine for me but theoretically we need to guard with the mutex all chdir() calls and file operations that use relative path. Here is the code that I mentioned above https://github.com/anatol/tup/blob/fix_openat_macosx/src/compat/openat.c BTW openat() mentioned in the Open Group specifications http://pubs.opengroup.org/onlinepubs/9699919799/ is there any chance that darwin team implement openat() functions family in the next macosx version? _______________________________________________ Do not post admin requests to the list. They will be ignored. Darwin-dev mailing list (Darwin-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: http://lists.apple.com/mailman/options/darwin-dev/site_archiver%40lists.appl... This email sent to site_archiver@lists.apple.com