Follow up on my own post...

My intention is to perform file locking on remote volumes, including AFPFS volumes. So far, I've found no documentation on how to implement "AFP-style" mandatory locking using fcntl().

Then I remember that, while deprecated, the now-ancient FS API is still around. Plan B was born: use FSOpenFork's deny-read & deny-write permissions to implement file locking, then turn around and use open(2) to access the data.

That didn't work. As soon as I opened the file via FSOpenFork, open(2) would fail with "resource not available" error.

Hmm, that sounds exactly like what happens when open(2) tries to open a file that has been opened by another process with O_SHLOCK or O_EXLOCK.

So it would appear that, rather than being completely different file locking mechanisms, FSOpenFork() bridges to the advisory locking provided by open(2). And when I rewrite my test code to use open(2) O_SHLOCK and O_EXLOCK to access the same AFPFS volume from two different clients, it works perfectly!

Now I'm wondering why the AFPFS volume (this on a Time Capsule, by the way) reports VOL_CAP_INT_FLOCK=NO and VOL_CAP_INT_ADVLOCK=NO. The functionality of open(2) on that volume would appear to directly contradict that capability test.

Can anyone explain this?

Thanks!

James


James Bucanek <mailto:subscri...@gloaming.com>
February 26, 2018 at 1:11 PM
More annoying questions...

How does one use "AFP-style mandatory file locking" in macOS (10.9...current)?

I'm trying to implement file locking/coordination across various filesystems and servers.

The man page for getattrlist() includes the following filesystem capability test:

VOL_CAP_INT_MANLOCK  If this bit is set, the volume format implementation
                     supports AFP-style mandatory byte range locks
                     via ioctl(2).

AFPFS (a.k.a. AppleShare) volumes, particularly those on AirPort Extreme / Time Capsule devices, return 1 for this capability. These volumes do not support flock() or fcntl(F_SETLK) style advisory locking.

I looked at the man page for ioctl(2) and it contains no real information. It says the commands for ioctl(2) are documented in <sys/ioctl.h>.

So I had a look at <sys/ioctl.h> and found very little there; it's basically an umbrella header for several other headers. So I went through them one at a time: <sys/ttycom.h>, <sys/ioccom.h>, <sys/filio.h> (the one I would have assumed it would be in), and <sys/sockio.h>. I could found no mention of any kind of file or byte range locking commands defined.

So, is it possible to lock files/ranges on an AFPFS volume using ioctl(2), and if so where are these commands defined?


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Filesystem-dev mailing list      (Filesystem-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/filesystem-dev/subscriber%40gloaming.com

This email sent to subscri...@gloaming.com


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Filesystem-dev mailing list      (Filesystem-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/filesystem-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to