From d79001543b4790e6bc4569d599a0eb01000df560 Mon Sep 17 00:00:00 2001
From: robk-tahoe <robk-tahoe@allmydata.com>
Date: Thu, 25 Sep 2008 06:42:23 -0700
Subject: [PATCH] fuse/impl_c: add --auto-fsid option

this was inspired by reading the fuse docs and discovering the 'fsid' option
to fuse_main, and was _intended_ to support a sort of 'stability' to the
filesystem (specifically derived from the root-uri mounted, whether directly
or via an alias) to support mac aliases across unmount/remount etc.

some experimentation shows that that doesn't actually work, and that, at
least for mac aliases in my testing, they're tied to path-to-mountpoint and
not to the fsid - which seems to have no bearing.  perhaps the 'local' flag
is causing weirdness therein.

at any rate, I'm recording it simply for posterity, in case it turns out to
be useful after all somewhere down the road.
---
 contrib/fuse/impl_c/blackmatch.py | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/contrib/fuse/impl_c/blackmatch.py b/contrib/fuse/impl_c/blackmatch.py
index 103fd04c..f52acd53 100644
--- a/contrib/fuse/impl_c/blackmatch.py
+++ b/contrib/fuse/impl_c/blackmatch.py
@@ -17,6 +17,7 @@ import os
 #import pprint
 import errno
 import stat
+import struct
 # pull in some spaghetti to make this stuff work without fuse-py being installed
 try:
     import _find_fuse_parts
@@ -62,6 +63,12 @@ class TahoeFuseOptions(usage.Options):
         ["cache-timeout", None, 20,
          "Time, in seconds, to cache directory data."],
         ]
+    optFlags = [
+        ["auto-fsid", None,
+         "Set the volume fsid to be a hash of the mounted root_cap. This provides "
+         "a stable identity to the filesystem upon remount, which is useful e.g. "
+         "in support of aliases to files within the filesystem."],
+         ]
 
     def __init__(self):
         usage.Options.__init__(self)
@@ -904,6 +911,12 @@ def main(argv):
     logfile = file(fname, 'ab')
     log('\n'+(24*'_')+'init'+(24*'_')+'\n')
 
+    if config['auto-fsid']:
+        # note, macfuse docs state '32bit int' implementation says '< 0xFFFFFF'
+        h = 0xFFFFFF & struct.unpack('i', sha.new(root_uri).digest()[:4])[0]
+        log('using auto-allocated fsid: %d' % h)
+        config.fuse_options.append('fsid=%d'%h)
+
     if not os.path.exists(config.mountpoint):
         raise OSError(2, 'No such file or directory: "%s"' % (config.mountpoint,))
 
-- 
2.45.2