diff options
author | Martin Pärtel <martin.partel@gmail.com> | 2012-01-24 17:53:56 +0200 |
---|---|---|
committer | Martin Pärtel <martin.partel@gmail.com> | 2012-01-24 17:53:56 +0200 |
commit | 0c816b382b3ad7cba38733f68cae96d78dfde06d (patch) | |
tree | 7369746791b377381215630e23a73ac35568942c | |
parent | d8286ccf49e01e6abbac953c08c713f82a01f116 (diff) | |
download | bindfs-0c816b382b3ad7cba38733f68cae96d78dfde06d.tar.gz |
Added --hide-hard-links option.
Patch by fbogner
http://code.google.com/p/bindfs/issues/detail?id=17
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | src/bindfs.1 | 17 | ||||
-rw-r--r-- | src/bindfs.c | 29 | ||||
-rwxr-xr-x | tests/test_bindfs.rb | 9 |
4 files changed, 43 insertions, 16 deletions
@@ -1,3 +1,7 @@ +2012-01-24 Martin Pärtel <martin dot partel at gmail dot com> + + * Added --hide-hard-links. + 2010-08-07 Martin Pärtel <martin dot partel at gmail dot com> * Improved --help and manpage. diff --git a/src/bindfs.1 b/src/bindfs.1 index 92444a2..d92c55d 100644 --- a/src/bindfs.1 +++ b/src/bindfs.1 @@ -196,22 +196,23 @@ The read/write permissions are checked against the (possibly modified) file permissions inside the mount. -.SH TIME-RELATED OPTIONS +.SH MISCELLANEOUS WORKAROUNDS +.TP +.B \-\-ctime\-from-mtime, \-o ctime\-from\-mtime Recall that a unix file has three standard timestamps: \fBatime\fP (last access i.e. read time), \fBmtime\fP (last content modification time) \fBctime\fP (last content or metadata (inode) change time) -It may sometimes be useful to alter these timestamps, but care should be taken -not to cause programs (e.g. backup jobs) to miss important changes. - -.TP -.B \-\-ctime\-from-mtime, \-o ctime\-from\-mtime -Reads the ctime of each file and directory from its mtime. +With this option, the ctime of each file and directory is read from its mtime. In other words, only content modifications (as opposed to metadata changes) will be reflected in a mirrored file's ctime. -(The underlying file's ctime will still be updated normally.) +The underlying file's ctime will still be updated normally. + +.TP +.B \-\-hide-hard-links, \-o hide-hard-links +Shows the hard link count of all files as 1. .SH FUSE OPTIONS diff --git a/src/bindfs.c b/src/bindfs.c index ff7b35f..4cb1305 100644 --- a/src/bindfs.c +++ b/src/bindfs.c @@ -118,6 +118,9 @@ static struct settings { int num_mirrored_members; int ctime_from_mtime; + + int hide_hard_links; + } settings; @@ -256,6 +259,10 @@ static int getattr_common(const char *procpath, struct stat *stbuf) if (access(procpath, X_OK) == -1) stbuf->st_mode &= ~0111; + /* Hide hard links */ + if (settings.hide_hard_links) + stbuf->st_nlink = 1; + return 0; } @@ -342,8 +349,8 @@ static int bindfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, { DIR *dp = get_dirp(fi); struct dirent *de; - (void) path; + seekdir(dp, offset); while ((de = readdir(dp)) != NULL) { struct stat st; @@ -628,7 +635,6 @@ static int bindfs_ftruncate(const char *path, off_t size, struct fuse_file_info *fi) { int res; - (void) path; res = ftruncate(fi->fh, size); @@ -706,8 +712,8 @@ static int bindfs_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int res; - (void) path; + res = pread(fi->fh, buf, size, offset); if (res == -1) res = -errno; @@ -719,8 +725,8 @@ static int bindfs_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int res; - (void) path; + res = pwrite(fi->fh, buf, size, offset); if (res == -1) res = -errno; @@ -744,6 +750,7 @@ static int bindfs_statfs(const char *path, struct statvfs *stbuf) static int bindfs_release(const char *path, struct fuse_file_info *fi) { (void) path; + close(fi->fh); return 0; @@ -937,9 +944,10 @@ static void print_usage(const char *progname) " --xattr-ro Read-only xattr operations.\n" " --xattr-rw Read-write xattr operations (the default).\n" "\n" - "Time-related:\n" + "Workarounds:\n" " --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 0.\n" "\n" "FUSE options:\n" " -o opt[,opt,...] Mount options.\n" @@ -986,7 +994,8 @@ enum OptionKey { OPTKEY_XATTR_NONE, OPTKEY_XATTR_READ_ONLY, OPTKEY_XATTR_READ_WRITE, - OPTKEY_CTIME_FROM_MTIME + OPTKEY_CTIME_FROM_MTIME, + OPTKEY_HIDE_HARD_LINKS }; static int process_option(void *data, const char *arg, int key, @@ -1060,7 +1069,11 @@ static int process_option(void *data, const char *arg, int key, case OPTKEY_CTIME_FROM_MTIME: settings.ctime_from_mtime = 1; - return 0; + return 0; + + case OPTKEY_HIDE_HARD_LINKS: + settings.hide_hard_links = 1; + return 0; case OPTKEY_NONOPTION: if (!settings.mntsrc) { @@ -1136,6 +1149,7 @@ int main(int argc, char *argv[]) OPT2("--xattr-ro", "xattr-ro", OPTKEY_XATTR_READ_ONLY), OPT2("--xattr-rw", "xattr-rw", OPTKEY_XATTR_READ_WRITE), OPT2("--ctime-from-mtime", "ctime-from-mtime", OPTKEY_CTIME_FROM_MTIME), + OPT2("--hide-hard-links", "hide-hard-links", OPTKEY_HIDE_HARD_LINKS), FUSE_OPT_END }; @@ -1168,6 +1182,7 @@ int main(int argc, char *argv[]) settings.mirrored_members = NULL; settings.num_mirrored_members = 0; settings.ctime_from_mtime = 0; + settings.hide_hard_links = 0; atexit(&atexit_func); /* Parse options */ diff --git a/tests/test_bindfs.rb b/tests/test_bindfs.rb index 4c21de2..ea2e7e2 100755 --- a/tests/test_bindfs.rb +++ b/tests/test_bindfs.rb @@ -91,7 +91,14 @@ testenv("--ctime-from-mtime") do # to_i gives us prceision of 1 sec assert { File.stat(mf).ctime.to_i == File.stat(mf).mtime.to_i } assert { File.stat(sf).ctime > File.stat(sf).mtime } - +end + +testenv("--hide-hard-links") do + touch('src/one') + ln('src/one', 'src/two') + + assert { File.stat('src/one').nlink == 2 } + assert { File.stat('mnt/one').nlink == 1 } end # Define expectation for changing [uid, gid, both] |