Hello,

I have changed bindfs to hide symbolic links from subversion so it commits the actual file to the repository.

Here is the patch. (Mirror: http://pastebin.com/PfzpBMp6 )

Download: http://bindfs.org/downloads/bindfs-1.12.3.tar.gz
tar xvfz bindfs-1.12.3.tar.gz
mv bindfs-1.12.3 bindfs
patch -p0 <bindfs-1.12.3.patch
cd bindfs
./configure;make;make install

Note that the entire local copy of a repository needs to be mounted or else subversion will complain about having to rename files between different devices on updates and commits.

Like this:
bindfs ./local_copy ./local_copy -o nonempty,follow-symbolic-links


The patch also seems to work with the current (20131109) git version of bindfs.

I also expect it to hide symbolic links from git.


Enjoy

diff -ru bindfs-1.12.3_orig/src/bindfs.c bindfs-1.12.3/src/bindfs.c
--- bindfs-1.12.3_orig/src/bindfs.c	2013-09-23 22:59:23.000000000 +0200
+++ bindfs-1.12.3/src/bindfs.c	2013-11-09 02:31:54.000000000 +0100
@@ -132,7 +132,7 @@
 
     int ctime_from_mtime;
     int hide_hard_links;
-    
+    int follow_symbolic_links;
 } settings;
 
 
@@ -241,6 +241,13 @@
         return path;
 }
 
+static int lstat_wrap(const char *path, struct stat *stbuf)
+{
+    if (settings.follow_symbolic_links)
+      return stat(path, stbuf);
+    return lstat(path, stbuf);
+}
+
 static int getattr_common(const char *procpath, struct stat *stbuf)
 {
     struct fuse_context *fc = fuse_get_context();
@@ -309,7 +316,7 @@
 
         path_copy = strdup(path);
         dir_path = my_dirname(path_copy);
-        if (lstat(dir_path, &stbuf) != -1 && stbuf.st_mode & S_ISGID)
+        if (lstat_wrap(dir_path, &stbuf) != -1 && stbuf.st_mode & S_ISGID)
             file_group = -1;
         free(path_copy);
     } else {
@@ -362,7 +369,7 @@
 {
     path = process_path(path);
 
-    if (lstat(path, stbuf) == -1)
+    if (lstat_wrap(path, stbuf) == -1)
         return -errno;
     return getattr_common(path, stbuf);
 }
@@ -444,9 +451,13 @@
             break;
         }
         
-        memset(&st, 0, sizeof(st));
-        st.st_ino = de->d_ino;
-        st.st_mode = de->d_type << 12;
+        if (settings.follow_symbolic_links) {
+            lstat_wrap(de->d_name, &st);
+        } else {
+            memset(&st, 0, sizeof(st));
+            st.st_ino = de->d_ino;
+            st.st_mode = de->d_type << 12;
+        }
         if (filler(buf, de->d_name, &st, telldir(dp)))
             break;
     }
@@ -586,7 +597,7 @@
 
     if (settings.chmod_allow_x) {
         /* Get the old permission bits and see which bits would change. */
-        if (lstat(path, &st) == -1)
+        if (lstat_wrap(path, &st) == -1)
             return -errno;
 
         if (S_ISREG(st.st_mode)) {
@@ -981,6 +992,7 @@
            "  --ctime-from-mtime        Read file properties' change time\n"
            "                            from file content modification time.\n"
            "  --hide-hard-links         Always report a hard link count of 1.\n"
+           "  --follow-symbolic-links   Follow (hide) symbolic links.\n"
            "  --multithreaded           Enable multithreaded mode. See man page\n"
            "                            for security issue with current implementation.\n"
            "\n"
@@ -1019,6 +1031,7 @@
     OPTKEY_REALISTIC_PERMISSIONS,
     OPTKEY_CTIME_FROM_MTIME,
     OPTKEY_HIDE_HARD_LINKS,
+    OPTKEY_FOLLOW_SYMBOLIC_LINKS,
     OPTKEY_MULTITHREADED
 };
 
@@ -1100,6 +1113,9 @@
     case OPTKEY_HIDE_HARD_LINKS:
         settings.hide_hard_links = 1;
         return 0;
+    case OPTKEY_FOLLOW_SYMBOLIC_LINKS:
+        settings.follow_symbolic_links = 1;
+        return 0;
 
     case OPTKEY_NONOPTION:
         if (!settings.mntsrc) {
@@ -1400,6 +1416,7 @@
         OPT2("--realistic-permissions", "realistic-permissions", OPTKEY_REALISTIC_PERMISSIONS),
         OPT2("--ctime-from-mtime", "ctime-from-mtime", OPTKEY_CTIME_FROM_MTIME),
         OPT2("--hide-hard-links", "hide-hard-links", OPTKEY_HIDE_HARD_LINKS),
+        OPT2("--follow-symbolic-links", "follow-symbolic-links", OPTKEY_FOLLOW_SYMBOLIC_LINKS),
         OPT_OFFSET2("--multithreaded", "multithreaded", multithreaded, -1),
         FUSE_OPT_END
     };
@@ -1436,6 +1453,7 @@
     settings.realistic_permissions = 0;
     settings.ctime_from_mtime = 0;
     settings.hide_hard_links = 0;
+    settings.follow_symbolic_links = 0;
     atexit(&atexit_func);
     
     /* Parse options */

diff -ru bindfs-1.12.3_orig/src/bindfs.c bindfs-1.12.3/src/bindfs.c
--- bindfs-1.12.3_orig/src/bindfs.c     2013-09-23 22:59:23.000000000 +0200
+++ bindfs-1.12.3/src/bindfs.c  2013-11-09 02:31:54.000000000 +0100
@@ -132,7 +132,7 @@
 
     int ctime_from_mtime;
     int hide_hard_links;
-    
+    int follow_symbolic_links;
 } settings;
 
 
