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 */