From 2ee96eccd49c8f7f722b6dc21b60147a6c4997ec Mon Sep 17 00:00:00 2001 From: Martin Pärtel Date: Thu, 5 Apr 2012 12:56:05 +0300 Subject: Made -ouse_ino and -oreaddir_ino the default to mirror inodes. --- tests/Makefile.am | 3 +++ tests/readdir_inode.c | 36 ++++++++++++++++++++++++++++++++++++ tests/test_bindfs.rb | 23 +++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 tests/readdir_inode.c (limited to 'tests') diff --git a/tests/Makefile.am b/tests/Makefile.am index 79b8dee..ce11f95 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,2 +1,5 @@ +noinst_PROGRAMS = readdir_inode +readdir_inode_SOURCES = readdir_inode.c + TESTS = test_bindfs.rb diff --git a/tests/readdir_inode.c b/tests/readdir_inode.c new file mode 100644 index 0000000..a216c7e --- /dev/null +++ b/tests/readdir_inode.c @@ -0,0 +1,36 @@ + +#include +#include +#include +#include + +int main(int argc, char* argv[]) +{ + DIR* dirp; + struct dirent* dent; + + if (argc != 2) { + fprintf(stderr, "Usage: readdir_inode dir\n"); + return 1; + } + + dirp = opendir(argv[1]); + if (dirp == NULL) { + perror("failed to open directory"); + return 2; + } + + dent = readdir(dirp); + while (dent != NULL) { + if (errno != 0) { + perror("failed to read directory entry"); + return 3; + } + printf("%llu %s\n", (unsigned long long)dent->d_ino, dent->d_name); + dent = readdir(dirp); + } + + closedir(dirp); + + return 0; +} diff --git a/tests/test_bindfs.rb b/tests/test_bindfs.rb index ef732ff..ff1ee24 100755 --- a/tests/test_bindfs.rb +++ b/tests/test_bindfs.rb @@ -41,6 +41,8 @@ $only_these_tests = ARGV unless ARGV.empty? $nobody_uid = nobody_uid = Etc.getpwnam('nobody').uid $nogroup_gid = nogroup_gid = Etc.getgrnam('nogroup').gid +$tests_dir = File.dirname(File.realpath(__FILE__)) + testenv("") do assert { File.basename(pwd) == TESTDIR_NAME } @@ -307,3 +309,24 @@ root_testenv("--map=0/1:@0/@1", :title => "--map and chown/chgrp") do assert { File.stat('mnt/file1').uid == 1 } assert { File.stat('mnt/file1').gid == 1 } end + +testenv("", :title => "preserves inode numbers") do + touch('src/file') + mkdir('src/dir') + assert { File.stat('mnt/file').ino == File.stat('src/file').ino } + assert { File.stat('mnt/dir').ino == File.stat('src/dir').ino } +end + +testenv("", :title => "has readdir inode numbers") do + touch('src/file') + mkdir('src/dir') + + inodes = {} + for line in `#{$tests_dir}/readdir_inode mnt`.split("\n").reject(&:empty?) + inode, name = line.split(" ") + inodes[name] = inode.to_i + end + + assert { inodes['file'] == File.stat('src/file').ino } + assert { inodes['dir'] == File.stat('src/dir').ino } +end -- cgit v1.2.3