@@ -241,6 +241,13 @@
         return path;
 }
 
+static int lstat_wrap(const char *path, struct stat *stbuf)
+{
+    if (settings.follow_symbolic_links)
+      return stat(path, stbuf);
+    return lstat(path, stbuf);
+}
+
 static int getattr_common(const char *procpath, struct stat *stbuf)
 {
     struct fuse_context *fc = fuse_get_context();
@@ -309,7 +316,7 @@
 
         path_copy = strdup(path);
         dir_path = my_dirname(path_copy);
-        if (lstat(dir_path, &stbuf) != -1 && stbuf.st_mode & S_ISGID)
+        if (lstat_wrap(dir_path, &stbuf) != -1 && stbuf.st_mode & S_ISGID)
             file_group = -1;
         free(path_copy);
     } else {
@@ -362,7 +369,7 @@
 {
     path = process_path(path);
 
-    if (lstat(path, stbuf) == -1)
+    if (lstat_wrap(path, stbuf) == -1)
         return -errno;
     return getattr_common(path, stbuf);
 }
@@ -444,9 +451,13 @@
             break;
         }
         
-        memset(&st, 0, sizeof(st));
-        st.st_ino = de->d_ino;
-        st.st_mode = de->d_type << 12;
+        if (settings.follow_symbolic_links) {
+            lstat_wrap(de->d_name, &st);
+        } else {
+            memset(&st, 0, sizeof(st));
+            st.st_ino = de->d_ino;
+            st.st_mode = de->d_type << 12;
+        }
         if (filler(buf, de->d_name, &st, telldir(dp)))
             break;
     }
@@ -586,7 +597,7 @@
 
     if (settings.chmod_allow_x) {
         /* Get the old permission bits and see which bits would change. */
-        if (lstat(path, &st) == -1)
+        if (lstat_wrap(path, &st) == -1)
             return -errno;
 
         if (S_ISREG(st.st_mode)) {
@@ -981,6 +992,7 @@
            "  --ctime-from-mtime        Read file properties' change time\n"
            "                            from file content modification time.\n"
            "  --hide-hard-links         Always report a hard link count of 
1.\n"
+           "  --follow-symbolic-links   Follow (hide) symbolic links.\n"
            "  --multithreaded           Enable multithreaded mode. See man 
page\n"
            "                            for security issue with current 
implementation.\n"
            "\n"
@@ -1019,6 +1031,7 @@
     OPTKEY_REALISTIC_PERMISSIONS,
     OPTKEY_CTIME_FROM_MTIME,
     OPTKEY_HIDE_HARD_LINKS,
+    OPTKEY_FOLLOW_SYMBOLIC_LINKS,
     OPTKEY_MULTITHREADED
 };
 
@@ -1100,6 +1113,9 @@
     case OPTKEY_HIDE_HARD_LINKS:
         settings.hide_hard_links = 1;
         return 0;
+    case OPTKEY_FOLLOW_SYMBOLIC_LINKS:
+        settings.follow_symbolic_links = 1;
+        return 0;
 
     case OPTKEY_NONOPTION:
         if (!settings.mntsrc) {
@@ -1400,6 +1416,7 @@
         OPT2("--realistic-permissions", "realistic-permissions", 
OPTKEY_REALISTIC_PERMISSIONS),
         OPT2("--ctime-from-mtime", "ctime-from-mtime", 
OPTKEY_CTIME_FROM_MTIME),
         OPT2("--hide-hard-links", "hide-hard-links", OPTKEY_HIDE_HARD_LINKS),
+        OPT2("--follow-symbolic-links", "follow-symbolic-links", 
OPTKEY_FOLLOW_SYMBOLIC_LINKS),
         OPT_OFFSET2("--multithreaded", "multithreaded", multithreaded, -1),
         FUSE_OPT_END
     };
@@ -1436,6 +1453,7 @@
     settings.realistic_permissions = 0;
     settings.ctime_from_mtime = 0;
     settings.hide_hard_links = 0;
+    settings.follow_symbolic_links = 0;
     atexit(&atexit_func);
     
     /* Parse options */

Reply via email to