From c11e8c809a6ca40717cca372c95b2dfbd7341545 Mon Sep 17 00:00:00 2001 From: om Date: Mon, 12 Apr 2021 00:48:11 +0530 Subject: [PATCH 1/2] Add syscall_intercept submodule --- .gitmodules | 3 +++ dependencies/splitfs_deps.sh | 25 ++++++++++++++++++++++++- dependencies/syscall_intercept | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 .gitmodules create mode 160000 dependencies/syscall_intercept diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..4b7e30e710 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "dependencies/syscall_intercept"] + path = dependencies/syscall_intercept + url = git@github.com:pmem/syscall_intercept.git diff --git a/dependencies/splitfs_deps.sh b/dependencies/splitfs_deps.sh index 4879c6cf28..cc0362854c 100755 --- a/dependencies/splitfs_deps.sh +++ b/dependencies/splitfs_deps.sh @@ -1,4 +1,27 @@ #!/bin/bash # install boost -sudo apt-get install libboost-dev +sudo apt-get install libboost-dev libcapstone-dev cmake pandoc clang + +# install syscall_intercept +git submodule init +git submodule update +syscall_dir=$PWD/syscall_intercept +install_dir=$PWD/sysint_install + +mkdir $install_dir +cd $install_dir +cmake $syscall_dir -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang +if [ "$?" -ne 0 ]; then + echo "Failed to build syscall_intercept" + exit 1 +fi + +make +if [ "$?" -ne 0 ]; then + echo "Failed to build syscall_intercept" + exit 1 +fi + +sudo make install +rm -rf $install_dir \ No newline at end of file diff --git a/dependencies/syscall_intercept b/dependencies/syscall_intercept new file mode 160000 index 0000000000..304404581c --- /dev/null +++ b/dependencies/syscall_intercept @@ -0,0 +1 @@ +Subproject commit 304404581c57d43478438d175099d20260bae74e From 74bed014367c899aa67c1944625072ac2ce0280c Mon Sep 17 00:00:00 2001 From: om Date: Mon, 12 Apr 2021 00:52:31 +0530 Subject: [PATCH 2/2] Add syscall_intercept version of splitfs --- splitfs_syscall_intercept/CMakeLists.txt | 376 ++++++ splitfs_syscall_intercept/README.md | 8 + .../build/CMakeCache.txt | 600 +++++++++ .../CMakeFiles/3.5.1/CMakeCCompiler.cmake | 67 + .../CMakeFiles/3.5.1/CMakeCXXCompiler.cmake | 68 + .../3.5.1/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8640 bytes .../3.5.1/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8656 bytes .../build/CMakeFiles/3.5.1/CMakeSystem.cmake | 15 + .../3.5.1/CompilerIdC/CMakeCCompilerId.c | 544 ++++++++ .../build/CMakeFiles/3.5.1/CompilerIdC/a.out | Bin 0 -> 8800 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 ++++++++ .../CMakeFiles/3.5.1/CompilerIdCXX/a.out | Bin 0 -> 8808 bytes .../CMakeDirectoryInformation.cmake | 16 + .../build/CMakeFiles/CMakeError.log | 123 ++ .../build/CMakeFiles/CMakeOutput.log | 1107 ++++++++++++++++ .../build/CMakeFiles/CMakeRuleHashes.txt | 7 + .../build/CMakeFiles/Makefile.cmake | 151 +++ .../build/CMakeFiles/Makefile2 | 571 ++++++++ .../build/CMakeFiles/TargetDirectories.txt | 26 + .../DependInfo.cmake | 11 + .../check-whitespace-main.dir/build.make | 76 ++ .../cmake_clean.cmake | 8 + .../check-whitespace-main.dir/progress.make | 1 + .../check-whitespace.dir/DependInfo.cmake | 11 + .../check-whitespace.dir/build.make | 72 ++ .../check-whitespace.dir/cmake_clean.cmake | 5 + .../check-whitespace.dir/progress.make | 1 + .../CMakeFiles/checkers.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/checkers.dir/build.make | 72 ++ .../CMakeFiles/checkers.dir/cmake_clean.cmake | 5 + .../CMakeFiles/checkers.dir/depend.internal | 3 + .../build/CMakeFiles/checkers.dir/depend.make | 3 + .../CMakeFiles/checkers.dir/progress.make | 1 + .../build/CMakeFiles/cmake.check_cache | 1 + .../CMakeFiles/cppformat.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cppformat.dir/build.make | 72 ++ .../cppformat.dir/cmake_clean.cmake | 5 + .../CMakeFiles/cppformat.dir/progress.make | 1 + .../CMakeFiles/cppstyle.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cppstyle.dir/build.make | 72 ++ .../CMakeFiles/cppstyle.dir/cmake_clean.cmake | 5 + .../CMakeFiles/cppstyle.dir/progress.make | 1 + .../CMakeFiles/cstyle.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cstyle.dir/build.make | 72 ++ .../CMakeFiles/cstyle.dir/cmake_clean.cmake | 5 + .../build/CMakeFiles/cstyle.dir/progress.make | 1 + .../build/CMakeFiles/feature_tests.bin | Bin 0 -> 12696 bytes .../build/CMakeFiles/feature_tests.c | 34 + .../build/CMakeFiles/feature_tests.cxx | 405 ++++++ .../build/CMakeFiles/progress.marks | 1 + .../CMakeFiles/tests.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/tests.dir/build.make | 72 ++ .../CMakeFiles/tests.dir/cmake_clean.cmake | 5 + .../build/CMakeFiles/tests.dir/progress.make | 1 + .../CMakeFiles/uninstall.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/uninstall.dir/build.make | 76 ++ .../uninstall.dir/cmake_clean.cmake | 8 + .../CMakeFiles/uninstall.dir/progress.make | 1 + splitfs_syscall_intercept/build/Makefile | 378 ++++++ .../build/cmake_install.cmake | 50 + .../build/cmake_uninstall.cmake | 22 + .../CMakeDirectoryInformation.cmake | 16 + .../DependInfo.cmake | 11 + .../check-whitespace-splitfs.dir/build.make | 76 ++ .../cmake_clean.cmake | 8 + .../progress.make | 1 + .../cstyle-splitfs.dir/DependInfo.cmake | 11 + .../CMakeFiles/cstyle-splitfs.dir/build.make | 76 ++ .../cstyle-splitfs.dir/cmake_clean.cmake | 8 + .../cstyle-splitfs.dir/progress.make | 1 + .../build/src/CMakeFiles/progress.marks | 1 + .../CMakeFiles/splitfs_o.dir/C.includecache | 860 ++++++++++++ .../CMakeFiles/splitfs_o.dir/DependInfo.cmake | 59 + .../src/CMakeFiles/splitfs_o.dir/build.make | 833 ++++++++++++ .../splitfs_o.dir/cmake_clean.cmake | 36 + .../CMakeFiles/splitfs_o.dir/depend.internal | 319 +++++ .../src/CMakeFiles/splitfs_o.dir/depend.make | 319 +++++ .../src/CMakeFiles/splitfs_o.dir/flags.make | 10 + .../CMakeFiles/splitfs_o.dir/progress.make | 30 + .../splitfs_shared.dir/DependInfo.cmake | 18 + .../CMakeFiles/splitfs_shared.dir/build.make | 152 +++ .../splitfs_shared.dir/cmake_clean.cmake | 11 + .../splitfs_shared.dir/depend.internal | 3 + .../CMakeFiles/splitfs_shared.dir/depend.make | 3 + .../CMakeFiles/splitfs_shared.dir/flags.make | 10 + .../CMakeFiles/splitfs_shared.dir/link.txt | 1 + .../splitfs_shared.dir/progress.make | 2 + .../splitfs_static.dir/DependInfo.cmake | 11 + .../CMakeFiles/splitfs_static.dir/build.make | 81 ++ .../splitfs_static.dir/cmake_clean.cmake | 9 + .../splitfs_static.dir/depend.internal | 3 + .../CMakeFiles/splitfs_static.dir/depend.make | 3 + .../splitfs_static.dir/progress.make | 2 + .../DependInfo.cmake | 11 + .../splitfs_static_unscoped.dir/build.make | 146 +++ .../cmake_clean.cmake | 9 + .../cmake_clean_target.cmake | 3 + .../depend.internal | 3 + .../splitfs_static_unscoped.dir/depend.make | 3 + .../splitfs_static_unscoped.dir/flags.make | 10 + .../splitfs_static_unscoped.dir/link.txt | 2 + .../splitfs_static_unscoped.dir/progress.make | 2 + splitfs_syscall_intercept/build/src/Makefile | 1148 +++++++++++++++++ .../build/src/cmake_install.cmake | 102 ++ .../build/src/libsplitfs.a | Bin 0 -> 729156 bytes .../build/src/libsplitfs.so | 1 + .../build/src/libsplitfs.so.0 | 1 + .../build/src/libsplitfs.so.0.0.0 | Bin 0 -> 352568 bytes .../build/src/libsplitfs_unscoped.a | Bin 0 -> 731800 bytes .../cmake_uninstall.cmake.in | 22 + .../include/splitfs-posix.h | 95 ++ splitfs_syscall_intercept/src/CMakeLists.txt | 114 ++ splitfs_syscall_intercept/src/add_delay.c | 97 ++ splitfs_syscall_intercept/src/add_delay.h | 17 + .../src/compiler_utils.h | 85 ++ splitfs_syscall_intercept/src/constants.h | 2 + splitfs_syscall_intercept/src/execv.c | 216 ++++ splitfs_syscall_intercept/src/execv.h | 9 + splitfs_syscall_intercept/src/fallocate.c | 182 +++ splitfs_syscall_intercept/src/file.c | 345 +++++ splitfs_syscall_intercept/src/file.h | 71 + splitfs_syscall_intercept/src/fsync.c | 72 ++ splitfs_syscall_intercept/src/handle_mmaps.c | 139 ++ splitfs_syscall_intercept/src/handle_mmaps.h | 40 + splitfs_syscall_intercept/src/hash_map.c | 226 ++++ splitfs_syscall_intercept/src/hash_map.h | 58 + splitfs_syscall_intercept/src/inode.c | 169 +++ splitfs_syscall_intercept/src/inode.h | 169 +++ splitfs_syscall_intercept/src/intel_intrin.c | 273 ++++ splitfs_syscall_intercept/src/intel_intrin.h | 80 ++ splitfs_syscall_intercept/src/libsplitfs.map | 45 + splitfs_syscall_intercept/src/lseek.c | 165 +++ splitfs_syscall_intercept/src/mmap_pool.c | 60 + splitfs_syscall_intercept/src/mmap_pool.h | 25 + splitfs_syscall_intercept/src/os_thread.h | 122 ++ .../src/os_thread_pthread.c | 164 +++ splitfs_syscall_intercept/src/os_util.h | 52 + splitfs_syscall_intercept/src/os_util_linux.c | 84 ++ splitfs_syscall_intercept/src/out.c | 349 +++++ splitfs_syscall_intercept/src/out.h | 242 ++++ splitfs_syscall_intercept/src/path_resolve.c | 142 ++ splitfs_syscall_intercept/src/pm_util.h | 44 + splitfs_syscall_intercept/src/preload.c | 809 ++++++++++++ splitfs_syscall_intercept/src/preload.h | 63 + splitfs_syscall_intercept/src/read.c | 316 +++++ splitfs_syscall_intercept/src/relink.c | 68 + splitfs_syscall_intercept/src/relink.h | 32 + splitfs_syscall_intercept/src/splitfs-posix.c | 132 ++ splitfs_syscall_intercept/src/staging.c | 244 ++++ splitfs_syscall_intercept/src/staging.h | 43 + .../src/staging_thread.c | 90 ++ .../src/staging_thread.h | 18 + splitfs_syscall_intercept/src/stat.c | 110 ++ splitfs_syscall_intercept/src/sys_util.h | 199 +++ .../src/syscall_early_filter.c | 217 ++++ .../src/syscall_early_filter.h | 122 ++ splitfs_syscall_intercept/src/table_mmaps.c | 162 +++ splitfs_syscall_intercept/src/table_mmaps.h | 32 + splitfs_syscall_intercept/src/truncate.c | 116 ++ splitfs_syscall_intercept/src/truncate.h | 30 + splitfs_syscall_intercept/src/unlink.c | 90 ++ splitfs_syscall_intercept/src/utils.c | 118 ++ splitfs_syscall_intercept/src/utils.h | 46 + splitfs_syscall_intercept/src/vfd_table.c | 350 +++++ splitfs_syscall_intercept/src/vfd_table.h | 38 + splitfs_syscall_intercept/src/write.c | 417 ++++++ splitfs_syscall_intercept/tests/Makefile | 19 + splitfs_syscall_intercept/tests/README.md | 5 + splitfs_syscall_intercept/tests/a.out | Bin 0 -> 13800 bytes .../tests/pjd-fstest-20080816/LICENSE | 27 + .../tests/pjd-fstest-20080816/Makefile | 15 + .../tests/pjd-fstest-20080816/README | 28 + .../tests/pjd-fstest-20080816/fstest | Bin 0 -> 24528 bytes .../tests/pjd-fstest-20080816/fstest.c | 1002 ++++++++++++++ .../pjd-fstest-20080816/tests/chflags/00.t | 178 +++ .../pjd-fstest-20080816/tests/chflags/01.t | 20 + .../pjd-fstest-20080816/tests/chflags/02.t | 18 + .../pjd-fstest-20080816/tests/chflags/03.t | 25 + .../pjd-fstest-20080816/tests/chflags/04.t | 19 + .../pjd-fstest-20080816/tests/chflags/05.t | 35 + .../pjd-fstest-20080816/tests/chflags/06.t | 21 + .../pjd-fstest-20080816/tests/chflags/07.t | 54 + .../pjd-fstest-20080816/tests/chflags/08.t | 70 + .../pjd-fstest-20080816/tests/chflags/09.t | 82 ++ .../pjd-fstest-20080816/tests/chflags/10.t | 62 + .../pjd-fstest-20080816/tests/chflags/11.t | 70 + .../pjd-fstest-20080816/tests/chflags/12.t | 43 + .../pjd-fstest-20080816/tests/chflags/13.t | 14 + .../pjd-fstest-20080816/tests/chmod/00.t | 161 +++ .../pjd-fstest-20080816/tests/chmod/01.t | 18 + .../pjd-fstest-20080816/tests/chmod/02.t | 15 + .../pjd-fstest-20080816/tests/chmod/03.t | 24 + .../pjd-fstest-20080816/tests/chmod/04.t | 17 + .../pjd-fstest-20080816/tests/chmod/05.t | 31 + .../pjd-fstest-20080816/tests/chmod/06.t | 19 + .../pjd-fstest-20080816/tests/chmod/07.t | 31 + .../pjd-fstest-20080816/tests/chmod/08.t | 59 + .../pjd-fstest-20080816/tests/chmod/09.t | 37 + .../pjd-fstest-20080816/tests/chmod/10.t | 12 + .../pjd-fstest-20080816/tests/chmod/11.t | 53 + .../pjd-fstest-20080816/tests/chown/00.t | 376 ++++++ .../pjd-fstest-20080816/tests/chown/01.t | 18 + .../pjd-fstest-20080816/tests/chown/02.t | 15 + .../pjd-fstest-20080816/tests/chown/03.t | 24 + .../pjd-fstest-20080816/tests/chown/04.t | 17 + .../pjd-fstest-20080816/tests/chown/05.t | 32 + .../pjd-fstest-20080816/tests/chown/06.t | 19 + .../pjd-fstest-20080816/tests/chown/07.t | 28 + .../pjd-fstest-20080816/tests/chown/08.t | 53 + .../pjd-fstest-20080816/tests/chown/09.t | 37 + .../pjd-fstest-20080816/tests/chown/10.t | 12 + .../tests/pjd-fstest-20080816/tests/conf | 8 + .../tests/pjd-fstest-20080816/tests/link/00.t | 151 +++ .../tests/pjd-fstest-20080816/tests/link/01.t | 22 + .../tests/pjd-fstest-20080816/tests/link/02.t | 23 + .../tests/pjd-fstest-20080816/tests/link/03.t | 32 + .../tests/pjd-fstest-20080816/tests/link/04.t | 20 + .../tests/pjd-fstest-20080816/tests/link/05.t | 41 + .../tests/pjd-fstest-20080816/tests/link/06.t | 43 + .../tests/pjd-fstest-20080816/tests/link/07.t | 41 + .../tests/pjd-fstest-20080816/tests/link/08.t | 24 + .../tests/pjd-fstest-20080816/tests/link/09.t | 18 + .../tests/pjd-fstest-20080816/tests/link/10.t | 32 + .../tests/pjd-fstest-20080816/tests/link/11.t | 41 + .../tests/pjd-fstest-20080816/tests/link/12.t | 55 + .../tests/pjd-fstest-20080816/tests/link/13.t | 56 + .../tests/pjd-fstest-20080816/tests/link/14.t | 34 + .../tests/pjd-fstest-20080816/tests/link/15.t | 38 + .../tests/pjd-fstest-20080816/tests/link/16.t | 39 + .../tests/pjd-fstest-20080816/tests/link/17.t | 20 + .../tests/pjd-fstest-20080816/tests/misc.sh | 143 ++ .../pjd-fstest-20080816/tests/mkdir/00.t | 73 ++ .../pjd-fstest-20080816/tests/mkdir/01.t | 18 + .../pjd-fstest-20080816/tests/mkdir/02.t | 13 + .../pjd-fstest-20080816/tests/mkdir/03.t | 23 + .../pjd-fstest-20080816/tests/mkdir/04.t | 16 + .../pjd-fstest-20080816/tests/mkdir/05.t | 29 + .../pjd-fstest-20080816/tests/mkdir/06.t | 29 + .../pjd-fstest-20080816/tests/mkdir/07.t | 19 + .../pjd-fstest-20080816/tests/mkdir/08.t | 53 + .../pjd-fstest-20080816/tests/mkdir/09.t | 34 + .../pjd-fstest-20080816/tests/mkdir/10.t | 27 + .../pjd-fstest-20080816/tests/mkdir/11.t | 36 + .../pjd-fstest-20080816/tests/mkdir/12.t | 12 + .../pjd-fstest-20080816/tests/mkfifo/00.t | 73 ++ .../pjd-fstest-20080816/tests/mkfifo/01.t | 18 + .../pjd-fstest-20080816/tests/mkfifo/02.t | 13 + .../pjd-fstest-20080816/tests/mkfifo/03.t | 23 + .../pjd-fstest-20080816/tests/mkfifo/04.t | 16 + .../pjd-fstest-20080816/tests/mkfifo/05.t | 29 + .../pjd-fstest-20080816/tests/mkfifo/06.t | 29 + .../pjd-fstest-20080816/tests/mkfifo/07.t | 19 + .../pjd-fstest-20080816/tests/mkfifo/08.t | 34 + .../pjd-fstest-20080816/tests/mkfifo/09.t | 27 + .../pjd-fstest-20080816/tests/mkfifo/10.t | 53 + .../pjd-fstest-20080816/tests/mkfifo/11.t | 36 + .../pjd-fstest-20080816/tests/mkfifo/12.t | 12 + .../tests/pjd-fstest-20080816/tests/open/00.t | 99 ++ .../tests/pjd-fstest-20080816/tests/open/01.t | 18 + .../tests/pjd-fstest-20080816/tests/open/02.t | 14 + .../tests/pjd-fstest-20080816/tests/open/03.t | 24 + .../tests/pjd-fstest-20080816/tests/open/04.t | 17 + .../tests/pjd-fstest-20080816/tests/open/05.t | 29 + .../tests/pjd-fstest-20080816/tests/open/06.t | 102 ++ .../tests/pjd-fstest-20080816/tests/open/07.t | 45 + .../tests/pjd-fstest-20080816/tests/open/08.t | 19 + .../tests/pjd-fstest-20080816/tests/open/09.t | 53 + .../tests/pjd-fstest-20080816/tests/open/10.t | 45 + .../tests/pjd-fstest-20080816/tests/open/11.t | 39 + .../tests/pjd-fstest-20080816/tests/open/12.t | 19 + .../tests/pjd-fstest-20080816/tests/open/13.t | 24 + .../tests/pjd-fstest-20080816/tests/open/14.t | 37 + .../tests/pjd-fstest-20080816/tests/open/15.t | 32 + .../tests/pjd-fstest-20080816/tests/open/16.t | 29 + .../tests/pjd-fstest-20080816/tests/open/17.t | 15 + .../tests/pjd-fstest-20080816/tests/open/18.t | 25 + .../tests/pjd-fstest-20080816/tests/open/19.t | 37 + .../tests/pjd-fstest-20080816/tests/open/20.t | 25 + .../tests/pjd-fstest-20080816/tests/open/21.t | 12 + .../tests/pjd-fstest-20080816/tests/open/22.t | 27 + .../tests/pjd-fstest-20080816/tests/open/23.t | 24 + .../pjd-fstest-20080816/tests/rename/00.t | 141 ++ .../pjd-fstest-20080816/tests/rename/01.t | 21 + .../pjd-fstest-20080816/tests/rename/02.t | 28 + .../pjd-fstest-20080816/tests/rename/03.t | 20 + .../pjd-fstest-20080816/tests/rename/04.t | 43 + .../pjd-fstest-20080816/tests/rename/05.t | 41 + .../pjd-fstest-20080816/tests/rename/06.t | 50 + .../pjd-fstest-20080816/tests/rename/07.t | 95 ++ .../pjd-fstest-20080816/tests/rename/08.t | 95 ++ .../pjd-fstest-20080816/tests/rename/09.t | 94 ++ .../pjd-fstest-20080816/tests/rename/10.t | 243 ++++ .../pjd-fstest-20080816/tests/rename/11.t | 24 + .../pjd-fstest-20080816/tests/rename/12.t | 22 + .../pjd-fstest-20080816/tests/rename/13.t | 34 + .../pjd-fstest-20080816/tests/rename/14.t | 34 + .../pjd-fstest-20080816/tests/rename/15.t | 45 + .../pjd-fstest-20080816/tests/rename/16.t | 37 + .../pjd-fstest-20080816/tests/rename/17.t | 20 + .../pjd-fstest-20080816/tests/rename/18.t | 22 + .../pjd-fstest-20080816/tests/rename/19.t | 30 + .../pjd-fstest-20080816/tests/rename/20.t | 35 + .../pjd-fstest-20080816/tests/rmdir/00.t | 28 + .../pjd-fstest-20080816/tests/rmdir/01.t | 30 + .../pjd-fstest-20080816/tests/rmdir/02.t | 14 + .../pjd-fstest-20080816/tests/rmdir/03.t | 24 + .../pjd-fstest-20080816/tests/rmdir/04.t | 17 + .../pjd-fstest-20080816/tests/rmdir/05.t | 19 + .../pjd-fstest-20080816/tests/rmdir/06.t | 36 + .../pjd-fstest-20080816/tests/rmdir/07.t | 27 + .../pjd-fstest-20080816/tests/rmdir/08.t | 27 + .../pjd-fstest-20080816/tests/rmdir/09.t | 49 + .../pjd-fstest-20080816/tests/rmdir/10.t | 52 + .../pjd-fstest-20080816/tests/rmdir/11.t | 40 + .../pjd-fstest-20080816/tests/rmdir/12.t | 29 + .../pjd-fstest-20080816/tests/rmdir/13.t | 27 + .../pjd-fstest-20080816/tests/rmdir/14.t | 32 + .../pjd-fstest-20080816/tests/rmdir/15.t | 12 + .../pjd-fstest-20080816/tests/symlink/00.t | 32 + .../pjd-fstest-20080816/tests/symlink/01.t | 18 + .../pjd-fstest-20080816/tests/symlink/02.t | 20 + .../pjd-fstest-20080816/tests/symlink/03.t | 28 + .../pjd-fstest-20080816/tests/symlink/04.t | 16 + .../pjd-fstest-20080816/tests/symlink/05.t | 34 + .../pjd-fstest-20080816/tests/symlink/06.t | 34 + .../pjd-fstest-20080816/tests/symlink/07.t | 19 + .../pjd-fstest-20080816/tests/symlink/08.t | 23 + .../pjd-fstest-20080816/tests/symlink/09.t | 53 + .../pjd-fstest-20080816/tests/symlink/10.t | 37 + .../pjd-fstest-20080816/tests/symlink/11.t | 36 + .../pjd-fstest-20080816/tests/symlink/12.t | 18 + .../pjd-fstest-20080816/tests/truncate/00.t | 51 + .../pjd-fstest-20080816/tests/truncate/01.t | 18 + .../pjd-fstest-20080816/tests/truncate/02.t | 15 + .../pjd-fstest-20080816/tests/truncate/03.t | 24 + .../pjd-fstest-20080816/tests/truncate/04.t | 17 + .../pjd-fstest-20080816/tests/truncate/05.t | 32 + .../pjd-fstest-20080816/tests/truncate/06.t | 24 + .../pjd-fstest-20080816/tests/truncate/07.t | 19 + .../pjd-fstest-20080816/tests/truncate/08.t | 59 + .../pjd-fstest-20080816/tests/truncate/09.t | 15 + .../pjd-fstest-20080816/tests/truncate/10.t | 37 + .../pjd-fstest-20080816/tests/truncate/11.t | 23 + .../pjd-fstest-20080816/tests/truncate/12.t | 27 + .../pjd-fstest-20080816/tests/truncate/13.t | 16 + .../pjd-fstest-20080816/tests/truncate/14.t | 12 + .../pjd-fstest-20080816/tests/unlink/00.t | 115 ++ .../pjd-fstest-20080816/tests/unlink/01.t | 18 + .../pjd-fstest-20080816/tests/unlink/02.t | 14 + .../pjd-fstest-20080816/tests/unlink/03.t | 24 + .../pjd-fstest-20080816/tests/unlink/04.t | 17 + .../pjd-fstest-20080816/tests/unlink/05.t | 27 + .../pjd-fstest-20080816/tests/unlink/06.t | 27 + .../pjd-fstest-20080816/tests/unlink/07.t | 19 + .../pjd-fstest-20080816/tests/unlink/08.t | 28 + .../pjd-fstest-20080816/tests/unlink/09.t | 49 + .../pjd-fstest-20080816/tests/unlink/10.t | 52 + .../pjd-fstest-20080816/tests/unlink/11.t | 68 + .../pjd-fstest-20080816/tests/unlink/12.t | 32 + .../pjd-fstest-20080816/tests/unlink/13.t | 12 + .../tests/rw_experiment.c | 176 +++ .../tests/unit_tests/test_dup2.c | 40 + .../tests/unit_tests/test_execv_new_process.c | 37 + .../tests/unit_tests/test_execv_old_process.c | 32 + .../tests/unit_tests/test_open.c | 19 + .../tests/unit_tests/test_opendir.c | 11 + .../tests/unit_tests/test_redirect.c | 53 + .../tests/unit_tests/test_symlink.c | 40 + .../tests/unit_tests/test_write.c | 25 + .../utils/CMakeLists.txt | 376 ++++++ splitfs_syscall_intercept/utils/README.md | 8 + .../utils/build/CMakeCache.txt | 600 +++++++++ .../CMakeFiles/3.5.1/CMakeCCompiler.cmake | 67 + .../CMakeFiles/3.5.1/CMakeCXXCompiler.cmake | 68 + .../3.5.1/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8640 bytes .../3.5.1/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8656 bytes .../build/CMakeFiles/3.5.1/CMakeSystem.cmake | 15 + .../3.5.1/CompilerIdC/CMakeCCompilerId.c | 544 ++++++++ .../build/CMakeFiles/3.5.1/CompilerIdC/a.out | Bin 0 -> 8800 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 ++++++++ .../CMakeFiles/3.5.1/CompilerIdCXX/a.out | Bin 0 -> 8808 bytes .../CMakeDirectoryInformation.cmake | 16 + .../utils/build/CMakeFiles/CMakeError.log | 123 ++ .../utils/build/CMakeFiles/CMakeOutput.log | 1107 ++++++++++++++++ .../build/CMakeFiles/CMakeRuleHashes.txt | 7 + .../utils/build/CMakeFiles/Makefile.cmake | 151 +++ .../utils/build/CMakeFiles/Makefile2 | 571 ++++++++ .../build/CMakeFiles/TargetDirectories.txt | 26 + .../DependInfo.cmake | 11 + .../check-whitespace-main.dir/build.make | 76 ++ .../cmake_clean.cmake | 8 + .../check-whitespace-main.dir/progress.make | 1 + .../check-whitespace.dir/DependInfo.cmake | 11 + .../check-whitespace.dir/build.make | 72 ++ .../check-whitespace.dir/cmake_clean.cmake | 5 + .../check-whitespace.dir/progress.make | 1 + .../CMakeFiles/checkers.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/checkers.dir/build.make | 72 ++ .../CMakeFiles/checkers.dir/cmake_clean.cmake | 5 + .../CMakeFiles/checkers.dir/depend.internal | 3 + .../build/CMakeFiles/checkers.dir/depend.make | 3 + .../CMakeFiles/checkers.dir/progress.make | 1 + .../utils/build/CMakeFiles/cmake.check_cache | 1 + .../CMakeFiles/cppformat.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cppformat.dir/build.make | 72 ++ .../cppformat.dir/cmake_clean.cmake | 5 + .../CMakeFiles/cppformat.dir/progress.make | 1 + .../CMakeFiles/cppstyle.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cppstyle.dir/build.make | 72 ++ .../CMakeFiles/cppstyle.dir/cmake_clean.cmake | 5 + .../CMakeFiles/cppstyle.dir/progress.make | 1 + .../CMakeFiles/cstyle.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/cstyle.dir/build.make | 72 ++ .../CMakeFiles/cstyle.dir/cmake_clean.cmake | 5 + .../build/CMakeFiles/cstyle.dir/progress.make | 1 + .../utils/build/CMakeFiles/feature_tests.bin | Bin 0 -> 12696 bytes .../utils/build/CMakeFiles/feature_tests.c | 34 + .../utils/build/CMakeFiles/feature_tests.cxx | 405 ++++++ .../utils/build/CMakeFiles/progress.marks | 1 + .../CMakeFiles/tests.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/tests.dir/build.make | 72 ++ .../CMakeFiles/tests.dir/cmake_clean.cmake | 5 + .../build/CMakeFiles/tests.dir/progress.make | 1 + .../CMakeFiles/uninstall.dir/DependInfo.cmake | 11 + .../build/CMakeFiles/uninstall.dir/build.make | 76 ++ .../uninstall.dir/cmake_clean.cmake | 8 + .../CMakeFiles/uninstall.dir/progress.make | 1 + .../utils/build/Makefile | 378 ++++++ .../utils/build/cmake_install.cmake | 50 + .../utils/build/cmake_uninstall.cmake | 22 + .../CMakeDirectoryInformation.cmake | 16 + .../DependInfo.cmake | 11 + .../check-whitespace-splitfs.dir/build.make | 76 ++ .../cmake_clean.cmake | 8 + .../progress.make | 1 + .../cstyle-splitfs.dir/DependInfo.cmake | 11 + .../CMakeFiles/cstyle-splitfs.dir/build.make | 76 ++ .../cstyle-splitfs.dir/cmake_clean.cmake | 8 + .../cstyle-splitfs.dir/progress.make | 1 + .../utils/build/src/CMakeFiles/progress.marks | 1 + .../CMakeFiles/splitfs_o.dir/C.includecache | 860 ++++++++++++ .../CMakeFiles/splitfs_o.dir/DependInfo.cmake | 59 + .../src/CMakeFiles/splitfs_o.dir/build.make | 833 ++++++++++++ .../splitfs_o.dir/cmake_clean.cmake | 36 + .../CMakeFiles/splitfs_o.dir/depend.internal | 319 +++++ .../src/CMakeFiles/splitfs_o.dir/depend.make | 319 +++++ .../src/CMakeFiles/splitfs_o.dir/flags.make | 10 + .../CMakeFiles/splitfs_o.dir/progress.make | 30 + .../splitfs_shared.dir/DependInfo.cmake | 18 + .../CMakeFiles/splitfs_shared.dir/build.make | 152 +++ .../splitfs_shared.dir/cmake_clean.cmake | 11 + .../splitfs_shared.dir/depend.internal | 3 + .../CMakeFiles/splitfs_shared.dir/depend.make | 3 + .../CMakeFiles/splitfs_shared.dir/flags.make | 10 + .../CMakeFiles/splitfs_shared.dir/link.txt | 1 + .../splitfs_shared.dir/progress.make | 2 + .../splitfs_static.dir/DependInfo.cmake | 11 + .../CMakeFiles/splitfs_static.dir/build.make | 81 ++ .../splitfs_static.dir/cmake_clean.cmake | 9 + .../splitfs_static.dir/depend.internal | 3 + .../CMakeFiles/splitfs_static.dir/depend.make | 3 + .../splitfs_static.dir/progress.make | 2 + .../DependInfo.cmake | 11 + .../splitfs_static_unscoped.dir/build.make | 146 +++ .../cmake_clean.cmake | 9 + .../cmake_clean_target.cmake | 3 + .../depend.internal | 3 + .../splitfs_static_unscoped.dir/depend.make | 3 + .../splitfs_static_unscoped.dir/flags.make | 10 + .../splitfs_static_unscoped.dir/link.txt | 2 + .../splitfs_static_unscoped.dir/progress.make | 2 + .../utils/build/src/Makefile | 1148 +++++++++++++++++ .../utils/build/src/cmake_install.cmake | 102 ++ .../utils/build/src/libsplitfs.a | Bin 0 -> 729156 bytes .../utils/build/src/libsplitfs.so | 1 + .../utils/build/src/libsplitfs.so.0 | 1 + .../utils/build/src/libsplitfs.so.0.0.0 | Bin 0 -> 352568 bytes .../utils/build/src/libsplitfs_unscoped.a | Bin 0 -> 731800 bytes .../utils/check_whitespace | 229 ++++ .../utils/cmake_uninstall.cmake.in | 22 + splitfs_syscall_intercept/utils/cppstyle | 72 ++ splitfs_syscall_intercept/utils/cstyle | 1031 +++++++++++++++ .../utils/include/splitfs-posix.h | 95 ++ .../utils/src/CMakeLists.txt | 114 ++ .../utils/src/add_delay.c | 97 ++ .../utils/src/add_delay.h | 17 + .../utils/src/compiler_utils.h | 85 ++ .../utils/src/constants.h | 2 + splitfs_syscall_intercept/utils/src/execv.c | 216 ++++ splitfs_syscall_intercept/utils/src/execv.h | 9 + .../utils/src/fallocate.c | 182 +++ splitfs_syscall_intercept/utils/src/file.c | 345 +++++ splitfs_syscall_intercept/utils/src/file.h | 71 + splitfs_syscall_intercept/utils/src/fsync.c | 72 ++ .../utils/src/handle_mmaps.c | 139 ++ .../utils/src/handle_mmaps.h | 40 + .../utils/src/hash_map.c | 226 ++++ .../utils/src/hash_map.h | 58 + splitfs_syscall_intercept/utils/src/inode.c | 169 +++ splitfs_syscall_intercept/utils/src/inode.h | 169 +++ .../utils/src/intel_intrin.c | 273 ++++ .../utils/src/intel_intrin.h | 80 ++ .../utils/src/libsplitfs.map | 45 + splitfs_syscall_intercept/utils/src/lseek.c | 165 +++ .../utils/src/mmap_pool.c | 60 + .../utils/src/mmap_pool.h | 25 + .../utils/src/os_thread.h | 122 ++ .../utils/src/os_thread_pthread.c | 164 +++ splitfs_syscall_intercept/utils/src/os_util.h | 52 + .../utils/src/os_util_linux.c | 84 ++ splitfs_syscall_intercept/utils/src/out.c | 349 +++++ splitfs_syscall_intercept/utils/src/out.h | 242 ++++ .../utils/src/path_resolve.c | 142 ++ splitfs_syscall_intercept/utils/src/pm_util.h | 44 + splitfs_syscall_intercept/utils/src/preload.c | 809 ++++++++++++ splitfs_syscall_intercept/utils/src/preload.h | 63 + splitfs_syscall_intercept/utils/src/read.c | 316 +++++ splitfs_syscall_intercept/utils/src/relink.c | 68 + splitfs_syscall_intercept/utils/src/relink.h | 32 + .../utils/src/splitfs-posix.c | 132 ++ splitfs_syscall_intercept/utils/src/staging.c | 244 ++++ splitfs_syscall_intercept/utils/src/staging.h | 43 + .../utils/src/staging_thread.c | 90 ++ .../utils/src/staging_thread.h | 18 + splitfs_syscall_intercept/utils/src/stat.c | 110 ++ .../utils/src/sys_util.h | 199 +++ .../utils/src/syscall_early_filter.c | 217 ++++ .../utils/src/syscall_early_filter.h | 122 ++ .../utils/src/table_mmaps.c | 162 +++ .../utils/src/table_mmaps.h | 32 + .../utils/src/truncate.c | 116 ++ .../utils/src/truncate.h | 30 + splitfs_syscall_intercept/utils/src/unlink.c | 90 ++ splitfs_syscall_intercept/utils/src/utils.c | 118 ++ splitfs_syscall_intercept/utils/src/utils.h | 46 + .../utils/src/vfd_table.c | 350 +++++ .../utils/src/vfd_table.h | 38 + splitfs_syscall_intercept/utils/src/write.c | 417 ++++++ .../utils/tests/Makefile | 19 + .../utils/tests/README.md | 5 + splitfs_syscall_intercept/utils/tests/a.out | Bin 0 -> 13800 bytes .../utils/tests/pjd-fstest-20080816/LICENSE | 27 + .../utils/tests/pjd-fstest-20080816/Makefile | 15 + .../utils/tests/pjd-fstest-20080816/README | 28 + .../utils/tests/pjd-fstest-20080816/fstest | Bin 0 -> 24528 bytes .../utils/tests/pjd-fstest-20080816/fstest.c | 1002 ++++++++++++++ .../pjd-fstest-20080816/tests/chflags/00.t | 178 +++ .../pjd-fstest-20080816/tests/chflags/01.t | 20 + .../pjd-fstest-20080816/tests/chflags/02.t | 18 + .../pjd-fstest-20080816/tests/chflags/03.t | 25 + .../pjd-fstest-20080816/tests/chflags/04.t | 19 + .../pjd-fstest-20080816/tests/chflags/05.t | 35 + .../pjd-fstest-20080816/tests/chflags/06.t | 21 + .../pjd-fstest-20080816/tests/chflags/07.t | 54 + .../pjd-fstest-20080816/tests/chflags/08.t | 70 + .../pjd-fstest-20080816/tests/chflags/09.t | 82 ++ .../pjd-fstest-20080816/tests/chflags/10.t | 62 + .../pjd-fstest-20080816/tests/chflags/11.t | 70 + .../pjd-fstest-20080816/tests/chflags/12.t | 43 + .../pjd-fstest-20080816/tests/chflags/13.t | 14 + .../pjd-fstest-20080816/tests/chmod/00.t | 161 +++ .../pjd-fstest-20080816/tests/chmod/01.t | 18 + .../pjd-fstest-20080816/tests/chmod/02.t | 15 + .../pjd-fstest-20080816/tests/chmod/03.t | 24 + .../pjd-fstest-20080816/tests/chmod/04.t | 17 + .../pjd-fstest-20080816/tests/chmod/05.t | 31 + .../pjd-fstest-20080816/tests/chmod/06.t | 19 + .../pjd-fstest-20080816/tests/chmod/07.t | 31 + .../pjd-fstest-20080816/tests/chmod/08.t | 59 + .../pjd-fstest-20080816/tests/chmod/09.t | 37 + .../pjd-fstest-20080816/tests/chmod/10.t | 12 + .../pjd-fstest-20080816/tests/chmod/11.t | 53 + .../pjd-fstest-20080816/tests/chown/00.t | 376 ++++++ .../pjd-fstest-20080816/tests/chown/01.t | 18 + .../pjd-fstest-20080816/tests/chown/02.t | 15 + .../pjd-fstest-20080816/tests/chown/03.t | 24 + .../pjd-fstest-20080816/tests/chown/04.t | 17 + .../pjd-fstest-20080816/tests/chown/05.t | 32 + .../pjd-fstest-20080816/tests/chown/06.t | 19 + .../pjd-fstest-20080816/tests/chown/07.t | 28 + .../pjd-fstest-20080816/tests/chown/08.t | 53 + .../pjd-fstest-20080816/tests/chown/09.t | 37 + .../pjd-fstest-20080816/tests/chown/10.t | 12 + .../tests/pjd-fstest-20080816/tests/conf | 8 + .../tests/pjd-fstest-20080816/tests/link/00.t | 151 +++ .../tests/pjd-fstest-20080816/tests/link/01.t | 22 + .../tests/pjd-fstest-20080816/tests/link/02.t | 23 + .../tests/pjd-fstest-20080816/tests/link/03.t | 32 + .../tests/pjd-fstest-20080816/tests/link/04.t | 20 + .../tests/pjd-fstest-20080816/tests/link/05.t | 41 + .../tests/pjd-fstest-20080816/tests/link/06.t | 43 + .../tests/pjd-fstest-20080816/tests/link/07.t | 41 + .../tests/pjd-fstest-20080816/tests/link/08.t | 24 + .../tests/pjd-fstest-20080816/tests/link/09.t | 18 + .../tests/pjd-fstest-20080816/tests/link/10.t | 32 + .../tests/pjd-fstest-20080816/tests/link/11.t | 41 + .../tests/pjd-fstest-20080816/tests/link/12.t | 55 + .../tests/pjd-fstest-20080816/tests/link/13.t | 56 + .../tests/pjd-fstest-20080816/tests/link/14.t | 34 + .../tests/pjd-fstest-20080816/tests/link/15.t | 38 + .../tests/pjd-fstest-20080816/tests/link/16.t | 39 + .../tests/pjd-fstest-20080816/tests/link/17.t | 20 + .../tests/pjd-fstest-20080816/tests/misc.sh | 143 ++ .../pjd-fstest-20080816/tests/mkdir/00.t | 73 ++ .../pjd-fstest-20080816/tests/mkdir/01.t | 18 + .../pjd-fstest-20080816/tests/mkdir/02.t | 13 + .../pjd-fstest-20080816/tests/mkdir/03.t | 23 + .../pjd-fstest-20080816/tests/mkdir/04.t | 16 + .../pjd-fstest-20080816/tests/mkdir/05.t | 29 + .../pjd-fstest-20080816/tests/mkdir/06.t | 29 + .../pjd-fstest-20080816/tests/mkdir/07.t | 19 + .../pjd-fstest-20080816/tests/mkdir/08.t | 53 + .../pjd-fstest-20080816/tests/mkdir/09.t | 34 + .../pjd-fstest-20080816/tests/mkdir/10.t | 27 + .../pjd-fstest-20080816/tests/mkdir/11.t | 36 + .../pjd-fstest-20080816/tests/mkdir/12.t | 12 + .../pjd-fstest-20080816/tests/mkfifo/00.t | 73 ++ .../pjd-fstest-20080816/tests/mkfifo/01.t | 18 + .../pjd-fstest-20080816/tests/mkfifo/02.t | 13 + .../pjd-fstest-20080816/tests/mkfifo/03.t | 23 + .../pjd-fstest-20080816/tests/mkfifo/04.t | 16 + .../pjd-fstest-20080816/tests/mkfifo/05.t | 29 + .../pjd-fstest-20080816/tests/mkfifo/06.t | 29 + .../pjd-fstest-20080816/tests/mkfifo/07.t | 19 + .../pjd-fstest-20080816/tests/mkfifo/08.t | 34 + .../pjd-fstest-20080816/tests/mkfifo/09.t | 27 + .../pjd-fstest-20080816/tests/mkfifo/10.t | 53 + .../pjd-fstest-20080816/tests/mkfifo/11.t | 36 + .../pjd-fstest-20080816/tests/mkfifo/12.t | 12 + .../tests/pjd-fstest-20080816/tests/open/00.t | 99 ++ .../tests/pjd-fstest-20080816/tests/open/01.t | 18 + .../tests/pjd-fstest-20080816/tests/open/02.t | 14 + .../tests/pjd-fstest-20080816/tests/open/03.t | 24 + .../tests/pjd-fstest-20080816/tests/open/04.t | 17 + .../tests/pjd-fstest-20080816/tests/open/05.t | 29 + .../tests/pjd-fstest-20080816/tests/open/06.t | 102 ++ .../tests/pjd-fstest-20080816/tests/open/07.t | 45 + .../tests/pjd-fstest-20080816/tests/open/08.t | 19 + .../tests/pjd-fstest-20080816/tests/open/09.t | 53 + .../tests/pjd-fstest-20080816/tests/open/10.t | 45 + .../tests/pjd-fstest-20080816/tests/open/11.t | 39 + .../tests/pjd-fstest-20080816/tests/open/12.t | 19 + .../tests/pjd-fstest-20080816/tests/open/13.t | 24 + .../tests/pjd-fstest-20080816/tests/open/14.t | 37 + .../tests/pjd-fstest-20080816/tests/open/15.t | 32 + .../tests/pjd-fstest-20080816/tests/open/16.t | 29 + .../tests/pjd-fstest-20080816/tests/open/17.t | 15 + .../tests/pjd-fstest-20080816/tests/open/18.t | 25 + .../tests/pjd-fstest-20080816/tests/open/19.t | 37 + .../tests/pjd-fstest-20080816/tests/open/20.t | 25 + .../tests/pjd-fstest-20080816/tests/open/21.t | 12 + .../tests/pjd-fstest-20080816/tests/open/22.t | 27 + .../tests/pjd-fstest-20080816/tests/open/23.t | 24 + .../pjd-fstest-20080816/tests/rename/00.t | 141 ++ .../pjd-fstest-20080816/tests/rename/01.t | 21 + .../pjd-fstest-20080816/tests/rename/02.t | 28 + .../pjd-fstest-20080816/tests/rename/03.t | 20 + .../pjd-fstest-20080816/tests/rename/04.t | 43 + .../pjd-fstest-20080816/tests/rename/05.t | 41 + .../pjd-fstest-20080816/tests/rename/06.t | 50 + .../pjd-fstest-20080816/tests/rename/07.t | 95 ++ .../pjd-fstest-20080816/tests/rename/08.t | 95 ++ .../pjd-fstest-20080816/tests/rename/09.t | 94 ++ .../pjd-fstest-20080816/tests/rename/10.t | 243 ++++ .../pjd-fstest-20080816/tests/rename/11.t | 24 + .../pjd-fstest-20080816/tests/rename/12.t | 22 + .../pjd-fstest-20080816/tests/rename/13.t | 34 + .../pjd-fstest-20080816/tests/rename/14.t | 34 + .../pjd-fstest-20080816/tests/rename/15.t | 45 + .../pjd-fstest-20080816/tests/rename/16.t | 37 + .../pjd-fstest-20080816/tests/rename/17.t | 20 + .../pjd-fstest-20080816/tests/rename/18.t | 22 + .../pjd-fstest-20080816/tests/rename/19.t | 30 + .../pjd-fstest-20080816/tests/rename/20.t | 35 + .../pjd-fstest-20080816/tests/rmdir/00.t | 28 + .../pjd-fstest-20080816/tests/rmdir/01.t | 30 + .../pjd-fstest-20080816/tests/rmdir/02.t | 14 + .../pjd-fstest-20080816/tests/rmdir/03.t | 24 + .../pjd-fstest-20080816/tests/rmdir/04.t | 17 + .../pjd-fstest-20080816/tests/rmdir/05.t | 19 + .../pjd-fstest-20080816/tests/rmdir/06.t | 36 + .../pjd-fstest-20080816/tests/rmdir/07.t | 27 + .../pjd-fstest-20080816/tests/rmdir/08.t | 27 + .../pjd-fstest-20080816/tests/rmdir/09.t | 49 + .../pjd-fstest-20080816/tests/rmdir/10.t | 52 + .../pjd-fstest-20080816/tests/rmdir/11.t | 40 + .../pjd-fstest-20080816/tests/rmdir/12.t | 29 + .../pjd-fstest-20080816/tests/rmdir/13.t | 27 + .../pjd-fstest-20080816/tests/rmdir/14.t | 32 + .../pjd-fstest-20080816/tests/rmdir/15.t | 12 + .../pjd-fstest-20080816/tests/symlink/00.t | 32 + .../pjd-fstest-20080816/tests/symlink/01.t | 18 + .../pjd-fstest-20080816/tests/symlink/02.t | 20 + .../pjd-fstest-20080816/tests/symlink/03.t | 28 + .../pjd-fstest-20080816/tests/symlink/04.t | 16 + .../pjd-fstest-20080816/tests/symlink/05.t | 34 + .../pjd-fstest-20080816/tests/symlink/06.t | 34 + .../pjd-fstest-20080816/tests/symlink/07.t | 19 + .../pjd-fstest-20080816/tests/symlink/08.t | 23 + .../pjd-fstest-20080816/tests/symlink/09.t | 53 + .../pjd-fstest-20080816/tests/symlink/10.t | 37 + .../pjd-fstest-20080816/tests/symlink/11.t | 36 + .../pjd-fstest-20080816/tests/symlink/12.t | 18 + .../pjd-fstest-20080816/tests/truncate/00.t | 51 + .../pjd-fstest-20080816/tests/truncate/01.t | 18 + .../pjd-fstest-20080816/tests/truncate/02.t | 15 + .../pjd-fstest-20080816/tests/truncate/03.t | 24 + .../pjd-fstest-20080816/tests/truncate/04.t | 17 + .../pjd-fstest-20080816/tests/truncate/05.t | 32 + .../pjd-fstest-20080816/tests/truncate/06.t | 24 + .../pjd-fstest-20080816/tests/truncate/07.t | 19 + .../pjd-fstest-20080816/tests/truncate/08.t | 59 + .../pjd-fstest-20080816/tests/truncate/09.t | 15 + .../pjd-fstest-20080816/tests/truncate/10.t | 37 + .../pjd-fstest-20080816/tests/truncate/11.t | 23 + .../pjd-fstest-20080816/tests/truncate/12.t | 27 + .../pjd-fstest-20080816/tests/truncate/13.t | 16 + .../pjd-fstest-20080816/tests/truncate/14.t | 12 + .../pjd-fstest-20080816/tests/unlink/00.t | 115 ++ .../pjd-fstest-20080816/tests/unlink/01.t | 18 + .../pjd-fstest-20080816/tests/unlink/02.t | 14 + .../pjd-fstest-20080816/tests/unlink/03.t | 24 + .../pjd-fstest-20080816/tests/unlink/04.t | 17 + .../pjd-fstest-20080816/tests/unlink/05.t | 27 + .../pjd-fstest-20080816/tests/unlink/06.t | 27 + .../pjd-fstest-20080816/tests/unlink/07.t | 19 + .../pjd-fstest-20080816/tests/unlink/08.t | 28 + .../pjd-fstest-20080816/tests/unlink/09.t | 49 + .../pjd-fstest-20080816/tests/unlink/10.t | 52 + .../pjd-fstest-20080816/tests/unlink/11.t | 68 + .../pjd-fstest-20080816/tests/unlink/12.t | 32 + .../pjd-fstest-20080816/tests/unlink/13.t | 12 + .../utils/tests/rw_experiment.c | 176 +++ .../utils/tests/unit_tests/test_dup2.c | 40 + .../tests/unit_tests/test_execv_new_process.c | 37 + .../tests/unit_tests/test_execv_old_process.c | 32 + .../utils/tests/unit_tests/test_open.c | 19 + .../utils/tests/unit_tests/test_opendir.c | 11 + .../utils/tests/unit_tests/test_redirect.c | 53 + .../utils/tests/unit_tests/test_symlink.c | 40 + .../utils/tests/unit_tests/test_write.c | 25 + 741 files changed, 54924 insertions(+) create mode 100644 splitfs_syscall_intercept/CMakeLists.txt create mode 100644 splitfs_syscall_intercept/README.md create mode 100644 splitfs_syscall_intercept/build/CMakeCache.txt create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake create mode 100755 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin create mode 100755 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeSystem.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c create mode 100755 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdC/a.out create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/CMakeError.log create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/CMakeOutput.log create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/CMakeRuleHashes.txt create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/Makefile.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/Makefile2 create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/TargetDirectories.txt create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.internal create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cmake.check_cache create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/progress.make create mode 100755 splitfs_syscall_intercept/build/CMakeFiles/feature_tests.bin create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/feature_tests.c create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/feature_tests.cxx create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/progress.marks create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/tests.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/tests.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/tests.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/tests.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/build.make create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/Makefile create mode 100644 splitfs_syscall_intercept/build/cmake_install.cmake create mode 100644 splitfs_syscall_intercept/build/cmake_uninstall.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/progress.marks create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/C.includecache create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.internal create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/flags.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.internal create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/flags.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/link.txt create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.internal create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt create mode 100644 splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make create mode 100644 splitfs_syscall_intercept/build/src/Makefile create mode 100644 splitfs_syscall_intercept/build/src/cmake_install.cmake create mode 100644 splitfs_syscall_intercept/build/src/libsplitfs.a create mode 120000 splitfs_syscall_intercept/build/src/libsplitfs.so create mode 120000 splitfs_syscall_intercept/build/src/libsplitfs.so.0 create mode 100755 splitfs_syscall_intercept/build/src/libsplitfs.so.0.0.0 create mode 100644 splitfs_syscall_intercept/build/src/libsplitfs_unscoped.a create mode 100644 splitfs_syscall_intercept/cmake_uninstall.cmake.in create mode 100644 splitfs_syscall_intercept/include/splitfs-posix.h create mode 100644 splitfs_syscall_intercept/src/CMakeLists.txt create mode 100755 splitfs_syscall_intercept/src/add_delay.c create mode 100755 splitfs_syscall_intercept/src/add_delay.h create mode 100644 splitfs_syscall_intercept/src/compiler_utils.h create mode 100644 splitfs_syscall_intercept/src/constants.h create mode 100644 splitfs_syscall_intercept/src/execv.c create mode 100644 splitfs_syscall_intercept/src/execv.h create mode 100644 splitfs_syscall_intercept/src/fallocate.c create mode 100644 splitfs_syscall_intercept/src/file.c create mode 100644 splitfs_syscall_intercept/src/file.h create mode 100644 splitfs_syscall_intercept/src/fsync.c create mode 100644 splitfs_syscall_intercept/src/handle_mmaps.c create mode 100644 splitfs_syscall_intercept/src/handle_mmaps.h create mode 100644 splitfs_syscall_intercept/src/hash_map.c create mode 100644 splitfs_syscall_intercept/src/hash_map.h create mode 100644 splitfs_syscall_intercept/src/inode.c create mode 100644 splitfs_syscall_intercept/src/inode.h create mode 100644 splitfs_syscall_intercept/src/intel_intrin.c create mode 100644 splitfs_syscall_intercept/src/intel_intrin.h create mode 100644 splitfs_syscall_intercept/src/libsplitfs.map create mode 100644 splitfs_syscall_intercept/src/lseek.c create mode 100644 splitfs_syscall_intercept/src/mmap_pool.c create mode 100644 splitfs_syscall_intercept/src/mmap_pool.h create mode 100644 splitfs_syscall_intercept/src/os_thread.h create mode 100644 splitfs_syscall_intercept/src/os_thread_pthread.c create mode 100644 splitfs_syscall_intercept/src/os_util.h create mode 100644 splitfs_syscall_intercept/src/os_util_linux.c create mode 100644 splitfs_syscall_intercept/src/out.c create mode 100644 splitfs_syscall_intercept/src/out.h create mode 100644 splitfs_syscall_intercept/src/path_resolve.c create mode 100755 splitfs_syscall_intercept/src/pm_util.h create mode 100644 splitfs_syscall_intercept/src/preload.c create mode 100644 splitfs_syscall_intercept/src/preload.h create mode 100644 splitfs_syscall_intercept/src/read.c create mode 100644 splitfs_syscall_intercept/src/relink.c create mode 100644 splitfs_syscall_intercept/src/relink.h create mode 100644 splitfs_syscall_intercept/src/splitfs-posix.c create mode 100644 splitfs_syscall_intercept/src/staging.c create mode 100644 splitfs_syscall_intercept/src/staging.h create mode 100644 splitfs_syscall_intercept/src/staging_thread.c create mode 100644 splitfs_syscall_intercept/src/staging_thread.h create mode 100644 splitfs_syscall_intercept/src/stat.c create mode 100644 splitfs_syscall_intercept/src/sys_util.h create mode 100644 splitfs_syscall_intercept/src/syscall_early_filter.c create mode 100644 splitfs_syscall_intercept/src/syscall_early_filter.h create mode 100644 splitfs_syscall_intercept/src/table_mmaps.c create mode 100644 splitfs_syscall_intercept/src/table_mmaps.h create mode 100644 splitfs_syscall_intercept/src/truncate.c create mode 100644 splitfs_syscall_intercept/src/truncate.h create mode 100644 splitfs_syscall_intercept/src/unlink.c create mode 100644 splitfs_syscall_intercept/src/utils.c create mode 100644 splitfs_syscall_intercept/src/utils.h create mode 100644 splitfs_syscall_intercept/src/vfd_table.c create mode 100644 splitfs_syscall_intercept/src/vfd_table.h create mode 100644 splitfs_syscall_intercept/src/write.c create mode 100644 splitfs_syscall_intercept/tests/Makefile create mode 100644 splitfs_syscall_intercept/tests/README.md create mode 100755 splitfs_syscall_intercept/tests/a.out create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/LICENSE create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/Makefile create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/README create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest.c create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/10.t create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/conf create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/14.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/15.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/16.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/17.t create mode 100644 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/misc.sh create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/14.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/15.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/16.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/17.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/18.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/19.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/20.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/21.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/22.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/23.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/14.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/15.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/16.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/17.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/18.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/19.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/20.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/14.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/15.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/13.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/14.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/00.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/01.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/02.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/03.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/04.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/05.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/06.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/07.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/08.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/09.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/10.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/11.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/12.t create mode 100755 splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/13.t create mode 100644 splitfs_syscall_intercept/tests/rw_experiment.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_dup2.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_execv_new_process.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_execv_old_process.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_open.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_opendir.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_redirect.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_symlink.c create mode 100644 splitfs_syscall_intercept/tests/unit_tests/test_write.c create mode 100644 splitfs_syscall_intercept/utils/CMakeLists.txt create mode 100644 splitfs_syscall_intercept/utils/README.md create mode 100644 splitfs_syscall_intercept/utils/build/CMakeCache.txt create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake create mode 100755 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin create mode 100755 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeSystem.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c create mode 100755 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdC/a.out create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeError.log create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeOutput.log create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeRuleHashes.txt create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile2 create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/TargetDirectories.txt create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.internal create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cmake.check_cache create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/progress.make create mode 100755 splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.bin create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.c create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.cxx create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/progress.marks create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/Makefile create mode 100644 splitfs_syscall_intercept/utils/build/cmake_install.cmake create mode 100644 splitfs_syscall_intercept/utils/build/cmake_uninstall.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/progress.marks create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/C.includecache create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.internal create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/flags.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.internal create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/flags.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/link.txt create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.internal create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt create mode 100644 splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make create mode 100644 splitfs_syscall_intercept/utils/build/src/Makefile create mode 100644 splitfs_syscall_intercept/utils/build/src/cmake_install.cmake create mode 100644 splitfs_syscall_intercept/utils/build/src/libsplitfs.a create mode 120000 splitfs_syscall_intercept/utils/build/src/libsplitfs.so create mode 120000 splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0 create mode 100755 splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0.0.0 create mode 100644 splitfs_syscall_intercept/utils/build/src/libsplitfs_unscoped.a create mode 100755 splitfs_syscall_intercept/utils/check_whitespace create mode 100644 splitfs_syscall_intercept/utils/cmake_uninstall.cmake.in create mode 100755 splitfs_syscall_intercept/utils/cppstyle create mode 100755 splitfs_syscall_intercept/utils/cstyle create mode 100644 splitfs_syscall_intercept/utils/include/splitfs-posix.h create mode 100644 splitfs_syscall_intercept/utils/src/CMakeLists.txt create mode 100755 splitfs_syscall_intercept/utils/src/add_delay.c create mode 100755 splitfs_syscall_intercept/utils/src/add_delay.h create mode 100644 splitfs_syscall_intercept/utils/src/compiler_utils.h create mode 100644 splitfs_syscall_intercept/utils/src/constants.h create mode 100644 splitfs_syscall_intercept/utils/src/execv.c create mode 100644 splitfs_syscall_intercept/utils/src/execv.h create mode 100644 splitfs_syscall_intercept/utils/src/fallocate.c create mode 100644 splitfs_syscall_intercept/utils/src/file.c create mode 100644 splitfs_syscall_intercept/utils/src/file.h create mode 100644 splitfs_syscall_intercept/utils/src/fsync.c create mode 100644 splitfs_syscall_intercept/utils/src/handle_mmaps.c create mode 100644 splitfs_syscall_intercept/utils/src/handle_mmaps.h create mode 100644 splitfs_syscall_intercept/utils/src/hash_map.c create mode 100644 splitfs_syscall_intercept/utils/src/hash_map.h create mode 100644 splitfs_syscall_intercept/utils/src/inode.c create mode 100644 splitfs_syscall_intercept/utils/src/inode.h create mode 100644 splitfs_syscall_intercept/utils/src/intel_intrin.c create mode 100644 splitfs_syscall_intercept/utils/src/intel_intrin.h create mode 100644 splitfs_syscall_intercept/utils/src/libsplitfs.map create mode 100644 splitfs_syscall_intercept/utils/src/lseek.c create mode 100644 splitfs_syscall_intercept/utils/src/mmap_pool.c create mode 100644 splitfs_syscall_intercept/utils/src/mmap_pool.h create mode 100644 splitfs_syscall_intercept/utils/src/os_thread.h create mode 100644 splitfs_syscall_intercept/utils/src/os_thread_pthread.c create mode 100644 splitfs_syscall_intercept/utils/src/os_util.h create mode 100644 splitfs_syscall_intercept/utils/src/os_util_linux.c create mode 100644 splitfs_syscall_intercept/utils/src/out.c create mode 100644 splitfs_syscall_intercept/utils/src/out.h create mode 100644 splitfs_syscall_intercept/utils/src/path_resolve.c create mode 100755 splitfs_syscall_intercept/utils/src/pm_util.h create mode 100644 splitfs_syscall_intercept/utils/src/preload.c create mode 100644 splitfs_syscall_intercept/utils/src/preload.h create mode 100644 splitfs_syscall_intercept/utils/src/read.c create mode 100644 splitfs_syscall_intercept/utils/src/relink.c create mode 100644 splitfs_syscall_intercept/utils/src/relink.h create mode 100644 splitfs_syscall_intercept/utils/src/splitfs-posix.c create mode 100644 splitfs_syscall_intercept/utils/src/staging.c create mode 100644 splitfs_syscall_intercept/utils/src/staging.h create mode 100644 splitfs_syscall_intercept/utils/src/staging_thread.c create mode 100644 splitfs_syscall_intercept/utils/src/staging_thread.h create mode 100644 splitfs_syscall_intercept/utils/src/stat.c create mode 100644 splitfs_syscall_intercept/utils/src/sys_util.h create mode 100644 splitfs_syscall_intercept/utils/src/syscall_early_filter.c create mode 100644 splitfs_syscall_intercept/utils/src/syscall_early_filter.h create mode 100644 splitfs_syscall_intercept/utils/src/table_mmaps.c create mode 100644 splitfs_syscall_intercept/utils/src/table_mmaps.h create mode 100644 splitfs_syscall_intercept/utils/src/truncate.c create mode 100644 splitfs_syscall_intercept/utils/src/truncate.h create mode 100644 splitfs_syscall_intercept/utils/src/unlink.c create mode 100644 splitfs_syscall_intercept/utils/src/utils.c create mode 100644 splitfs_syscall_intercept/utils/src/utils.h create mode 100644 splitfs_syscall_intercept/utils/src/vfd_table.c create mode 100644 splitfs_syscall_intercept/utils/src/vfd_table.h create mode 100644 splitfs_syscall_intercept/utils/src/write.c create mode 100644 splitfs_syscall_intercept/utils/tests/Makefile create mode 100644 splitfs_syscall_intercept/utils/tests/README.md create mode 100755 splitfs_syscall_intercept/utils/tests/a.out create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/LICENSE create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/Makefile create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/README create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest.c create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/10.t create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/conf create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/14.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/15.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/16.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/17.t create mode 100644 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/misc.sh create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/14.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/15.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/16.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/17.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/18.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/19.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/20.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/21.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/22.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/23.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/14.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/15.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/16.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/17.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/18.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/19.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/20.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/14.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/15.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/13.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/14.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/00.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/01.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/02.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/03.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/04.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/05.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/06.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/07.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/08.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/09.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/10.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/11.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/12.t create mode 100755 splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/13.t create mode 100644 splitfs_syscall_intercept/utils/tests/rw_experiment.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_dup2.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_new_process.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_old_process.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_open.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_opendir.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_redirect.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_symlink.c create mode 100644 splitfs_syscall_intercept/utils/tests/unit_tests/test_write.c diff --git a/splitfs_syscall_intercept/CMakeLists.txt b/splitfs_syscall_intercept/CMakeLists.txt new file mode 100644 index 0000000000..dc78c3365c --- /dev/null +++ b/splitfs_syscall_intercept/CMakeLists.txt @@ -0,0 +1,376 @@ +cmake_minimum_required(VERSION 3.3) +project(splitfs C CXX) + +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) + +set(VERSION_MAJOR 0) +set(VERSION_MINOR 0) +set(VERSION_PATCH 0) +set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) + +include(FindThreads) +include(CMakeDependentOption) + +# XXX rename libpmemfile, since the whole repo is also just +# called pmemfile! +option(BUILD_LIBSPLITFS + "build libsplitfs (requires libsyscall_intercept)" ON) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo") +endif (NOT CMAKE_BUILD_TYPE) + +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + execute_process(COMMAND git describe + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) + if(NOT SRCVERSION) + execute_process(COMMAND git log -1 --format=%h + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() +else() + execute_process(COMMAND cat .version + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +if(WIN32) + message(FATAL_ERROR "Windows is not supported") +endif() + +include(FindPerl) +if(NOT PERL_FOUND) + message(FATAL_ERROR "Perl not found") +endif() +if (PERL_VERSION_STRING VERSION_LESS 5.16) + message(FATAL_ERROR "Too old Perl (<5.16)") +endif() + +add_definitions(-DSRCVERSION="${SRCVERSION}") +add_definitions(-DPMEMFILE_MAJOR_VERSION=${VERSION_MAJOR}) +add_definitions(-DPMEMFILE_MINOR_VERSION=${VERSION_MINOR}) +if(NOT WIN32) + add_definitions(-DUSE_VALGRIND) +endif() + +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) +include(GNUInstallDirs) +find_package(PkgConfig QUIET) + +include_directories(include) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_CXX_STANDARD 11) + +function(join SEP OUT VALUES) + string(REPLACE ";" "${SEP}" JOIN_TMP "${VALUES}") + set(${OUT} "${JOIN_TMP}" PARENT_SCOPE) +endfunction() + +# Checks whether flag is supported by current C compiler and appends +# it to the relevant cmake variable. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_c_flag flag) + string(REPLACE - _ flag2 ${flag}) + string(REPLACE " " _ flag2 ${flag2}) + string(REPLACE = "_" flag2 ${flag2}) + set(check_name "C_HAS_${flag2}") + + check_c_compiler_flag("${flag}" "${check_name}") + + if (${${check_name}}) + if (${ARGC} EQUAL 1) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") + else() + set(CMAKE_C_FLAGS_${ARGV1} "${CMAKE_C_FLAGS_${ARGV1}} ${flag}") + endif() + endif() +endmacro() + +# Checks whether flag is supported by current C++ compiler and appends +# it to the relevant cmake variable. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_cxx_flag flag) + string(REPLACE - _ flag2 ${flag}) + string(REPLACE " " _ flag2 ${flag2}) + string(REPLACE = "_" flag2 ${flag2}) + set(check_name "CXX_HAS_${flag2}") + + check_cxx_compiler_flag(${flag} ${check_name}) + + if (${${check_name}}) + if (${ARGC} EQUAL 1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") + else() + set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${flag}") + endif() + endif() +endmacro() + +# Checks whether flag is supported by current C & C++ compilers and appends +# it to the relevant cmake variables. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_flag flag) + add_c_flag(${flag} ${ARGN}) + add_cxx_flag(${flag} ${ARGN}) +endmacro() + +add_flag(-Wall) +add_flag(-Wpointer-arith) +add_flag(-Wunused-macros) +add_flag(-Wsign-conversion) +add_flag(-Wsign-compare) +add_flag(-Wconversion) +add_flag(-Wunreachable-code-return) +add_flag(-Wmissing-variable-declarations) +add_flag(-fno-common) +add_flag(-Ofast) +add_flag(-funroll-loops) +add_flag(-ftree-vectorize) +add_flag(-m64) + +# Conditionally using the -Wno-missing-field-initializers flag. +# +# As of 2017, the following clang erroneously issues a warning for +# the following code: +# +# struct x { int a; int b; int c; }; +# +# struct x variable = {0}; +# +# The warning is meant to warn about fields not being initialized while +# using this syntax in C++, but the clang warns while compiling C as well. +# +# See: https://llvm.org/bugs/show_bug.cgi?id=21689 +# See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750 +if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") + add_c_flag(-Wno-missing-field-initializers) +endif() + +add_c_flag(-Wmissing-prototypes) + +check_c_compiler_flag(-Wl,-z,relro LINKER_HAS_RELRO) +if(LINKER_HAS_RELRO) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") +endif() + +check_c_compiler_flag(-Wl,--warn-common LINKER_HAS_WARN_COMMON) +if(LINKER_HAS_WARN_COMMON) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--warn-common") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--warn-common") +endif() + +add_flag(-ggdb RELWITHDEBINFO) +add_flag(-ggdb DEBUG) +add_flag(-DDEBUG DEBUG) + +add_flag(-ggdb RELWITHDEBINFO) +add_flag(-fno-omit-frame-pointer RELWITHDEBINFO) + +add_flag("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" RELEASE) + +add_flag(-D_LARGEFILE64_SOURCE) + +option(USE_ASAN "enable AddressSanitizer (debugging) (using with +BUILD_LIBSPLITFS=ON is experimental)" OFF) +option(USE_UBSAN "enable UndefinedBehaviorSanitizer (debugging) (using with +BUILD_LIBSPLITFS=ON is experimental)" OFF) +set(ASAN_RUNTIME "" CACHE STRING "(experimental) path to preloadable lib for sanitizers e.g.: /usr/lib/gcc/x86_64-linux-gnu/6/libasan.so") + +macro(add_sanitizer_flag flag) + if(BUILD_LIBSPLITFS) + message(WARNING "Sanitizers might be incompatible with LIBSPLITFS. + Running tests with sanitizers and BUILD_LIBSPLITFS is experimental") + endif() + + set(SAVED_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} -fsanitize=${flag}") + + check_c_compiler_flag("-fsanitize=${flag}" C_HAS_ASAN_UBSAN) + if(C_HAS_ASAN_UBSAN) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${flag}") + endif() + + check_cxx_compiler_flag("-fsanitize=${flag}" CXX_HAS_ASAN_UBSAN) + if(CXX_HAS_ASAN_UBSAN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${flag}") + endif() + + if(C_HAS_ASAN_UBSAN OR CXX_HAS_ASAN_UBSAN) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${flag}") + endif() + + set(CMAKE_REQUIRED_LIBRARIES ${SAVED_CMAKE_REQUIRED_LIBRARIES}) +endmacro() + +if(USE_ASAN) + add_sanitizer_flag(address) +endif() +if(USE_UBSAN) + add_sanitizer_flag(undefined) +endif() + +if(DEVELOPER_MODE) + add_flag(-Werror) + + check_c_compiler_flag(-Wl,--fatal-warnings LINKER_HAS_FATAL_WARNINGS) + if(LINKER_HAS_FATAL_WARNINGS) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--fatal-warnings") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--fatal-warnings") + endif() +endif(DEVELOPER_MODE) + +# Generates cstyle-$name target and attaches it as a dependency of global +# "cstyle" target. This target verifies C style of files in current source dir. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_cstyle name) + if(${ARGC} EQUAL 1) + add_custom_target(cstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cstyle + ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.h) + else() + add_custom_target(cstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cstyle ${ARGN}) + endif() + add_dependencies(cstyle cstyle-${name}) +endfunction() + +# Generates cppstyle-$name and cppformat-$name targets and attaches them +# as dependencies of global "cstyle" and "cppformat" targets. +# cppstyle-$name target verifies C++ style of files in current source dir. +# cppformat-$name target reformats files in current source dir. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_cppstyle name) + if(NOT CLANG_FORMAT) + return() + endif() + + if(${ARGC} EQUAL 1) + add_custom_target(cppstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + check + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp + ) + add_custom_target(cppformat-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + format + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp + ) + else() + add_custom_target(cppstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + check + ${ARGN} + ) + add_custom_target(cppformat-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + format + ${ARGN} + ) + endif() + + add_dependencies(cppstyle cppstyle-${name}) + add_dependencies(cppformat cppformat-${name}) +endfunction() + +# Generates check-whitespace-$name target and attaches it as a dependency +# of global "check-whitespace" target. This target verifies C files in current +# source dir do not have any whitespace errors. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_check_whitespace name) + if(${ARGC} EQUAL 1) + add_custom_target(check-whitespace-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace + ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.h) + else() + add_custom_target(check-whitespace-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace ${ARGN}) + endif() + add_dependencies(check-whitespace check-whitespace-${name}) +endfunction() + +add_custom_target(checkers ALL) +add_custom_target(cstyle) +add_custom_target(cppstyle) +add_custom_target(cppformat) +add_custom_target(check-whitespace) + +add_custom_target(check-whitespace-main + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace) +add_dependencies(check-whitespace check-whitespace-main) + +add_custom_target(tests) + +option(DEVELOPER_MODE "enable developer checks" OFF) +if(DEVELOPER_MODE) + find_program(CLANG_FORMAT NAMES clang-format-3.9 clang-format-3.8) + if (NOT CLANG_FORMAT) + message(WARNING "clang-format not found - C++ sources will not be checked (needed version: 3.8 or 3.9)") + endif() + + execute_process(COMMAND ${PERL_EXECUTABLE} -MText::Diff -e "" + ERROR_QUIET + RESULT_VARIABLE PERL_TEXT_DIFF_STATUS) + if (PERL_TEXT_DIFF_STATUS) + message(FATAL_ERROR "Text::Diff Perl module not found (install libtext-diff-perl or perl-Text-Diff)") + endif() + + add_dependencies(checkers cstyle) + add_dependencies(checkers cppstyle) + add_dependencies(checkers check-whitespace) +endif(DEVELOPER_MODE) + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + +add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) + +if(PKG_CONFIG_FOUND) + pkg_check_modules(LIBUNWIND QUIET libunwind) +else() + find_package(LIBUNWIND QUIET) +endif() +if(NOT LIBUNWIND_FOUND) + message(WARNING "libunwind not found. Stack traces from tests will not be reliable") +endif() + +if(BUILD_LIBSPLITFS) + add_subdirectory(src) +endif() + diff --git a/splitfs_syscall_intercept/README.md b/splitfs_syscall_intercept/README.md new file mode 100644 index 0000000000..bf530819e3 --- /dev/null +++ b/splitfs_syscall_intercept/README.md @@ -0,0 +1,8 @@ +# SplitFS + +###How to use +1. At the root of the repo create a build directory: `mkdir build && cd build` +2. Do cmake to generate makefile: `cmake ../` # Include -DCMAKE_BUILD_TYPE=Debug if you want to enable logging. +3. Run make: `make` +4. You should see the .so file at `build/src/libsplitfs.so` +5. Run application using: `LD_PRELOAD=/build/src/libsplitfs.so ` diff --git a/splitfs_syscall_intercept/build/CMakeCache.txt b/splitfs_syscall_intercept/build/CMakeCache.txt new file mode 100644 index 0000000000..8fed23aff2 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeCache.txt @@ -0,0 +1,600 @@ +# This is the CMakeCache file. +# For build in directory: /home/om/wspace/splitfs-new/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//(experimental) path to preloadable lib for sanitizers e.g.: /usr/lib/gcc/x86_64-linux-gnu/6/libasan.so +ASAN_RUNTIME:STRING= + +//build libsplitfs (requires libsyscall_intercept) +BUILD_LIBSPLITFS:BOOL=ON + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING=Debug + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//user executables (bin) +CMAKE_INSTALL_BINDIR:PATH=bin + +//read-only architecture-independent data (DATAROOTDIR) +CMAKE_INSTALL_DATADIR:PATH= + +//read-only architecture-independent data root (share) +CMAKE_INSTALL_DATAROOTDIR:PATH=share + +//documentation root (DATAROOTDIR/doc/PROJECT_NAME) +CMAKE_INSTALL_DOCDIR:PATH= + +//C header files (include) +CMAKE_INSTALL_INCLUDEDIR:PATH=include + +//info documentation (DATAROOTDIR/info) +CMAKE_INSTALL_INFODIR:PATH= + +//object code libraries (lib) +CMAKE_INSTALL_LIBDIR:PATH=lib + +//program executables (libexec) +CMAKE_INSTALL_LIBEXECDIR:PATH=libexec + +//locale-dependent data (DATAROOTDIR/locale) +CMAKE_INSTALL_LOCALEDIR:PATH= + +//modifiable single-machine data (var) +CMAKE_INSTALL_LOCALSTATEDIR:PATH=var + +//man documentation (DATAROOTDIR/man) +CMAKE_INSTALL_MANDIR:PATH= + +//C header files for non-gcc (/usr/include) +CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//system admin executables (sbin) +CMAKE_INSTALL_SBINDIR:PATH=sbin + +//modifiable architecture-independent data (com) +CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com + +//read-only single-machine data (etc) +CMAKE_INSTALL_SYSCONFDIR:PATH=etc + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=splitfs + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//enable developer checks +DEVELOPER_MODE:BOOL=OFF + +//Path to a program. +PERL_EXECUTABLE:FILEPATH=/usr/bin/perl + +//pkg-config executable +PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/bin/pkg-config + +//enable AddressSanitizer (debugging) (using with +//\nBUILD_LIBSPLITFS=ON is experimental) +USE_ASAN:BOOL=OFF + +//enable UndefinedBehaviorSanitizer (debugging) (using with +//\nBUILD_LIBSPLITFS=ON is experimental) +USE_UBSAN:BOOL=OFF + +//Value Computed by CMake +splitfs_BINARY_DIR:STATIC=/home/om/wspace/splitfs-new/build + +//Value Computed by CMake +splitfs_SOURCE_DIR:STATIC=/home/om/wspace/splitfs-new + +//Dependencies for the target +splitfs_shared_LIB_DEPENDS:STATIC=general;syscall_intercept;general;cap;general;-lpthread;general;dl;general;rt;general;-Wl,--version-script=/home/om/wspace/splitfs-new/src/libsplitfs.map; + +//Dependencies for target +splitfs_static_unscoped_LIB_DEPENDS:STATIC= + + +######################## +# INTERNAL cache entries +######################## + +CAP_CFLAGS:INTERNAL= +CAP_CFLAGS_I:INTERNAL= +CAP_CFLAGS_OTHER:INTERNAL= +CAP_FOUND:INTERNAL=1 +CAP_INCLUDEDIR:INTERNAL=/usr/include +CAP_INCLUDE_DIRS:INTERNAL= +CAP_LDFLAGS:INTERNAL=-L/lib64;-lcap +CAP_LDFLAGS_OTHER:INTERNAL= +CAP_LIBDIR:INTERNAL=/lib64 +CAP_LIBRARIES:INTERNAL=cap +CAP_LIBRARY_DIRS:INTERNAL=/lib64 +CAP_LIBS:INTERNAL= +CAP_LIBS_L:INTERNAL= +CAP_LIBS_OTHER:INTERNAL= +CAP_LIBS_PATHS:INTERNAL= +CAP_PREFIX:INTERNAL=/usr +CAP_STATIC_CFLAGS:INTERNAL= +CAP_STATIC_CFLAGS_I:INTERNAL= +CAP_STATIC_CFLAGS_OTHER:INTERNAL= +CAP_STATIC_INCLUDE_DIRS:INTERNAL= +CAP_STATIC_LDFLAGS:INTERNAL=-L/lib64;-lcap;-lattr +CAP_STATIC_LDFLAGS_OTHER:INTERNAL= +CAP_STATIC_LIBDIR:INTERNAL= +CAP_STATIC_LIBRARIES:INTERNAL=cap;attr +CAP_STATIC_LIBRARY_DIRS:INTERNAL=/lib64 +CAP_STATIC_LIBS:INTERNAL= +CAP_STATIC_LIBS_L:INTERNAL= +CAP_STATIC_LIBS_OTHER:INTERNAL= +CAP_STATIC_LIBS_PATHS:INTERNAL= +CAP_VERSION:INTERNAL=2.24 +CAP_libcap_INCLUDEDIR:INTERNAL= +CAP_libcap_LIBDIR:INTERNAL= +CAP_libcap_PREFIX:INTERNAL= +CAP_libcap_VERSION:INTERNAL= +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/om/wspace/splitfs-new/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=5 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Have symbol pthread_create +CMAKE_HAVE_LIBC_CREATE:INTERNAL= +//Have library pthreads +CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= +//Have library pthread +CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 +//Have include pthread.h +CMAKE_HAVE_PTHREAD_H:INTERNAL=1 +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/om/wspace/splitfs-new +//ADVANCED property for variable: CMAKE_INSTALL_BINDIR +CMAKE_INSTALL_BINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATADIR +CMAKE_INSTALL_DATADIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATAROOTDIR +CMAKE_INSTALL_DATAROOTDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DOCDIR +CMAKE_INSTALL_DOCDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INCLUDEDIR +CMAKE_INSTALL_INCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INFODIR +CMAKE_INSTALL_INFODIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBDIR +CMAKE_INSTALL_LIBDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBEXECDIR +CMAKE_INSTALL_LIBEXECDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALEDIR +CMAKE_INSTALL_LOCALEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALSTATEDIR +CMAKE_INSTALL_LOCALSTATEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_MANDIR +CMAKE_INSTALL_MANDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_OLDINCLUDEDIR +CMAKE_INSTALL_OLDINCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SBINDIR +CMAKE_INSTALL_SBINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SHAREDSTATEDIR +CMAKE_INSTALL_SHAREDSTATEDIR-ADVANCED:INTERNAL=1 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SYSCONFDIR +CMAKE_INSTALL_SYSCONFDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=2 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.5 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Test CXX_HAS__DDEBUG +CXX_HAS__DDEBUG:INTERNAL=1 +//Test CXX_HAS__D_LARGEFILE64_SOURCE +CXX_HAS__D_LARGEFILE64_SOURCE:INTERNAL=1 +//Test CXX_HAS__Ofast +CXX_HAS__Ofast:INTERNAL=1 +//Test CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 +CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2:INTERNAL=1 +//Test CXX_HAS__Wall +CXX_HAS__Wall:INTERNAL=1 +//Test CXX_HAS__Wconversion +CXX_HAS__Wconversion:INTERNAL=1 +//Test CXX_HAS__Wmissing_variable_declarations +CXX_HAS__Wmissing_variable_declarations:INTERNAL= +//Test CXX_HAS__Wpointer_arith +CXX_HAS__Wpointer_arith:INTERNAL=1 +//Test CXX_HAS__Wsign_compare +CXX_HAS__Wsign_compare:INTERNAL=1 +//Test CXX_HAS__Wsign_conversion +CXX_HAS__Wsign_conversion:INTERNAL=1 +//Test CXX_HAS__Wunreachable_code_return +CXX_HAS__Wunreachable_code_return:INTERNAL= +//Test CXX_HAS__Wunused_macros +CXX_HAS__Wunused_macros:INTERNAL=1 +//Test CXX_HAS__fno_common +CXX_HAS__fno_common:INTERNAL=1 +//Test CXX_HAS__fno_omit_frame_pointer +CXX_HAS__fno_omit_frame_pointer:INTERNAL=1 +//Test CXX_HAS__ftree_vectorize +CXX_HAS__ftree_vectorize:INTERNAL=1 +//Test CXX_HAS__funroll_loops +CXX_HAS__funroll_loops:INTERNAL=1 +//Test CXX_HAS__ggdb +CXX_HAS__ggdb:INTERNAL=1 +//Test CXX_HAS__m64 +CXX_HAS__m64:INTERNAL=1 +//Test C_HAS__DDEBUG +C_HAS__DDEBUG:INTERNAL=1 +//Test C_HAS__D_LARGEFILE64_SOURCE +C_HAS__D_LARGEFILE64_SOURCE:INTERNAL=1 +//Test C_HAS__Ofast +C_HAS__Ofast:INTERNAL=1 +//Test C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 +C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2:INTERNAL=1 +//Test C_HAS__Wall +C_HAS__Wall:INTERNAL=1 +//Test C_HAS__Wconversion +C_HAS__Wconversion:INTERNAL=1 +//Test C_HAS__Wmissing_prototypes +C_HAS__Wmissing_prototypes:INTERNAL=1 +//Test C_HAS__Wmissing_variable_declarations +C_HAS__Wmissing_variable_declarations:INTERNAL= +//Test C_HAS__Wpointer_arith +C_HAS__Wpointer_arith:INTERNAL=1 +//Test C_HAS__Wsign_compare +C_HAS__Wsign_compare:INTERNAL=1 +//Test C_HAS__Wsign_conversion +C_HAS__Wsign_conversion:INTERNAL=1 +//Test C_HAS__Wunreachable_code_return +C_HAS__Wunreachable_code_return:INTERNAL= +//Test C_HAS__Wunused_macros +C_HAS__Wunused_macros:INTERNAL=1 +//Test C_HAS__fno_common +C_HAS__fno_common:INTERNAL=1 +//Test C_HAS__fno_omit_frame_pointer +C_HAS__fno_omit_frame_pointer:INTERNAL=1 +//Test C_HAS__ftree_vectorize +C_HAS__ftree_vectorize:INTERNAL=1 +//Test C_HAS__funroll_loops +C_HAS__funroll_loops:INTERNAL=1 +//Test C_HAS__ggdb +C_HAS__ggdb:INTERNAL=1 +//Test C_HAS__m64 +C_HAS__m64:INTERNAL=1 +//Details about finding Perl +FIND_PACKAGE_MESSAGE_DETAILS_Perl:INTERNAL=[/usr/bin/perl][v5.22.1()] +//Details about finding Threads +FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] +LIBUNWIND_CFLAGS:INTERNAL= +LIBUNWIND_CFLAGS_I:INTERNAL= +LIBUNWIND_CFLAGS_OTHER:INTERNAL= +LIBUNWIND_FOUND:INTERNAL= +LIBUNWIND_INCLUDEDIR:INTERNAL= +LIBUNWIND_LIBDIR:INTERNAL= +LIBUNWIND_LIBS:INTERNAL= +LIBUNWIND_LIBS_L:INTERNAL= +LIBUNWIND_LIBS_OTHER:INTERNAL= +LIBUNWIND_LIBS_PATHS:INTERNAL= +LIBUNWIND_PREFIX:INTERNAL= +LIBUNWIND_STATIC_CFLAGS:INTERNAL= +LIBUNWIND_STATIC_CFLAGS_I:INTERNAL= +LIBUNWIND_STATIC_CFLAGS_OTHER:INTERNAL= +LIBUNWIND_STATIC_LIBDIR:INTERNAL= +LIBUNWIND_STATIC_LIBS:INTERNAL= +LIBUNWIND_STATIC_LIBS_L:INTERNAL= +LIBUNWIND_STATIC_LIBS_OTHER:INTERNAL= +LIBUNWIND_STATIC_LIBS_PATHS:INTERNAL= +LIBUNWIND_VERSION:INTERNAL= +LIBUNWIND_libunwind_INCLUDEDIR:INTERNAL= +LIBUNWIND_libunwind_LIBDIR:INTERNAL= +LIBUNWIND_libunwind_PREFIX:INTERNAL= +LIBUNWIND_libunwind_VERSION:INTERNAL= +//Test LINKER_HAS_RELRO +LINKER_HAS_RELRO:INTERNAL=1 +//Test LINKER_HAS_WARN_COMMON +LINKER_HAS_WARN_COMMON:INTERNAL=1 +//ADVANCED property for variable: PERL_EXECUTABLE +PERL_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE +PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 +SYSCALL_INTERCEPT_CFLAGS:INTERNAL=-I/usr/include/capstone +SYSCALL_INTERCEPT_CFLAGS_I:INTERNAL= +SYSCALL_INTERCEPT_CFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_FOUND:INTERNAL=1 +SYSCALL_INTERCEPT_INCLUDEDIR:INTERNAL=/usr/include +SYSCALL_INTERCEPT_INCLUDE_DIRS:INTERNAL=/usr/include/capstone +SYSCALL_INTERCEPT_LDFLAGS:INTERNAL=-lsyscall_intercept +SYSCALL_INTERCEPT_LDFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_LIBDIR:INTERNAL=/usr/lib/x86_64-linux-gnu +SYSCALL_INTERCEPT_LIBRARIES:INTERNAL=syscall_intercept +SYSCALL_INTERCEPT_LIBRARY_DIRS:INTERNAL= +SYSCALL_INTERCEPT_LIBS:INTERNAL= +SYSCALL_INTERCEPT_LIBS_L:INTERNAL= +SYSCALL_INTERCEPT_LIBS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_LIBS_PATHS:INTERNAL= +SYSCALL_INTERCEPT_PREFIX:INTERNAL=/usr +SYSCALL_INTERCEPT_STATIC_CFLAGS:INTERNAL=-I/usr/include/capstone +SYSCALL_INTERCEPT_STATIC_CFLAGS_I:INTERNAL= +SYSCALL_INTERCEPT_STATIC_CFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_INCLUDE_DIRS:INTERNAL=/usr/include/capstone +SYSCALL_INTERCEPT_STATIC_LDFLAGS:INTERNAL=-lsyscall_intercept;-ldl;-lcapstone +SYSCALL_INTERCEPT_STATIC_LDFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBDIR:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBRARIES:INTERNAL=syscall_intercept;dl;capstone +SYSCALL_INTERCEPT_STATIC_LIBRARY_DIRS:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_L:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_PATHS:INTERNAL= +SYSCALL_INTERCEPT_VERSION:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_INCLUDEDIR:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_LIBDIR:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_PREFIX:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_VERSION:INTERNAL= +//CMAKE_INSTALL_PREFIX during last run +_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/usr/local +__pkg_config_checked_CAP:INTERNAL=1 +__pkg_config_checked_LIBUNWIND:INTERNAL=1 +__pkg_config_checked_SYSCALL_INTERCEPT:INTERNAL=1 +prefix_result:INTERNAL=/lib64 + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake new file mode 100644 index 0000000000..f40522e627 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake @@ -0,0 +1,67 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "5.4.0") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake new file mode 100644 index 0000000000..013ee9298f --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake @@ -0,0 +1,68 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "5.4.0") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..4e87d56e36ad8f7c9cc3768c49b5acfa7236baa5 GIT binary patch literal 8640 zcmeHNeQXrR6`#BF$2o@cL4cT#mQ4$-q4MVJ8pnWI_I$Qk6WdT@)3nsA&%U#L2NSgPWDZP+DM7UA?pg+C0rF)11n=1 zTh5lT5|7v=;Md@^fCi_=GbEQ;Fw|frY9UIjFPAitwd9Ls zmP(Q_g#*aLwt78W1=-6pBo)z)Dj|u7D)OoXuS)PpPKbt)r2b*w@Yf~$bvZTAP}fkf zCVtIHw8gaLiW$QEkZ?5Q)({5Wl672Tj3n{C1w3r$r%hgA*eU9})3{8D{*e?admtL= ztFLo3rjm<*z<;dHnBhUVgc@@8XTOzW?yDolpMwvEv7Bdgd&6=jCIS#mBDw<$ZBC zfh?tJ&=m(e`*GUUGsD2Vku-w| z(-;m$VubW3Q^r6f7GXwfSGy4kC&Gh~q!~_hwFjc{Shy?L7Y(yWY#?qVBYVQ}0V6bG zCYTWp1fFrmi-?-bNFXH7syI2iNIsxWEU+LY`UVC=kWQ# zXN*#%m`C`mQ9W3uk6m}`&lJB|rZD~KakF^xYaBe|K8>Y}W!9X6qRh%OaIILbK@RmH zEV_Cr18L<8pbs2G08`D4*7W%udiouG?4MIxx?0bU;|$Qxp2P{LpFNB7XYvog`*5IQ zc@tyD9)yN<>(w~l^s#A=p1!hc=`r+#&6(G80t+&i!1yTySsa2c|KQ); z!O0mHIMCBm`pL-+y5kM~{EWFU>#dx;RV)WTR{eXwQ3ma2sd?Q%oQy%kdfq6$K@==KK=N0J)OFAw)r-;^O@%B`k{*7@5Omu z@%p%<`8FXB=OMSD8QHGz@$i4!zs;Y{_`CgGZ3k9%lqk@-1Jx+Ewx(~jrZ2Ruy29_- z$xmF98)h;Y{plN~Qge~Uqb>bjTl!WLc*rbxTOT{^(AQo|y{C_zac}SOf6w3J-{Ch- zAIw$y0o-Tq4=nJOI|^n8W33%6o7d$%Hrss-J=i~v2m2!1VSj;uW2tLBzO#zq_tqzw z%wCXgXx|35Xey|4})Zl9`EzcMo;B)u4a#Nps3MP^=z^3@$DFx;J9f7+e@c$SA4c@<)6d}0+7qJ{?M+!B!_kryJCR&5Zp57z4AHsB>C78QJ<2k~oiY=YmO?*6?U?Lrs zdETE1VGpl3uG6?q3H^vDx7h#tE1hHInzo64%J{}WV4YIc-It1)DP@gXr~0bvQ(UWg zqNZN;)u}bLtE>X0)>l*StM{#yeaN~CW>tezlVP|=&g^+Pzt9CGrmcNZcD@wa7iZ^5 zAzqT5Plb3Xv%3#2n4NV03hm1n&4WVxp6q-n#Aly}u-wJwz`<6_H|2R3o6CA_@!a_= zpX6dT=Oi$2<(>Zu?dN6V3x)W6b{KY}a&obIv+=y@*07c$%?%gMzSL0rWS zzb|`E$>+H6X%f$CAwK(jjO8wybE<{YYLxSW&tVa}naLqm4%ayctR8avaeZ^b`S`GO zU(hq+mn2*jxV)}5asRpVG_40)IX-(l_Xt0xA!tUZD68+ z$eqUF6xcW*B5<%wL-TB!fSldrI^iLD-8b+1R$Z(cfllZfV)t z++}q68{3+(Y92@XoKZ6=7N=?X;jGUSRLhH}SwX(f6jWnsa`&(q>;q{gEICBENDP94 zBTS9O&9Dl0r`ik-3T-f!Qu|U72zN(9Ohs)dm>gniXm ziEuQC1d$twnoQ+!LKU*=U>sC4JPKDHt5g$l9)DEBLt;`5g}@1E7S)s;0Q{#+70_f#h?)*Xf zd;zl#$lzIn_|r}eG(4AZ!On>eW4sl!#D_NyPut+?f*qVY0K@D;A*F8I9( z6Ui4LpU>|V{9eJQ_Hq(jWc{ZSpWde;C{Q-Xh}DIYIf9{C@!#Z#D7hJVf7{C&c|1(;+*5=sp~h z>Zk8J)7U9Ua(hW9`99d>w?BKn5)~-uBrg$<Kib6@{bW^^GzhT?ee{PZGE%*NjmM+)-Uu%1oAOHXW literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..02597532eff5f5e939c78f5e7765bf1f4388740a GIT binary patch literal 8656 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 Y!jHxy-1BeRcI}^AY>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if !defined(__STDC_VERSION__) + "90" +#elif __STDC_VERSION__ >= 201000L + "11" +#elif __STDC_VERSION__ >= 199901L + "99" +#else +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdC/a.out b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0abd21ce8dad9af37207bc298c44d2eb9b0d82f7 GIT binary patch literal 8800 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if __cplusplus >= 201402L + "14" +#elif __cplusplus >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out b/splitfs_syscall_intercept/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..e52b547670e5014917a116b7273fbb1d63c20394 GIT binary patch literal 8808 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/build/CMakeFiles/CMakeDirectoryInformation.cmake b/splitfs_syscall_intercept/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..7d0be58f5c --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/om/wspace/splitfs-new") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/om/wspace/splitfs-new/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/splitfs_syscall_intercept/build/CMakeFiles/CMakeError.log b/splitfs_syscall_intercept/build/CMakeFiles/CMakeError.log new file mode 100644 index 0000000000..776dbfd98f --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/CMakeError.log @@ -0,0 +1,123 @@ +Determining if the pthread_create exist failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b10d4/fast" +/usr/bin/make -f CMakeFiles/cmTC_b10d4.dir/build.make CMakeFiles/cmTC_b10d4.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o +/usr/bin/cc -o CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c +Linking C executable cmTC_b10d4 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b10d4.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o -o cmTC_b10d4 -rdynamic +CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o: In function `main': +CheckSymbolExists.c:(.text+0x16): undefined reference to `pthread_create' +collect2: error: ld returned 1 exit status +CMakeFiles/cmTC_b10d4.dir/build.make:97: recipe for target 'cmTC_b10d4' failed +make[1]: *** [cmTC_b10d4] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_b10d4/fast' failed +make: *** [cmTC_b10d4/fast] Error 2 + +File /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c: +/* */ +#include + +int main(int argc, char** argv) +{ + (void)argv; +#ifndef pthread_create + return ((int*)(&pthread_create))[argc]; +#else + (void)argc; + return 0; +#endif +} + +Determining if the function pthread_create exists in the pthreads failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_416c8/fast" +/usr/bin/make -f CMakeFiles/cmTC_416c8.dir/build.make CMakeFiles/cmTC_416c8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.5/Modules/CheckFunctionExists.c +Linking C executable cmTC_416c8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_416c8.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o -o cmTC_416c8 -rdynamic -lpthreads +/usr/bin/ld: cannot find -lpthreads +collect2: error: ld returned 1 exit status +CMakeFiles/cmTC_416c8.dir/build.make:97: recipe for target 'cmTC_416c8' failed +make[1]: *** [cmTC_416c8] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_416c8/fast' failed +make: *** [cmTC_416c8/fast] Error 2 + + +Performing C SOURCE FILE Test C_HAS__Wunreachable_code_return failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_04959/fast" +/usr/bin/make -f CMakeFiles/cmTC_04959.dir/build.make CMakeFiles/cmTC_04959.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_04959.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__Wunreachable_code_return -Wunreachable-code-return -o CMakeFiles/cmTC_04959.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +cc: error: unrecognized command line option '-Wunreachable-code-return' +CMakeFiles/cmTC_04959.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_04959.dir/src.c.o' failed +make[1]: *** [CMakeFiles/cmTC_04959.dir/src.c.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_04959/fast' failed +make: *** [cmTC_04959/fast] Error 2 + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wunreachable_code_return failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5bccb/fast" +/usr/bin/make -f CMakeFiles/cmTC_5bccb.dir/build.make CMakeFiles/cmTC_5bccb.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_5bccb.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__Wunreachable_code_return -Wunreachable-code-return -o CMakeFiles/cmTC_5bccb.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +c++: error: unrecognized command line option '-Wunreachable-code-return' +CMakeFiles/cmTC_5bccb.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_5bccb.dir/src.cxx.o' failed +make[1]: *** [CMakeFiles/cmTC_5bccb.dir/src.cxx.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_5bccb/fast' failed +make: *** [cmTC_5bccb/fast] Error 2 + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wmissing_variable_declarations failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_14f93/fast" +/usr/bin/make -f CMakeFiles/cmTC_14f93.dir/build.make CMakeFiles/cmTC_14f93.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_14f93.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__Wmissing_variable_declarations -Wmissing-variable-declarations -o CMakeFiles/cmTC_14f93.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +cc: error: unrecognized command line option '-Wmissing-variable-declarations' +CMakeFiles/cmTC_14f93.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_14f93.dir/src.c.o' failed +make[1]: *** [CMakeFiles/cmTC_14f93.dir/src.c.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_14f93/fast' failed +make: *** [cmTC_14f93/fast] Error 2 + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wmissing_variable_declarations failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e6654/fast" +/usr/bin/make -f CMakeFiles/cmTC_e6654.dir/build.make CMakeFiles/cmTC_e6654.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e6654.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__Wmissing_variable_declarations -Wmissing-variable-declarations -o CMakeFiles/cmTC_e6654.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +c++: error: unrecognized command line option '-Wmissing-variable-declarations' +CMakeFiles/cmTC_e6654.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_e6654.dir/src.cxx.o' failed +make[1]: *** [CMakeFiles/cmTC_e6654.dir/src.cxx.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_e6654/fast' failed +make: *** [cmTC_e6654/fast] Error 2 + +Source file was: +int main() { return 0; } diff --git a/splitfs_syscall_intercept/build/CMakeFiles/CMakeOutput.log b/splitfs_syscall_intercept/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000000..0f91e104c1 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,1107 @@ +The system is: Linux - 4.13.0 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/om/wspace/splitfs-new/build/CMakeFiles/3.5.1/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/om/wspace/splitfs-new/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_fdac6/fast" +/usr/bin/make -f CMakeFiles/cmTC_fdac6.dir/build.make CMakeFiles/cmTC_fdac6.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_fdac6 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_fdac6.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o -o cmTC_fdac6 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4e298/fast" +/usr/bin/make -f CMakeFiles/cmTC_4e298.dir/build.make CMakeFiles/cmTC_4e298.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c +Linking C executable cmTC_4e298 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4e298.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -o cmTC_4e298 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4e298' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cca8gFNB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_4e298 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_4e298/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_4e298.dir/build.make CMakeFiles/cmTC_4e298.dir/build] + ignore line: [make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp'] + ignore line: [Building C object CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTC_4e298] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4e298.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -o cmTC_4e298 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4e298' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cca8gFNB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_4e298 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cca8gFNB.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_4e298] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] + arg [CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5] ==> [/usr/lib/gcc/x86_64-linux-gnu/5] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting C [-std=c11] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_f907f/fast" +/usr/bin/make -f CMakeFiles/cmTC_f907f.dir/build.make CMakeFiles/cmTC_f907f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_f907f.dir/feature_tests.c.o +/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_f907f.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_f907f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f907f.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_f907f.dir/feature_tests.c.o -o cmTC_f907f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:1c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c99] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b6c88/fast" +/usr/bin/make -f CMakeFiles/cmTC_b6c88.dir/build.make CMakeFiles/cmTC_b6c88.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o +/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_b6c88 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b6c88.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o -o cmTC_b6c88 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c90] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5afbe/fast" +/usr/bin/make -f CMakeFiles/cmTC_5afbe.dir/build.make CMakeFiles/cmTC_5afbe.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o +/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_5afbe +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_5afbe.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o -o cmTC_5afbe -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:0c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:0c_variadic_macros +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_6009c/fast" +/usr/bin/make -f CMakeFiles/cmTC_6009c.dir/build.make CMakeFiles/cmTC_6009c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_6009c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_6009c.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o -o cmTC_6009c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b06ef/fast" +/usr/bin/make -f CMakeFiles/cmTC_b06ef.dir/build.make CMakeFiles/cmTC_b06ef.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_b06ef +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b06ef.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b06ef -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_b06ef' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjmNSb6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_b06ef /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_b06ef/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_b06ef.dir/build.make CMakeFiles/cmTC_b06ef.dir/build] + ignore line: [make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_b06ef] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b06ef.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b06ef -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_b06ef' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjmNSb6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_b06ef /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccjmNSb6.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b06ef] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] + arg [CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5] ==> [/usr/lib/gcc/x86_64-linux-gnu/5] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_cb8f3/fast" +/usr/bin/make -f CMakeFiles/cmTC_cb8f3.dir/build.make CMakeFiles/cmTC_cb8f3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_cb8f3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_cb8f3.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o -o cmTC_cb8f3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_8c779/fast" +/usr/bin/make -f CMakeFiles/cmTC_8c779.dir/build.make CMakeFiles/cmTC_8c779.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_8c779 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8c779.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o -o cmTC_8c779 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e2019/fast" +/usr/bin/make -f CMakeFiles/cmTC_e2019.dir/build.make CMakeFiles/cmTC_e2019.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_e2019 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e2019.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o -o cmTC_e2019 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates +Determining if the include file pthread.h exists passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_1cf57/fast" +/usr/bin/make -f CMakeFiles/cmTC_1cf57.dir/build.make CMakeFiles/cmTC_1cf57.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o +/usr/bin/cc -o CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckIncludeFile.c +Linking C executable cmTC_1cf57 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1cf57.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o -o cmTC_1cf57 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Determining if the function pthread_create exists in the pthread passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e17af/fast" +/usr/bin/make -f CMakeFiles/cmTC_e17af.dir/build.make CMakeFiles/cmTC_e17af.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.5/Modules/CheckFunctionExists.c +Linking C executable cmTC_e17af +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e17af.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o -o cmTC_e17af -rdynamic -lpthread +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Performing C SOURCE FILE Test C_HAS__Wall succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d3373/fast" +/usr/bin/make -f CMakeFiles/cmTC_d3373.dir/build.make CMakeFiles/cmTC_d3373.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d3373.dir/src.c.o +/usr/bin/cc -DC_HAS__Wall -Wall -o CMakeFiles/cmTC_d3373.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d3373 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d3373.dir/link.txt --verbose=1 +/usr/bin/cc -DC_HAS__Wall CMakeFiles/cmTC_d3373.dir/src.c.o -o cmTC_d3373 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wall succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_07142/fast" +/usr/bin/make -f CMakeFiles/cmTC_07142.dir/build.make CMakeFiles/cmTC_07142.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_07142.dir/src.cxx.o +/usr/bin/c++ -DCXX_HAS__Wall -Wall -o CMakeFiles/cmTC_07142.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_07142 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_07142.dir/link.txt --verbose=1 +/usr/bin/c++ -DCXX_HAS__Wall CMakeFiles/cmTC_07142.dir/src.cxx.o -o cmTC_07142 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wpointer_arith succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d74b8/fast" +/usr/bin/make -f CMakeFiles/cmTC_d74b8.dir/build.make CMakeFiles/cmTC_d74b8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d74b8.dir/src.c.o +/usr/bin/cc -Wall -DC_HAS__Wpointer_arith -Wpointer-arith -o CMakeFiles/cmTC_d74b8.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d74b8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d74b8.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -DC_HAS__Wpointer_arith CMakeFiles/cmTC_d74b8.dir/src.c.o -o cmTC_d74b8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wpointer_arith succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_091e2/fast" +/usr/bin/make -f CMakeFiles/cmTC_091e2.dir/build.make CMakeFiles/cmTC_091e2.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_091e2.dir/src.cxx.o +/usr/bin/c++ -Wall -DCXX_HAS__Wpointer_arith -Wpointer-arith -o CMakeFiles/cmTC_091e2.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_091e2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_091e2.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -DCXX_HAS__Wpointer_arith CMakeFiles/cmTC_091e2.dir/src.cxx.o -o cmTC_091e2 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wunused_macros succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_c8936/fast" +/usr/bin/make -f CMakeFiles/cmTC_c8936.dir/build.make CMakeFiles/cmTC_c8936.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_c8936.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -DC_HAS__Wunused_macros -Wunused-macros -o CMakeFiles/cmTC_c8936.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_c8936 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c8936.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -DC_HAS__Wunused_macros CMakeFiles/cmTC_c8936.dir/src.c.o -o cmTC_c8936 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wunused_macros succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4c1dd/fast" +/usr/bin/make -f CMakeFiles/cmTC_4c1dd.dir/build.make CMakeFiles/cmTC_4c1dd.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_4c1dd.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -DCXX_HAS__Wunused_macros -Wunused-macros -o CMakeFiles/cmTC_4c1dd.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_4c1dd +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4c1dd.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -DCXX_HAS__Wunused_macros CMakeFiles/cmTC_4c1dd.dir/src.cxx.o -o cmTC_4c1dd -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wsign_conversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_a23f0/fast" +/usr/bin/make -f CMakeFiles/cmTC_a23f0.dir/build.make CMakeFiles/cmTC_a23f0.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_a23f0.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -DC_HAS__Wsign_conversion -Wsign-conversion -o CMakeFiles/cmTC_a23f0.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_a23f0 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a23f0.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -DC_HAS__Wsign_conversion CMakeFiles/cmTC_a23f0.dir/src.c.o -o cmTC_a23f0 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wsign_conversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_2db3f/fast" +/usr/bin/make -f CMakeFiles/cmTC_2db3f.dir/build.make CMakeFiles/cmTC_2db3f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_2db3f.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -DCXX_HAS__Wsign_conversion -Wsign-conversion -o CMakeFiles/cmTC_2db3f.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_2db3f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2db3f.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -DCXX_HAS__Wsign_conversion CMakeFiles/cmTC_2db3f.dir/src.cxx.o -o cmTC_2db3f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wsign_compare succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ffab1/fast" +/usr/bin/make -f CMakeFiles/cmTC_ffab1.dir/build.make CMakeFiles/cmTC_ffab1.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_ffab1.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DC_HAS__Wsign_compare -Wsign-compare -o CMakeFiles/cmTC_ffab1.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_ffab1 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ffab1.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DC_HAS__Wsign_compare CMakeFiles/cmTC_ffab1.dir/src.c.o -o cmTC_ffab1 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wsign_compare succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_8405c/fast" +/usr/bin/make -f CMakeFiles/cmTC_8405c.dir/build.make CMakeFiles/cmTC_8405c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_8405c.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DCXX_HAS__Wsign_compare -Wsign-compare -o CMakeFiles/cmTC_8405c.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_8405c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8405c.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DCXX_HAS__Wsign_compare CMakeFiles/cmTC_8405c.dir/src.cxx.o -o cmTC_8405c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wconversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d1eb7/fast" +/usr/bin/make -f CMakeFiles/cmTC_d1eb7.dir/build.make CMakeFiles/cmTC_d1eb7.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d1eb7.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DC_HAS__Wconversion -Wconversion -o CMakeFiles/cmTC_d1eb7.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d1eb7 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d1eb7.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DC_HAS__Wconversion CMakeFiles/cmTC_d1eb7.dir/src.c.o -o cmTC_d1eb7 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wconversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_116b3/fast" +/usr/bin/make -f CMakeFiles/cmTC_116b3.dir/build.make CMakeFiles/cmTC_116b3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_116b3.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DCXX_HAS__Wconversion -Wconversion -o CMakeFiles/cmTC_116b3.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_116b3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_116b3.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DCXX_HAS__Wconversion CMakeFiles/cmTC_116b3.dir/src.cxx.o -o cmTC_116b3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__fno_common succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5637f/fast" +/usr/bin/make -f CMakeFiles/cmTC_5637f.dir/build.make CMakeFiles/cmTC_5637f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_5637f.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__fno_common -fno-common -o CMakeFiles/cmTC_5637f.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_5637f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_5637f.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__fno_common CMakeFiles/cmTC_5637f.dir/src.c.o -o cmTC_5637f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__fno_common succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_886ed/fast" +/usr/bin/make -f CMakeFiles/cmTC_886ed.dir/build.make CMakeFiles/cmTC_886ed.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_886ed.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__fno_common -fno-common -o CMakeFiles/cmTC_886ed.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_886ed +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_886ed.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__fno_common CMakeFiles/cmTC_886ed.dir/src.cxx.o -o cmTC_886ed -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Ofast succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_69761/fast" +/usr/bin/make -f CMakeFiles/cmTC_69761.dir/build.make CMakeFiles/cmTC_69761.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_69761.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DC_HAS__Ofast -Ofast -o CMakeFiles/cmTC_69761.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_69761 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_69761.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DC_HAS__Ofast CMakeFiles/cmTC_69761.dir/src.c.o -o cmTC_69761 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Ofast succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e879c/fast" +/usr/bin/make -f CMakeFiles/cmTC_e879c.dir/build.make CMakeFiles/cmTC_e879c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e879c.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DCXX_HAS__Ofast -Ofast -o CMakeFiles/cmTC_e879c.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_e879c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e879c.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DCXX_HAS__Ofast CMakeFiles/cmTC_e879c.dir/src.cxx.o -o cmTC_e879c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__funroll_loops succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3acd4/fast" +/usr/bin/make -f CMakeFiles/cmTC_3acd4.dir/build.make CMakeFiles/cmTC_3acd4.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3acd4.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DC_HAS__funroll_loops -funroll-loops -o CMakeFiles/cmTC_3acd4.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3acd4 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3acd4.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DC_HAS__funroll_loops CMakeFiles/cmTC_3acd4.dir/src.c.o -o cmTC_3acd4 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__funroll_loops succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_66ac3/fast" +/usr/bin/make -f CMakeFiles/cmTC_66ac3.dir/build.make CMakeFiles/cmTC_66ac3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_66ac3.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DCXX_HAS__funroll_loops -funroll-loops -o CMakeFiles/cmTC_66ac3.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_66ac3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_66ac3.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DCXX_HAS__funroll_loops CMakeFiles/cmTC_66ac3.dir/src.cxx.o -o cmTC_66ac3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__ftree_vectorize succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_78641/fast" +/usr/bin/make -f CMakeFiles/cmTC_78641.dir/build.make CMakeFiles/cmTC_78641.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_78641.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DC_HAS__ftree_vectorize -ftree-vectorize -o CMakeFiles/cmTC_78641.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_78641 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_78641.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DC_HAS__ftree_vectorize CMakeFiles/cmTC_78641.dir/src.c.o -o cmTC_78641 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__ftree_vectorize succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_bde70/fast" +/usr/bin/make -f CMakeFiles/cmTC_bde70.dir/build.make CMakeFiles/cmTC_bde70.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_bde70.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DCXX_HAS__ftree_vectorize -ftree-vectorize -o CMakeFiles/cmTC_bde70.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_bde70 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_bde70.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DCXX_HAS__ftree_vectorize CMakeFiles/cmTC_bde70.dir/src.cxx.o -o cmTC_bde70 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__m64 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_66318/fast" +/usr/bin/make -f CMakeFiles/cmTC_66318.dir/build.make CMakeFiles/cmTC_66318.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_66318.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DC_HAS__m64 -m64 -o CMakeFiles/cmTC_66318.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_66318 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_66318.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DC_HAS__m64 CMakeFiles/cmTC_66318.dir/src.c.o -o cmTC_66318 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__m64 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_465a7/fast" +/usr/bin/make -f CMakeFiles/cmTC_465a7.dir/build.make CMakeFiles/cmTC_465a7.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_465a7.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DCXX_HAS__m64 -m64 -o CMakeFiles/cmTC_465a7.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_465a7 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_465a7.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DCXX_HAS__m64 CMakeFiles/cmTC_465a7.dir/src.cxx.o -o cmTC_465a7 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wmissing_prototypes succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_172d2/fast" +/usr/bin/make -f CMakeFiles/cmTC_172d2.dir/build.make CMakeFiles/cmTC_172d2.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_172d2.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DC_HAS__Wmissing_prototypes -Wmissing-prototypes -o CMakeFiles/cmTC_172d2.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_172d2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_172d2.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DC_HAS__Wmissing_prototypes CMakeFiles/cmTC_172d2.dir/src.c.o -o cmTC_172d2 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test LINKER_HAS_RELRO succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ed1d5/fast" +/usr/bin/make -f CMakeFiles/cmTC_ed1d5.dir/build.make CMakeFiles/cmTC_ed1d5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_ed1d5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_RELRO -Wl,-z,relro -o CMakeFiles/cmTC_ed1d5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_ed1d5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ed1d5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_RELRO CMakeFiles/cmTC_ed1d5.dir/src.c.o -o cmTC_ed1d5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test LINKER_HAS_WARN_COMMON succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3aab5/fast" +/usr/bin/make -f CMakeFiles/cmTC_3aab5.dir/build.make CMakeFiles/cmTC_3aab5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3aab5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_WARN_COMMON -Wl,--warn-common -o CMakeFiles/cmTC_3aab5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3aab5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3aab5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_WARN_COMMON -Wl,-z,relro CMakeFiles/cmTC_3aab5.dir/src.c.o -o cmTC_3aab5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test C_HAS__ggdb succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3d5c8/fast" +/usr/bin/make -f CMakeFiles/cmTC_3d5c8.dir/build.make CMakeFiles/cmTC_3d5c8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3d5c8.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__ggdb -ggdb -o CMakeFiles/cmTC_3d5c8.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3d5c8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3d5c8.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__ggdb -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_3d5c8.dir/src.c.o -o cmTC_3d5c8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__ggdb succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_31fc8/fast" +/usr/bin/make -f CMakeFiles/cmTC_31fc8.dir/build.make CMakeFiles/cmTC_31fc8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_31fc8.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__ggdb -ggdb -o CMakeFiles/cmTC_31fc8.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_31fc8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_31fc8.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__ggdb -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_31fc8.dir/src.cxx.o -o cmTC_31fc8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__DDEBUG succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d0924/fast" +/usr/bin/make -f CMakeFiles/cmTC_d0924.dir/build.make CMakeFiles/cmTC_d0924.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d0924.dir/src.c.o +/usr/bin/cc -DDEBUG -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__DDEBUG -o CMakeFiles/cmTC_d0924.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d0924 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d0924.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__DDEBUG -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_d0924.dir/src.c.o -o cmTC_d0924 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__DDEBUG succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d444a/fast" +/usr/bin/make -f CMakeFiles/cmTC_d444a.dir/build.make CMakeFiles/cmTC_d444a.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_d444a.dir/src.cxx.o +/usr/bin/c++ -DDEBUG -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__DDEBUG -o CMakeFiles/cmTC_d444a.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_d444a +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d444a.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__DDEBUG -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_d444a.dir/src.cxx.o -o cmTC_d444a -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__fno_omit_frame_pointer succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_77eb5/fast" +/usr/bin/make -f CMakeFiles/cmTC_77eb5.dir/build.make CMakeFiles/cmTC_77eb5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_77eb5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__fno_omit_frame_pointer -fno-omit-frame-pointer -o CMakeFiles/cmTC_77eb5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_77eb5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_77eb5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__fno_omit_frame_pointer -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_77eb5.dir/src.c.o -o cmTC_77eb5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__fno_omit_frame_pointer succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b3856/fast" +/usr/bin/make -f CMakeFiles/cmTC_b3856.dir/build.make CMakeFiles/cmTC_b3856.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_b3856.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__fno_omit_frame_pointer -fno-omit-frame-pointer -o CMakeFiles/cmTC_b3856.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_b3856 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b3856.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__fno_omit_frame_pointer -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_b3856.dir/src.cxx.o -o cmTC_b3856 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_515aa/fast" +/usr/bin/make -f CMakeFiles/cmTC_515aa.dir/build.make CMakeFiles/cmTC_515aa.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_515aa.dir/src.c.o +/usr/bin/cc -D_FORTIFY_SOURCE=2 -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -U_FORTIFY_SOURCE -o CMakeFiles/cmTC_515aa.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_515aa +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_515aa.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_515aa.dir/src.c.o -o cmTC_515aa -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ae990/fast" +/usr/bin/make -f CMakeFiles/cmTC_ae990.dir/build.make CMakeFiles/cmTC_ae990.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_ae990.dir/src.cxx.o +/usr/bin/c++ -D_FORTIFY_SOURCE=2 -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -U_FORTIFY_SOURCE -o CMakeFiles/cmTC_ae990.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_ae990 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ae990.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_ae990.dir/src.cxx.o -o cmTC_ae990 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__D_LARGEFILE64_SOURCE succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4df69/fast" +/usr/bin/make -f CMakeFiles/cmTC_4df69.dir/build.make CMakeFiles/cmTC_4df69.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4df69.dir/src.c.o +/usr/bin/cc -D_LARGEFILE64_SOURCE -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__D_LARGEFILE64_SOURCE -o CMakeFiles/cmTC_4df69.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_4df69 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4df69.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__D_LARGEFILE64_SOURCE -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_4df69.dir/src.c.o -o cmTC_4df69 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__D_LARGEFILE64_SOURCE succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4db8a/fast" +/usr/bin/make -f CMakeFiles/cmTC_4db8a.dir/build.make CMakeFiles/cmTC_4db8a.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_4db8a.dir/src.cxx.o +/usr/bin/c++ -D_LARGEFILE64_SOURCE -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__D_LARGEFILE64_SOURCE -o CMakeFiles/cmTC_4db8a.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_4db8a +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4db8a.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__D_LARGEFILE64_SOURCE -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_4db8a.dir/src.cxx.o -o cmTC_4db8a -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } diff --git a/splitfs_syscall_intercept/build/CMakeFiles/CMakeRuleHashes.txt b/splitfs_syscall_intercept/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000000..a255d50ed7 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,7 @@ +# Hashes of file build rules. +dbe7a445bb23af4ce9213ce72db1ba2e CMakeFiles/check-whitespace-main +56711551edaeab2832fe2940a7efde14 CMakeFiles/uninstall +5bf7eb62e08edcd8658261ec079ce85c src/CMakeFiles/check-whitespace-splitfs +796f68a5fdfc90ef8c9ab430552dcefe src/CMakeFiles/cstyle-splitfs +cdd7bef2cd2417a99fce4d326c10de5d src/CMakeFiles/splitfs_static +c84f578580c5c1bc1802d967a63f277a src/libsplitfs.a diff --git a/splitfs_syscall_intercept/build/CMakeFiles/Makefile.cmake b/splitfs_syscall_intercept/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000000..ac6b9130f8 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,151 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/feature_tests.c" + "CMakeFiles/feature_tests.cxx" + "../cmake_uninstall.cmake.in" + "../src/CMakeLists.txt" + "/usr/share/cmake-3.5/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.5/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.5/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.5/Modules/CMakeConfigurableFile.in" + "/usr/share/cmake-3.5/Modules/CMakeDependentOption.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.5/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseArguments.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.5/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.5/Modules/CheckCCompilerFlag.cmake" + "/usr/share/cmake-3.5/Modules/CheckCSourceCompiles.cmake" + "/usr/share/cmake-3.5/Modules/CheckCXXCompilerFlag.cmake" + "/usr/share/cmake-3.5/Modules/CheckCXXSourceCompiles.cmake" + "/usr/share/cmake-3.5/Modules/CheckFunctionExists.c" + "/usr/share/cmake-3.5/Modules/CheckIncludeFile.c.in" + "/usr/share/cmake-3.5/Modules/CheckIncludeFile.cmake" + "/usr/share/cmake-3.5/Modules/CheckLibraryExists.cmake" + "/usr/share/cmake-3.5/Modules/CheckSymbolExists.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MIPSpro-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/FindCygwin.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageMessage.cmake" + "/usr/share/cmake-3.5/Modules/FindPerl.cmake" + "/usr/share/cmake-3.5/Modules/FindPkgConfig.cmake" + "/usr/share/cmake-3.5/Modules/FindThreads.cmake" + "/usr/share/cmake-3.5/Modules/GNUInstallDirs.cmake" + "/usr/share/cmake-3.5/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.5/Modules/MultiArchCross.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.5/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "cmake_uninstall.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "src/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/cppformat.dir/DependInfo.cmake" + "CMakeFiles/cppstyle.dir/DependInfo.cmake" + "CMakeFiles/checkers.dir/DependInfo.cmake" + "CMakeFiles/tests.dir/DependInfo.cmake" + "CMakeFiles/check-whitespace.dir/DependInfo.cmake" + "CMakeFiles/cstyle.dir/DependInfo.cmake" + "CMakeFiles/uninstall.dir/DependInfo.cmake" + "CMakeFiles/check-whitespace-main.dir/DependInfo.cmake" + "src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_static.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_o.dir/DependInfo.cmake" + "src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake" + ) diff --git a/splitfs_syscall_intercept/build/CMakeFiles/Makefile2 b/splitfs_syscall_intercept/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000000..f75b644687 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/Makefile2 @@ -0,0 +1,571 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# The main recursive all target +all: + +.PHONY : all + +# The main recursive preinstall target +preinstall: + +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Target rules for target CMakeFiles/cppformat.dir + +# All Build rule for target. +CMakeFiles/cppformat.dir/all: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/depend + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cppformat" +.PHONY : CMakeFiles/cppformat.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cppformat.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cppformat.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cppformat.dir/rule + +# Convenience name for target. +cppformat: CMakeFiles/cppformat.dir/rule + +.PHONY : cppformat + +# clean rule for target. +CMakeFiles/cppformat.dir/clean: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/clean +.PHONY : CMakeFiles/cppformat.dir/clean + +# clean rule for target. +clean: CMakeFiles/cppformat.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/cppstyle.dir + +# All Build rule for target. +CMakeFiles/cppstyle.dir/all: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/depend + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cppstyle" +.PHONY : CMakeFiles/cppstyle.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cppstyle.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cppstyle.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cppstyle.dir/rule + +# Convenience name for target. +cppstyle: CMakeFiles/cppstyle.dir/rule + +.PHONY : cppstyle + +# clean rule for target. +CMakeFiles/cppstyle.dir/clean: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/clean +.PHONY : CMakeFiles/cppstyle.dir/clean + +# clean rule for target. +clean: CMakeFiles/cppstyle.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/checkers.dir + +# All Build rule for target. +CMakeFiles/checkers.dir/all: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/depend + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target checkers" +.PHONY : CMakeFiles/checkers.dir/all + +# Include target in all. +all: CMakeFiles/checkers.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/checkers.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/checkers.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/checkers.dir/rule + +# Convenience name for target. +checkers: CMakeFiles/checkers.dir/rule + +.PHONY : checkers + +# clean rule for target. +CMakeFiles/checkers.dir/clean: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/clean +.PHONY : CMakeFiles/checkers.dir/clean + +# clean rule for target. +clean: CMakeFiles/checkers.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/tests.dir + +# All Build rule for target. +CMakeFiles/tests.dir/all: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/depend + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target tests" +.PHONY : CMakeFiles/tests.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/tests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/tests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/tests.dir/rule + +# Convenience name for target. +tests: CMakeFiles/tests.dir/rule + +.PHONY : tests + +# clean rule for target. +CMakeFiles/tests.dir/clean: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/clean +.PHONY : CMakeFiles/tests.dir/clean + +# clean rule for target. +clean: CMakeFiles/tests.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/check-whitespace.dir + +# All Build rule for target. +CMakeFiles/check-whitespace.dir/all: CMakeFiles/check-whitespace-main.dir/all +CMakeFiles/check-whitespace.dir/all: src/CMakeFiles/check-whitespace-splitfs.dir/all + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/depend + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace" +.PHONY : CMakeFiles/check-whitespace.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/check-whitespace.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/check-whitespace.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/check-whitespace.dir/rule + +# Convenience name for target. +check-whitespace: CMakeFiles/check-whitespace.dir/rule + +.PHONY : check-whitespace + +# clean rule for target. +CMakeFiles/check-whitespace.dir/clean: + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/clean +.PHONY : CMakeFiles/check-whitespace.dir/clean + +# clean rule for target. +clean: CMakeFiles/check-whitespace.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/cstyle.dir + +# All Build rule for target. +CMakeFiles/cstyle.dir/all: src/CMakeFiles/cstyle-splitfs.dir/all + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/depend + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cstyle" +.PHONY : CMakeFiles/cstyle.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cstyle.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cstyle.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cstyle.dir/rule + +# Convenience name for target. +cstyle: CMakeFiles/cstyle.dir/rule + +.PHONY : cstyle + +# clean rule for target. +CMakeFiles/cstyle.dir/clean: + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/clean +.PHONY : CMakeFiles/cstyle.dir/clean + +# clean rule for target. +clean: CMakeFiles/cstyle.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/uninstall.dir + +# All Build rule for target. +CMakeFiles/uninstall.dir/all: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/depend + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target uninstall" +.PHONY : CMakeFiles/uninstall.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/uninstall.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/uninstall.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/uninstall.dir/rule + +# Convenience name for target. +uninstall: CMakeFiles/uninstall.dir/rule + +.PHONY : uninstall + +# clean rule for target. +CMakeFiles/uninstall.dir/clean: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/clean +.PHONY : CMakeFiles/uninstall.dir/clean + +# clean rule for target. +clean: CMakeFiles/uninstall.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/check-whitespace-main.dir + +# All Build rule for target. +CMakeFiles/check-whitespace-main.dir/all: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/depend + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace-main" +.PHONY : CMakeFiles/check-whitespace-main.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/check-whitespace-main.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/check-whitespace-main.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/check-whitespace-main.dir/rule + +# Convenience name for target. +check-whitespace-main: CMakeFiles/check-whitespace-main.dir/rule + +.PHONY : check-whitespace-main + +# clean rule for target. +CMakeFiles/check-whitespace-main.dir/clean: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/clean +.PHONY : CMakeFiles/check-whitespace-main.dir/clean + +# clean rule for target. +clean: CMakeFiles/check-whitespace-main.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory src + +# Convenience name for "all" pass in the directory. +src/all: src/CMakeFiles/splitfs_static.dir/all +src/all: src/CMakeFiles/splitfs_o.dir/all +src/all: src/CMakeFiles/splitfs_static_unscoped.dir/all +src/all: src/CMakeFiles/splitfs_shared.dir/all + +.PHONY : src/all + +# Convenience name for "clean" pass in the directory. +src/clean: src/CMakeFiles/check-whitespace-splitfs.dir/clean +src/clean: src/CMakeFiles/splitfs_static.dir/clean +src/clean: src/CMakeFiles/splitfs_o.dir/clean +src/clean: src/CMakeFiles/cstyle-splitfs.dir/clean +src/clean: src/CMakeFiles/splitfs_static_unscoped.dir/clean +src/clean: src/CMakeFiles/splitfs_shared.dir/clean + +.PHONY : src/clean + +# Convenience name for "preinstall" pass in the directory. +src/preinstall: + +.PHONY : src/preinstall + +#============================================================================= +# Target rules for target src/CMakeFiles/check-whitespace-splitfs.dir + +# All Build rule for target. +src/CMakeFiles/check-whitespace-splitfs.dir/all: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/depend + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace-splitfs" +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/all + +# Build rule for subdir invocation for target. +src/CMakeFiles/check-whitespace-splitfs.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/check-whitespace-splitfs.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/rule + +# Convenience name for target. +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/rule + +.PHONY : check-whitespace-splitfs + +# clean rule for target. +src/CMakeFiles/check-whitespace-splitfs.dir/clean: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/clean +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/check-whitespace-splitfs.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_static.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_static.dir/all: src/CMakeFiles/splitfs_static_unscoped.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=31 "Built target splitfs_static" +.PHONY : src/CMakeFiles/splitfs_static.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_static.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_static.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 31 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_static.dir/rule + +# Convenience name for target. +splitfs_static: src/CMakeFiles/splitfs_static.dir/rule + +.PHONY : splitfs_static + +# clean rule for target. +src/CMakeFiles/splitfs_static.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/clean +.PHONY : src/CMakeFiles/splitfs_static.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_static.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_o.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_o.dir/all: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 "Built target splitfs_o" +.PHONY : src/CMakeFiles/splitfs_o.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_o.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_o.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 29 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_o.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_o.dir/rule + +# Convenience name for target. +splitfs_o: src/CMakeFiles/splitfs_o.dir/rule + +.PHONY : splitfs_o + +# clean rule for target. +src/CMakeFiles/splitfs_o.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/clean +.PHONY : src/CMakeFiles/splitfs_o.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_o.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/cstyle-splitfs.dir + +# All Build rule for target. +src/CMakeFiles/cstyle-splitfs.dir/all: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/depend + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cstyle-splitfs" +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/all + +# Build rule for subdir invocation for target. +src/CMakeFiles/cstyle-splitfs.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/cstyle-splitfs.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/rule + +# Convenience name for target. +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/rule + +.PHONY : cstyle-splitfs + +# clean rule for target. +src/CMakeFiles/cstyle-splitfs.dir/clean: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/clean +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/cstyle-splitfs.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_static_unscoped.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_static_unscoped.dir/all: src/CMakeFiles/splitfs_o.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=32 "Built target splitfs_static_unscoped" +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_static_unscoped.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_static_unscoped.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static_unscoped.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/rule + +# Convenience name for target. +splitfs_static_unscoped: src/CMakeFiles/splitfs_static_unscoped.dir/rule + +.PHONY : splitfs_static_unscoped + +# clean rule for target. +src/CMakeFiles/splitfs_static_unscoped.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/clean +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_static_unscoped.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_shared.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_shared.dir/all: src/CMakeFiles/splitfs_o.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=30 "Built target splitfs_shared" +.PHONY : src/CMakeFiles/splitfs_shared.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_shared.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_shared.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_shared.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_shared.dir/rule + +# Convenience name for target. +splitfs_shared: src/CMakeFiles/splitfs_shared.dir/rule + +.PHONY : splitfs_shared + +# clean rule for target. +src/CMakeFiles/splitfs_shared.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/clean +.PHONY : src/CMakeFiles/splitfs_shared.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_shared.dir/clean + +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/TargetDirectories.txt b/splitfs_syscall_intercept/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000000..ce43e18879 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,26 @@ +/home/om/wspace/splitfs-new/build/CMakeFiles/install.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/rebuild_cache.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/edit_cache.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cppformat.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cppstyle.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/checkers.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/tests.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cstyle.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/uninstall.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace-main.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/list_install_components.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/install/strip.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/install/local.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/check-whitespace-splitfs.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/rebuild_cache.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/list_install_components.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/cstyle-splitfs.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install/strip.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static_unscoped.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install/local.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_shared.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/edit_cache.dir diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/build.make new file mode 100644 index 0000000000..fb02f240e8 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace-main. + +# Include the progress variables for this target. +include CMakeFiles/check-whitespace-main.dir/progress.make + +CMakeFiles/check-whitespace-main: + /usr/bin/perl /home/om/wspace/splitfs-new/utils/check_whitespace + +check-whitespace-main: CMakeFiles/check-whitespace-main +check-whitespace-main: CMakeFiles/check-whitespace-main.dir/build.make + +.PHONY : check-whitespace-main + +# Rule to build all files generated by this target. +CMakeFiles/check-whitespace-main.dir/build: check-whitespace-main + +.PHONY : CMakeFiles/check-whitespace-main.dir/build + +CMakeFiles/check-whitespace-main.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake +.PHONY : CMakeFiles/check-whitespace-main.dir/clean + +CMakeFiles/check-whitespace-main.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/check-whitespace-main.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake new file mode 100644 index 0000000000..a0ae55aa4c --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/check-whitespace-main" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace-main.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace-main.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/build.make new file mode 100644 index 0000000000..e60a27a3ed --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace. + +# Include the progress variables for this target. +include CMakeFiles/check-whitespace.dir/progress.make + +check-whitespace: CMakeFiles/check-whitespace.dir/build.make + +.PHONY : check-whitespace + +# Rule to build all files generated by this target. +CMakeFiles/check-whitespace.dir/build: check-whitespace + +.PHONY : CMakeFiles/check-whitespace.dir/build + +CMakeFiles/check-whitespace.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace.dir/cmake_clean.cmake +.PHONY : CMakeFiles/check-whitespace.dir/clean + +CMakeFiles/check-whitespace.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/check-whitespace.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake new file mode 100644 index 0000000000..2e0a4b29e3 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/check-whitespace.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/build.make new file mode 100644 index 0000000000..b8df3465c6 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for checkers. + +# Include the progress variables for this target. +include CMakeFiles/checkers.dir/progress.make + +checkers: CMakeFiles/checkers.dir/build.make + +.PHONY : checkers + +# Rule to build all files generated by this target. +CMakeFiles/checkers.dir/build: checkers + +.PHONY : CMakeFiles/checkers.dir/build + +CMakeFiles/checkers.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/checkers.dir/cmake_clean.cmake +.PHONY : CMakeFiles/checkers.dir/clean + +CMakeFiles/checkers.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/checkers.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/checkers.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/cmake_clean.cmake new file mode 100644 index 0000000000..d72f5401fa --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/checkers.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.internal b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.make b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/checkers.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cmake.check_cache b/splitfs_syscall_intercept/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000000..3dccd73172 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/build.make new file mode 100644 index 0000000000..c96ceddd8d --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cppformat. + +# Include the progress variables for this target. +include CMakeFiles/cppformat.dir/progress.make + +cppformat: CMakeFiles/cppformat.dir/build.make + +.PHONY : cppformat + +# Rule to build all files generated by this target. +CMakeFiles/cppformat.dir/build: cppformat + +.PHONY : CMakeFiles/cppformat.dir/build + +CMakeFiles/cppformat.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cppformat.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cppformat.dir/clean + +CMakeFiles/cppformat.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cppformat.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cppformat.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/cmake_clean.cmake new file mode 100644 index 0000000000..fec845697e --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cppformat.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppformat.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/build.make new file mode 100644 index 0000000000..9f10756885 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cppstyle. + +# Include the progress variables for this target. +include CMakeFiles/cppstyle.dir/progress.make + +cppstyle: CMakeFiles/cppstyle.dir/build.make + +.PHONY : cppstyle + +# Rule to build all files generated by this target. +CMakeFiles/cppstyle.dir/build: cppstyle + +.PHONY : CMakeFiles/cppstyle.dir/build + +CMakeFiles/cppstyle.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cppstyle.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cppstyle.dir/clean + +CMakeFiles/cppstyle.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cppstyle.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cppstyle.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake new file mode 100644 index 0000000000..038336d8b8 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cppstyle.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cppstyle.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/build.make new file mode 100644 index 0000000000..e1902f6ae9 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cstyle. + +# Include the progress variables for this target. +include CMakeFiles/cstyle.dir/progress.make + +cstyle: CMakeFiles/cstyle.dir/build.make + +.PHONY : cstyle + +# Rule to build all files generated by this target. +CMakeFiles/cstyle.dir/build: cstyle + +.PHONY : CMakeFiles/cstyle.dir/build + +CMakeFiles/cstyle.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cstyle.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cstyle.dir/clean + +CMakeFiles/cstyle.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cstyle.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cstyle.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/cmake_clean.cmake new file mode 100644 index 0000000000..ac65d5a1dc --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cstyle.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/cstyle.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.bin b/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.bin new file mode 100755 index 0000000000000000000000000000000000000000..24939d193bbcef29063a395a70cc6c6ee560c767 GIT binary patch literal 12696 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.c b/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.c new file mode 100644 index 0000000000..6590dded23 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.c @@ -0,0 +1,34 @@ + + const char features[] = {"\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 +"1" +#else +"0" +#endif +"c_function_prototypes\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_restrict\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L +"1" +#else +"0" +#endif +"c_static_assert\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_variadic_macros\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.cxx b/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.cxx new file mode 100644 index 0000000000..b93418c6ed --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/feature_tests.cxx @@ -0,0 +1,405 @@ + + const char features[] = {"\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/splitfs_syscall_intercept/build/CMakeFiles/progress.marks b/splitfs_syscall_intercept/build/CMakeFiles/progress.marks new file mode 100644 index 0000000000..f5c89552bd --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +32 diff --git a/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/build.make new file mode 100644 index 0000000000..0890446879 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for tests. + +# Include the progress variables for this target. +include CMakeFiles/tests.dir/progress.make + +tests: CMakeFiles/tests.dir/build.make + +.PHONY : tests + +# Rule to build all files generated by this target. +CMakeFiles/tests.dir/build: tests + +.PHONY : CMakeFiles/tests.dir/build + +CMakeFiles/tests.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/tests.dir/cmake_clean.cmake +.PHONY : CMakeFiles/tests.dir/clean + +CMakeFiles/tests.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/tests.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/tests.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/cmake_clean.cmake new file mode 100644 index 0000000000..910f04d829 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/tests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/tests.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/build.make b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/build.make new file mode 100644 index 0000000000..2fde4feed0 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for uninstall. + +# Include the progress variables for this target. +include CMakeFiles/uninstall.dir/progress.make + +CMakeFiles/uninstall: + /usr/bin/cmake -P /home/om/wspace/splitfs-new/build/cmake_uninstall.cmake + +uninstall: CMakeFiles/uninstall +uninstall: CMakeFiles/uninstall.dir/build.make + +.PHONY : uninstall + +# Rule to build all files generated by this target. +CMakeFiles/uninstall.dir/build: uninstall + +.PHONY : CMakeFiles/uninstall.dir/build + +CMakeFiles/uninstall.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/uninstall.dir/cmake_clean.cmake +.PHONY : CMakeFiles/uninstall.dir/clean + +CMakeFiles/uninstall.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/uninstall.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/uninstall.dir/depend + diff --git a/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/cmake_clean.cmake new file mode 100644 index 0000000000..027952dfb7 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/uninstall" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/uninstall.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/progress.make b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/CMakeFiles/uninstall.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/Makefile b/splitfs_syscall_intercept/build/Makefile new file mode 100644 index 0000000000..80aea12a24 --- /dev/null +++ b/splitfs_syscall_intercept/build/Makefile @@ -0,0 +1,378 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles /home/om/wspace/splitfs-new/build/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named cppformat + +# Build rule for target. +cppformat: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cppformat +.PHONY : cppformat + +# fast build rule for target. +cppformat/fast: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/build +.PHONY : cppformat/fast + +#============================================================================= +# Target rules for targets named cppstyle + +# Build rule for target. +cppstyle: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cppstyle +.PHONY : cppstyle + +# fast build rule for target. +cppstyle/fast: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/build +.PHONY : cppstyle/fast + +#============================================================================= +# Target rules for targets named checkers + +# Build rule for target. +checkers: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 checkers +.PHONY : checkers + +# fast build rule for target. +checkers/fast: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/build +.PHONY : checkers/fast + +#============================================================================= +# Target rules for targets named tests + +# Build rule for target. +tests: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 tests +.PHONY : tests + +# fast build rule for target. +tests/fast: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/build +.PHONY : tests/fast + +#============================================================================= +# Target rules for targets named check-whitespace + +# Build rule for target. +check-whitespace: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace +.PHONY : check-whitespace + +# fast build rule for target. +check-whitespace/fast: + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/build +.PHONY : check-whitespace/fast + +#============================================================================= +# Target rules for targets named cstyle + +# Build rule for target. +cstyle: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cstyle +.PHONY : cstyle + +# fast build rule for target. +cstyle/fast: + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/build +.PHONY : cstyle/fast + +#============================================================================= +# Target rules for targets named uninstall + +# Build rule for target. +uninstall: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 uninstall +.PHONY : uninstall + +# fast build rule for target. +uninstall/fast: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build +.PHONY : uninstall/fast + +#============================================================================= +# Target rules for targets named check-whitespace-main + +# Build rule for target. +check-whitespace-main: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace-main +.PHONY : check-whitespace-main + +# fast build rule for target. +check-whitespace-main/fast: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/build +.PHONY : check-whitespace-main/fast + +#============================================================================= +# Target rules for targets named check-whitespace-splitfs + +# Build rule for target. +check-whitespace-splitfs: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace-splitfs +.PHONY : check-whitespace-splitfs + +# fast build rule for target. +check-whitespace-splitfs/fast: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build +.PHONY : check-whitespace-splitfs/fast + +#============================================================================= +# Target rules for targets named splitfs_static + +# Build rule for target. +splitfs_static: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_static +.PHONY : splitfs_static + +# fast build rule for target. +splitfs_static/fast: + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build +.PHONY : splitfs_static/fast + +#============================================================================= +# Target rules for targets named splitfs_o + +# Build rule for target. +splitfs_o: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_o +.PHONY : splitfs_o + +# fast build rule for target. +splitfs_o/fast: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build +.PHONY : splitfs_o/fast + +#============================================================================= +# Target rules for targets named cstyle-splitfs + +# Build rule for target. +cstyle-splitfs: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cstyle-splitfs +.PHONY : cstyle-splitfs + +# fast build rule for target. +cstyle-splitfs/fast: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build +.PHONY : cstyle-splitfs/fast + +#============================================================================= +# Target rules for targets named splitfs_static_unscoped + +# Build rule for target. +splitfs_static_unscoped: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_static_unscoped +.PHONY : splitfs_static_unscoped + +# fast build rule for target. +splitfs_static_unscoped/fast: + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build +.PHONY : splitfs_static_unscoped/fast + +#============================================================================= +# Target rules for targets named splitfs_shared + +# Build rule for target. +splitfs_shared: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_shared +.PHONY : splitfs_shared + +# fast build rule for target. +splitfs_shared/fast: + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build +.PHONY : splitfs_shared/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... edit_cache" + @echo "... cppformat" + @echo "... cppstyle" + @echo "... checkers" + @echo "... tests" + @echo "... check-whitespace" + @echo "... cstyle" + @echo "... uninstall" + @echo "... check-whitespace-main" + @echo "... list_install_components" + @echo "... install/strip" + @echo "... install/local" + @echo "... check-whitespace-splitfs" + @echo "... splitfs_static" + @echo "... splitfs_o" + @echo "... cstyle-splitfs" + @echo "... splitfs_static_unscoped" + @echo "... splitfs_shared" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/build/cmake_install.cmake b/splitfs_syscall_intercept/build/cmake_install.cmake new file mode 100644 index 0000000000..68e706ac73 --- /dev/null +++ b/splitfs_syscall_intercept/build/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/om/wspace/splitfs-new + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/om/wspace/splitfs-new/build/src/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/om/wspace/splitfs-new/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/splitfs_syscall_intercept/build/cmake_uninstall.cmake b/splitfs_syscall_intercept/build/cmake_uninstall.cmake new file mode 100644 index 0000000000..9b495ebcfd --- /dev/null +++ b/splitfs_syscall_intercept/build/cmake_uninstall.cmake @@ -0,0 +1,22 @@ +# From: https://cmake.org/Wiki/CMake_FAQ + +if(NOT EXISTS "/home/om/wspace/splitfs-new/build/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: /home/om/wspace/splitfs-new/build/install_manifest.txt") +endif(NOT EXISTS "/home/om/wspace/splitfs-new/build/install_manifest.txt") + +file(READ "/home/om/wspace/splitfs-new/build/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program("/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/CMakeDirectoryInformation.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..7d0be58f5c --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/om/wspace/splitfs-new") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/om/wspace/splitfs-new/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make new file mode 100644 index 0000000000..92a07ef15a --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace-splitfs. + +# Include the progress variables for this target. +include src/CMakeFiles/check-whitespace-splitfs.dir/progress.make + +src/CMakeFiles/check-whitespace-splitfs: + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/perl /home/om/wspace/splitfs-new/utils/check_whitespace /home/om/wspace/splitfs-new/src/*.c /home/om/wspace/splitfs-new/src/*.h + +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/build.make + +.PHONY : check-whitespace-splitfs + +# Rule to build all files generated by this target. +src/CMakeFiles/check-whitespace-splitfs.dir/build: check-whitespace-splitfs + +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/build + +src/CMakeFiles/check-whitespace-splitfs.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/clean + +src/CMakeFiles/check-whitespace-splitfs.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake new file mode 100644 index 0000000000..640aa87432 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/check-whitespace-splitfs" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace-splitfs.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/build.make new file mode 100644 index 0000000000..655a92fe5c --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cstyle-splitfs. + +# Include the progress variables for this target. +include src/CMakeFiles/cstyle-splitfs.dir/progress.make + +src/CMakeFiles/cstyle-splitfs: + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/perl /home/om/wspace/splitfs-new/utils/cstyle /home/om/wspace/splitfs-new/src/*.c /home/om/wspace/splitfs-new/src/*.h + +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/build.make + +.PHONY : cstyle-splitfs + +# Rule to build all files generated by this target. +src/CMakeFiles/cstyle-splitfs.dir/build: cstyle-splitfs + +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/build + +src/CMakeFiles/cstyle-splitfs.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/clean + +src/CMakeFiles/cstyle-splitfs.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake new file mode 100644 index 0000000000..e205bc9f8f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/cstyle-splitfs" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cstyle-splitfs.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/progress.marks b/splitfs_syscall_intercept/build/src/CMakeFiles/progress.marks new file mode 100644 index 0000000000..f5c89552bd --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/progress.marks @@ -0,0 +1 @@ +32 diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/C.includecache b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/C.includecache new file mode 100644 index 0000000000..d0fe232bb6 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/C.includecache @@ -0,0 +1,860 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/splitfs-posix.h +sys/stat.h +- +sys/types.h +- +sys/uio.h +- +sys/vfs.h +- +utime.h +- + +/home/om/wspace/splitfs-new/src/add_delay.c +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h + +/home/om/wspace/splitfs-new/src/add_delay.h +fcntl.h +- +string.h +- +sys/mman.h +- +sys/stat.h +- +pthread.h +- +stdint.h +- +pm_util.h +/home/om/wspace/splitfs-new/src/pm_util.h + +/home/om/wspace/splitfs-new/src/compiler_utils.h + +/home/om/wspace/splitfs-new/src/constants.h + +/home/om/wspace/splitfs-new/src/execv.c +sys/mman.h +- +sys/stat.h +- +fcntl.h +- +errno.h +- +stdio.h +- +syscall.h +- +unistd.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +constants.h +/home/om/wspace/splitfs-new/src/constants.h +vfd_table.h +/home/om/wspace/splitfs-new/src/vfd_table.h +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +execv.h +/home/om/wspace/splitfs-new/src/execv.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h + +/home/om/wspace/splitfs-new/src/execv.h + +/home/om/wspace/splitfs-new/src/fallocate.c +stdlib.h +- +inttypes.h +- +errno.h +- +fcntl.h +- +unistd.h +- +limits.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/file.c +stdlib.h +- +inttypes.h +- +syscall.h +- +sys/types.h +- +sys/stat.h +- +unistd.h +- +fcntl.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +truncate.h +/home/om/wspace/splitfs-new/src/truncate.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/file.h +stddef.h +- +inode.h +/home/om/wspace/splitfs-new/src/inode.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h + +/home/om/wspace/splitfs-new/src/fsync.c +stdlib.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +out.h +/home/om/wspace/splitfs-new/src/out.h +splitfs-posix.h +- +syscall.h +- + +/home/om/wspace/splitfs-new/src/handle_mmaps.c +stdlib.h +- +sys/mman.h +- +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h + +/home/om/wspace/splitfs-new/src/handle_mmaps.h +inttypes.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/hash_map.c +errno.h +- +stddef.h +- +stdlib.h +- +string.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/hash_map.h +stdint.h +- +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/inode.c +stdlib.h +- +inttypes.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/inode.h +stdint.h +- +time.h +- +stdbool.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h + +/home/om/wspace/splitfs-new/src/intel_intrin.c +stdlib.h +- +cpuid.h +- +stdio.h +- +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h + +/home/om/wspace/splitfs-new/src/intel_intrin.h +sys/mman.h +- +stdio.h +- +string.h +- +fcntl.h +- +stdlib.h +- +unistd.h +- +errno.h +- +sys/mman.h +- +math.h +- +string.h +- +sys/types.h +- +linux/perf_event.h +- +linux/hw_breakpoint.h +- +sys/ioctl.h +- +asm/unistd.h +- +inttypes.h +- +sched.h +- +sys/time.h +- +sys/resource.h +- +sys/stat.h +- +sys/prctl.h +- +sys/wait.h +- +sys/syscall.h +- +emmintrin.h +- +stdbool.h +- + +/home/om/wspace/splitfs-new/src/lseek.c +errno.h +- +unistd.h +- +fcntl.h +- +limits.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/mmap_pool.c +stdlib.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/mmap_pool.h + +/home/om/wspace/splitfs-new/src/os_thread.h + +/home/om/wspace/splitfs-new/src/os_thread_pthread.c +errno.h +- +pthread.h +- +stdlib.h +- +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/os_util.h + +/home/om/wspace/splitfs-new/src/os_util_linux.c +limits.h +- +stdio.h +- +string.h +- +sys/types.h +- +unistd.h +- +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h + +/home/om/wspace/splitfs-new/src/out.c +stdlib.h +- +stdio.h +- +stdarg.h +- +string.h +- +errno.h +- +syscall.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/out.h +stdarg.h +- +stddef.h +- +stdlib.h +- +unistd.h +- +pthread.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h + +/home/om/wspace/splitfs-new/src/path_resolve.c +assert.h +- +stdbool.h +- +fcntl.h +- +stdlib.h +- +inttypes.h +- +syscall.h +- +sys/stat.h +- +errno.h +- +string.h +- +unistd.h +- +stdio.h +- +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/pm_util.h + +/home/om/wspace/splitfs-new/src/preload.c +assert.h +- +fcntl.h +- +stdarg.h +- +stdbool.h +- +stdio.h +- +syscall.h +- +stdlib.h +- +inttypes.h +- +string.h +- +errno.h +- +setjmp.h +- +pthread.h +- +unistd.h +- +sys/socket.h +- +sys/stat.h +- +sys/types.h +- +sys/un.h +- +stdio.h +- +limits.h +- +linux/fs.h +- +utime.h +- +sys/fsuid.h +- +sys/capability.h +- +dlfcn.h +- +limits.h +- +asm-generic/errno.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +syscall_early_filter.h +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/preload.h +stdbool.h +- +sys/stat.h +- +stddef.h +- +pthread.h +- +linux/limits.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +vfd_table.h +/home/om/wspace/splitfs-new/src/vfd_table.h + +/home/om/wspace/splitfs-new/src/read.c +stdlib.h +- +stdio.h +- +string.h +- +limits.h +- +inttypes.h +- +syscall.h +- +sys/mman.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/relink.c +stdlib.h +- +syscall.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/relink.h +file.h +/home/om/wspace/splitfs-new/src/file.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +splitfs-posix.h +- + +/home/om/wspace/splitfs-new/src/splitfs-posix.c +limits.h +- +stdio.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +file.h +/home/om/wspace/splitfs-new/src/file.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +out.h +/home/om/wspace/splitfs-new/src/out.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +execv.h +/home/om/wspace/splitfs-new/src/execv.h + +/home/om/wspace/splitfs-new/src/staging.c +stdlib.h +- +assert.h +- +stdbool.h +- +fcntl.h +- +syscall.h +- +stdio.h +- +inttypes.h +- +sys/mman.h +- +string.h +- +libsyscall_intercept_hook_point.h +- +splitfs-posix.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +file.h +/home/om/wspace/splitfs-new/src/file.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/staging.h +file.h +/home/om/wspace/splitfs-new/src/file.h + +/home/om/wspace/splitfs-new/src/staging_thread.c +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h + +/home/om/wspace/splitfs-new/src/staging_thread.h +stdlib.h +- +pthread.h +- +stdatomic.h +- +sys/mman.h +- +stdbool.h +- +staging.h +/home/om/wspace/splitfs-new/src/staging.h + +/home/om/wspace/splitfs-new/src/stat.c +stdlib.h +- +inttypes.h +- +syscall.h +- +errno.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/sys_util.h +errno.h +- +string.h +- +pthread.h +- +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h + +/home/om/wspace/splitfs-new/src/syscall_early_filter.c +syscall_early_filter.h +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +stdlib.h +- +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +stdbool.h +- +sys/syscall.h +- + +/home/om/wspace/splitfs-new/src/table_mmaps.c +stdlib.h +- +stdbool.h +- +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +sys/mman.h +- + +/home/om/wspace/splitfs-new/src/table_mmaps.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h + +/home/om/wspace/splitfs-new/src/truncate.c +stdlib.h +- +inttypes.h +- +syscall.h +- +limits.h +- +truncate.h +/home/om/wspace/splitfs-new/src/truncate.h + +/home/om/wspace/splitfs-new/src/truncate.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/unlink.c +stdlib.h +- +inttypes.h +- +syscall.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/utils.c +errno.h +- +time.h +- +string.h +- +utils.h +/home/om/wspace/splitfs-new/src/utils.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h + +/home/om/wspace/splitfs-new/src/utils.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h + +/home/om/wspace/splitfs-new/src/vfd_table.c +stdlib.h +- +assert.h +- +stdbool.h +- +fcntl.h +- +syscall.h +- +libsyscall_intercept_hook_point.h +- +splitfs-posix.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/vfd_table.h + +/home/om/wspace/splitfs-new/src/write.c +stdlib.h +- +limits.h +- +inttypes.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake new file mode 100644 index 0000000000..733120e03a --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake @@ -0,0 +1,59 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_C + "/home/om/wspace/splitfs-new/src/add_delay.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" + "/home/om/wspace/splitfs-new/src/execv.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" + "/home/om/wspace/splitfs-new/src/fallocate.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" + "/home/om/wspace/splitfs-new/src/file.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" + "/home/om/wspace/splitfs-new/src/fsync.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" + "/home/om/wspace/splitfs-new/src/handle_mmaps.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + "/home/om/wspace/splitfs-new/src/hash_map.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" + "/home/om/wspace/splitfs-new/src/inode.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" + "/home/om/wspace/splitfs-new/src/intel_intrin.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + "/home/om/wspace/splitfs-new/src/lseek.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" + "/home/om/wspace/splitfs-new/src/mmap_pool.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + "/home/om/wspace/splitfs-new/src/os_thread_pthread.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + "/home/om/wspace/splitfs-new/src/os_util_linux.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + "/home/om/wspace/splitfs-new/src/out.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" + "/home/om/wspace/splitfs-new/src/path_resolve.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" + "/home/om/wspace/splitfs-new/src/preload.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" + "/home/om/wspace/splitfs-new/src/read.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" + "/home/om/wspace/splitfs-new/src/relink.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" + "/home/om/wspace/splitfs-new/src/splitfs-posix.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + "/home/om/wspace/splitfs-new/src/staging.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" + "/home/om/wspace/splitfs-new/src/staging_thread.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" + "/home/om/wspace/splitfs-new/src/stat.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" + "/home/om/wspace/splitfs-new/src/syscall_early_filter.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + "/home/om/wspace/splitfs-new/src/table_mmaps.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + "/home/om/wspace/splitfs-new/src/truncate.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" + "/home/om/wspace/splitfs-new/src/unlink.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" + "/home/om/wspace/splitfs-new/src/utils.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" + "/home/om/wspace/splitfs-new/src/vfd_table.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" + "/home/om/wspace/splitfs-new/src/write.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + ) +set(CMAKE_C_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_C + "PMEMFILE_MAJOR_VERSION=0" + "PMEMFILE_MINOR_VERSION=0" + "SRCVERSION=\"a5a036a\"" + "USE_VALGRIND" + ) + +# The include file search paths: +set(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/capstone" + "../src/.." + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/build.make new file mode 100644 index 0000000000..3e77fecd67 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/build.make @@ -0,0 +1,833 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_o.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_o.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_o.dir/flags.make + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object src/CMakeFiles/splitfs_o.dir/add_delay.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/add_delay.c.o -c /home/om/wspace/splitfs-new/src/add_delay.c + +src/CMakeFiles/splitfs_o.dir/add_delay.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/add_delay.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/add_delay.c > CMakeFiles/splitfs_o.dir/add_delay.c.i + +src/CMakeFiles/splitfs_o.dir/add_delay.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/add_delay.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/add_delay.c -o CMakeFiles/splitfs_o.dir/add_delay.c.s + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides: src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/add_delay.c.o + + +src/CMakeFiles/splitfs_o.dir/execv.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building C object src/CMakeFiles/splitfs_o.dir/execv.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/execv.c.o -c /home/om/wspace/splitfs-new/src/execv.c + +src/CMakeFiles/splitfs_o.dir/execv.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/execv.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/execv.c > CMakeFiles/splitfs_o.dir/execv.c.i + +src/CMakeFiles/splitfs_o.dir/execv.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/execv.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/execv.c -o CMakeFiles/splitfs_o.dir/execv.c.s + +src/CMakeFiles/splitfs_o.dir/execv.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/execv.c.o.requires + +src/CMakeFiles/splitfs_o.dir/execv.c.o.provides: src/CMakeFiles/splitfs_o.dir/execv.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/execv.c.o.provides + +src/CMakeFiles/splitfs_o.dir/execv.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/execv.c.o + + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/fallocate.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building C object src/CMakeFiles/splitfs_o.dir/fallocate.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/fallocate.c.o -c /home/om/wspace/splitfs-new/src/fallocate.c + +src/CMakeFiles/splitfs_o.dir/fallocate.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/fallocate.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/fallocate.c > CMakeFiles/splitfs_o.dir/fallocate.c.i + +src/CMakeFiles/splitfs_o.dir/fallocate.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/fallocate.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/fallocate.c -o CMakeFiles/splitfs_o.dir/fallocate.c.s + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides: src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/fallocate.c.o + + +src/CMakeFiles/splitfs_o.dir/file.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building C object src/CMakeFiles/splitfs_o.dir/file.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/file.c.o -c /home/om/wspace/splitfs-new/src/file.c + +src/CMakeFiles/splitfs_o.dir/file.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/file.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/file.c > CMakeFiles/splitfs_o.dir/file.c.i + +src/CMakeFiles/splitfs_o.dir/file.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/file.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/file.c -o CMakeFiles/splitfs_o.dir/file.c.s + +src/CMakeFiles/splitfs_o.dir/file.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/file.c.o.requires + +src/CMakeFiles/splitfs_o.dir/file.c.o.provides: src/CMakeFiles/splitfs_o.dir/file.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/file.c.o.provides + +src/CMakeFiles/splitfs_o.dir/file.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/file.c.o + + +src/CMakeFiles/splitfs_o.dir/fsync.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/fsync.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object src/CMakeFiles/splitfs_o.dir/fsync.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/fsync.c.o -c /home/om/wspace/splitfs-new/src/fsync.c + +src/CMakeFiles/splitfs_o.dir/fsync.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/fsync.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/fsync.c > CMakeFiles/splitfs_o.dir/fsync.c.i + +src/CMakeFiles/splitfs_o.dir/fsync.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/fsync.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/fsync.c -o CMakeFiles/splitfs_o.dir/fsync.c.s + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides: src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/fsync.c.o + + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o -c /home/om/wspace/splitfs-new/src/handle_mmaps.c + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/handle_mmaps.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/handle_mmaps.c > CMakeFiles/splitfs_o.dir/handle_mmaps.c.i + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/handle_mmaps.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/handle_mmaps.c -o CMakeFiles/splitfs_o.dir/handle_mmaps.c.s + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o + + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object src/CMakeFiles/splitfs_o.dir/hash_map.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/hash_map.c.o -c /home/om/wspace/splitfs-new/src/hash_map.c + +src/CMakeFiles/splitfs_o.dir/hash_map.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/hash_map.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/hash_map.c > CMakeFiles/splitfs_o.dir/hash_map.c.i + +src/CMakeFiles/splitfs_o.dir/hash_map.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/hash_map.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/hash_map.c -o CMakeFiles/splitfs_o.dir/hash_map.c.s + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides: src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/hash_map.c.o + + +src/CMakeFiles/splitfs_o.dir/inode.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building C object src/CMakeFiles/splitfs_o.dir/inode.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/inode.c.o -c /home/om/wspace/splitfs-new/src/inode.c + +src/CMakeFiles/splitfs_o.dir/inode.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/inode.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/inode.c > CMakeFiles/splitfs_o.dir/inode.c.i + +src/CMakeFiles/splitfs_o.dir/inode.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/inode.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/inode.c -o CMakeFiles/splitfs_o.dir/inode.c.s + +src/CMakeFiles/splitfs_o.dir/inode.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/inode.c.o.requires + +src/CMakeFiles/splitfs_o.dir/inode.c.o.provides: src/CMakeFiles/splitfs_o.dir/inode.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/inode.c.o.provides + +src/CMakeFiles/splitfs_o.dir/inode.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/inode.c.o + + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/intel_intrin.c.o -c /home/om/wspace/splitfs-new/src/intel_intrin.c + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/intel_intrin.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/intel_intrin.c > CMakeFiles/splitfs_o.dir/intel_intrin.c.i + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/intel_intrin.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/intel_intrin.c -o CMakeFiles/splitfs_o.dir/intel_intrin.c.s + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o + + +src/CMakeFiles/splitfs_o.dir/lseek.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/lseek.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object src/CMakeFiles/splitfs_o.dir/lseek.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/lseek.c.o -c /home/om/wspace/splitfs-new/src/lseek.c + +src/CMakeFiles/splitfs_o.dir/lseek.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/lseek.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/lseek.c > CMakeFiles/splitfs_o.dir/lseek.c.i + +src/CMakeFiles/splitfs_o.dir/lseek.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/lseek.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/lseek.c -o CMakeFiles/splitfs_o.dir/lseek.c.s + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides: src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/lseek.c.o + + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/mmap_pool.c.o -c /home/om/wspace/splitfs-new/src/mmap_pool.c + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/mmap_pool.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/mmap_pool.c > CMakeFiles/splitfs_o.dir/mmap_pool.c.i + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/mmap_pool.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/mmap_pool.c -o CMakeFiles/splitfs_o.dir/mmap_pool.c.s + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o + + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread_pthread.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o -c /home/om/wspace/splitfs-new/src/os_thread_pthread.c + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/os_thread_pthread.c > CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/os_thread_pthread.c -o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o + + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util_linux.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building C object src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/os_util_linux.c.o -c /home/om/wspace/splitfs-new/src/os_util_linux.c + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/os_util_linux.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/os_util_linux.c > CMakeFiles/splitfs_o.dir/os_util_linux.c.i + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/os_util_linux.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/os_util_linux.c -o CMakeFiles/splitfs_o.dir/os_util_linux.c.s + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o + + +src/CMakeFiles/splitfs_o.dir/out.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object src/CMakeFiles/splitfs_o.dir/out.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/out.c.o -c /home/om/wspace/splitfs-new/src/out.c + +src/CMakeFiles/splitfs_o.dir/out.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/out.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/out.c > CMakeFiles/splitfs_o.dir/out.c.i + +src/CMakeFiles/splitfs_o.dir/out.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/out.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/out.c -o CMakeFiles/splitfs_o.dir/out.c.s + +src/CMakeFiles/splitfs_o.dir/out.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/out.c.o.requires + +src/CMakeFiles/splitfs_o.dir/out.c.o.provides: src/CMakeFiles/splitfs_o.dir/out.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/out.c.o.provides + +src/CMakeFiles/splitfs_o.dir/out.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/out.c.o + + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/path_resolve.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/path_resolve.c.o -c /home/om/wspace/splitfs-new/src/path_resolve.c + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/path_resolve.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/path_resolve.c > CMakeFiles/splitfs_o.dir/path_resolve.c.i + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/path_resolve.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/path_resolve.c -o CMakeFiles/splitfs_o.dir/path_resolve.c.s + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o + + +src/CMakeFiles/splitfs_o.dir/preload.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object src/CMakeFiles/splitfs_o.dir/preload.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/preload.c.o -c /home/om/wspace/splitfs-new/src/preload.c + +src/CMakeFiles/splitfs_o.dir/preload.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/preload.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/preload.c > CMakeFiles/splitfs_o.dir/preload.c.i + +src/CMakeFiles/splitfs_o.dir/preload.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/preload.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/preload.c -o CMakeFiles/splitfs_o.dir/preload.c.s + +src/CMakeFiles/splitfs_o.dir/preload.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/preload.c.o.requires + +src/CMakeFiles/splitfs_o.dir/preload.c.o.provides: src/CMakeFiles/splitfs_o.dir/preload.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/preload.c.o.provides + +src/CMakeFiles/splitfs_o.dir/preload.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/preload.c.o + + +src/CMakeFiles/splitfs_o.dir/read.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/read.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object src/CMakeFiles/splitfs_o.dir/read.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/read.c.o -c /home/om/wspace/splitfs-new/src/read.c + +src/CMakeFiles/splitfs_o.dir/read.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/read.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/read.c > CMakeFiles/splitfs_o.dir/read.c.i + +src/CMakeFiles/splitfs_o.dir/read.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/read.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/read.c -o CMakeFiles/splitfs_o.dir/read.c.s + +src/CMakeFiles/splitfs_o.dir/read.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/read.c.o.requires + +src/CMakeFiles/splitfs_o.dir/read.c.o.provides: src/CMakeFiles/splitfs_o.dir/read.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/read.c.o.provides + +src/CMakeFiles/splitfs_o.dir/read.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/read.c.o + + +src/CMakeFiles/splitfs_o.dir/relink.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object src/CMakeFiles/splitfs_o.dir/relink.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/relink.c.o -c /home/om/wspace/splitfs-new/src/relink.c + +src/CMakeFiles/splitfs_o.dir/relink.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/relink.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/relink.c > CMakeFiles/splitfs_o.dir/relink.c.i + +src/CMakeFiles/splitfs_o.dir/relink.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/relink.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/relink.c -o CMakeFiles/splitfs_o.dir/relink.c.s + +src/CMakeFiles/splitfs_o.dir/relink.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/relink.c.o.requires + +src/CMakeFiles/splitfs_o.dir/relink.c.o.provides: src/CMakeFiles/splitfs_o.dir/relink.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/relink.c.o.provides + +src/CMakeFiles/splitfs_o.dir/relink.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/relink.c.o + + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/splitfs-posix.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o -c /home/om/wspace/splitfs-new/src/splitfs-posix.c + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/splitfs-posix.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/splitfs-posix.c > CMakeFiles/splitfs_o.dir/splitfs-posix.c.i + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/splitfs-posix.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/splitfs-posix.c -o CMakeFiles/splitfs_o.dir/splitfs-posix.c.s + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o + + +src/CMakeFiles/splitfs_o.dir/staging.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object src/CMakeFiles/splitfs_o.dir/staging.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/staging.c.o -c /home/om/wspace/splitfs-new/src/staging.c + +src/CMakeFiles/splitfs_o.dir/staging.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/staging.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/staging.c > CMakeFiles/splitfs_o.dir/staging.c.i + +src/CMakeFiles/splitfs_o.dir/staging.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/staging.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/staging.c -o CMakeFiles/splitfs_o.dir/staging.c.s + +src/CMakeFiles/splitfs_o.dir/staging.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/staging.c.o.requires + +src/CMakeFiles/splitfs_o.dir/staging.c.o.provides: src/CMakeFiles/splitfs_o.dir/staging.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/staging.c.o.provides + +src/CMakeFiles/splitfs_o.dir/staging.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/staging.c.o + + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/staging_thread.c.o -c /home/om/wspace/splitfs-new/src/staging_thread.c + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/staging_thread.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/staging_thread.c > CMakeFiles/splitfs_o.dir/staging_thread.c.i + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/staging_thread.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/staging_thread.c -o CMakeFiles/splitfs_o.dir/staging_thread.c.s + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o + + +src/CMakeFiles/splitfs_o.dir/stat.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/stat.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object src/CMakeFiles/splitfs_o.dir/stat.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/stat.c.o -c /home/om/wspace/splitfs-new/src/stat.c + +src/CMakeFiles/splitfs_o.dir/stat.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/stat.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/stat.c > CMakeFiles/splitfs_o.dir/stat.c.i + +src/CMakeFiles/splitfs_o.dir/stat.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/stat.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/stat.c -o CMakeFiles/splitfs_o.dir/stat.c.s + +src/CMakeFiles/splitfs_o.dir/stat.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/stat.c.o.requires + +src/CMakeFiles/splitfs_o.dir/stat.c.o.provides: src/CMakeFiles/splitfs_o.dir/stat.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/stat.c.o.provides + +src/CMakeFiles/splitfs_o.dir/stat.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/stat.c.o + + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o -c /home/om/wspace/splitfs-new/src/syscall_early_filter.c + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/syscall_early_filter.c > CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/syscall_early_filter.c -o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o + + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/table_mmaps.c.o -c /home/om/wspace/splitfs-new/src/table_mmaps.c + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/table_mmaps.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/table_mmaps.c > CMakeFiles/splitfs_o.dir/table_mmaps.c.i + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/table_mmaps.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/table_mmaps.c -o CMakeFiles/splitfs_o.dir/table_mmaps.c.s + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o + + +src/CMakeFiles/splitfs_o.dir/truncate.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building C object src/CMakeFiles/splitfs_o.dir/truncate.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/truncate.c.o -c /home/om/wspace/splitfs-new/src/truncate.c + +src/CMakeFiles/splitfs_o.dir/truncate.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/truncate.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/truncate.c > CMakeFiles/splitfs_o.dir/truncate.c.i + +src/CMakeFiles/splitfs_o.dir/truncate.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/truncate.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/truncate.c -o CMakeFiles/splitfs_o.dir/truncate.c.s + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides: src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/truncate.c.o + + +src/CMakeFiles/splitfs_o.dir/unlink.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/unlink.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building C object src/CMakeFiles/splitfs_o.dir/unlink.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/unlink.c.o -c /home/om/wspace/splitfs-new/src/unlink.c + +src/CMakeFiles/splitfs_o.dir/unlink.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/unlink.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/unlink.c > CMakeFiles/splitfs_o.dir/unlink.c.i + +src/CMakeFiles/splitfs_o.dir/unlink.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/unlink.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/unlink.c -o CMakeFiles/splitfs_o.dir/unlink.c.s + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides: src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/unlink.c.o + + +src/CMakeFiles/splitfs_o.dir/utils.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building C object src/CMakeFiles/splitfs_o.dir/utils.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/utils.c.o -c /home/om/wspace/splitfs-new/src/utils.c + +src/CMakeFiles/splitfs_o.dir/utils.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/utils.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/utils.c > CMakeFiles/splitfs_o.dir/utils.c.i + +src/CMakeFiles/splitfs_o.dir/utils.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/utils.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/utils.c -o CMakeFiles/splitfs_o.dir/utils.c.s + +src/CMakeFiles/splitfs_o.dir/utils.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/utils.c.o.requires + +src/CMakeFiles/splitfs_o.dir/utils.c.o.provides: src/CMakeFiles/splitfs_o.dir/utils.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/utils.c.o.provides + +src/CMakeFiles/splitfs_o.dir/utils.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/utils.c.o + + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building C object src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/vfd_table.c.o -c /home/om/wspace/splitfs-new/src/vfd_table.c + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/vfd_table.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/vfd_table.c > CMakeFiles/splitfs_o.dir/vfd_table.c.i + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/vfd_table.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/vfd_table.c -o CMakeFiles/splitfs_o.dir/vfd_table.c.s + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o + + +src/CMakeFiles/splitfs_o.dir/write.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/write.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building C object src/CMakeFiles/splitfs_o.dir/write.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/write.c.o -c /home/om/wspace/splitfs-new/src/write.c + +src/CMakeFiles/splitfs_o.dir/write.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/write.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/write.c > CMakeFiles/splitfs_o.dir/write.c.i + +src/CMakeFiles/splitfs_o.dir/write.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/write.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/write.c -o CMakeFiles/splitfs_o.dir/write.c.s + +src/CMakeFiles/splitfs_o.dir/write.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/write.c.o.requires + +src/CMakeFiles/splitfs_o.dir/write.c.o.provides: src/CMakeFiles/splitfs_o.dir/write.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/write.c.o.provides + +src/CMakeFiles/splitfs_o.dir/write.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/write.c.o + + +splitfs_o: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/execv.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/file.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/fsync.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/inode.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/lseek.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/out.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/preload.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/read.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/relink.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/staging.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/stat.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/truncate.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/unlink.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/utils.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/write.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/build.make + +.PHONY : splitfs_o + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_o.dir/build: splitfs_o + +.PHONY : src/CMakeFiles/splitfs_o.dir/build + +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/execv.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/file.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/inode.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/out.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/preload.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/read.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/relink.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/staging.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/stat.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/utils.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/write.c.o.requires + +.PHONY : src/CMakeFiles/splitfs_o.dir/requires + +src/CMakeFiles/splitfs_o.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_o.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_o.dir/clean + +src/CMakeFiles/splitfs_o.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_o.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake new file mode 100644 index 0000000000..88de8a598b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake @@ -0,0 +1,36 @@ +file(REMOVE_RECURSE + "CMakeFiles/splitfs_o.dir/add_delay.c.o" + "CMakeFiles/splitfs_o.dir/execv.c.o" + "CMakeFiles/splitfs_o.dir/fallocate.c.o" + "CMakeFiles/splitfs_o.dir/file.c.o" + "CMakeFiles/splitfs_o.dir/fsync.c.o" + "CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + "CMakeFiles/splitfs_o.dir/hash_map.c.o" + "CMakeFiles/splitfs_o.dir/inode.c.o" + "CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + "CMakeFiles/splitfs_o.dir/lseek.c.o" + "CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + "CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + "CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + "CMakeFiles/splitfs_o.dir/out.c.o" + "CMakeFiles/splitfs_o.dir/path_resolve.c.o" + "CMakeFiles/splitfs_o.dir/preload.c.o" + "CMakeFiles/splitfs_o.dir/read.c.o" + "CMakeFiles/splitfs_o.dir/relink.c.o" + "CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + "CMakeFiles/splitfs_o.dir/staging.c.o" + "CMakeFiles/splitfs_o.dir/staging_thread.c.o" + "CMakeFiles/splitfs_o.dir/stat.c.o" + "CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + "CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + "CMakeFiles/splitfs_o.dir/truncate.c.o" + "CMakeFiles/splitfs_o.dir/unlink.c.o" + "CMakeFiles/splitfs_o.dir/utils.c.o" + "CMakeFiles/splitfs_o.dir/vfd_table.c.o" + "CMakeFiles/splitfs_o.dir/write.c.o" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_o.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.internal b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.internal new file mode 100644 index 0000000000..c32c6905dc --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.internal @@ -0,0 +1,319 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o + /home/om/wspace/splitfs-new/src/add_delay.c + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/pm_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/execv.c + /home/om/wspace/splitfs-new/src/execv.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/fallocate.c + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/file.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.c + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/truncate.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/fsync.c + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.c + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/hash_map.c + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/inode.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.c + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o + /home/om/wspace/splitfs-new/src/intel_intrin.c + /home/om/wspace/splitfs-new/src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/lseek.c + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/mmap_pool.c + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_thread_pthread.c + /home/om/wspace/splitfs-new/src/out.h +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/os_util_linux.c +src/CMakeFiles/splitfs_o.dir/out.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/out.c + /home/om/wspace/splitfs-new/src/out.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/path_resolve.c + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/preload.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/preload.c + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/syscall_early_filter.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/read.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/read.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/relink.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.c + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/execv.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/splitfs-posix.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/staging.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/staging.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.c + /home/om/wspace/splitfs-new/src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/stat.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/stat.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/syscall_early_filter.c + /home/om/wspace/splitfs-new/src/syscall_early_filter.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.c + /home/om/wspace/splitfs-new/src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/truncate.c + /home/om/wspace/splitfs-new/src/truncate.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/unlink.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/utils.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/utils.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/vfd_table.c + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/write.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h + /home/om/wspace/splitfs-new/src/write.c diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.make new file mode 100644 index 0000000000..c680cbe650 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/depend.make @@ -0,0 +1,319 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.c +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/pm_util.h + +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.c +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/fallocate.c +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/file.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.c +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/truncate.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/fsync.c +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.c +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.c +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.c +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.c +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.h + +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/lseek.c +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.c +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread_pthread.c +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/out.h + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util_linux.c + +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.c +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.h + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/path_resolve.c +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.c +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/syscall_early_filter.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/read.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/read.c +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.c +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/execv.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/splitfs-posix.c +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.c +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.c +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.h + +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/stat.c +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.c +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.h + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.c +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.h + +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.c +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/unlink.c +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.c +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.c +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/write.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/utils.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/write.c + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/flags.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/flags.make new file mode 100644 index 0000000000..7f6695e41c --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/progress.make new file mode 100644 index 0000000000..bc905f9ec9 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_o.dir/progress.make @@ -0,0 +1,30 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 +CMAKE_PROGRESS_9 = 9 +CMAKE_PROGRESS_10 = 10 +CMAKE_PROGRESS_11 = 11 +CMAKE_PROGRESS_12 = 12 +CMAKE_PROGRESS_13 = 13 +CMAKE_PROGRESS_14 = 14 +CMAKE_PROGRESS_15 = 15 +CMAKE_PROGRESS_16 = 16 +CMAKE_PROGRESS_17 = 17 +CMAKE_PROGRESS_18 = 18 +CMAKE_PROGRESS_19 = 19 +CMAKE_PROGRESS_20 = 20 +CMAKE_PROGRESS_21 = 21 +CMAKE_PROGRESS_22 = 22 +CMAKE_PROGRESS_23 = 23 +CMAKE_PROGRESS_24 = 24 +CMAKE_PROGRESS_25 = 25 +CMAKE_PROGRESS_26 = 26 +CMAKE_PROGRESS_27 = 27 +CMAKE_PROGRESS_28 = 28 +CMAKE_PROGRESS_29 = 29 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake new file mode 100644 index 0000000000..bf06eedb87 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake @@ -0,0 +1,18 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + ) + + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/build.make new file mode 100644 index 0000000000..961e900331 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/build.make @@ -0,0 +1,152 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_shared.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_shared.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_shared.dir/flags.make + +# Object files for target splitfs_shared +splitfs_shared_OBJECTS = + +# External object files for target splitfs_shared +splitfs_shared_EXTERNAL_OBJECTS = \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/execv.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/file.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/fsync.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/inode.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/lseek.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/out.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/preload.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/read.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/relink.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/staging.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/stat.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/truncate.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/unlink.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/utils.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/write.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_shared.dir/build.make +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_shared.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Linking C shared library libsplitfs.so" + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/splitfs_shared.dir/link.txt --verbose=$(VERBOSE) + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_symlink_library libsplitfs.so.0.0.0 libsplitfs.so.0 libsplitfs.so + +src/libsplitfs.so.0: src/libsplitfs.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate src/libsplitfs.so.0 + +src/libsplitfs.so: src/libsplitfs.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate src/libsplitfs.so + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_shared.dir/build: src/libsplitfs.so + +.PHONY : src/CMakeFiles/splitfs_shared.dir/build + +src/CMakeFiles/splitfs_shared.dir/requires: + +.PHONY : src/CMakeFiles/splitfs_shared.dir/requires + +src/CMakeFiles/splitfs_shared.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_shared.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_shared.dir/clean + +src/CMakeFiles/splitfs_shared.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_shared.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake new file mode 100644 index 0000000000..8c53c55127 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "libsplitfs.pdb" + "libsplitfs.so" + "libsplitfs.so.0.0.0" + "libsplitfs.so.0" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_shared.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.internal b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/flags.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/flags.make new file mode 100644 index 0000000000..c0a5cc5653 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND -Dsplitfs_shared_EXPORTS + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/link.txt b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/link.txt new file mode 100644 index 0000000000..71b5cc9b6b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -Wl,-z,relro -Wl,--warn-common -shared -Wl,-soname,libsplitfs.so.0 -o libsplitfs.so.0.0.0 CMakeFiles/splitfs_o.dir/add_delay.c.o CMakeFiles/splitfs_o.dir/execv.c.o CMakeFiles/splitfs_o.dir/fallocate.c.o CMakeFiles/splitfs_o.dir/file.c.o CMakeFiles/splitfs_o.dir/fsync.c.o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o CMakeFiles/splitfs_o.dir/hash_map.c.o CMakeFiles/splitfs_o.dir/inode.c.o CMakeFiles/splitfs_o.dir/intel_intrin.c.o CMakeFiles/splitfs_o.dir/lseek.c.o CMakeFiles/splitfs_o.dir/mmap_pool.c.o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o CMakeFiles/splitfs_o.dir/os_util_linux.c.o CMakeFiles/splitfs_o.dir/out.c.o CMakeFiles/splitfs_o.dir/path_resolve.c.o CMakeFiles/splitfs_o.dir/preload.c.o CMakeFiles/splitfs_o.dir/read.c.o CMakeFiles/splitfs_o.dir/relink.c.o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o CMakeFiles/splitfs_o.dir/staging.c.o CMakeFiles/splitfs_o.dir/staging_thread.c.o CMakeFiles/splitfs_o.dir/stat.c.o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o CMakeFiles/splitfs_o.dir/table_mmaps.c.o CMakeFiles/splitfs_o.dir/truncate.c.o CMakeFiles/splitfs_o.dir/unlink.c.o CMakeFiles/splitfs_o.dir/utils.c.o CMakeFiles/splitfs_o.dir/vfd_table.c.o CMakeFiles/splitfs_o.dir/write.c.o -lsyscall_intercept -lcap -lpthread -ldl -lrt -Wl,--version-script=/home/om/wspace/splitfs-new/src/libsplitfs.map diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/progress.make new file mode 100644 index 0000000000..3040898ab1 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_shared.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 30 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/build.make new file mode 100644 index 0000000000..f4d7368c4f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/build.make @@ -0,0 +1,81 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for splitfs_static. + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_static.dir/progress.make + +src/CMakeFiles/splitfs_static: src/libsplitfs.a + + +src/libsplitfs.a: src/libsplitfs_unscoped.a + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating libsplitfs.a" + cd /home/om/wspace/splitfs-new/build/src && objcopy --localize-hidden `sed -n 's/^\s*\([a-zA-Z0-9_]*\);$$/-G\ \1/p' /home/om/wspace/splitfs-new/src/libsplitfs.map` libsplitfs_unscoped.a libsplitfs.a + +splitfs_static: src/CMakeFiles/splitfs_static +splitfs_static: src/libsplitfs.a +splitfs_static: src/CMakeFiles/splitfs_static.dir/build.make + +.PHONY : splitfs_static + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_static.dir/build: splitfs_static + +.PHONY : src/CMakeFiles/splitfs_static.dir/build + +src/CMakeFiles/splitfs_static.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_static.dir/clean + +src/CMakeFiles/splitfs_static.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_static.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake new file mode 100644 index 0000000000..7e0291a09f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/splitfs_static" + "libsplitfs.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/splitfs_static.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.internal b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/progress.make new file mode 100644 index 0000000000..a3100dd4e8 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 31 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make new file mode 100644 index 0000000000..6d066c27bb --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make @@ -0,0 +1,146 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_static_unscoped.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_static_unscoped.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_static_unscoped.dir/flags.make + +# Object files for target splitfs_static_unscoped +splitfs_static_unscoped_OBJECTS = + +# External object files for target splitfs_static_unscoped +splitfs_static_unscoped_EXTERNAL_OBJECTS = \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/execv.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/file.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/fsync.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/inode.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/lseek.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/out.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/preload.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/read.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/relink.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/staging.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/stat.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/truncate.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/unlink.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/utils.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/write.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_static_unscoped.dir/build.make +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_static_unscoped.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Linking C static library libsplitfs_unscoped.a" + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/splitfs_static_unscoped.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_static_unscoped.dir/build: src/libsplitfs_unscoped.a + +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/build + +src/CMakeFiles/splitfs_static_unscoped.dir/requires: + +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/requires + +src/CMakeFiles/splitfs_static_unscoped.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/clean + +src/CMakeFiles/splitfs_static_unscoped.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/depend + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake new file mode 100644 index 0000000000..54d9c4a6a4 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "libsplitfs_unscoped.pdb" + "libsplitfs_unscoped.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake new file mode 100644 index 0000000000..6e5066cc09 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libsplitfs_unscoped.a" +) diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make new file mode 100644 index 0000000000..7f6695e41c --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt new file mode 100644 index 0000000000..fe613badc3 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libsplitfs_unscoped.a CMakeFiles/splitfs_o.dir/add_delay.c.o CMakeFiles/splitfs_o.dir/execv.c.o CMakeFiles/splitfs_o.dir/fallocate.c.o CMakeFiles/splitfs_o.dir/file.c.o CMakeFiles/splitfs_o.dir/fsync.c.o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o CMakeFiles/splitfs_o.dir/hash_map.c.o CMakeFiles/splitfs_o.dir/inode.c.o CMakeFiles/splitfs_o.dir/intel_intrin.c.o CMakeFiles/splitfs_o.dir/lseek.c.o CMakeFiles/splitfs_o.dir/mmap_pool.c.o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o CMakeFiles/splitfs_o.dir/os_util_linux.c.o CMakeFiles/splitfs_o.dir/out.c.o CMakeFiles/splitfs_o.dir/path_resolve.c.o CMakeFiles/splitfs_o.dir/preload.c.o CMakeFiles/splitfs_o.dir/read.c.o CMakeFiles/splitfs_o.dir/relink.c.o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o CMakeFiles/splitfs_o.dir/staging.c.o CMakeFiles/splitfs_o.dir/staging_thread.c.o CMakeFiles/splitfs_o.dir/stat.c.o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o CMakeFiles/splitfs_o.dir/table_mmaps.c.o CMakeFiles/splitfs_o.dir/truncate.c.o CMakeFiles/splitfs_o.dir/unlink.c.o CMakeFiles/splitfs_o.dir/utils.c.o CMakeFiles/splitfs_o.dir/vfd_table.c.o CMakeFiles/splitfs_o.dir/write.c.o +/usr/bin/ranlib libsplitfs_unscoped.a diff --git a/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make new file mode 100644 index 0000000000..044b5ab390 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 32 + diff --git a/splitfs_syscall_intercept/build/src/Makefile b/splitfs_syscall_intercept/build/src/Makefile new file mode 100644 index 0000000000..42cb546467 --- /dev/null +++ b/splitfs_syscall_intercept/build/src/Makefile @@ -0,0 +1,1148 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles /home/om/wspace/splitfs-new/build/src/CMakeFiles/progress.marks + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +src/CMakeFiles/check-whitespace-splitfs.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/check-whitespace-splitfs.dir/rule +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/rule + +# Convenience name for target. +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/rule + +.PHONY : check-whitespace-splitfs + +# fast build rule for target. +check-whitespace-splitfs/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build +.PHONY : check-whitespace-splitfs/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_static.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static.dir/rule +.PHONY : src/CMakeFiles/splitfs_static.dir/rule + +# Convenience name for target. +splitfs_static: src/CMakeFiles/splitfs_static.dir/rule + +.PHONY : splitfs_static + +# fast build rule for target. +splitfs_static/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build +.PHONY : splitfs_static/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_o.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_o.dir/rule +.PHONY : src/CMakeFiles/splitfs_o.dir/rule + +# Convenience name for target. +splitfs_o: src/CMakeFiles/splitfs_o.dir/rule + +.PHONY : splitfs_o + +# fast build rule for target. +splitfs_o/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build +.PHONY : splitfs_o/fast + +# Convenience name for target. +src/CMakeFiles/cstyle-splitfs.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/cstyle-splitfs.dir/rule +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/rule + +# Convenience name for target. +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/rule + +.PHONY : cstyle-splitfs + +# fast build rule for target. +cstyle-splitfs/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build +.PHONY : cstyle-splitfs/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_static_unscoped.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static_unscoped.dir/rule +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/rule + +# Convenience name for target. +splitfs_static_unscoped: src/CMakeFiles/splitfs_static_unscoped.dir/rule + +.PHONY : splitfs_static_unscoped + +# fast build rule for target. +splitfs_static_unscoped/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build +.PHONY : splitfs_static_unscoped/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_shared.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_shared.dir/rule +.PHONY : src/CMakeFiles/splitfs_shared.dir/rule + +# Convenience name for target. +splitfs_shared: src/CMakeFiles/splitfs_shared.dir/rule + +.PHONY : splitfs_shared + +# fast build rule for target. +splitfs_shared/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build +.PHONY : splitfs_shared/fast + +add_delay.o: add_delay.c.o + +.PHONY : add_delay.o + +# target to build an object file +add_delay.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.o +.PHONY : add_delay.c.o + +add_delay.i: add_delay.c.i + +.PHONY : add_delay.i + +# target to preprocess a source file +add_delay.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.i +.PHONY : add_delay.c.i + +add_delay.s: add_delay.c.s + +.PHONY : add_delay.s + +# target to generate assembly for a file +add_delay.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.s +.PHONY : add_delay.c.s + +execv.o: execv.c.o + +.PHONY : execv.o + +# target to build an object file +execv.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.o +.PHONY : execv.c.o + +execv.i: execv.c.i + +.PHONY : execv.i + +# target to preprocess a source file +execv.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.i +.PHONY : execv.c.i + +execv.s: execv.c.s + +.PHONY : execv.s + +# target to generate assembly for a file +execv.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.s +.PHONY : execv.c.s + +fallocate.o: fallocate.c.o + +.PHONY : fallocate.o + +# target to build an object file +fallocate.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.o +.PHONY : fallocate.c.o + +fallocate.i: fallocate.c.i + +.PHONY : fallocate.i + +# target to preprocess a source file +fallocate.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.i +.PHONY : fallocate.c.i + +fallocate.s: fallocate.c.s + +.PHONY : fallocate.s + +# target to generate assembly for a file +fallocate.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.s +.PHONY : fallocate.c.s + +file.o: file.c.o + +.PHONY : file.o + +# target to build an object file +file.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.o +.PHONY : file.c.o + +file.i: file.c.i + +.PHONY : file.i + +# target to preprocess a source file +file.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.i +.PHONY : file.c.i + +file.s: file.c.s + +.PHONY : file.s + +# target to generate assembly for a file +file.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.s +.PHONY : file.c.s + +fsync.o: fsync.c.o + +.PHONY : fsync.o + +# target to build an object file +fsync.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.o +.PHONY : fsync.c.o + +fsync.i: fsync.c.i + +.PHONY : fsync.i + +# target to preprocess a source file +fsync.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.i +.PHONY : fsync.c.i + +fsync.s: fsync.c.s + +.PHONY : fsync.s + +# target to generate assembly for a file +fsync.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.s +.PHONY : fsync.c.s + +handle_mmaps.o: handle_mmaps.c.o + +.PHONY : handle_mmaps.o + +# target to build an object file +handle_mmaps.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +.PHONY : handle_mmaps.c.o + +handle_mmaps.i: handle_mmaps.c.i + +.PHONY : handle_mmaps.i + +# target to preprocess a source file +handle_mmaps.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.i +.PHONY : handle_mmaps.c.i + +handle_mmaps.s: handle_mmaps.c.s + +.PHONY : handle_mmaps.s + +# target to generate assembly for a file +handle_mmaps.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.s +.PHONY : handle_mmaps.c.s + +hash_map.o: hash_map.c.o + +.PHONY : hash_map.o + +# target to build an object file +hash_map.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.o +.PHONY : hash_map.c.o + +hash_map.i: hash_map.c.i + +.PHONY : hash_map.i + +# target to preprocess a source file +hash_map.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.i +.PHONY : hash_map.c.i + +hash_map.s: hash_map.c.s + +.PHONY : hash_map.s + +# target to generate assembly for a file +hash_map.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.s +.PHONY : hash_map.c.s + +inode.o: inode.c.o + +.PHONY : inode.o + +# target to build an object file +inode.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.o +.PHONY : inode.c.o + +inode.i: inode.c.i + +.PHONY : inode.i + +# target to preprocess a source file +inode.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.i +.PHONY : inode.c.i + +inode.s: inode.c.s + +.PHONY : inode.s + +# target to generate assembly for a file +inode.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.s +.PHONY : inode.c.s + +intel_intrin.o: intel_intrin.c.o + +.PHONY : intel_intrin.o + +# target to build an object file +intel_intrin.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +.PHONY : intel_intrin.c.o + +intel_intrin.i: intel_intrin.c.i + +.PHONY : intel_intrin.i + +# target to preprocess a source file +intel_intrin.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.i +.PHONY : intel_intrin.c.i + +intel_intrin.s: intel_intrin.c.s + +.PHONY : intel_intrin.s + +# target to generate assembly for a file +intel_intrin.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.s +.PHONY : intel_intrin.c.s + +lseek.o: lseek.c.o + +.PHONY : lseek.o + +# target to build an object file +lseek.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.o +.PHONY : lseek.c.o + +lseek.i: lseek.c.i + +.PHONY : lseek.i + +# target to preprocess a source file +lseek.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.i +.PHONY : lseek.c.i + +lseek.s: lseek.c.s + +.PHONY : lseek.s + +# target to generate assembly for a file +lseek.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.s +.PHONY : lseek.c.s + +mmap_pool.o: mmap_pool.c.o + +.PHONY : mmap_pool.o + +# target to build an object file +mmap_pool.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +.PHONY : mmap_pool.c.o + +mmap_pool.i: mmap_pool.c.i + +.PHONY : mmap_pool.i + +# target to preprocess a source file +mmap_pool.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.i +.PHONY : mmap_pool.c.i + +mmap_pool.s: mmap_pool.c.s + +.PHONY : mmap_pool.s + +# target to generate assembly for a file +mmap_pool.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.s +.PHONY : mmap_pool.c.s + +os_thread_pthread.o: os_thread_pthread.c.o + +.PHONY : os_thread_pthread.o + +# target to build an object file +os_thread_pthread.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +.PHONY : os_thread_pthread.c.o + +os_thread_pthread.i: os_thread_pthread.c.i + +.PHONY : os_thread_pthread.i + +# target to preprocess a source file +os_thread_pthread.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i +.PHONY : os_thread_pthread.c.i + +os_thread_pthread.s: os_thread_pthread.c.s + +.PHONY : os_thread_pthread.s + +# target to generate assembly for a file +os_thread_pthread.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s +.PHONY : os_thread_pthread.c.s + +os_util_linux.o: os_util_linux.c.o + +.PHONY : os_util_linux.o + +# target to build an object file +os_util_linux.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +.PHONY : os_util_linux.c.o + +os_util_linux.i: os_util_linux.c.i + +.PHONY : os_util_linux.i + +# target to preprocess a source file +os_util_linux.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.i +.PHONY : os_util_linux.c.i + +os_util_linux.s: os_util_linux.c.s + +.PHONY : os_util_linux.s + +# target to generate assembly for a file +os_util_linux.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.s +.PHONY : os_util_linux.c.s + +out.o: out.c.o + +.PHONY : out.o + +# target to build an object file +out.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.o +.PHONY : out.c.o + +out.i: out.c.i + +.PHONY : out.i + +# target to preprocess a source file +out.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.i +.PHONY : out.c.i + +out.s: out.c.s + +.PHONY : out.s + +# target to generate assembly for a file +out.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.s +.PHONY : out.c.s + +path_resolve.o: path_resolve.c.o + +.PHONY : path_resolve.o + +# target to build an object file +path_resolve.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +.PHONY : path_resolve.c.o + +path_resolve.i: path_resolve.c.i + +.PHONY : path_resolve.i + +# target to preprocess a source file +path_resolve.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.i +.PHONY : path_resolve.c.i + +path_resolve.s: path_resolve.c.s + +.PHONY : path_resolve.s + +# target to generate assembly for a file +path_resolve.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.s +.PHONY : path_resolve.c.s + +preload.o: preload.c.o + +.PHONY : preload.o + +# target to build an object file +preload.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.o +.PHONY : preload.c.o + +preload.i: preload.c.i + +.PHONY : preload.i + +# target to preprocess a source file +preload.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.i +.PHONY : preload.c.i + +preload.s: preload.c.s + +.PHONY : preload.s + +# target to generate assembly for a file +preload.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.s +.PHONY : preload.c.s + +read.o: read.c.o + +.PHONY : read.o + +# target to build an object file +read.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.o +.PHONY : read.c.o + +read.i: read.c.i + +.PHONY : read.i + +# target to preprocess a source file +read.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.i +.PHONY : read.c.i + +read.s: read.c.s + +.PHONY : read.s + +# target to generate assembly for a file +read.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.s +.PHONY : read.c.s + +relink.o: relink.c.o + +.PHONY : relink.o + +# target to build an object file +relink.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.o +.PHONY : relink.c.o + +relink.i: relink.c.i + +.PHONY : relink.i + +# target to preprocess a source file +relink.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.i +.PHONY : relink.c.i + +relink.s: relink.c.s + +.PHONY : relink.s + +# target to generate assembly for a file +relink.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.s +.PHONY : relink.c.s + +splitfs-posix.o: splitfs-posix.c.o + +.PHONY : splitfs-posix.o + +# target to build an object file +splitfs-posix.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +.PHONY : splitfs-posix.c.o + +splitfs-posix.i: splitfs-posix.c.i + +.PHONY : splitfs-posix.i + +# target to preprocess a source file +splitfs-posix.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.i +.PHONY : splitfs-posix.c.i + +splitfs-posix.s: splitfs-posix.c.s + +.PHONY : splitfs-posix.s + +# target to generate assembly for a file +splitfs-posix.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.s +.PHONY : splitfs-posix.c.s + +staging.o: staging.c.o + +.PHONY : staging.o + +# target to build an object file +staging.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.o +.PHONY : staging.c.o + +staging.i: staging.c.i + +.PHONY : staging.i + +# target to preprocess a source file +staging.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.i +.PHONY : staging.c.i + +staging.s: staging.c.s + +.PHONY : staging.s + +# target to generate assembly for a file +staging.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.s +.PHONY : staging.c.s + +staging_thread.o: staging_thread.c.o + +.PHONY : staging_thread.o + +# target to build an object file +staging_thread.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +.PHONY : staging_thread.c.o + +staging_thread.i: staging_thread.c.i + +.PHONY : staging_thread.i + +# target to preprocess a source file +staging_thread.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.i +.PHONY : staging_thread.c.i + +staging_thread.s: staging_thread.c.s + +.PHONY : staging_thread.s + +# target to generate assembly for a file +staging_thread.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.s +.PHONY : staging_thread.c.s + +stat.o: stat.c.o + +.PHONY : stat.o + +# target to build an object file +stat.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.o +.PHONY : stat.c.o + +stat.i: stat.c.i + +.PHONY : stat.i + +# target to preprocess a source file +stat.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.i +.PHONY : stat.c.i + +stat.s: stat.c.s + +.PHONY : stat.s + +# target to generate assembly for a file +stat.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.s +.PHONY : stat.c.s + +syscall_early_filter.o: syscall_early_filter.c.o + +.PHONY : syscall_early_filter.o + +# target to build an object file +syscall_early_filter.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +.PHONY : syscall_early_filter.c.o + +syscall_early_filter.i: syscall_early_filter.c.i + +.PHONY : syscall_early_filter.i + +# target to preprocess a source file +syscall_early_filter.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i +.PHONY : syscall_early_filter.c.i + +syscall_early_filter.s: syscall_early_filter.c.s + +.PHONY : syscall_early_filter.s + +# target to generate assembly for a file +syscall_early_filter.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s +.PHONY : syscall_early_filter.c.s + +table_mmaps.o: table_mmaps.c.o + +.PHONY : table_mmaps.o + +# target to build an object file +table_mmaps.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +.PHONY : table_mmaps.c.o + +table_mmaps.i: table_mmaps.c.i + +.PHONY : table_mmaps.i + +# target to preprocess a source file +table_mmaps.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.i +.PHONY : table_mmaps.c.i + +table_mmaps.s: table_mmaps.c.s + +.PHONY : table_mmaps.s + +# target to generate assembly for a file +table_mmaps.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.s +.PHONY : table_mmaps.c.s + +truncate.o: truncate.c.o + +.PHONY : truncate.o + +# target to build an object file +truncate.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.o +.PHONY : truncate.c.o + +truncate.i: truncate.c.i + +.PHONY : truncate.i + +# target to preprocess a source file +truncate.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.i +.PHONY : truncate.c.i + +truncate.s: truncate.c.s + +.PHONY : truncate.s + +# target to generate assembly for a file +truncate.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.s +.PHONY : truncate.c.s + +unlink.o: unlink.c.o + +.PHONY : unlink.o + +# target to build an object file +unlink.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.o +.PHONY : unlink.c.o + +unlink.i: unlink.c.i + +.PHONY : unlink.i + +# target to preprocess a source file +unlink.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.i +.PHONY : unlink.c.i + +unlink.s: unlink.c.s + +.PHONY : unlink.s + +# target to generate assembly for a file +unlink.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.s +.PHONY : unlink.c.s + +utils.o: utils.c.o + +.PHONY : utils.o + +# target to build an object file +utils.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.o +.PHONY : utils.c.o + +utils.i: utils.c.i + +.PHONY : utils.i + +# target to preprocess a source file +utils.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.i +.PHONY : utils.c.i + +utils.s: utils.c.s + +.PHONY : utils.s + +# target to generate assembly for a file +utils.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.s +.PHONY : utils.c.s + +vfd_table.o: vfd_table.c.o + +.PHONY : vfd_table.o + +# target to build an object file +vfd_table.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +.PHONY : vfd_table.c.o + +vfd_table.i: vfd_table.c.i + +.PHONY : vfd_table.i + +# target to preprocess a source file +vfd_table.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.i +.PHONY : vfd_table.c.i + +vfd_table.s: vfd_table.c.s + +.PHONY : vfd_table.s + +# target to generate assembly for a file +vfd_table.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.s +.PHONY : vfd_table.c.s + +write.o: write.c.o + +.PHONY : write.o + +# target to build an object file +write.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.o +.PHONY : write.c.o + +write.i: write.c.i + +.PHONY : write.i + +# target to preprocess a source file +write.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.i +.PHONY : write.c.i + +write.s: write.c.s + +.PHONY : write.s + +# target to generate assembly for a file +write.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.s +.PHONY : write.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... check-whitespace-splitfs" + @echo "... splitfs_static" + @echo "... splitfs_o" + @echo "... rebuild_cache" + @echo "... list_install_components" + @echo "... cstyle-splitfs" + @echo "... install/strip" + @echo "... splitfs_static_unscoped" + @echo "... install/local" + @echo "... splitfs_shared" + @echo "... edit_cache" + @echo "... add_delay.o" + @echo "... add_delay.i" + @echo "... add_delay.s" + @echo "... execv.o" + @echo "... execv.i" + @echo "... execv.s" + @echo "... fallocate.o" + @echo "... fallocate.i" + @echo "... fallocate.s" + @echo "... file.o" + @echo "... file.i" + @echo "... file.s" + @echo "... fsync.o" + @echo "... fsync.i" + @echo "... fsync.s" + @echo "... handle_mmaps.o" + @echo "... handle_mmaps.i" + @echo "... handle_mmaps.s" + @echo "... hash_map.o" + @echo "... hash_map.i" + @echo "... hash_map.s" + @echo "... inode.o" + @echo "... inode.i" + @echo "... inode.s" + @echo "... intel_intrin.o" + @echo "... intel_intrin.i" + @echo "... intel_intrin.s" + @echo "... lseek.o" + @echo "... lseek.i" + @echo "... lseek.s" + @echo "... mmap_pool.o" + @echo "... mmap_pool.i" + @echo "... mmap_pool.s" + @echo "... os_thread_pthread.o" + @echo "... os_thread_pthread.i" + @echo "... os_thread_pthread.s" + @echo "... os_util_linux.o" + @echo "... os_util_linux.i" + @echo "... os_util_linux.s" + @echo "... out.o" + @echo "... out.i" + @echo "... out.s" + @echo "... path_resolve.o" + @echo "... path_resolve.i" + @echo "... path_resolve.s" + @echo "... preload.o" + @echo "... preload.i" + @echo "... preload.s" + @echo "... read.o" + @echo "... read.i" + @echo "... read.s" + @echo "... relink.o" + @echo "... relink.i" + @echo "... relink.s" + @echo "... splitfs-posix.o" + @echo "... splitfs-posix.i" + @echo "... splitfs-posix.s" + @echo "... staging.o" + @echo "... staging.i" + @echo "... staging.s" + @echo "... staging_thread.o" + @echo "... staging_thread.i" + @echo "... staging_thread.s" + @echo "... stat.o" + @echo "... stat.i" + @echo "... stat.s" + @echo "... syscall_early_filter.o" + @echo "... syscall_early_filter.i" + @echo "... syscall_early_filter.s" + @echo "... table_mmaps.o" + @echo "... table_mmaps.i" + @echo "... table_mmaps.s" + @echo "... truncate.o" + @echo "... truncate.i" + @echo "... truncate.s" + @echo "... unlink.o" + @echo "... unlink.i" + @echo "... unlink.s" + @echo "... utils.o" + @echo "... utils.i" + @echo "... utils.s" + @echo "... vfd_table.o" + @echo "... vfd_table.i" + @echo "... vfd_table.s" + @echo "... write.o" + @echo "... write.i" + @echo "... write.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/build/src/cmake_install.cmake b/splitfs_syscall_intercept/build/src/cmake_install.cmake new file mode 100644 index 0000000000..03c635148b --- /dev/null +++ b/splitfs_syscall_intercept/build/src/cmake_install.cmake @@ -0,0 +1,102 @@ +# Install script for directory: /home/om/wspace/splitfs-new/src + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee]|[Nn][Oo][Nn][Ee]|[Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + file(RPATH_CHECK + FILE "${file}" + RPATH "") + endif() + endforeach() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" + ) + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "${file}") + endif() + endif() + endforeach() + endif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee]|[Nn][Oo][Nn][Ee]|[Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + file(RPATH_CHECK + FILE "${file}" + RPATH "") + endif() + endforeach() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug" TYPE SHARED_LIBRARY FILES + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" + ) + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "${file}") + endif() + endif() + endforeach() + endif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") +endif() + diff --git a/splitfs_syscall_intercept/build/src/libsplitfs.a b/splitfs_syscall_intercept/build/src/libsplitfs.a new file mode 100644 index 0000000000000000000000000000000000000000..2dde12d997691b847b4a692c94ee7eb8c5b5ad83 GIT binary patch literal 729156 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 yxrU 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 B1`YrK literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/build/src/libsplitfs.so b/splitfs_syscall_intercept/build/src/libsplitfs.so new file mode 120000 index 0000000000..e1939fe0df --- /dev/null +++ b/splitfs_syscall_intercept/build/src/libsplitfs.so @@ -0,0 +1 @@ +libsplitfs.so.0 \ No newline at end of file diff --git a/splitfs_syscall_intercept/build/src/libsplitfs.so.0 b/splitfs_syscall_intercept/build/src/libsplitfs.so.0 new file mode 120000 index 0000000000..1d62d8ebad --- /dev/null +++ b/splitfs_syscall_intercept/build/src/libsplitfs.so.0 @@ -0,0 +1 @@ +libsplitfs.so.0.0.0 \ No newline at end of file diff --git a/splitfs_syscall_intercept/build/src/libsplitfs.so.0.0.0 b/splitfs_syscall_intercept/build/src/libsplitfs.so.0.0.0 new file mode 100755 index 0000000000000000000000000000000000000000..bc6e561e651cfa466800bd6ac6e1e888a1b5e789 GIT binary patch literal 352568 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Ξ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¨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�Q;jy=cFz&6MmP@bfQ1P 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ð$FZ>syYbiQr3$O0Mov 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

E!jqoFv0Mj$Nj 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

CZBLnRDEcwNy!==U9th=GGT7F6HJk|0IjQh4Gmd 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 QtVe5^_wtVw2;C~ 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/cmake_uninstall.cmake.in b/splitfs_syscall_intercept/cmake_uninstall.cmake.in new file mode 100644 index 0000000000..9dd59db7dd --- /dev/null +++ b/splitfs_syscall_intercept/cmake_uninstall.cmake.in @@ -0,0 +1,22 @@ +# From: https://cmake.org/Wiki/CMake_FAQ + +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program("@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/splitfs_syscall_intercept/include/splitfs-posix.h b/splitfs_syscall_intercept/include/splitfs-posix.h new file mode 100644 index 0000000000..7c960672aa --- /dev/null +++ b/splitfs_syscall_intercept/include/splitfs-posix.h @@ -0,0 +1,95 @@ +/* + * ===================================================================================== + * + * Filename: splitfs-posix.h + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:58:57 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_POSIX_H +#define SPLITFS_POSIX_H + +#include +#include +#include +#include +#include + +typedef struct splitfs_file SPLITFSfile; + +#define SPLITFS_O_RDONLY 00 +#define SPLITFS_O_WRONLY 01 +#define SPLITFS_O_RDWR 02 +#define SPLITFS_O_ACCMODE 0003 + +#define SPLITFS_O_CREAT 0100 +#define SPLITFS_O_EXCL 0200 +#define SPLITFS_O_NOCTTY 0400 +#define SPLITFS_O_TRUNC 01000 +#define SPLITFS_O_APPEND 02000 +#define SPLITFS_O_NONBLOCK 04000 +#define SPLITFS_O_NDELAY SPLITFS_O_NONBLOCK +#define SPLITFS_O_SYNC 04010000 +#define SPLITFS_O_ASYNC 020000 + +#define SPLITFS_O_LARGEFILE 0 +#define SPLITFS_O_DIRECTORY 0200000 +#define SPLITFS_O_NOFOLLOW 0400000 +#define SPLITFS_O_CLOEXEC 02000000 +#define SPLITFS_O_DIRECT 040000 +#define SPLITFS_O_NOATIME 01000000 +#define SPLITFS_O_PATH 010000000 +#define SPLITFS_O_DSYNC 010000 +#define SPLITFS_O_TMPFILE (020000000 | SPLITFS_O_DIRECTORY) + +#define SPLITFS_S_IFREG 0100000 + +#define SPLITFS_ALLPERMS 07777 + +#define SPLITFS_SEEK_SET 0 +#define SPLITFS_SEEK_CUR 1 +#define SPLITFS_SEEK_END 2 +#define SPLITFS_SEEK_DATA 3 +#define SPLITFS_SEEK_HOLE 4 + +#define PAGE_SIZE 4096 + +SPLITFSfile *splitfs_openat(const char *path, long flags, ...); +long splitfs_close(long fd, SPLITFSfile *file); +int splitfs_fallocate(long fd, SPLITFSfile *file, int mode, off_t offset, off_t length); +int splitfs_posix_fallocate(long fd, SPLITFSfile *file, int mode, off_t offset, off_t length); +int splitfs_fstatat(const char* path, struct stat *buf, int flags); +int splitfs_fstat(long fd, SPLITFSfile *file, struct stat *buf); +int splitfs_lstat(const char* path, struct stat* buf); +int splitfs_stat(const char* path, struct stat* buf); +ssize_t splitfs_readv(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt); +ssize_t splitfs_pread(long fd, SPLITFSfile *file, void *buf, size_t count, off_t offset); +ssize_t splitfs_preadv(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt, off_t offset); +ssize_t splitfs_read(long fd, SPLITFSfile *file, void* buf, size_t count); +ssize_t splitfs_write(long fd, SPLITFSfile *file, const void* buf, size_t count); +ssize_t splitfs_writev(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt); +ssize_t splitfs_pwrite(long fd, SPLITFSfile *file, const void* buf, size_t count, off_t offset); +ssize_t splitfs_pwritev(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt, off_t offset); +int splitfs_unlinkat(const char* pathname, long flags); +int splitfs_unlink(const char* pathname); +long splitfs_truncate(const char* path, off_t length); +off_t splitfs_lseek(long fd, SPLITFSfile *file, off_t offset, int whence); +long splitfs_ftruncate(long fd, SPLITFSfile *file, off_t length); +long splitfs_fsync(long fd, SPLITFSfile *file); +long splitfs_fdatasync(long fd, SPLITFSfile *file); +int splitfs_execv(void); + +const char *splitfs_errormsg(void); + +#endif + diff --git a/splitfs_syscall_intercept/src/CMakeLists.txt b/splitfs_syscall_intercept/src/CMakeLists.txt new file mode 100644 index 0000000000..4c3da34c9a --- /dev/null +++ b/splitfs_syscall_intercept/src/CMakeLists.txt @@ -0,0 +1,114 @@ +set(SOURCES + add_delay.c + execv.c + fallocate.c + file.c + fsync.c + handle_mmaps.c + hash_map.c + inode.c + intel_intrin.c + lseek.c + mmap_pool.c + os_thread_pthread.c + os_util_linux.c + out.c + path_resolve.c + preload.c + read.c + relink.c + splitfs-posix.c + staging.c + staging_thread.c + stat.c + syscall_early_filter.c + table_mmaps.c + truncate.c + unlink.c + utils.c + vfd_table.c + write.c + ) + +set(EXPORTED_SYMBOLS + splitfs_fallocate + splitfs_file + splitfs_fsync + splitfs_lseek + splitfs_read + splitfs_stat + splitfs_truncate + splitfs_unlink + splitfs_write + splitfs_execv + ) + +if(PKG_CONFIG_FOUND) + pkg_check_modules(SYSCALL_INTERCEPT libsyscall_intercept) + pkg_check_modules(CAP libcap) +else() + find_package(SYSCALL_INTERCEPT QUIET) + find_package(CAP QUIET) +endif() + +if(NOT SYSCALL_INTERCEPT_FOUND) + message(FATAL_ERROR + "libsyscall_intercept not found - needed by libpmemfile + to skip building libpmemfile, set the BUILD_LIBPMEMFILE option to OFF") +endif() + +if(NOT CAP_FOUND) + message(FATAL_ERROR + "libcap not found - needed by libpmemfile + to skip building libpmemfile, set the BUILD_LIBPMEMFILE option to OFF") +endif() + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# XXX OBJECT library type is not supported on some old cmake versions +add_library(splitfs_o OBJECT ${SOURCES}) + +include_directories(${SYSCALL_INTERCEPT_INCLUDE_DIRS} ..) +link_directories(${SYSCALL_INTERCEPT_LIBRARY_DIRS}) + +add_library(splitfs_shared SHARED $) +add_library(splitfs_static_unscoped STATIC $) + +target_link_libraries(splitfs_shared PRIVATE ${SYSCALL_INTERCEPT_LIBRARIES}) +target_link_libraries(splitfs_shared PRIVATE ${CAP_LIBRARIES}) +target_link_libraries(splitfs_shared PRIVATE ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(splitfs_shared PRIVATE ${CMAKE_DL_LIBS}) +target_link_libraries(splitfs_shared PRIVATE rt) +target_link_libraries(splitfs_shared PRIVATE + -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libsplitfs.map) + +set_target_properties(splitfs_static_unscoped PROPERTIES OUTPUT_NAME splitfs_unscoped) +set_target_properties(splitfs_shared PROPERTIES OUTPUT_NAME splitfs) +set_target_properties(splitfs_shared PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) + +add_custom_command(OUTPUT libsplitfs.a + COMMAND objcopy --localize-hidden `sed -n + "'s/^\\s*\\([a-zA-Z0-9_]*\\);$$/-G \\1/p'" + ${CMAKE_CURRENT_SOURCE_DIR}/libsplitfs.map` libsplitfs_unscoped.a + libsplitfs.a + DEPENDS splitfs_static_unscoped) +add_custom_target(splitfs_static ALL DEPENDS libsplitfs.a) + +install(TARGETS splitfs_shared LIBRARY + CONFIGURATIONS Release None RelWithDebInfo + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +install(TARGETS splitfs_shared LIBRARY + CONFIGURATIONS Debug + DESTINATION ${CMAKE_INSTALL_LIBDIR}/splitfs_debug) + +#install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpmemfile.a +# CONFIGURATIONS Release None +# DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +#install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpmemfile.a +# CONFIGURATIONS Debug +# DESTINATION ${CMAKE_INSTALL_LIBDIR}/pmemfile_debug) + +add_cstyle(splitfs) +add_check_whitespace(splitfs) diff --git a/splitfs_syscall_intercept/src/add_delay.c b/splitfs_syscall_intercept/src/add_delay.c new file mode 100755 index 0000000000..617eee639a --- /dev/null +++ b/splitfs_syscall_intercept/src/add_delay.c @@ -0,0 +1,97 @@ +#include "add_delay.h" + +// Set CPU frequency correctly +#define _CPUFREQ 3600LLU /* MHz */ + +#define NS2CYCLE(__ns) (((__ns) * _CPUFREQ) / 1000) + +#define BANDWIDTH_MONITOR_NS 10000 +#define SEC_TO_NS(x) (x * 1000000000UL) + +#define ENABLE_PERF_MODEL + +// performance parameters +/* SCM read extra latency than DRAM */ +uint32_t SCM_EXTRA_READ_LATENCY_NS = 220; +// We assume WBARRIER LATENCY is 0 since write back queue can hide this even in +// power failure. +// https://software.intel.com/en-us/blogs/2016/09/12/deprecate-pcommit-instruction +uint32_t SCM_WBARRIER_LATENCY_NS = 0; + +/* SCM write bandwidth */ +uint32_t SCM_BANDWIDTH_MB = 21000; +/* DRAM system peak bandwidth */ +uint32_t DRAM_BANDWIDTH_MB = 63000; + +uint64_t bandwidth_consumption; +static uint64_t monitor_start = 0, monitor_end = 0, now = 0; + +pthread_mutex_t mlfs_nvm_mutex; + +static inline void PERSISTENT_BARRIER(void) +{ + asm volatile ("sfence\n" : : ); +} + +/////////////////////////////////////////////////////// + +static inline void emulate_latency_ns(unsigned long long ns) +{ + uint64_t cycles, start, stop; + + start = asm_rdtscp(); + cycles = NS2CYCLE(ns); + + do { + /* RDTSC doesn't necessarily wait for previous instructions to complete + * so a serializing instruction is usually used to ensure previous + * instructions have completed. However, in our case this is a desirable + * property since we want to overlap the latency we emulate with the + * actual latency of the emulated instruction. + */ + stop = asm_rdtscp(); + } while (stop - start < cycles); +} + +void perfmodel_add_delay(int read, size_t size) +{ +#ifdef ENABLE_PERF_MODEL + uint32_t extra_latency; + uint32_t do_bandwidth_delay; + + now = asm_rdtscp(); + + if (now >= monitor_end) { + monitor_start = now; + monitor_end = monitor_start + NS2CYCLE(BANDWIDTH_MONITOR_NS); + bandwidth_consumption = 0; + } + + if (__sync_add_and_fetch(&bandwidth_consumption, size) >= + ((SCM_BANDWIDTH_MB << 20) / (SEC_TO_NS(1UL) / BANDWIDTH_MONITOR_NS))) + do_bandwidth_delay = 1; + else + do_bandwidth_delay = 0; + + if (read) { + extra_latency = SCM_EXTRA_READ_LATENCY_NS; + } else + extra_latency = SCM_WBARRIER_LATENCY_NS; + + // bandwidth delay for both read and write. + if (do_bandwidth_delay) { + // Due to the writeback cache, write does not have latency + // but it has bandwidth limit. + // The following is emulated delay when bandwidth is full + extra_latency += (uint32_t)size * (uint32_t) + ((1 - (float)(((float) SCM_BANDWIDTH_MB)/1000) / + (((float)DRAM_BANDWIDTH_MB)/1000)) / (((float)SCM_BANDWIDTH_MB)/1000)); + pthread_mutex_lock(&mlfs_nvm_mutex); + emulate_latency_ns(extra_latency); + pthread_mutex_unlock(&mlfs_nvm_mutex); + } else + emulate_latency_ns(extra_latency); + +#endif + return; +} diff --git a/splitfs_syscall_intercept/src/add_delay.h b/splitfs_syscall_intercept/src/add_delay.h new file mode 100755 index 0000000000..eb96e3a2b6 --- /dev/null +++ b/splitfs_syscall_intercept/src/add_delay.h @@ -0,0 +1,17 @@ +#ifndef SPLITFS_ADD_DELAY_H_ +#define SPLITFS_ADD_DELAY_H_ + +// to use O_DIRECT flag +// +#include +#include +#include +#include +#include +#include + +#include "pm_util.h" + +void perfmodel_add_delay(int read, size_t size); + +#endif diff --git a/splitfs_syscall_intercept/src/compiler_utils.h b/splitfs_syscall_intercept/src/compiler_utils.h new file mode 100644 index 0000000000..60ecacc539 --- /dev/null +++ b/splitfs_syscall_intercept/src/compiler_utils.h @@ -0,0 +1,85 @@ +/* + * Copyright 2014-2017, Intel Corporation + * Copyright (c) 2016, Microsoft Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * util.h -- internal definitions for util module + */ + +#ifndef SPLITFS_UTIL_H +#define SPLITFS_UTIL_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Macro calculates number of elements in given table + */ +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#if !defined(likely) +#if defined(__GNUC__) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (!!(x)) +#define unlikely(x) (!!(x)) +#endif +#endif + +#ifndef _WIN32 +#define DIR_SEPARATOR '/' +#else +#define DIR_SEPARATOR '\\' +#endif + +#define COMPILE_ERROR_ON(cond)\ + extern int (*compile_error_dummy_symbol(void))\ + [!!sizeof(struct { int dummy: (1 + (1 / (!(cond)))); })] + +#define splitfs_always_inline __attribute__((always_inline)) inline +#define splitfs_printf_like(fmt_arg_num, arg_num) \ + __attribute__((format(printf, fmt_arg_num, arg_num))) +#define splitfs_noreturn __attribute__((noreturn)) +#define splitfs_constructor static __attribute__((constructor)) +#define splitfs_destructor static __attribute__((destructor)) +#define splitfs_used_var __attribute__((used)) +#define splitfs_warn_unused_result __attribute__((warn_unused_result)) + +#ifdef __cplusplus +} +#endif + +#endif /* util.h */ diff --git a/splitfs_syscall_intercept/src/constants.h b/splitfs_syscall_intercept/src/constants.h new file mode 100644 index 0000000000..7d3095398d --- /dev/null +++ b/splitfs_syscall_intercept/src/constants.h @@ -0,0 +1,2 @@ +#define OPEN_MAX 1024 // Original 0x8000 +#define BUF_SIZE 40 \ No newline at end of file diff --git a/splitfs_syscall_intercept/src/execv.c b/splitfs_syscall_intercept/src/execv.c new file mode 100644 index 0000000000..c03d6bac2e --- /dev/null +++ b/splitfs_syscall_intercept/src/execv.c @@ -0,0 +1,216 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "splitfs-posix.h" +#include "constants.h" +#include "vfd_table.h" +#include "file.h" +#include "inode.h" +#include "os_util.h" +#include "sys_util.h" +#include "hash_map.h" +#include "execv.h" +#include "mmap_pool.h" +#include "table_mmaps.h" + +struct vfile_description_flat { + int valid; + struct splitfs_file sfs_file; + struct splitfs_vinode vinode; +}; + +int restore_fds(void); + + +void get_shm_filename(char *filename) { + int ret; + + ret = sprintf(filename, "exec-ledger-%d", os_getpid()); + filename[ret] = '\0'; +} + +/** + * This will do the following: + * 1. FSYNC all the files + * 2. [TODO] Cleanup the staging files. + * 3. [TODO] Close the files that have close_on_exec flag set. + * 4. Create vfile_description_flat to store all the splitfs file data structures with index corresponding to fd + * 5. Loop through the vfd table to see which fds are open and populate open files' data structures + * 6. Open shared memory file, mmap and write the data + */ +int splitfs_execv(void) { + struct vfile_description_flat vfs[OPEN_MAX]; + struct splitfs_file *fp; + char exec_splitfs_filename[BUF_SIZE], buf[512]; + int exec_ledger_fd = -1; + + // Fsync all the files. + for(int i=0; ivinode); + } + + get_shm_filename(exec_splitfs_filename); + exec_ledger_fd = shm_open(exec_splitfs_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (exec_ledger_fd == -1) { + buf[sprintf(buf, "Failed to open shared memory: %s", strerror(errno))] = '\0'; + FATAL(buf); + } + + long res = syscall_no_intercept(SYS_ftruncate, exec_ledger_fd, (10*1024*1024)); + if (res == -1) { + buf[sprintf(buf, "%s: ftruncate failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + char *shm_area = mmap(NULL, 10*1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, exec_ledger_fd, 0); + if (shm_area == NULL) { + buf[sprintf(buf, "%s: mmap failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + if (memcpy(shm_area, vfs, OPEN_MAX * sizeof(struct vfile_description_flat)) == NULL) { + buf[sprintf(buf, "%s: memcpy of vfile_description_flat failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + return 0; +} + + +/** + * This will do the following: + * 1. Load the data structure vfile_description_flat from the shared memory file + * 2. For all valid == 1 indices, do the following + * 2a. Assign splitfs file using 'splitfs_file_assign' + * 2b. Set the struct with corresponding values (flags, offset, serial no) + * 2c. Get the vinode for the serial number using 'splitfs_vinode_assign' + * 2d. Initialise the inode values like - serialno, file_mmaps, sync_length, length is_large_file etc - using functions wherever applicable. + * 2e. Associate the splitfs_file structure with the vinode using spltifs_vfd_assign + * 2f. Assign the splitfs_file structure to the appropriate index in vfd table using 'splitfs_vfd_assign' + */ +int restore_fds(void) { + struct splitfs_file *fp; + struct splitfs_vinode *vi; + struct vfile_description_flat vfs[OPEN_MAX]; + char exec_splitfs_filename[BUF_SIZE], buf[512]; + char *shm_area; + int exec_ledger_fd = -1; + long ret; + + get_shm_filename(exec_splitfs_filename); + exec_ledger_fd = shm_open(exec_splitfs_filename, O_RDONLY, 0666); + if (exec_ledger_fd == -1) { + buf[sprintf(buf, "Failed to open shared memory: %s", strerror(errno))] = '\0'; + FATAL(buf); + } + + shm_area = mmap(NULL, 10*1024*1024, PROT_READ, MAP_SHARED, exec_ledger_fd, 0); + if (shm_area == NULL) { + buf[sprintf(buf, "%s: mmap failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + if (memcpy(vfs, shm_area, OPEN_MAX * sizeof(struct vfile_description_flat)) == NULL) { + buf[sprintf(buf, "%s: memcpy of fd lookup failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + for(int i=0; iflags = vfs[i].sfs_file.flags; + fp->offset = vfs[i].sfs_file.offset; + fp->serialno = vfs[i].sfs_file.serialno; + + + // Initialise the corresponding vinode + vi = splitfs_vinode_assign(fp->serialno); + if (vi == NULL) { + FATAL("Ran out of inodes\n"); + } + inode_set_ino(vi, inode_get_ino(&vfs[i].vinode)); + inode_set_uncommitted_size(vi, inode_get_uncommitted_size(&vfs[i].vinode)); + inode_set_sync_size(vi, inode_get_sync_size(&vfs[i].vinode)); + inode_set_large_file_status(vi, inode_get_large_file_status(&vfs[i].vinode)); + + void *mmaps = splitfs_mmap_assign(); + if (mmaps == NULL) { + vi->file_mmaps = calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + } + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, vi->serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, vi->serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + vi->tbl_mmap = (struct table_mmap *)tbl_mmaps; + + if (vi->tbl_mmap == NULL) { + vi->tbl_mmap = splitfs_alloc_tbl(); + } + + // Associate the inode with the file + ASSERT(vi->tbl_mmap); + fp->vinode = vi; + + // Assign the splitfs_file structure to the appropriate index in vfd table + ret = splitfs_vfd_assign(i, fp); + if(ret < 0) { + buf[sprintf(buf, "%s: Failed to assign vfd %d to the vfd_table\n", __func__, i)] = '\0'; + FATAL(buf); + } + } + + ret = munmap(shm_area, 10*1024*1024); + ASSERT(ret==0); + ret = shm_unlink(exec_splitfs_filename); + ASSERT(ret==0); + + return 0; +} + +int splitfs_restore_fd_if_exec(void) { + int ret = 0; + char execv_full_path[BUF_SIZE]; + char filename[BUF_SIZE]; + + get_shm_filename(filename); + + execv_full_path[sprintf(execv_full_path, "/dev/shm/%s", filename)] = '\0'; + + if (access(execv_full_path, F_OK ) != -1) { + ret = restore_fds(); + } + return ret; +} diff --git a/splitfs_syscall_intercept/src/execv.h b/splitfs_syscall_intercept/src/execv.h new file mode 100644 index 0000000000..104e03829a --- /dev/null +++ b/splitfs_syscall_intercept/src/execv.h @@ -0,0 +1,9 @@ +#ifndef SPLITFS_EXECV +#define SPLITFS_EXECV + +void get_shm_filename(char *filename); + +// returns 0 on success, else failed. +int splitfs_restore_fd_if_exec(void); + +#endif \ No newline at end of file diff --git a/splitfs_syscall_intercept/src/fallocate.c b/splitfs_syscall_intercept/src/fallocate.c new file mode 100644 index 0000000000..4a81f8ba53 --- /dev/null +++ b/splitfs_syscall_intercept/src/fallocate.c @@ -0,0 +1,182 @@ +/* + * ===================================================================================== + * + * Filename: fallocate.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:33:35 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "out.h" + +static int +_splitfs_inode_fallocate(struct splitfs_vinode *inode, long mode, + off_t offset, off_t length) { + + bool remove_mmaps = false; + inode_set_uncommitted_size(inode, (size_t)(offset + length)); + inode_set_sync_size(inode, (size_t)(offset + length)); + inode_set_large_file_status(inode, false); + clear_mmaps_from_ino(inode->serialno, remove_mmaps); + return 0; +} + + +/* + * fallocate_check_arguments - part of pmemfile_fallocate implementation + * Perform some checks that are independent of the file being operated on. + */ +static int +fallocate_check_arguments(int mode, off_t offset, + off_t length) +{ + /* + * from man 2 fallocate: + * + * "EINVAL - offset was less than 0, or len was less + * than or equal to 0." + */ + if (length <= 0 || offset < 0) + return EINVAL; + + /* + * from man 2 fallocate: + * + * "EFBIG - offset+len exceeds the maximum file size." + */ + if ((size_t)offset + (size_t)length > (size_t)SSIZE_MAX) + return EFBIG; + + /* + * from man 2 fallocate: + * + * "EOPNOTSUPP - The filesystem containing the file referred to by + * fd does not support this operation; or the mode is not supported by + * the filesystem containing the file referred to by fd." + * + * As of now, pmemfile_fallocate supports allocating disk space, and + * punching holes. + */ + if (mode & FALLOC_FL_COLLAPSE_RANGE) { + ERR("FL_COLLAPSE_RANGE is not supported"); + return EOPNOTSUPP; + } + + if (mode & FALLOC_FL_ZERO_RANGE) { + ERR("FL_ZERO_RANGE is not supported"); + return EOPNOTSUPP; + } + + if (mode & FALLOC_FL_PUNCH_HOLE) { + /* + * from man 2 fallocate: + * + * "The FALLOC_FL_PUNCH_HOLE flag must be ORed + * with FALLOC_FL_KEEP_SIZE in mode; in other words, + * even when punching off the end of the file, the file size + * (as reported by stat(2)) does not change." + */ + if (mode != (FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_KEEP_SIZE)) + return EOPNOTSUPP; + } else { /* Allocating disk space */ + /* + * Note: According to 'man 2 fallocate' FALLOC_FL_UNSHARE + * is another possible flag to accept here. No equivalent of + * that flag is supported by pmemfile as of now. Also that man + * page is wrong anyways, the header files only refer to + * FALLOC_FL_UNSHARE_RANGE, so it is suspected that noone is + * using it anyways. + */ + if ((mode & ~FALLOC_FL_KEEP_SIZE) != 0) + return EINVAL; + } + + return 0; +} + +int +splitfs_fallocate(long fd, struct splitfs_file *file, int mode, + off_t offset, off_t length) { + + LOG(0, "Called splitfs_fallocate()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + int error; + + error = fallocate_check_arguments(mode, offset, length); + if (error) + goto end; + + ASSERT(offset >= 0); + ASSERT(length > 0); + + pthread_mutex_lock(&file->mutex); + uint64_t flags = file->flags; + struct splitfs_vinode *inode = file->vinode; + pthread_mutex_unlock(&file->mutex); + + /* + * from man 2 fallocate: + * + * "EBADF fd is not a valid file descriptor, or is not opened for + * writing." + */ + if ((flags & PFILE_WRITE) == 0) { + error = EBADF; + goto end; + } + + if (inode) { + os_rwlock_wrlock(&inode->rwlock); + + error = _splitfs_inode_fallocate(inode, mode, (off_t)offset, + (off_t)length); + + syscall_no_intercept(SYS_fallocate, fd, mode, offset, length); + os_rwlock_unlock(&inode->rwlock); + } else + syscall_no_intercept(SYS_fallocate, fd, mode, offset, length); + +end: + if (error != 0) { + errno = error; + return -1; + } + + return 0; +} + +int splitfs_posix_fallocate(long fd, struct splitfs_file *file, + int mode, off_t offset, off_t length) { + + return splitfs_fallocate(fd, file, mode, offset, length); +} diff --git a/splitfs_syscall_intercept/src/file.c b/splitfs_syscall_intercept/src/file.c new file mode 100644 index 0000000000..dbc7af8cc9 --- /dev/null +++ b/splitfs_syscall_intercept/src/file.c @@ -0,0 +1,345 @@ +/* + * ===================================================================================== + * + * Filename: file.c + * + * Description: + * + * Version: 1.0 + * Created: 07/31/2019 04:38:40 AM + * Revision: none + * Compiler: gcc + * + * Author: Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include + +#include "constants.h" +#include "file.h" +#include "splitfs-posix.h" +#include "mmap_pool.h" +#include "truncate.h" +#include "sys_util.h" +#include "utils.h" +#include "hash_map.h" +#include "table_mmaps.h" +#include "out.h" + +static struct splitfs_file *free_file_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_file_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static struct splitfs_file *fetch_free_file_slot(void) { + + struct splitfs_file *entry; + + util_mutex_lock(&free_file_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_file_slots[--free_slot_count]; + + util_mutex_unlock(&free_file_slot_mutex); + + return entry; +} + +struct splitfs_file * +splitfs_file_assign() { + + struct splitfs_file *entry = fetch_free_file_slot(); + return entry; +} + +static void splitfs_file_add(struct splitfs_file *entry) { + + util_mutex_lock(&free_file_slot_mutex); + + free_file_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_file_slot_mutex); +} + +void splitfs_file_table_init() { + + static struct splitfs_file store[ARRAY_SIZE(free_file_slots) - 1]; + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) { + pthread_mutex_init(&store[i].mutex, NULL); + splitfs_file_add(store + i); + } +} + + +/* + * check_flags -- open(2) flags tester + */ + +static int +check_flags(long flags) +{ + if (flags & SPLITFS_O_APPEND) { + flags &= ~SPLITFS_O_APPEND; + } + + if (flags & SPLITFS_O_ASYNC) { + ERR("O_ASYNC is not supported"); + errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_CREAT) { + LOG(LTRC, "O_CREAT"); + flags &= ~SPLITFS_O_CREAT; + } + + /* XXX: move to interposing layer */ + if (flags & SPLITFS_O_CLOEXEC) { + LOG(LINF, "O_CLOEXEC is always enabled"); + flags &= ~SPLITFS_O_CLOEXEC; + } + + if (flags & SPLITFS_O_DIRECT) { + LOG(LINF, "O_DIRECT is always enabled"); + flags &= ~SPLITFS_O_DIRECT; + } + + /* O_TMPFILE contains O_DIRECTORY */ + if ((flags & SPLITFS_O_TMPFILE) == SPLITFS_O_TMPFILE) { + ERR("O_TMPFILE is not supported"); + errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_DIRECTORY) { + LOG(0, "O_DIRECTORY is not supported"); + //errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_DSYNC) { + LOG(LINF, "O_DSYNC is always enabled"); + flags &= ~SPLITFS_O_DSYNC; + } + + if (flags & SPLITFS_O_EXCL) { + LOG(LTRC, "O_EXCL"); + flags &= ~SPLITFS_O_EXCL; + } + + if (flags & SPLITFS_O_NOCTTY) { + LOG(LINF, "O_NOCTTY is always enabled"); + flags &= ~SPLITFS_O_NOCTTY; + } + + flags &= ~SPLITFS_O_NOATIME; + + if (flags & SPLITFS_O_NOFOLLOW) { + LOG(LTRC, "O_NOFOLLOW"); + flags &= ~SPLITFS_O_NOFOLLOW; + } + + if (flags & SPLITFS_O_NONBLOCK) { + LOG(LINF, "O_NONBLOCK is ignored"); + flags &= ~SPLITFS_O_NONBLOCK; + } + + if (flags & SPLITFS_O_PATH) { + LOG(LTRC, "O_PATH"); + flags &= ~SPLITFS_O_PATH; + } + + if (flags & SPLITFS_O_SYNC) { + LOG(LINF, "O_SYNC is always enabled"); + flags &= ~SPLITFS_O_SYNC; + } + + if (flags & SPLITFS_O_TRUNC) { + LOG(LTRC, "O_TRUNC"); + flags &= ~SPLITFS_O_TRUNC; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_RDONLY) { + LOG(LTRC, "O_RDONLY"); + flags -= SPLITFS_O_RDONLY; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_WRONLY) { + LOG(LTRC, "O_WRONLY"); + flags -= SPLITFS_O_WRONLY; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_RDWR) { + LOG(LTRC, "O_RDWR"); + flags -= SPLITFS_O_RDWR; + } + + if (flags) { + LOG(0, "unknown flag 0x%lx\n", flags); + errno = EINVAL; + return -1; + } + + return 0; +} + +static SPLITFSfile * +_splitfs_openat(const char *path, long flags, ...) { + + LOG(0, "path = %s", path); + if (check_flags(flags)) + return NULL; + + va_list ap; + va_start(ap, flags); + long mode = 0; + + if (flags & SPLITFS_O_CREAT) { + mode = va_arg(ap, long); + LOG(LDBG, "mode %lo", mode); + mode &= SPLITFS_ALLPERMS; + } + va_end(ap); + + struct splitfs_file *file = NULL; + struct splitfs_vinode *inode = NULL; + struct stat sbuf; + + if (syscall_no_intercept(SYS_stat, path, &sbuf) != 0) { + FATAL("stat failed\n"); + } + + LOG(0, "sbuf st_mode = %u, IFREG = %d. sbuf.st_mode & SPLITFS_S_IFREG = %d", + sbuf.st_mode, SPLITFS_S_IFREG, sbuf.st_mode & SPLITFS_S_IFREG); + if ((sbuf.st_mode & SPLITFS_S_IFREG) == 0) + return NULL; + + int accmode = flags & SPLITFS_O_ACCMODE; + + file = splitfs_file_assign(); + if (file == NULL) { + FATAL("Ran out of files\n"); + } + + pthread_mutex_lock(&file->mutex); + + file->offset = 0; + file->serialno = (uint32_t) sbuf.st_ino; + + LOG(0, "flags passed = %ld", flags); + if (flags & SPLITFS_O_PATH) + file->flags = PFILE_PATH; + else if (accmode == SPLITFS_O_RDONLY) + file->flags = PFILE_READ; + else if (accmode == SPLITFS_O_WRONLY) + file->flags = PFILE_WRITE; + else if (accmode == SPLITFS_O_RDWR) + file->flags = PFILE_READ | PFILE_WRITE; + LOG(0, "flags set = %ld\n", file->flags); + + inode = splitfs_vinode_assign(file->serialno); + if (inode == NULL) { + FATAL("Ran out of inodes\n"); + } + + os_rwlock_wrlock(&inode->rwlock); + + inode_set_ino(inode, (uint32_t) sbuf.st_ino); + LOG(0, "path = %s, inode no = %u", path, inode_get_ino(inode)); + + if (inode_get_ref(inode) == 1) { + + if (flags & SPLITFS_O_TRUNC) { + splitfs_truncate_vinode(inode, 0); + } else { + inode_set_uncommitted_size(inode, (size_t) sbuf.st_size); + inode_set_sync_size(inode, (size_t) sbuf.st_size); + inode_set_large_file_status(inode, false); + } + + util_mutex_lock(&mmap_cache_mutex); + void *mmaps = hash_map_get(global_mmap_cache, inode->serialno); + + if (mmaps != NULL) { + if (inode->file_mmaps != NULL) + splitfs_mmap_add(inode->file_mmaps); + inode->file_mmaps = mmaps; + hash_map_remove(global_mmap_cache, inode->serialno, mmaps); + } else { + if (inode->file_mmaps == NULL) { + mmaps = splitfs_mmap_assign(); + if (mmaps == NULL) { + inode->file_mmaps = calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + } + } + } + util_mutex_unlock(&mmap_cache_mutex); + + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, inode->serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, inode->serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + inode->tbl_mmap = (struct table_mmap *)tbl_mmaps; + + if (inode->tbl_mmap == NULL) { + inode->tbl_mmap = splitfs_alloc_tbl(); + } + } + + ASSERT(inode->tbl_mmap); + file->vinode = inode; + + os_rwlock_unlock(&inode->rwlock); + pthread_mutex_unlock(&file->mutex); + + return file; +} + +long splitfs_close(long fd, SPLITFSfile *file) { + + LOG(0, "In splitfs_close. fd = %ld", fd); + + long ret = 0; + struct splitfs_vinode *inode = file->vinode; + file->vinode = NULL; + + ret = splitfs_vinode_unref(fd, inode); + if (ret == 0) + splitfs_file_add(file); + + LOG(0, "file closed"); + return 0; +} + +SPLITFSfile * +splitfs_openat(const char *path, long flags, ...) { + + if (!path) { + LOG(LUSR, "NULL pathname"); + errno = ENOENT; + return NULL; + } + + va_list ap; + va_start(ap, flags); + long mode = 0; + if (flags & SPLITFS_O_CREAT) + mode = va_arg(ap, long); + va_end(ap); + + SPLITFSfile *ret = _splitfs_openat(path, flags, mode); + + return ret; +} diff --git a/splitfs_syscall_intercept/src/file.h b/splitfs_syscall_intercept/src/file.h new file mode 100644 index 0000000000..593bd183d9 --- /dev/null +++ b/splitfs_syscall_intercept/src/file.h @@ -0,0 +1,71 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SPLITFS_FILE_H +#define SPLITFS_FILE_H + +/* + * Runtime state structures. + */ + +#include +#include "inode.h" +#include "os_thread.h" + +#define PFILE_READ (1ULL << 0) +#define PFILE_WRITE (1ULL << 1) +#define PFILE_PATH (1ULL << 4) + +/* file handle */ +struct splitfs_file { + /* volatile inode */ + struct splitfs_vinode *vinode; + + /* + * Protects against changes to offset / position cache from multiple + * threads. + */ + pthread_mutex_t mutex; + + /* flags */ + uint64_t flags; + + /* requested/current position */ + volatile size_t offset; + + /* inode number of the file. Do we need this? */ + uint32_t serialno; // duplicated so that iterating doesn't require following every node* +}; + +void splitfs_file_table_init(void); +struct splitfs_file *splitfs_file_assign(void); + +#endif diff --git a/splitfs_syscall_intercept/src/fsync.c b/splitfs_syscall_intercept/src/fsync.c new file mode 100644 index 0000000000..d597e54d48 --- /dev/null +++ b/splitfs_syscall_intercept/src/fsync.c @@ -0,0 +1,72 @@ +/* + * ===================================================================================== + * + * Filename: fsync.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 10:11:22 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include "file.h" +#include "sys_util.h" +#include "staging.h" +#include "relink.h" +#include "out.h" +#include +#include + + +static ssize_t +splitfs_fsync_args_check(struct splitfs_file *file) +{ + if (!(file->flags & PFILE_WRITE)) { + errno = EBADF; + return -1; + } + + return 0; +} + +long splitfs_fsync(long fd, struct splitfs_file *file) { + + LOG(0, "In splitfs_fsync(). fd = %ld\n", fd); + long ret = 0; + + ret = splitfs_fsync_args_check(file); + + pthread_mutex_lock(&file->mutex); + struct splitfs_vinode *inode = file->vinode; + pthread_mutex_unlock(&file->mutex); + + os_rwlock_wrlock(&inode->rwlock); + + ASSERT(inode_get_uncommitted_size(inode) >= inode_get_sync_size(inode)); + + if (inode_get_uncommitted_size(inode) > inode_get_sync_size(inode)) { + + ASSERT(inode->staging); + + perform_relink(fd, (off_t) (inode_get_sync_size(inode)), inode, + inode_get_uncommitted_size(inode) - inode_get_sync_size(inode)); + + inode_set_sync_size(inode, inode_get_uncommitted_size(inode)); + inode->staging = NULL; + } + + os_rwlock_unlock(&inode->rwlock); + + return ret; +} + +long splitfs_fdatasync(long fd, struct splitfs_file *file) { + return splitfs_fsync(fd, file); +} diff --git a/splitfs_syscall_intercept/src/handle_mmaps.c b/splitfs_syscall_intercept/src/handle_mmaps.c new file mode 100644 index 0000000000..300e29b578 --- /dev/null +++ b/splitfs_syscall_intercept/src/handle_mmaps.c @@ -0,0 +1,139 @@ +/* + * ===================================================================================== + * + * Filename: handle_mmaps.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 04:33:49 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "handle_mmaps.h" + +static void create_file_mmap(long fd, struct splitfs_file *file, unsigned mmap_index, off_t file_offset) { + + ASSERT(file->vinode->file_mmaps[mmap_index] == 0); + off_t mmap_start_off = file_offset & ~(SIZE_OF_MMAP - 1); + long mmap_flags = 0; + if (file->flags & PFILE_READ) + mmap_flags |= PROT_READ; + if (file->flags & PFILE_WRITE) + mmap_flags |= PROT_WRITE; + + char *addr = (char *)syscall_no_intercept(SYS_mmap, NULL, + SIZE_OF_MMAP, + mmap_flags, + MAP_SHARED | MAP_POPULATE, + (int) fd, + mmap_start_off); + + if (addr == MAP_FAILED) { + FATAL("mmap creation failed\n"); + } + + file->vinode->file_mmaps[mmap_index] = (unsigned long)addr; +} + +void *get_mmap_address(long fd, struct splitfs_file *file, off_t file_offset, size_t *extent_length) { + + unsigned mmap_index = (unsigned) (file_offset / SIZE_OF_MMAP); + unsigned largest_valid_mmap = (unsigned) (file->vinode->sync_length / SIZE_OF_MMAP) - 1; + if (mmap_index > largest_valid_mmap) { + *extent_length = 0; + return NULL; + } + + if (file->vinode->file_mmaps[mmap_index] == 0) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + create_file_mmap(fd, file, mmap_index, file_offset); + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + } + + ASSERT(file->vinode->file_mmaps[mmap_index] != 0); + uint64_t start_addr = file->vinode->file_mmaps[mmap_index]; + off_t offset_in_mmap = file_offset % SIZE_OF_MMAP; + + *extent_length = (size_t) (SIZE_OF_MMAP - offset_in_mmap); + return (void *) (start_addr + (unsigned long) offset_in_mmap); +} + +void *get_staging_mmap_address(struct splitfs_file *file, size_t count, + off_t file_offset, size_t *extent_length, bool write) { + + struct sfile_description *staging = NULL; + + if (!file) + FATAL("file is NULL"); + if (!file->vinode) + FATAL("vinode is NULL"); + if (file_offset < 0 || file->offset > file->vinode->length) + FATAL("file_offset is wrong"); + if (!extent_length) + FATAL("extent_length is NULL"); + if (count < 0 || count > (64*1024*1024)) + FATAL("count is wrong"); + + if (write && file->vinode->staging == NULL) { + get_staging_file(file); + } + + if (!file->vinode->staging) + FATAL("staging is NULL"); + + staging = file->vinode->staging; + void *start_addr = (void *)(staging->start_addr); + off_t offset_in_mmap = file_offset + staging->valid_offset; + + if (offset_in_mmap >= (off_t)STAGING_FILE_SIZE) { + *extent_length = 0; + if (staging->valid_offset > STAGING_FILE_SIZE) + staging->valid_offset = (off_t)STAGING_FILE_SIZE; + } + else + *extent_length = (size_t)STAGING_FILE_SIZE - (size_t)offset_in_mmap; + + //if ((void *)(start_addr) == NULL) + // FATAL("start addr is NULL"); + + return (void *) ((uint64_t)start_addr + (uint64_t) offset_in_mmap); +} + +long clear_mmaps_from_ino(uint32_t serialno, bool remove_mmap) { + + long ret = 0; + + util_mutex_lock(&mmap_cache_mutex); + + char **file_mmaps = (char **)hash_map_get(global_mmap_cache, serialno); + hash_map_remove(global_mmap_cache, serialno, file_mmaps); + + util_mutex_unlock(&mmap_cache_mutex); + + if (file_mmaps) { + for (unsigned i = 0; i < PER_NODE_MMAPS; i++) { + if (file_mmaps[i] != 0) { + ret = munmap((char *)file_mmaps[i], SIZE_OF_MMAP); + if (ret != 0) { + errno = EFAULT; + return ret; + } + } + } + } + + if (remove_mmap) + splitfs_mmap_add(file_mmaps); + + return ret; +} diff --git a/splitfs_syscall_intercept/src/handle_mmaps.h b/splitfs_syscall_intercept/src/handle_mmaps.h new file mode 100644 index 0000000000..ee4b64cfb5 --- /dev/null +++ b/splitfs_syscall_intercept/src/handle_mmaps.h @@ -0,0 +1,40 @@ +/* + * ===================================================================================== + * + * Filename: handle_mmaps.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:19:25 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_HANDLE_MMAPS_H +#define SPLITFS_HANDLE_MMAPS_H + +#include +#include + +#include "file.h" +#include "inode.h" +#include "staging.h" +#include "sys_util.h" +#include "hash_map.h" +#include "mmap_pool.h" +#include "out.h" + +#define SIZE_OF_MMAP (2*1024*1024) + +void *get_mmap_address(long fd, struct splitfs_file *file, off_t file_offset, size_t *extent_length); +void *get_staging_mmap_address(struct splitfs_file *file, size_t count, + off_t file_offset, size_t *extent_length, bool write); +long clear_mmaps_from_ino(uint32_t serialno, bool remove_mmap); + +#endif diff --git a/splitfs_syscall_intercept/src/hash_map.c b/splitfs_syscall_intercept/src/hash_map.c new file mode 100644 index 0000000000..79268fd7af --- /dev/null +++ b/splitfs_syscall_intercept/src/hash_map.c @@ -0,0 +1,226 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "constants.h" +#include "hash_map.h" +#include "os_thread.h" +#include "out.h" + +#define INITIAL_NBUCKETS OPEN_MAX + +/* hash map bucket */ +struct hash_map_bucket { + uint32_t key; + void *value; +}; + +/* hash map */ +struct hash_map { + + /* number of elements in "buckets" */ + size_t nbuckets; + + /* buckets */ + struct hash_map_bucket *buckets; + + /* number of used slots */ + size_t entries; +}; + +/* + * hash_map_alloc -- allocates hash map + */ +struct hash_map * +hash_map_alloc(void) +{ + struct hash_map *map = calloc(1, sizeof(*map)); + if (!map) + return NULL; + + map->nbuckets = INITIAL_NBUCKETS; + map->buckets = calloc(map->nbuckets, sizeof(map->buckets)); + if (!map->buckets) { + free(map); + return NULL; + } + + return map; +} + +/* + * hash_map_traverse -- returns number of live entries + */ +int +hash_map_traverse(struct hash_map *map) +{ + int num = 0; + + for (unsigned i = 0; i < map->nbuckets; ++i) { + struct hash_map_bucket *bucket = &map->buckets[i]; + + void *value = bucket->value; + if (value) { + num++; + } + } + + return num; +} + +/* + * hash_map_free -- destroys inode hash map + */ +void +hash_map_free(struct hash_map *map) +{ + free(map->buckets); + free(map); +} + +/* + * pf_hash -- returns hash value of the key + */ +static inline uint32_t +hash(struct hash_map *map, uint32_t key) +{ + return (key); +} + +/* + * hash_map_rebuild -- rebuilds the whole inode hash map + * + * Returns 0 on success, negative value (-errno) on failure, 1 on hash map + * conflict. + */ +static int +hash_map_rebuild(struct hash_map *c, size_t new_sz) +{ + struct hash_map_bucket *new_buckets = + calloc(new_sz, sizeof(new_buckets)); + size_t idx; + + if (!new_buckets) + return -errno; + + for (size_t i = 0; i < c->nbuckets; ++i) { + struct hash_map_bucket *b = &c->buckets[i]; + + idx = hash(c, b->key) % new_sz; + struct hash_map_bucket *newbucket = &new_buckets[idx]; + if (newbucket->key == 0) + newbucket->value = b->value; + } + + free(c->buckets); + c->nbuckets = new_sz; + c->buckets = new_buckets; + + return 0; +} + +/* + * hash_map_remove -- removes key/value from the hash map + */ +int +hash_map_remove(struct hash_map *map, uint32_t key, + void *value) +{ + size_t idx = hash(map, key) % map->nbuckets; + struct hash_map_bucket *b = &map->buckets[idx]; + if (b->value == value) + memset(b, 0, sizeof(struct hash_map_bucket)); + + map->entries--; + + return 0; +} + +/* + * hash_map_get -- returns value associated with specified key + */ +void * +hash_map_get(struct hash_map *map, uint32_t key) +{ + size_t idx = hash(map, key) % map->nbuckets; + + struct hash_map_bucket *b = &map->buckets[idx]; + if (b->key == key) + return b->value; + + return NULL; +} + +/* + * hash_map_put -- inserts key/value into hash map + * + * Returns existing value if key already existed or inserted value. + */ +void * +hash_map_put(struct hash_map *map, uint32_t key, void *value) +{ + uint32_t idx = (uint32_t) (hash(map, key) % map->nbuckets); + + struct hash_map_bucket *b = &map->buckets[idx]; + uint32_t empty_slot = UINT32_MAX; + if (b->key == key) + return b->value; + + if (empty_slot == UINT32_MAX && b->key == 0) + empty_slot = idx; + + while (empty_slot == UINT32_MAX) { + size_t new_sz = map->nbuckets*2; + int res; + res = hash_map_rebuild(map, new_sz); + + if (res < 0) { + errno = -res; + return NULL; + } + + idx = (uint32_t) (hash(map, key) % map->nbuckets); + b = &map->buckets[idx]; + if (b->key == 0) + empty_slot = idx; + } + + b->key = key; + b->value = value; + map->entries++; + + return value; +} diff --git a/splitfs_syscall_intercept/src/hash_map.h b/splitfs_syscall_intercept/src/hash_map.h new file mode 100644 index 0000000000..c5405954e8 --- /dev/null +++ b/splitfs_syscall_intercept/src/hash_map.h @@ -0,0 +1,58 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SPLITFS_HASHMAP_H +#define SPLITFS_HASHMAP_H + +#include +#include "sys_util.h" + +struct hash_map; + +struct hash_map *hash_map_alloc(void); +void hash_map_free(struct hash_map *map); + +int hash_map_traverse(struct hash_map *c); + +int hash_map_remove(struct hash_map *map, uint32_t key, void *value); + +void *hash_map_get(struct hash_map *map, uint32_t key); + +void *hash_map_put(struct hash_map *map, + uint32_t key, void *value); + +extern struct hash_map *file_inode_map; +extern struct hash_map *global_mmap_cache; +extern struct hash_map *tbl_mmap_cache; +extern pthread_mutex_t mmap_cache_mutex; +extern pthread_mutex_t tbl_mmap_mutex; + +#endif diff --git a/splitfs_syscall_intercept/src/inode.c b/splitfs_syscall_intercept/src/inode.c new file mode 100644 index 0000000000..dfc61befc2 --- /dev/null +++ b/splitfs_syscall_intercept/src/inode.c @@ -0,0 +1,169 @@ +/* + * ===================================================================================== + * + * Filename: inode.c + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 11:51:07 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include + +#include "constants.h" +#include "inode.h" +#include "sys_util.h" +#include "utils.h" +#include "hash_map.h" +#include "relink.h" +#include "table_mmaps.h" +#include "out.h" + +static struct splitfs_vinode *free_vinode_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_vinode_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + + +static struct splitfs_vinode *fetch_free_inode_slot(void) { + + struct splitfs_vinode *entry; + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_vinode_slots[--free_slot_count]; + + return entry; +} + +struct splitfs_vinode * +splitfs_vinode_assign(uint32_t serialno) { + + struct splitfs_vinode *entry = NULL; + + util_mutex_lock(&free_vinode_slot_mutex); + + entry = hash_map_get(file_inode_map, (uint32_t) serialno); + + if (entry == NULL) { + entry = fetch_free_inode_slot(); + hash_map_put(file_inode_map, serialno, (void*)entry); + } + + if (entry == NULL) + goto out; + + os_rwlock_wrlock(&entry->rwlock); + + __sync_fetch_and_add(&entry->ref, 1); + + os_rwlock_unlock(&entry->rwlock); + +out: + util_mutex_unlock(&free_vinode_slot_mutex); + + return entry; +} + +struct splitfs_vinode * +splitfs_map_vinode_check(uint32_t serialno) { + + + util_mutex_lock(&free_vinode_slot_mutex); + + struct splitfs_vinode *entry = hash_map_get(file_inode_map, serialno); + + util_mutex_unlock(&free_vinode_slot_mutex); + + return entry; +} + +void splitfs_vinode_add(struct splitfs_vinode *entry) { + + util_mutex_lock(&free_vinode_slot_mutex); + + free_vinode_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_vinode_slot_mutex); +} + +void splitfs_inode_free_list_init(void) { + + static struct splitfs_vinode store[ARRAY_SIZE(free_vinode_slots) - 1]; + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) { + os_rwlock_init(&store[i].rwlock); + + store[i].file_mmaps = (uint64_t *) calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + //store[i].dirty_file_mmap_cache = (uint32_t *) calloc(1, DIRTY_MMAP_CACHE_SIZE * sizeof(uint32_t)); + + splitfs_vinode_add(store + i); + } +} + +long splitfs_vinode_unref(long fd, struct splitfs_vinode *inode) { + + long ret = 0; + + if (!inode) { + ret = -1; + goto end; + } + + ret = 0; + uint32_t serialno = 0; + os_rwlock_wrlock(&inode->rwlock); + + if (__sync_sub_and_fetch(&inode->ref, 1) == 0) { + LOG(0, "ref = 0"); + if (inode->staging && + inode_get_uncommitted_size(inode) > inode_get_sync_size(inode)) { + LOG(0, "doing relink"); + perform_relink(fd, (off_t)inode_get_sync_size(inode), + inode, + inode_get_uncommitted_size(inode) - inode_get_sync_size(inode)); + } + + util_mutex_lock(&mmap_cache_mutex); + hash_map_put(global_mmap_cache, inode->serialno, inode->file_mmaps); + util_mutex_unlock(&mmap_cache_mutex); + + util_mutex_lock(&tbl_mmap_mutex); + hash_map_put(tbl_mmap_cache, inode->serialno, inode->tbl_mmap); + util_mutex_unlock(&tbl_mmap_mutex); + + inode->file_mmaps = NULL; + + serialno = inode_get_ino(inode); + inode_set_ino(inode, 0); + inode_set_uncommitted_size(inode, 0); + inode_set_sync_size(inode, 0); + inode_set_large_file_status(inode, false); + inode->staging = NULL; + } + + os_rwlock_unlock(&inode->rwlock); + + util_mutex_lock(&free_vinode_slot_mutex); + os_rwlock_rdlock(&inode->rwlock); + + if (inode_get_ref(inode) == 0) { + LOG(0, "removing entry from map"); + hash_map_remove(file_inode_map, serialno, (void *)inode); + LOG(0, "adding inode to free list"); + free_vinode_slots[free_slot_count++] = inode; + } + + os_rwlock_unlock(&inode->rwlock); + util_mutex_unlock(&free_vinode_slot_mutex); + +end: + return ret; +} diff --git a/splitfs_syscall_intercept/src/inode.h b/splitfs_syscall_intercept/src/inode.h new file mode 100644 index 0000000000..e6ec97b57a --- /dev/null +++ b/splitfs_syscall_intercept/src/inode.h @@ -0,0 +1,169 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_INODE_H +#define SPLITFS_INODE_H + +#include +#include +#include + +#include "splitfs-posix.h" +#include "os_thread.h" +#include "staging.h" + +#define PER_NODE_MMAPS 1024 +#define DIRTY_MMAP_CACHE_SIZE 20 + +/* +#define SPLITFS_S_LONGSYMLINK 0x10000 +COMPILE_ERROR_ON((SPLITFS_S_IFMT | SPLITFS_ALLPERMS) & + SPLITFS_S_LONGSYMLINK); +*/ + +/* volatile inode */ +struct splitfs_vinode { + /* reference counter */ + uint32_t ref; + + /* read-write lock, also protects inode read/writes */ + os_rwlock_t rwlock; + + /* list of mmaps of the file */ + uint64_t *file_mmaps; + + /* inode number of the file */ + uint32_t serialno; + + /* length matching with file system */ + size_t sync_length; + + /* uncommitted length due to appends */ + volatile size_t length; + + //int free_list_idx; + + /* cache of dirty file mmaps for use during close */ + //uint32_t *dirty_file_mmap_cache; + + //int root_dirty_num; + + /* total dirty mmaps */ + //int total_dirty_file_mmaps; + + /* large files are handled differently */ + bool is_large_file; + + // Staging file + struct sfile_description *staging; + + // Table mmap + struct table_mmap *tbl_mmap; +}; + +static inline size_t inode_get_sync_size(struct splitfs_vinode *i) { + return (i->sync_length); +} + +static inline size_t inode_get_uncommitted_size(struct splitfs_vinode *i) { + return (i->length); +} + +static inline uint32_t inode_get_ino(struct splitfs_vinode *i) { + return (i->serialno); +} + +static inline uint32_t inode_get_ref(struct splitfs_vinode *i) { + return (i->ref); +} + +/* +static inline int inode_get_dirty_mmaps(struct splitfs_vinode *i) { + return (i->total_dirty_file_mmaps); +} +*/ + +static inline bool inode_get_large_file_status(struct splitfs_vinode *i) { + return (i->is_large_file); +} + +static inline void inode_set_sync_size(struct splitfs_vinode *i, uint64_t size) { + i->sync_length = size; +} + +static inline void inode_set_uncommitted_size(struct splitfs_vinode *i, uint64_t size) { + i->length = size; +} + +static inline void inode_set_ino(struct splitfs_vinode *i, uint32_t ino) { + i->serialno = ino; +} + +static inline void inode_set_ref(struct splitfs_vinode *i, uint32_t ref_val) { + i->ref = ref_val; +} + +/* +static inline void inode_set_dirty_mmaps(struct splitfs_vinode *i, int dirty_mmaps) { + i->total_dirty_file_mmaps = dirty_mmaps; +} +*/ + +static inline void inode_set_large_file_status(struct splitfs_vinode *i, bool status) { + i->is_large_file = status; +} + +static inline void inode_inc_ref_val(struct splitfs_vinode *i, uint32_t inc_val) { + i->ref += inc_val; +} + +static inline void inode_inc_sync_size(struct splitfs_vinode *i, uint64_t inc_size) { + i->sync_length += inc_size; +} + +static inline void inode_inc_uncommitted_size(struct splitfs_vinode *i, uint64_t inc_size) { + i->length += inc_size; +} + +/* +static inline void inode_inc_dirty_mmaps(struct splitfs_vinode *i, int inc_dirty) { + i->total_dirty_file_mmaps += inc_dirty; +} +*/ + +void splitfs_inode_free_list_init(void); +struct splitfs_vinode *splitfs_vinode_assign(uint32_t serialno); +void splitfs_vinode_add(struct splitfs_vinode *entry); +long splitfs_vinode_unref(long fd, struct splitfs_vinode *inode); +struct splitfs_vinode *splitfs_map_vinode_check(uint32_t serialno); + +#endif diff --git a/splitfs_syscall_intercept/src/intel_intrin.c b/splitfs_syscall_intercept/src/intel_intrin.c new file mode 100644 index 0000000000..68b7ada1c1 --- /dev/null +++ b/splitfs_syscall_intercept/src/intel_intrin.c @@ -0,0 +1,273 @@ +/* + * ===================================================================================== + * + * Filename: intel_intrin.c + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 08:07:41 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include + +#include "intel_intrin.h" + +static void (*_mm_flush_fn_ptr)(void const* p); + +static void +flush_dcache_invalidate_opt(const void *addr, size_t len) +{ + uintptr_t uptr; + + /* + * Loop through cache-line-size (typically 64B) aligned chunks + * covering the given range. + */ + for (uptr = (uintptr_t)addr & ~(FLUSH_ALIGN - 1); + uptr < (uintptr_t)addr + len; uptr += FLUSH_ALIGN) { + _mm_flush((char *)uptr); + } +} + + +/* + * pmem_flush -- flush processor cache for the given range + */ +static void +pmem_flush(const void *addr, size_t len) +{ + flush_dcache_invalidate_opt(addr, len); +} + + +void *memmove_nodrain_movnt_granularity(void *pmemdest, const void *src, size_t len) +{ + __m128i xmm0, xmm1, xmm2, xmm3; + size_t i; + __m128i *d; + __m128i *s; + void *dest1 = pmemdest; + size_t cnt; + + if (len == 0 || src == pmemdest) + return pmemdest; + + if (len < MOVNT_THRESHOLD_GRANULARITY) { + memmove(pmemdest, src, len); + pmem_flush(pmemdest, len); + return pmemdest; + } + + if ((uintptr_t)dest1 - (uintptr_t)src >= len) { + /* + * Copy the range in the forward direction. + * + * This is the most common, most optimized case, used unless + * the overlap specifically prevents it. + */ + /* copy up to FLUSH_ALIGN boundary */ + cnt = (uint64_t)dest1 & ALIGN_MASK; + if (cnt > 0) { + cnt = FLUSH_ALIGN - cnt; + + /* never try to copy more the len bytes */ + if (cnt > len) + cnt = len; + + uint8_t *d8 = (uint8_t *)dest1; + const uint8_t *s8 = (uint8_t *)src; + for (i = 0; i < cnt; i++) { + *d8 = *s8; + d8++; + s8++; + } + pmem_flush(dest1, cnt); + dest1 = (char *)dest1 + cnt; + src = (char *)src + cnt; + len -= cnt; + } + + d = (__m128i *)dest1; + s = (__m128i *)src; + + cnt = len >> CHUNK_SHIFT_GRANULARITY; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s); + xmm1 = _mm_loadu_si128(s + 1); + xmm2 = _mm_loadu_si128(s + 2); + xmm3 = _mm_loadu_si128(s + 3); + s += 4; + _mm_stream_si128(d, xmm0); + _mm_stream_si128(d + 1, xmm1); + _mm_stream_si128(d + 2, xmm2); + _mm_stream_si128(d + 3, xmm3); + d += 4; + } + + /* copy the tail (<128 bytes) in 16 bytes chunks */ + len &= CHUNK_MASK_GRANULARITY; + if (len != 0) { + cnt = len >> MOVNT_SHIFT; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s); + _mm_stream_si128(d, xmm0); + s++; + d++; + } + } + len &= MOVNT_MASK; + if (len != 0) { + cnt = len >> DWORD_SHIFT; + int32_t *d32 = (int32_t *)d; + int32_t *s32 = (int32_t *)s; + for (i = 0; i < cnt; i++) { + _mm_stream_si32(d32, *s32); + d32++; + s32++; + } + cnt = len & DWORD_MASK; + uint8_t *d8 = (uint8_t *)d32; + const uint8_t *s8 = (uint8_t *)s32; + + for (i = 0; i < cnt; i++) { + *d8 = *s8; + d8++; + s8++; + } + pmem_flush(d32, cnt); + + /* copy the last bytes (<16), first dwords then bytes */ + } + } else { + /* + * Copy the range in the backward direction. + * + * This prevents overwriting source data due to an + * overlapped destination range. + */ + + dest1 = (char *)dest1 + len; + src = (char *)src + len; + + cnt = (uint64_t)dest1 & ALIGN_MASK; + if (cnt > 0) { + /* never try to copy more the len bytes */ + if (cnt > len) + cnt = len; + + uint8_t *d8 = (uint8_t *)dest1; + const uint8_t *s8 = (uint8_t *)src; + for (i = 0; i < cnt; i++) { + d8--; + s8--; + *d8 = *s8; + } + pmem_flush(d8, cnt); + dest1 = (char *)dest1 - cnt; + src = (char *)src - cnt; + len -= cnt; + } + + d = (__m128i *)dest1; + s = (__m128i *)src; + + cnt = len >> CHUNK_SHIFT_GRANULARITY; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s - 1); + xmm1 = _mm_loadu_si128(s - 2); + xmm2 = _mm_loadu_si128(s - 3); + _mm_stream_si128(d - 4, xmm3); + d -= 4; + } + + /* copy the tail (<128 bytes) in 16 bytes chunks */ + len &= CHUNK_MASK_GRANULARITY; + if (len != 0) { + cnt = len >> MOVNT_SHIFT; + for (i = 0; i < cnt; i++) { + d--; + s--; + xmm0 = _mm_loadu_si128(s); + _mm_stream_si128(d, xmm0); + } + } + + /* copy the last bytes (<16), first dwords then bytes */ + len &= MOVNT_MASK; + if (len != 0) { + cnt = len >> DWORD_SHIFT; + int32_t *d32 = (int32_t *)d; + int32_t *s32 = (int32_t *)s; + for (i = 0; i < cnt; i++) { + d32--; + s32--; + _mm_stream_si32(d32, *s32); + } + + cnt = len & DWORD_MASK; + uint8_t *d8 = (uint8_t *)d32; + const uint8_t *s8 = (uint8_t *)s32; + + for (i = 0; i < cnt; i++) { + d8--; + s8--; + *d8 = *s8; + } + pmem_flush(d8, cnt); + } + } + + /* + * The call to pmem_*_nodrain() should be followed by pmem_drain() + * to serialize non-temporal store instructions. (It could be only + * one drain after a sequence of pmem_*_nodrain calls). + * However, on platforms that only support strongly-ordered CLFLUSH + * for flushing the CPU cache (or that are forced to not use + * CLWB/CLFLUSHOPT) there is no need to put any memory barrier after + * the flush, so the pmem_drain() is a no-op function. In such case, + * we need to put a memory barrier here. + */ + + return pmemdest; +} + +void _mm_cache_flush(void const* p) { + _mm_clflush(p); +} + +void _mm_cache_flush_optimised(void const* p) { + _mm_clflushopt(p); +} + +// Figure out if CLFLUSHOPT is supported +static int is_clflushopt_supported() { + unsigned int eax, ebx, ecx, edx; + __cpuid_count(7, 0, eax, ebx, ecx, edx); + return ebx & bit_CLFLUSHOPT; +} + +void _mm_flush(void const* p) +{ + _mm_flush_fn_ptr(p); +} + +/* + Based on availability of CLFLUSHOPT instruction, point _mm_flush to the + appropriate function +*/ +void splitfs_init_mm_flush(void) { + if(is_clflushopt_supported()) { + _mm_flush_fn_ptr = _mm_cache_flush_optimised; + } else { + _mm_flush_fn_ptr = _mm_cache_flush; + } +} diff --git a/splitfs_syscall_intercept/src/intel_intrin.h b/splitfs_syscall_intercept/src/intel_intrin.h new file mode 100644 index 0000000000..68971dc67e --- /dev/null +++ b/splitfs_syscall_intercept/src/intel_intrin.h @@ -0,0 +1,80 @@ +/* + * ===================================================================================== + * + * Filename: intel_intrin.h + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 08:00:43 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#ifndef SPLITFS_INTRIN_H +#define SPLITFS_INTRIN_H + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CHUNK_SIZE_GRANULARITY 64 +#define CHUNK_SIZE 128 /* 16*8 */ +#define CHUNK_SHIFT 7 +#define CHUNK_SHIFT_GRANULARITY 6 +#define CHUNK_MASK (CHUNK_SIZE - 1) +#define CHUNK_MASK_GRANULARITY (CHUNK_SIZE_GRANULARITY - 1) + +#define DWORD_SIZE 4 +#define DWORD_SHIFT 2 +#define DWORD_MASK (DWORD_SIZE - 1) + +#define MOVNT_SIZE 16 +#define MOVNT_MASK (MOVNT_SIZE - 1) +#define MOVNT_SHIFT 4 +#define FLUSH_ALIGN ((uintptr_t)64) +#define ALIGN_MASK (FLUSH_ALIGN - 1) + +#define MOVNT_THRESHOLD 256 +#define MOVNT_THRESHOLD_GRANULARITY 64 + +#define CLFLUSH_SIZE 64 +#define _mm_clflushopt(addr)\ + asm volatile("clflushopt %0" : "+m" (*(volatile char *)(addr))) +#define _mm_clflush(addr)\ + asm volatile("clflush %0" : "+m" (*(volatile char *)(addr))) + +void *memmove_nodrain_movnt_granularity(void *pmemdest, const void *src, size_t len); +/* This will point to the right function during startup of + splitfs */ +void splitfs_init_mm_flush(void); +void _mm_flush(void const* p); + +#endif diff --git a/splitfs_syscall_intercept/src/libsplitfs.map b/splitfs_syscall_intercept/src/libsplitfs.map new file mode 100644 index 0000000000..c92a355dcb --- /dev/null +++ b/splitfs_syscall_intercept/src/libsplitfs.map @@ -0,0 +1,45 @@ +# +# Copyright 2016, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# src/libsplitfs.map +# +# linker map file for the preloadable splitfs library +# intentionally not exposing any symbols +# +{ + global: + __xpg_strerror_r; + strerror_r; + strerror; + local: + *; +}; diff --git a/splitfs_syscall_intercept/src/lseek.c b/splitfs_syscall_intercept/src/lseek.c new file mode 100644 index 0000000000..acc32a5373 --- /dev/null +++ b/splitfs_syscall_intercept/src/lseek.c @@ -0,0 +1,165 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * lseek.c -- pmemfile_lseek implementation + */ + +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "sys_util.h" +#include "utils.h" +#include "out.h" + +static inline off_t +add_off(size_t cur, off_t off) +{ + COMPILE_ERROR_ON(sizeof(cur) != sizeof(int64_t)); + ASSERT(cur <= INT64_MAX); + + cur += (size_t)off; + + if (cur > INT64_MAX) + return -1; + + return (off_t)cur; +} + +static off_t +splitfs_lseek_locked(SPLITFSfile *file, off_t offset, + int whence) +{ + LOG(LDBG, "file %p offset %ld whence %d", file, offset, whence); + + if (file->flags & PFILE_PATH) { + errno = EBADF; + return -1; + } + + struct splitfs_vinode *inode = file->vinode; + ASSERT(inode); + + off_t ret = 0; + int new_errno = EINVAL; + + switch (whence) { + case SPLITFS_SEEK_SET: + ret = offset; + if (ret < 0) { + /* + * From POSIX: EINVAL if + * "...the resulting file offset would be + * negative for a regular file..." + * + * POSIX manpage also mentions EOVERFLOW + * "The resulting file offset would be a value + * which cannot be represented correctly in an + * object of type off_t." + * However in existing implementations it looks + * like it is only used to represent user-type + * overflow - user calls lseek, when off_t is + * 32-bit, but internal kernel type is 64-bit, + * and returned value cannot be represented + * EOVERFLOW is returned. + * With 64-bit off_t type EINVAL is returned in + * case of overflow. + */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_CUR: + ret = add_off(file->offset, offset); + if (ret < 0) { + /* Error as in SEEK_SET */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_END: + os_rwlock_rdlock(&inode->rwlock); + ret = add_off(inode_get_uncommitted_size(inode), offset); + os_rwlock_unlock(&inode->rwlock); + + if (ret < 0) { + /* Error as in SEEK_SET */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_DATA: + case SPLITFS_SEEK_HOLE: + new_errno = EOPNOTSUPP; + break; + default: + ret = -1; + break; + } + + if (ret < 0) { + ret = -1; + errno = new_errno; + } else { + if (file->offset != (size_t)ret) + LOG(LDBG, "off diff: old %lu != new %lu", file->offset, + (size_t)ret); + file->offset = (size_t)ret; + } + + return ret; +} + +/* + * splitfs_lseek -- changes file current offset + */ +off_t +splitfs_lseek(long fd, struct splitfs_file *file, off_t offset, int whence) +{ + LOG(0, "Called splitfs_lseek()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + COMPILE_ERROR_ON(sizeof(offset) != 8); + off_t ret; + + pthread_mutex_lock(&file->mutex); + ret = splitfs_lseek_locked(file, offset, whence); + pthread_mutex_unlock(&file->mutex); + + return ret; +} diff --git a/splitfs_syscall_intercept/src/mmap_pool.c b/splitfs_syscall_intercept/src/mmap_pool.c new file mode 100644 index 0000000000..c6b6f72668 --- /dev/null +++ b/splitfs_syscall_intercept/src/mmap_pool.c @@ -0,0 +1,60 @@ +/* + * ===================================================================================== + * + * Filename: mmap_pool.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:21:23 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include + +#include "constants.h" +#include "mmap_pool.h" +#include "sys_util.h" + +static void *free_mmap_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_mmap_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void * +fetch_free_mmap_slot(void) { + + void *entry; + + util_mutex_lock(&free_mmap_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_mmap_slots[--free_slot_count]; + + util_mutex_unlock(&free_mmap_slot_mutex); + + return entry; +} + +void * +splitfs_mmap_assign() { + + void *entry = fetch_free_mmap_slot(); + return entry; +} + +void +splitfs_mmap_add(void *entry) { + + util_mutex_lock(&free_mmap_slot_mutex); + + free_mmap_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_mmap_slot_mutex); +} diff --git a/splitfs_syscall_intercept/src/mmap_pool.h b/splitfs_syscall_intercept/src/mmap_pool.h new file mode 100644 index 0000000000..82bb40513b --- /dev/null +++ b/splitfs_syscall_intercept/src/mmap_pool.h @@ -0,0 +1,25 @@ +/* + * ===================================================================================== + * + * Filename: mmap_pool.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:22:53 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_MMAP_POOL_H +#define SPLITFS_MMAP_POOL_H + +void *splitfs_mmap_assign(void); +void splitfs_mmap_add(void *entry); + +#endif diff --git a/splitfs_syscall_intercept/src/os_thread.h b/splitfs_syscall_intercept/src/os_thread.h new file mode 100644 index 0000000000..c88028b83f --- /dev/null +++ b/splitfs_syscall_intercept/src/os_thread.h @@ -0,0 +1,122 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * os_locks.h -- wrappers around system locking functions + */ + +#ifndef PMEMFILE_OS_LOCKS_H +#define PMEMFILE_OS_LOCKS_H 1 + +typedef struct { + long long data[8]; +} os_mutex_t; + +typedef struct { + long long data[8]; +} os_rwlock_t; + +/* + * os_mutex_init -- system mutex init wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_init(os_mutex_t *m); + +/* + * os_mutex_destroy -- system mutex destroy wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_destroy(os_mutex_t *m); + +/* + * os_mutex_lock -- system mutex lock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_lock(os_mutex_t *m); + +/* + * os_mutex_unlock -- system mutex unlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_unlock(os_mutex_t *m); + +/* + * os_rwlock_init -- system rwlock init wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_init(os_rwlock_t *m); + +/* + * os_rwlock_rdlock -- system rwlock rdlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_rdlock(os_rwlock_t *m); + +/* + * os_rwlock_wrlock -- system rwlock wrlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_wrlock(os_rwlock_t *m); + +/* + * os_rwlock_unlock -- system rwlock unlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_unlock(os_rwlock_t *m); + +/* + * os_rwlock_destroy -- system rwlock destroy wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_destroy(os_rwlock_t *m); + +typedef unsigned os_tls_key_t; + +int os_tls_key_create(os_tls_key_t *key, void (*destr_function)(void *)); + +void *os_tls_get(os_tls_key_t key); +int os_tls_set(os_tls_key_t key, const void *ptr); + +typedef int os_once_t; + +void os_once(os_once_t *once, void (*init_routine)(void)); + +#endif diff --git a/splitfs_syscall_intercept/src/os_thread_pthread.c b/splitfs_syscall_intercept/src/os_thread_pthread.c new file mode 100644 index 0000000000..3d77b1bf7a --- /dev/null +++ b/splitfs_syscall_intercept/src/os_thread_pthread.c @@ -0,0 +1,164 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * os_locks_pthread.c -- wrappers around system locking functions + */ + +#include +#include +#include + +#include "os_thread.h" +#include "out.h" + +void +os_mutex_init(os_mutex_t *m) +{ + COMPILE_ERROR_ON(sizeof(os_mutex_t) < sizeof(pthread_mutex_t)); + int tmp = pthread_mutex_init((pthread_mutex_t *)m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_init"); + } +} + +void +os_mutex_destroy(os_mutex_t *m) +{ + int tmp = pthread_mutex_destroy((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_destroy"); + } +} + +void +os_mutex_lock(os_mutex_t *m) +{ + int tmp = pthread_mutex_lock((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_lock"); + } +} + +void +os_mutex_unlock(os_mutex_t *m) +{ + int tmp = pthread_mutex_unlock((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_unlock"); + } +} + +void +os_rwlock_init(os_rwlock_t *m) +{ + COMPILE_ERROR_ON(sizeof(os_rwlock_t) < sizeof(pthread_rwlock_t)); + int tmp = pthread_rwlock_init((pthread_rwlock_t *)m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_init"); + } +} + +void +os_rwlock_rdlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_rdlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_rdlock"); + } +} + +void +os_rwlock_wrlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_wrlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_wrlock"); + } +} + +void +os_rwlock_unlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_unlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_unlock"); + } +} + +void +os_rwlock_destroy(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_destroy((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_destroy"); + } +} + +int +os_tls_key_create(os_tls_key_t *key, void (*destr_function)(void *)) +{ + COMPILE_ERROR_ON(sizeof(os_tls_key_t) < sizeof(pthread_key_t)); + + return pthread_key_create((pthread_key_t *)key, destr_function); +} + +void * +os_tls_get(os_tls_key_t key) +{ + return pthread_getspecific((pthread_key_t)key); +} + +int +os_tls_set(os_tls_key_t key, const void *ptr) +{ + return pthread_setspecific((pthread_key_t)key, ptr); +} + +void +os_once(os_once_t *once, void (*init_routine)(void)) +{ + int tmp = pthread_once(once, init_routine); + if (tmp) { + errno = tmp; + FATAL("!pthread_once"); + } +} diff --git a/splitfs_syscall_intercept/src/os_util.h b/splitfs_syscall_intercept/src/os_util.h new file mode 100644 index 0000000000..c0440ccf49 --- /dev/null +++ b/splitfs_syscall_intercept/src/os_util.h @@ -0,0 +1,52 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OS_UTIL_H +#define OS_UTIL_H + +int os_getpid(void); +void os_describe_errno(int errnum, char *buf, size_t buflen); + +#ifdef DEBUG + +/* + * os_getexecname -- return name of current executable + * + * This function is only used when logging is enabled, to make + * it more clear in the log which program was running. + */ +const char *os_getexecname(void); + +#endif /* DEBUG */ + +int os_usleep(unsigned usec); + +#endif diff --git a/splitfs_syscall_intercept/src/os_util_linux.c b/splitfs_syscall_intercept/src/os_util_linux.c new file mode 100644 index 0000000000..18a45afa9c --- /dev/null +++ b/splitfs_syscall_intercept/src/os_util_linux.c @@ -0,0 +1,84 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "os_util.h" + +int +os_getpid(void) +{ + return getpid(); +} + +void +os_describe_errno(int errnum, char *buf, size_t buflen) +{ + /* + * There are 2 versions of strerror_r - returning int and char * - + * defined depending on feature macros. We want int variant, so to + * catch accidental change in the definition we use temporary int + * variable. + */ + int r = strerror_r(errnum, buf, buflen); + if (r) + snprintf(buf, buflen, "Unknown errno %d", errnum); +} + +#ifdef DEBUG +const char * +os_getexecname(void) +{ + static char namepath[PATH_MAX + 1]; + char procpath[PATH_MAX]; + ssize_t cc; + + snprintf(procpath, PATH_MAX, "/proc/%d/exe", os_getpid()); + + if ((cc = readlink(procpath, namepath, PATH_MAX)) < 0) + strcpy(namepath, "unknown"); + else + namepath[cc] = '\0'; + + return namepath; +} +#endif /* DEBUG */ + +int +os_usleep(unsigned usec) +{ + return usleep(usec); +} diff --git a/splitfs_syscall_intercept/src/out.c b/splitfs_syscall_intercept/src/out.c new file mode 100644 index 0000000000..e432cd3260 --- /dev/null +++ b/splitfs_syscall_intercept/src/out.c @@ -0,0 +1,349 @@ +/* + * ===================================================================================== + * + * Filename: out.c + * + * Description: + * + * Version: 1.0 + * Created: 08/02/2019 06:45:54 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include + +#include "compiler_utils.h" +#include "os_thread.h" +#include "os_util.h" +#include "out.h" + +#define UTIL_MAX_ERR_MSG 128 + +static const char *Log_prefix; +static int Log_level; +static FILE *Out_fp; +static unsigned Log_alignment; + +#define MAXPRINT 8192 /* maximum expected log line */ + +/* + * out_init -- initialize the log + * + * This is called from the library initialization code. + */ +void +out_init(const char *log_prefix, const char *log_level_var, + const char *log_file_var) +{ + static int once; + + /* only need to initialize the out module once */ + if (once) + return; + once++; + + Log_prefix = log_prefix; + +#ifdef DEBUG + char *log_level; + char *log_file; + + if ((log_level = getenv(log_level_var)) != NULL) { + Log_level = atoi(log_level); + // if (Log_level < 0) { + // Log_level = 0; + // } + } + + if ((log_file = getenv(log_file_var)) != NULL && log_file[0] != '\0') { + size_t cc = strlen(log_file); + + /* reserve more than enough space for a PID + '\0' */ + char *log_file_pid = alloca(cc + 30); + fprintf(stderr, "Here in debug\n"); + if (cc > 0 && log_file[cc - 1] == '-') { + snprintf(log_file_pid, cc + 30, "%s%d", + log_file, os_getpid()); + log_file = log_file_pid; + } + if ((Out_fp = fopen(log_file, "w")) == NULL) { + char buff[UTIL_MAX_ERR_MSG]; + os_describe_errno(errno, buff, UTIL_MAX_ERR_MSG); + fprintf(stderr, "Error (%s): %s=%s: %s\n", + log_prefix, log_file_var, + log_file, buff); + abort(); + } + } +#endif /* DEBUG */ + + if (Out_fp == NULL) + Out_fp = stderr; + else + setvbuf(Out_fp, NULL, _IOLBF, 0); + +#ifdef DEBUG + LOG(LDBG, "pid %d: program: %s", os_getpid(), os_getexecname()); +#endif + +} + +/* + * out_fini -- close the log file + * + * This is called to close log file before process stop. + */ +void +out_fini(void) +{ + if (Out_fp != NULL && Out_fp != stderr) { + fclose(Out_fp); + Out_fp = stderr; + } +} + +/* + * out_print_func -- default print_func, goes to stderr or Out_fp + */ +static void +out_print_func(const char *s) +{ + syscall_no_intercept(SYS_write, fileno(Out_fp), s, strlen(s)); + //fputs(s, Out_fp); +} + +/* + * calling Print(s) calls the current print_func... + */ +typedef void (*Print_func)(const char *s); +typedef int (*Vsnprintf_func)(char *str, size_t size, const char *format, + va_list ap); +static Print_func Print = out_print_func; +static Vsnprintf_func Vsnprintf = vsnprintf; + +/* + * out_set_print_func -- allow override of print_func used by out module + */ +void +out_set_print_func(void (*print_func)(const char *s)) +{ + LOG(3, "print %p", print_func); + + Print = (print_func == NULL) ? out_print_func : print_func; +} + +/* + * out_set_vsnprintf_func -- allow override of vsnprintf_func used by out module + */ +void +out_set_vsnprintf_func(int (*vsnprintf_func)(char *str, size_t size, + const char *format, va_list ap)) +{ + LOG(3, "vsnprintf %p", vsnprintf_func); + + Vsnprintf = (vsnprintf_func == NULL) ? vsnprintf : vsnprintf_func; +} + +/* + * out_snprintf -- (internal) custom snprintf implementation + */ +static splitfs_printf_like(3, 4) int +out_snprintf(char *str, size_t size, const char *format, ...) +{ + int ret; + va_list ap; + + va_start(ap, format); + ret = Vsnprintf(str, size, format, ap); + va_end(ap); + + return (ret); +} + +/* + * out_common -- common output code, all output goes through here + */ +static void +out_common(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *suffix, const char *fmt, va_list ap) +{ + int oerrno = errno; + char buf[MAXPRINT]; + unsigned cc = 0; + int ret; + const char *sep = ""; + char errstr[UTIL_MAX_ERR_MSG] = ""; + + if (file) { + char *f = strrchr(file, DIR_SEPARATOR); + if (f) + file = f + 1; + ret = out_snprintf(&buf[cc], MAXPRINT - cc, + "<%s>: <%d> <%d: %lu> [%s:%d %s] ", + Log_prefix, level, pid, tid, file, line, func); + if (ret < 0) { + Print("out_snprintf failed"); + goto end; + } + cc += (unsigned)ret; + if (cc < Log_alignment) { + memset(buf + cc, ' ', Log_alignment - cc); + cc = Log_alignment; + } + } + + if (fmt) { + if (*fmt == '!') { + fmt++; + sep = ": "; + os_describe_errno(errno, errstr, UTIL_MAX_ERR_MSG); + } + ret = Vsnprintf(&buf[cc], MAXPRINT - cc, fmt, ap); + if (ret < 0) { + Print("Vsnprintf failed"); + goto end; + } + cc += (unsigned)ret; + } + + out_snprintf(&buf[cc], MAXPRINT - cc, "%s%s%s", sep, errstr, suffix); + + Print(buf); + +end: + errno = oerrno; +} + +/* + * out_error -- common error output code, all error messages go through here + */ +static void +out_error(const char *file, int line, const char *func, + const char *suffix, const char *fmt, va_list ap) +{ + int oerrno = errno; + unsigned cc = 0; + int ret; + const char *sep = ""; + char errstr[UTIL_MAX_ERR_MSG] = ""; + + char *errormsg = (char *)out_get_errormsg(); + + if (fmt) { + if (*fmt == '!') { + fmt++; + sep = ": "; + os_describe_errno(errno, errstr, UTIL_MAX_ERR_MSG); + } + ret = Vsnprintf(&errormsg[cc], MAXPRINT, fmt, ap); + if (ret < 0) { + strcpy(errormsg, "Vsnprintf failed"); + goto end; + } + cc += (unsigned)ret; + out_snprintf(&errormsg[cc], MAXPRINT - cc, "%s%s", + sep, errstr); + } + +#ifdef DEBUG + if (Log_level >= 1) { + char buf[MAXPRINT]; + cc = 0; + + if (file) { + char *f = strrchr(file, DIR_SEPARATOR); + if (f) + file = f + 1; + ret = out_snprintf(&buf[cc], MAXPRINT, + "<%s>: <1> [%s:%d %s] ", + Log_prefix, file, line, func); + if (ret < 0) { + Print("out_snprintf failed"); + goto end; + } + cc += (unsigned)ret; + if (cc < Log_alignment) { + memset(buf + cc, ' ', Log_alignment - cc); + cc = Log_alignment; + } + } + + out_snprintf(&buf[cc], MAXPRINT - cc, "%s%s", errormsg, + suffix); + + Print(buf); + } +#endif + +end: + errno = oerrno; +} + +/* + * out_log -- output a log line if Log_level >= level + */ +void +out_log(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) +{ + va_list ap; + + if (Log_level < level) + return; + + va_start(ap, fmt); + out_common(file, line, func, level, pid, tid, "\n", fmt, ap); + + va_end(ap); +} + +/* + * out_fatal -- output a fatal error & die (i.e. assertion failure) + */ +void +out_fatal(const char *file, int line, const char *func, + const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + out_common(file, line, func, 1, 1, 1, "\n", fmt, ap); + + va_end(ap); + + abort(); +} + +/* + * out_err -- output an error message + */ +void +out_err(const char *file, int line, const char *func, + const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + out_error(file, line, func, "\n", fmt, ap); + + va_end(ap); +} + +/* + * out_get_errormsg -- get the last error message + */ +const char * +out_get_errormsg(void) +{ + return "Last message"; +} diff --git a/splitfs_syscall_intercept/src/out.h b/splitfs_syscall_intercept/src/out.h new file mode 100644 index 0000000000..c7c65c985a --- /dev/null +++ b/splitfs_syscall_intercept/src/out.h @@ -0,0 +1,242 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * out.h -- definitions for "out" module + */ + +#ifndef SPLITFS_OUT_H +#define SPLITFS_OUT_H 1 + +#include +#include +#include +#include +#include + +#include "compiler_utils.h" +#include "libsyscall_intercept_hook_point.h" + +#define LUSR 2 /* user error */ +#define LINF 3 /* information */ +#define LDBG 4 /* debug info */ +#define LTRC 10 /* traces, very verbose */ + +/* + * Suppress errors which are after appropriate ASSERT* macro for nondebug + * builds. + */ + +#if !defined(DEBUG) && (defined(__clang_analyzer__) || defined(__COVERITY__)) +#define OUT_FATAL_DISCARD_NORETURN void +#else +#define OUT_FATAL_DISCARD_NORETURN +#endif + +#ifndef OUT_ENABLED +#ifdef DEBUG +#define OUT_ENABLED 1 +#else +#define OUT_ENABLED 0 +#endif +#endif + +#if OUT_ENABLED == 1 + +#define DEBUG_ENABLED 1 +#define OUT_LOG out_log +#define OUT_NONL out_nonl +#define OUT_FATAL out_fatal +#define OUT_FATAL_ABORT out_fatal + +#else + +static inline splitfs_printf_like(7, 8) void +out_log_discard(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) level; + (void) pid; + (void) tid; + (void) fmt; +} + +static inline splitfs_printf_like(2, 3) void +out_nonl_discard(int level, const char *fmt, ...) +{ + (void) level; + (void) fmt; +} + +static inline splitfs_printf_like(4, 5) OUT_FATAL_DISCARD_NORETURN void +out_fatal_discard(const char *file, int line, const char *func, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) fmt; +} + +static inline splitfs_printf_like(4, 5) splitfs_noreturn void +out_fatal_abort(const char *file, int line, const char *func, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) fmt; + + abort(); +} + +#define DEBUG_ENABLED 0 +#define OUT_LOG out_log_discard +#define OUT_NONL out_nonl_discard +#define OUT_FATAL out_fatal_discard +#define OUT_FATAL_ABORT out_fatal_abort + +#endif + +/* + * Trigger compile time error with non-zero builtin constants. + * Pro: this macro can be used non compile time constants. + * Con: this macro can only be used in function scope. + */ +#define ASSERT_COMPILE_ERROR_ON(cond) ((void)sizeof(char[(cond) ? -1 : 1])); + +/* produce debug/trace output */ +#define LOG(level, ...) do { \ + if (!DEBUG_ENABLED) break;\ + OUT_LOG(__FILE__, __LINE__, __func__, level, getpid(), pthread_self(), __VA_ARGS__);\ +} while (0) + +/* produce debug/trace output without prefix and new line */ +#define LOG_NONL(level, ...) do { \ + if (!DEBUG_ENABLED) break; \ + OUT_NONL(level, __VA_ARGS__); \ +} while (0) + +/* produce output and exit +#define FATAL(...)\ + OUT_FATAL_ABORT(__FILE__, __LINE__, __func__, __VA_ARGS__) +*/ + +/* assert a condition is true at runtime */ +#define ASSERT_rt(cnd) do { \ + if (!DEBUG_ENABLED || (cnd)) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__, "assertion failure: %s", #cnd);\ +} while (0) + +/* assertion with extra info printed if assertion fails at runtime */ +#define ASSERTinfo_rt(cnd, info) do { \ + if (!DEBUG_ENABLED || (cnd)) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__, \ + "assertion failure: %s (%s = %s)", #cnd, #info, info);\ +} while (0) + +/* assert two integer values are equal at runtime */ +#define ASSERTeq_rt(lhs, rhs) do { \ + if (!DEBUG_ENABLED || ((lhs) == (rhs))) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__,\ + "assertion failure: %s (0x%llx) == %s (0x%llx)", #lhs,\ + (unsigned long long)(lhs), #rhs, (unsigned long long)(rhs)); \ +} while (0) + +/* assert two integer values are not equal at runtime */ +#define ASSERTne_rt(lhs, rhs) do { \ + if (!DEBUG_ENABLED || ((lhs) != (rhs))) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__,\ + "assertion failure: %s (0x%llx) != %s (0x%llx)", #lhs,\ + (unsigned long long)(lhs), #rhs, (unsigned long long)(rhs)); \ +} while (0) + +/* assert a condition is true */ +#define ASSERT(cnd)\ + do {\ + /*\ + * Detect useless asserts on always true expression. Please use\ + * COMPILE_ERROR_ON(!cnd) or ASSERT_rt(cnd) in such cases.\ + */\ + if (__builtin_constant_p(cnd))\ + ASSERT_COMPILE_ERROR_ON(cnd);\ + ASSERT_rt(cnd);\ + } while (0) + +/* assertion with extra info printed if assertion fails */ +#define ASSERTinfo(cnd, info)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(cnd))\ + ASSERT_COMPILE_ERROR_ON(cnd);\ + ASSERTinfo_rt(cnd);\ + } while (0) + +/* assert two integer values are equal */ +#define ASSERTeq(lhs, rhs)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(lhs) && __builtin_constant_p(rhs))\ + ASSERT_COMPILE_ERROR_ON((lhs) == (rhs));\ + ASSERTeq_rt(lhs, rhs);\ + } while (0) + +/* assert two integer values are not equal */ +#define ASSERTne(lhs, rhs)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(lhs) && __builtin_constant_p(rhs))\ + ASSERT_COMPILE_ERROR_ON((lhs) != (rhs));\ + ASSERTne_rt(lhs, rhs);\ + } while (0) + +#define ERR(...)\ + out_err(__FILE__, __LINE__, __func__, __VA_ARGS__) + +void out_init(const char *log_prefix, const char *log_level_var, + const char *log_file_var); +void out_fini(void); +void out_log(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) splitfs_printf_like(7, 8); +void out_err(const char *file, int line, const char *func, + const char *fmt, ...) splitfs_printf_like(4, 5); +void out_fatal(const char *file, int line, const char *func, + const char *fmt, ...) splitfs_printf_like(4, 5) splitfs_noreturn; +void out_set_print_func(void (*print_func)(const char *s)); +void out_set_vsnprintf_func(int (*vsnprintf_func)(char *str, size_t size, + const char *format, va_list ap)); +const char *out_get_errormsg(void); + +#endif diff --git a/splitfs_syscall_intercept/src/path_resolve.c b/splitfs_syscall_intercept/src/path_resolve.c new file mode 100644 index 0000000000..e857ead299 --- /dev/null +++ b/splitfs_syscall_intercept/src/path_resolve.c @@ -0,0 +1,142 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Gosh, this path resolving was pain to write. + * XXX: clean up this whole file, and add some more explanations. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libsyscall_intercept_hook_point.h" +#include "splitfs-posix.h" + +#include "preload.h" +#include "out.h" + +static void +_resolve_path(long fd_at, + const char *path, + struct resolved_path *result) +{ + if (path == NULL) { + result->error_code = -EFAULT; + return; + } + + size_t size; /* The length of the whole path to be resolved. */ + size_t result_path_size = 0; + result->error_code = 0; + + if (path[0] != '/') { + if (fd_at == AT_FDCWD) { + char cwd_path[PATH_MAX]; + if (getcwd(cwd_path, sizeof(cwd_path)) == NULL) { + result->error_code = -ENOTDIR; + return; + } + for (size = 0; cwd_path[size] != '\0'; size++) { + result->path[size] = cwd_path[size]; + } + result_path_size = size; + } else { + /* Get the stat buf of the directory fd_at */ + char at_path[PATH_MAX]; + char proc_fd_path[PATH_MAX]; + long readlink_ret; + + sprintf(proc_fd_path, "/proc/self/fd/%ld", fd_at); + readlink_ret = syscall_no_intercept(SYS_readlink, proc_fd_path, at_path, sizeof(at_path)); + if (readlink_ret == -1) { + result->error_code = -ENOTDIR; + return; + } + at_path[readlink_ret] = '\0'; + + for (size = 0; at_path[size] != '\0'; ++size) { + result->path[result_path_size] = at_path[size]; + result_path_size++; + } + } + } + + // Suppose we open 'file.txt' in cwd '/root/wspace' then the path should be + // '/root/wspace/file.txt' not '/root/wspacefile.txt' hence adding a '/' + if (path[0] != '\0' && result_path_size > 0 && result->path[result_path_size-1] != '/') { + result->path[result_path_size] = '/'; + result_path_size++; + } + + /* Copy input path to result */ + for (size = 0; path[size] != '\0'; ++size) { + result->path[result_path_size] = path[size]; + result_path_size++; + if (result_path_size == (sizeof(result->path) - 1)) { + result->error_code = -ENAMETOOLONG; + return; + } + } + result->path[result_path_size] = '\0'; + + result->path_len = result_path_size; + + if (size == 0) { /* empty string */ + result->error_code = -ENOTDIR; + return; + } +} + +/* + * resolve_path - the main logic for resolving paths containing arbitrary + * combinations of path components in the kernel's vfs and pmemfile pools. + * + * The at argument describes the starting directory of the path resolution, + * It can refer to either a directory in pmemfile pool, or a directory accessed + * via the kernel. + */ +void +resolve_path(long fd_at, + const char *path, + struct resolved_path *result) +{ + _resolve_path(fd_at, path, result); +} diff --git a/splitfs_syscall_intercept/src/pm_util.h b/splitfs_syscall_intercept/src/pm_util.h new file mode 100755 index 0000000000..9649ab27b8 --- /dev/null +++ b/splitfs_syscall_intercept/src/pm_util.h @@ -0,0 +1,44 @@ +#ifndef _UTIL_H_ +#define _UTIL_H_ + +#ifdef __GNUC__ +#define TYPEOF(x) (__typeof__(x)) +#else +#define TYPEOF(x) +#endif + +#if defined(__i386__) + +static inline unsigned long long asm_rdtsc(void) +{ + unsigned long long int x; + __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); + return x; +} + +static inline unsigned long long asm_rdtscp(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi)::"ecx"); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); + +} +#elif defined(__x86_64__) + +static inline unsigned long long asm_rdtsc(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); +} + +static inline unsigned long long asm_rdtscp(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi)::"rcx"); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); +} +#else +#error "Only support for X86 architecture" +#endif +#endif diff --git a/splitfs_syscall_intercept/src/preload.c b/splitfs_syscall_intercept/src/preload.c new file mode 100644 index 0000000000..ad6dfe8b59 --- /dev/null +++ b/splitfs_syscall_intercept/src/preload.c @@ -0,0 +1,809 @@ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "compiler_utils.h" +#include "libsyscall_intercept_hook_point.h" +#include "sys_util.h" +#include "preload.h" +#include "syscall_early_filter.h" +#include "out.h" + +static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int exit_on_ENOTSUP; +static long check_errno(long e, long syscall_no) +{ + if (e == -ENOTSUP && exit_on_ENOTSUP) { + char buf[100]; + sprintf(buf, "syscall %ld not supported by pmemfile, exiting", + syscall_no); + + exit_with_msg(SPLITFS_PRELOAD_EXIT_NOT_SUPPORTED, buf); + } + + return e; +} + +void +exit_with_msg(int ret, const char *msg) +{ + if (msg && msg[0] == '!') { + char buf[100]; + char *errstr = strerror_r(errno, buf, sizeof(buf)); + fprintf(stderr, "%s: %d %s\n", msg + 1, errno, + errstr ? errstr : "unknown"); + + log_write("%s: %d %s\n", msg + 1, errno, + errstr ? errstr : "unknown"); + } else if (msg) { + fprintf(stderr, "%s\n", msg); + + log_write("%s\n", msg); + } + + exit(ret); + __builtin_unreachable(); +} + +static size_t page_size; + +static inline bool +is_accessible(const void *ptr, size_t len) +{ + if (len == 0) + return true; + if (!ptr) + return false; + return true; +} + +static inline bool +is_str_accessible(const char *str) +{ + if (!str) + return false; + return true; +} + +static inline bool +is_valid_ptr(const char *str) +{ + long result; + result = syscall_no_intercept(SYS_access, str, F_OK); + /** + * We need to check if 'str' is a valid pointer, but not crash it + * (segfault) if it's invalid. + * + * Since it is not possible to validate a pointer in the user-space, + * we are making an access system call which validates + * the pointer. + */ + if(result == -EFAULT) { + return false; + } + return true; +} + +static inline int +verify_iovec(long lvec, long cnt) +{ + return 0; +} + +static long +hook_linkat(int fd0, const char *arg0, int fd1, const char * arg1, long flags) +{ + //exit_with_msg(-1, "hook_linkat() not supported. Exiting"); + return syscall_no_intercept(SYS_linkat, fd0, arg0, fd1, arg1, flags); +} + +static long +hook_unlinkat(int fd, const char *path, long flags) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + if (flags & AT_REMOVEDIR) { + return syscall_no_intercept(SYS_unlinkat, fd, path, flags); + } + + long ret = 0; + struct resolved_path where; + + resolve_path(fd, path, &where); + + if (where.error_code != 0) { + ret = where.error_code; + } else if (strstr(where.path, PMEM_ROOT_PATH) != (const char *)where.path) { + ret = syscall_no_intercept(SYS_unlinkat, fd, path, flags); + } else { + ret = splitfs_unlinkat(where.path, flags); + } + + return ret; +} + +static long +hook_newfstatat(int fd, const char *path, struct stat *st, long arg2) +{ + //exit_with_msg(-1, "hook_newfstatat() not supported. Exiting"); + return syscall_no_intercept(SYS_newfstatat, fd, path, st, arg2); +} + +static long +openat_helper(struct resolved_path *where, long flags, long mode) +{ + /* + long temp_flags; + + if (flags & O_DIRECTORY || flags & O_ASYNC || flags & O_TMPFILE) { + temp_flags = flags; + } + else { + temp_flags = flags; + temp_flags = temp_flags & ~O_RDONLY; + temp_flags = temp_flags & ~O_WRONLY; + temp_flags = temp_flags | O_RDWR; + } + */ + + long fd = syscall_no_intercept(SYS_open, where->path, flags, mode); + if (fd < 0) + return fd; + + SPLITFSfile *file = splitfs_openat(where->path, + ((int)flags) & ~O_NONBLOCK, + (mode_t)mode); + + long r = fd; + if (file != NULL) { + r = splitfs_vfd_assign(fd, file); + if (r < 0) { + splitfs_close(fd, file); + syscall_no_intercept(SYS_close, fd); + } + } + + return r; +} + +static long +hook_openat(int fd_at, const char *path, long flags, long mode) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + long ret = 0; + struct resolved_path where; + + resolve_path(fd_at, path, &where); + + if (where.error_code != 0) { + /* path resolution failed */ + ret = where.error_code; + } else if (strstr(where.path, PMEM_ROOT_PATH) != (char*) (where.path)) { + /* Not pmemfile resident path */ + ret = syscall_no_intercept(SYS_openat, + fd_at, where.path, flags, mode); + } else { + ret = openat_helper(&where, flags, mode); + } + + return ret; +} + +static long +hook_fcntl(long fd, int cmd, long arg) +{ + //exit_with_msg(-1, "hook_fcntl() not supported. Exiting"); + return syscall_no_intercept(SYS_fcntl, fd, cmd, arg); +} + +static long +hook_renameat2(int fd_old, const char *path_old, int fd_new, + const char *path_new, unsigned flags) +{ + long ret = 0; + struct resolved_path where_old, where_new; + + if (!is_valid_ptr(path_old) || !is_valid_ptr(path_new)) { + return -EFAULT; + } + + resolve_path(fd_old, path_old, &where_old); + resolve_path(fd_new, path_new, &where_new); + + ret = syscall_no_intercept(SYS_renameat2, fd_old, path_old, fd_new, path_new, flags); + return ret; +} + +static long +hook_truncate(const char *path, off_t length) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + long result; + + if (strstr(path, PMEM_ROOT_PATH) != path) { + result = syscall_no_intercept(SYS_truncate, path, length); + } else { + result = splitfs_truncate(path, length); + } + + return result; +} + +static long +hook_symlinkat(const char *target, int fd, const char *linkpath) +{ + //exit_with_msg(-1, "hook_symlinkat() not supported. Exiting"); + return syscall_no_intercept(SYS_symlinkat, target, fd, linkpath); +} + +static long +hook_execveat(int fd, const char *path, char *const argv[], + char *const envp[], int flags) +{ + //exit_with_msg(-1, "hook_execveat() not supported. Exiting"); + long result = splitfs_execv(); + if (result != 0) { + FATAL("Failed to execv"); + } + return syscall_no_intercept(SYS_execveat, fd, path, argv, envp, flags); +} + +static long +hook_mmap(long arg0, long arg1, long arg2, + long arg3, int fd, long arg5) +{ + return syscall_no_intercept(SYS_mmap, + arg0, arg1, arg2, arg3, fd, arg5); +} + +static long +hook_mknodat(int fd, const char *path, mode_t mode, dev_t dev) +{ + //exit_with_msg(-1, "hook_mknodat() not supported. Exiting"); + return syscall_no_intercept(SYS_mknodat, fd, path, mode, dev); +} + +static long +hook_statfs(const char *path, struct statfs *buf) +{ + //exit_with_msg(-1, "hook_statfs() not supported. Exiting"); + return syscall_no_intercept(SYS_statfs, path, buf); +} + +static long +dispatch_syscall(long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5) +{ + + switch (syscall_number) { + + /* Use pmemfile_openat to implement open, create, openat */ + case SYS_open: + return hook_openat(AT_FDCWD, (const char *)arg0, arg1, arg2); + + case SYS_creat: + return hook_openat(AT_FDCWD, (const char *)arg0, + O_WRONLY | O_CREAT | O_TRUNC, arg1); + + case SYS_openat: + return hook_openat((int)arg0, (const char *)arg1, arg2, arg3); + + case SYS_rename: + return hook_renameat2(AT_FDCWD, (const char *)arg0, + AT_FDCWD, (const char *)arg1, 0); + + case SYS_renameat: + return hook_renameat2((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, 0); + + case SYS_renameat2: + return hook_renameat2((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, (unsigned)arg4); + + case SYS_link: + /* Use pmemfile_linkat to implement link */ + return hook_linkat(AT_FDCWD, (const char *)arg0, + AT_FDCWD, (const char *)arg1, 0); + + case SYS_linkat: + return hook_linkat((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, arg4); + + case SYS_unlink: + /* Use pmemfile_unlinkat to implement unlink */ + return hook_unlinkat(AT_FDCWD, (const char *)arg0, 0); + + case SYS_unlinkat: + return hook_unlinkat((int)arg0, (const char *)arg1, arg2); + + case SYS_rmdir: + /* Use pmemfile_unlinkat to implement rmdir */ + return hook_unlinkat(AT_FDCWD, (const char *)arg0, + AT_REMOVEDIR); + + /* + * The newfstatat syscall implements both stat and lstat. + * Linux calls it: newfstatat ( I guess there was an old one ) + * POSIX / libc interfaces call it: fstatat + * pmemfile calls it: pmemfile_fstatat + * + * fstat is unique. + */ + case SYS_stat: + return hook_newfstatat(AT_FDCWD, (const char *)arg0, + (struct stat*)arg1, 0); + + case SYS_lstat: + return hook_newfstatat(AT_FDCWD, (const char *)arg0, + (struct stat*)arg1, AT_SYMLINK_NOFOLLOW); + + case SYS_newfstatat: + return hook_newfstatat((int)arg0, (const char *)arg1, + (struct stat*)arg2, arg3); + + case SYS_close: + return splitfs_vfd_close((int)arg0); + + case SYS_mmap: + return hook_mmap(arg0, arg1, arg2, arg3, (int)arg4, arg5); + + case SYS_truncate: + return hook_truncate((const char *)arg0, arg1); + + case SYS_symlink: + return hook_symlinkat((const char *)arg0, + AT_FDCWD, (const char *)arg1); + + case SYS_symlinkat: + return hook_symlinkat((const char *)arg0, (int)arg1, + (const char *)arg2); + + case SYS_mknod: + return hook_mknodat(AT_FDCWD, (const char *)arg0, + (mode_t)arg1, (dev_t)arg2); + + case SYS_mknodat: + return hook_mknodat((int)arg0, (const char *)arg1, + (mode_t)arg2, (dev_t)arg3); + + case SYS_execve: + return hook_execveat(AT_FDCWD, (const char *)arg0, + (char *const *)arg1, (char *const *)arg2, 0); + + case SYS_execveat: + return hook_execveat((int)arg0, (const char *)arg1, + (char *const *)arg2, (char *const *)arg3, (int)arg4); + + case SYS_dup: + return splitfs_vfd_dup((int)arg0); + + case SYS_dup2: + return splitfs_vfd_dup2((int)arg0, (int)arg1); + + case SYS_dup3: + return splitfs_vfd_dup3((int)arg0, (int)arg1, (int)arg2); + + case SYS_statfs: + return hook_statfs((const char *)arg0, (struct statfs *)arg1); + + default: + /* Did we miss something? */ + // assert(false); + return syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + } +} + +static long +dispatch_syscall_fd_first(long syscall_number, + struct splitfs_file *file, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5) +{ + switch (syscall_number) { + + case SYS_write: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_write(arg0, file, (void*)arg1, (size_t)arg2); + } + + case SYS_writev: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_writev(arg0, file, (struct iovec*)arg1, (int)arg2); + } + + case SYS_read: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_read(arg0, file, (void*)arg1, (size_t)arg2); + } + + case SYS_readv: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_readv(arg0, file, (struct iovec*)arg1, (int)arg2); + } + + case SYS_lseek: + return splitfs_lseek(arg0, file, arg1, (int)arg2); + + case SYS_pread64: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_pread(arg0, file, (void*)arg1, (size_t)arg2, arg3); + } + + case SYS_pwrite64: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_pwrite(arg0, file, (void*)arg1, (size_t)arg2, arg3); + } + + case SYS_preadv: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_preadv(arg0, file, (struct iovec*)arg1, (int)arg2, arg3); + } + + case SYS_pwritev: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_pwritev(arg0, file, (struct iovec*)arg1, (int)arg2, arg3); + } + + case SYS_fcntl: + return hook_fcntl(arg0, (int)arg1, arg2); + + case SYS_ftruncate: + return splitfs_ftruncate(arg0, file, arg1); + + case SYS_fallocate: + return splitfs_fallocate(arg0, file, (int)arg1, arg2, arg3); + + case SYS_fstat: { + if (!is_accessible((void *)arg1, sizeof(struct stat))) + return -EFAULT; + + return splitfs_fstat(arg0, file, (void*)arg1); + } + + case SYS_fsync: { + return splitfs_fsync(arg0, file); + } + + default: + /* Did we miss something? */ + assert(false); + return syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + + } +} + + +/* + * Return values expected by libsyscall_intercept: + * A non-zero return value if it should execute the syscall, + * zero return value if it should not execute the syscall, and + * use *result value as the syscall's result. + */ +#define NOT_HOOKED 1 +#define HOOKED 0 + +static int +hook(const struct syscall_early_filter_entry *filter_entry, long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5, + long *syscall_return_value) +{ + if (syscall_number != SYS_execve) { + // We do not lock for execve since we do shm_open + util_mutex_lock(&global_mutex); // TODO: Why is this required? + } + + //char data[1000]; + //for (int i = 0; i < 1000; i++) + //data[i] = '\0'; + //sprintf(data, "<%s, %d>: syscall number = %ld\n", __func__, __LINE__, syscall_number); + //syscall_no_intercept(SYS_write, fileno(stderr), data, strlen(data)); + if (syscall_number == SYS_fcntl && + ((int)arg1 == F_DUPFD || (int)arg1 == F_DUPFD_CLOEXEC)) { + /* + * Other fcntl commands on pmemfile resident files are handled + * via dispatch_syscall_fd_first. + * + * XXX: close-on-exec flag is not handled correctly yet. + */ + *syscall_return_value = + splitfs_vfd_fcntl_dup((int)arg0, (int)arg2); + + //syscall_no_intercept(SYS_write, fileno(stderr), "END\n", 5); + if (syscall_number != SYS_execve) { + util_mutex_unlock(&global_mutex); + } + return HOOKED; + } + + int is_hooked; + + is_hooked = HOOKED; + + if (filter_entry->fd_first_arg) { + + struct splitfs_file *file = splitfs_vfd_ref((int)arg0); + if (!file) { + *syscall_return_value = syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + goto end; + } + + *syscall_return_value = + dispatch_syscall_fd_first(syscall_number, + file, arg0, arg1, arg2, arg3, arg4, arg5); + + *syscall_return_value = + check_errno(*syscall_return_value, syscall_number); + + splitfs_vfd_unref((int)arg0); + + } else { + *syscall_return_value = dispatch_syscall(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + } + + /* + *syscall_return_value = syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + */ +end: + //syscall_no_intercept(SYS_write, fileno(stderr), "END\n", 5); + if (syscall_number != SYS_execve) { + util_mutex_unlock(&global_mutex); + } + return is_hooked; +} + +static __thread bool guard_flag; +/* + * hook_reentrance_guard_wrapper -- a wrapper which can notice reentrance. + * + * The guard_flag flag allows pmemfile to prevent the hooking of its own + * syscalls. E.g. while handling an open syscall, libpmemfile might + * call pmemfile_pool_open, which in turn uses an open syscall internally. + * This internally used open syscall is once again forwarded to libpmemfile, + * but using this flag libpmemfile can notice this case of reentering itself. + * + * XXX This approach still contains a very significant bug, as libpmemfile being + * called inside a signal handler might easily forward a mock fd to the kernel. + */ +static int +hook_reentrance_guard_wrapper(long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5, + long *syscall_return_value) +{ + struct syscall_early_filter_entry filter_entry; + filter_entry = get_early_filter_entry(syscall_number); + + if (!filter_entry.must_handle) + return NOT_HOOKED; + + int is_hooked; + + guard_flag = true; + int oerrno = errno; + is_hooked = hook(&filter_entry, syscall_number, arg0, arg1, arg2, arg3, + arg4, arg5, syscall_return_value); + errno = oerrno; + guard_flag = false; + + return is_hooked; +} + +static void +init_hooking(void) +{ + /* + * Install the callback to be called by the syscall intercepting library + */ + intercept_hook_point = &hook_reentrance_guard_wrapper; +} + +static int (*libc__xpg_strerror_r)(int __errnum, char *__buf, size_t __buflen); +static char *(*libc_strerror_r)(int __errnum, char *__buf, size_t __buflen); +static char *(*libc_strerror)(int __errnum); + +int __xpg_strerror_r(int __errnum, char *__buf, size_t __buflen); + +/* + * XSI-compliant version of strerror_r. We have to override it to handle + * possible deadlock/infinite recursion when pmemfile is called from inside of + * strerror_r implementation and we call back into libc because of some failure + * (notably: pool opening failed when process switching is enabled). + */ +int +__xpg_strerror_r(int __errnum, char *__buf, size_t __buflen) +{ + if (!guard_flag && libc__xpg_strerror_r) + return libc__xpg_strerror_r(__errnum, __buf, __buflen); + + if (__errnum == EAGAIN) { + const char *str = + "Resource temporary unavailable (pmemfile wrapper)"; + if (__buflen < strlen(str) + 1) + return ERANGE; + strcpy(__buf, str); + return 0; + } + + const char *str = "Error code %d (pmemfile wrapper)"; + if (__buflen < strlen(str) + 10) + return ERANGE; + sprintf(__buf, str, __errnum); + + return 0; +} + +/* + * GNU-compliant version of strerror_r. See __xpg_strerror_r description. + */ +char * +strerror_r(int __errnum, char *__buf, size_t __buflen) +{ + if (!guard_flag && libc_strerror_r) + return libc_strerror_r(__errnum, __buf, __buflen); + + const char *str = "Error code %d (pmemfile wrapper)"; + if (__buflen < strlen(str) + 10) + return NULL; + + sprintf(__buf, str, __errnum); + return __buf; +} + +/* + * See __xpg_strerror_r description. + */ +char * +strerror(int __errnum) +{ + static char buf[100]; + if (!guard_flag && libc_strerror) + return libc_strerror(__errnum); + + sprintf(buf, "Error code %d (pmemfile wrapper)", __errnum); + return buf; +} + +static volatile int pause_at_start; + +splitfs_constructor void +splitfs_preload_constructor(void) +{ + long ps_sys = sysconf(_SC_PAGE_SIZE); + if (ps_sys < 0) { + FATAL("!sysconf PAGE_SIZE"); + } + page_size = (size_t)ps_sys; + + splitfs_vfd_table_init(); + + /* + const char *env_str = getenv("PMEMFILE_EXIT_ON_NOT_SUPPORTED"); + if (env_str) + exit_on_ENOTSUP = env_str[0] == '1'; + + log_init(getenv("PMEMFILE_PRELOAD_LOG"), + getenv("PMEMFILE_PRELOAD_LOG_TRUNC")); + + env_str = getenv("PMEMFILE_PRELOAD_PROCESS_SWITCHING"); + if (env_str) + process_switching = env_str[0] == '1'; + + initialize_validate_pointers(); + + env_str = getenv("PMEMFILE_PRELOAD_PAUSE_AT_START"); + if (env_str && env_str[0] == '1') { + pause_at_start = 1; + while (pause_at_start) + ; + } + + assert(pool_count == 0); + struct stat kernel_cwd_stat; + stat_cwd(&kernel_cwd_stat); + + detect_mount_points(&kernel_cwd_stat); + establish_mount_points(getenv("PMEMFILE_POOLS"), &kernel_cwd_stat); + */ + + libc__xpg_strerror_r = dlsym(RTLD_NEXT, "__xpg_strerror_r"); + if (!libc__xpg_strerror_r) + FATAL("!can't find __xpg_strerror_r"); + + libc_strerror_r = dlsym(RTLD_NEXT, "strerror_r"); + if (!libc_strerror_r) + FATAL("!can't find strerror_r"); + + libc_strerror = dlsym(RTLD_NEXT, "strerror"); + if (!libc_strerror) + FATAL("!can't find strerror"); + + /* + * Must be the last step, the callback can be called anytime + * after the call to init_hooking() + */ + init_hooking(); + + /* + char *cd = getenv("PMEMFILE_CD"); + if (cd && chdir(cd)) { + perror("chdir"); + exit(1); + } + */ +} + +splitfs_destructor void +splitfs_preload_destructor(void) +{ + /* + * Flush all streams, before library state is destructed. + * Fixes an issue when application forgets to flush or close a file + * it written to and libc destructor calls fflush when pmemfile + * and pmemobj state doesn't exist anymore. + */ + fflush(NULL); +} diff --git a/splitfs_syscall_intercept/src/preload.h b/splitfs_syscall_intercept/src/preload.h new file mode 100644 index 0000000000..a5bb1ad0d6 --- /dev/null +++ b/splitfs_syscall_intercept/src/preload.h @@ -0,0 +1,63 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_PRELOAD_H +#define SPLITFS_PRELOAD_H + +#include +#include +#include +#include +#include + +#include "splitfs-posix.h" +#include "compiler_utils.h" + +#include "vfd_table.h" + +#define PMEM_ROOT_PATH "/mnt/pmem_emul" + +struct splitfs_file; + +struct resolved_path { + long error_code; + char path[PATH_MAX]; + size_t path_len; +}; + +void resolve_path(long at, + const char *path, + struct resolved_path *result); + +splitfs_printf_like(1, 2) void log_write(const char *fmt, ...); + +#endif diff --git a/splitfs_syscall_intercept/src/read.c b/splitfs_syscall_intercept/src/read.c new file mode 100644 index 0000000000..2157452722 --- /dev/null +++ b/splitfs_syscall_intercept/src/read.c @@ -0,0 +1,316 @@ +/* + * ===================================================================================== + * + * Filename: read.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:39:08 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "intel_intrin.h" +#include "add_delay.h" +#include "table_mmaps.h" +#include "out.h" + +#define MEMCPY memcpy + +static size_t +read_staging_file(struct splitfs_file *file, off_t offset, + char *buf, size_t count) { + + LOG(0, "in read_staging_file"); + char *mmap_addr = NULL; + size_t extent_length = 0; + + mmap_addr = (char *)get_staging_mmap_address(file, count, + (off_t) (offset - (off_t) inode_get_sync_size(file->vinode)), &extent_length, false); + + ASSERT(mmap_addr != NULL); + + ASSERT(extent_length >= count); + + if (extent_length > count) + extent_length = count; + + MEMCPY((char *)buf, (char *)mmap_addr, extent_length); + perfmodel_add_delay(1, extent_length); + + return extent_length; +} + +/* + * vinode_read -- reads file + */ +static size_t +vinode_read(long fd, struct splitfs_file *file, off_t offset, + char *buf, size_t count) +{ + uint64_t size = inode_get_uncommitted_size(file->vinode); + void *mmap_addr = 0; + size_t extent_length = 0; + size_t len_read = 0; + size_t len_to_read = count; + // char buf2[count]; + LOG(0, "in vinode_read. fd = %ld, offset = %ld, count = %lu", fd, offset, count); + +//goto syscall; + /* + * Start reading at offset, stop reading + * when end of file is reached, or count bytes were read. + * The following two branches compute how many bytes are + * going to be read. + */ + if ((size_t)offset >= size) + return 0; /* EOF already */ + + if (size - (size_t)offset < count) + count = size - (size_t)offset; + + while (len_read < count) { + size_t len_read_iter = 0; + if ((size_t)offset >= inode_get_sync_size(file->vinode)) { + extent_length = read_staging_file(file, offset, + (char *) (buf + len_read), len_to_read); + goto loop_end; + } + + mmap_addr = (void *)splitfs_get_tbl_entry(file->vinode->tbl_mmap, offset, &extent_length); + if (mmap_addr == NULL) + mmap_addr = (void *)get_mmap_address(fd, file, offset, &extent_length); + + if ((size_t)offset + len_to_read >= inode_get_sync_size(file->vinode)) { + len_read_iter = inode_get_sync_size(file->vinode) - (size_t)offset; + } else { + len_read_iter = len_to_read; + } + + if (extent_length > len_read_iter) { + extent_length = len_read_iter; + } + + if (mmap_addr == NULL && extent_length == 0) { + extent_length = (size_t) syscall_no_intercept( + SYS_pread64, fd, (char *) (buf + len_read), + len_read_iter, offset); + } else { + LOG(0, "reading mmap_addr = %p, length = %lu, inode = %u", (char*)mmap_addr, extent_length, file->vinode->serialno); + MEMCPY((char *)buf, (char *)mmap_addr, extent_length); + perfmodel_add_delay(1, extent_length); + /* + syscall_no_intercept(SYS_pread64, fd, buf2, extent_length, offset); + if (strncmp((char*)(buf + len_read), buf2, extent_length) != 0) { + LOG(0, "%s", buf2); + LOG(0, "%s", (char*)(buf)); + LOG(0, "Reading wrong data: offset = %ld, length = %lu, addr = %p, fd = %ld, len_read = %lu", + offset, extent_length, (char*)mmap_addr, fd, len_read); + ASSERT(false); + } + */ + } + +loop_end: + len_read += extent_length; + len_to_read -= extent_length; + offset += (off_t)extent_length; + buf += extent_length; + } + + LOG(0, "read returns %lu", count); + +//syscall: + //count = syscall_no_intercept(SYS_pread64, fd, buf, count, offset); + return count; +} + + +/* + * pmemfile_preadv_args_check - checks some read arguments + * The arguments here can be examined while holding the mutex for the + * PMEMfile instance, while there is no need to hold the lock for the + * corresponding vinode instance. + */ +static ssize_t +splitfs_preadv_args_check(struct splitfs_file *file, + const struct iovec *iov, + int iovcnt) +{ + LOG(LDBG, "vinode %p iov %p iovcnt %d", file->vinode, iov, iovcnt); + + if (!(file->flags & PFILE_READ)) { + errno = EBADF; + return -1; + } + + if (iovcnt > 0 && iov == NULL) { + errno = EFAULT; + return -1; + } + + for (int i = 0; i < iovcnt; ++i) { + if (iov[i].iov_base == NULL) { + errno = EFAULT; + return -1; + } + } + + return 0; +} + +static ssize_t +splitfs_preadv_internal(long fd, + struct splitfs_file *file, + size_t offset, + const struct iovec *iov, + int iovcnt) +{ + LOG(0, "in splitfs_preadv_internal"); + ssize_t ret = 0; + + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + if ((ssize_t)((size_t)ret + len) < 0) + len = (size_t)(SSIZE_MAX - ret); + + ASSERT((ssize_t)((size_t)ret + len) >= 0); + + size_t bytes_read = vinode_read(fd, file, (off_t)offset, + iov[i].iov_base, len); + + ret += (ssize_t)bytes_read; + offset += bytes_read; + if (bytes_read != len) + break; + } + + return ret; +} + +/* + * pmemfile_readv_under_filelock - read from a file + * This function expects the PMEMfile instance to be locked while being called. + * Since the offset field is used to determine where to read from, and is also + * updated after a successful read operation, the PMEMfile instance can not be + * accessed by others while this is happening. + * + */ +static ssize_t +splitfs_readv_under_filelock(long fd, struct splitfs_file *file, + const struct iovec *iov, int iovcnt) +{ + ssize_t ret; + + ret = splitfs_preadv_args_check(file, iov, iovcnt); + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_preadv_internal(fd, + file, + file->offset, iov, iovcnt); + + + os_rwlock_unlock(&file->vinode->rwlock); + + if (ret > 0) { + file->offset += (size_t)ret; + } + + return ret; +} + + +ssize_t +splitfs_readv(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt) { + + LOG(0, "Called splitfs_readv()"); + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + pthread_mutex_lock(&file->mutex); + + ssize_t ret = + splitfs_readv_under_filelock(fd, file, iov, iovcnt); + + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_pread(long fd, struct splitfs_file *file, void *buf, size_t count, off_t offset) { + + struct iovec element = { .iov_base = buf, .iov_len = count }; + return splitfs_preadv(fd, file, &element, 1, offset); +} + +ssize_t +splitfs_preadv(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt, off_t offset) { + + LOG(0, "Called splitfs_preadv()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + if (offset < 0) { + errno = EINVAL; + return -1; + } + + ssize_t ret; + + pthread_mutex_lock(&file->mutex); + + ret = splitfs_preadv_args_check(file, iov, iovcnt); + + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&(file->vinode->rwlock)); + + ret = splitfs_preadv_internal(fd, file, (size_t)offset, iov, iovcnt); + + os_rwlock_unlock(&(file->vinode->rwlock)); + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_read(long fd, struct splitfs_file *file, void* buf, size_t count) { + + struct iovec element = { .iov_base = buf, .iov_len = count }; + return splitfs_readv(fd, file, &element, 1); +} diff --git a/splitfs_syscall_intercept/src/relink.c b/splitfs_syscall_intercept/src/relink.c new file mode 100644 index 0000000000..8a2722af96 --- /dev/null +++ b/splitfs_syscall_intercept/src/relink.c @@ -0,0 +1,68 @@ +/* + * ===================================================================================== + * + * Filename: relink.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 07:34:28 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "splitfs-posix.h" +#include "utils.h" +#include "relink.h" +#include "table_mmaps.h" +#include "out.h" + +void +perform_relink(long fd2, off_t offset2, + struct splitfs_vinode *inode, + size_t count) { + + if (!inode) + FATAL("inode is NULL"); + if (!inode->staging) + FATAL("staging is NULL"); + + struct sfile_description *staging = inode->staging; + + long fd1 = staging->fd; + off_t offset1 = staging->valid_offset; + const char *start_addr = (const char *)staging->start_addr; + + if (!start_addr) + FATAL("start_addr is NULL"); + + /* perform the relink */ + long ret = (long) syscall_no_intercept(335, fd2, + fd1, offset2, offset1, + start_addr, count); + + //long ret = syscall_no_intercept(SYS_pwrite64, fd2, (char *) (start_addr + offset1), count, offset2); + + if (ret < 0) + FATAL("ret is less than 0"); + if (!inode->tbl_mmap) + FATAL("tbl_mmap is null"); + + LOG(0, "will insert into table mmap"); + /* Add entry to tbl_mmap */ + splitfs_insert_tbl_entry(inode->tbl_mmap, offset2, + offset1, count, (unsigned long)staging->start_addr + (unsigned long)offset1); + + /* page align the valid_offset of the staging file */ + staging->valid_offset = offset1 + (off_t)count; + align_valid_offset(staging, PAGE_SIZE); + + /* give away the staging file from file2 to global pool */ + splitfs_add_to_staging_pool(staging); +} diff --git a/splitfs_syscall_intercept/src/relink.h b/splitfs_syscall_intercept/src/relink.h new file mode 100644 index 0000000000..08b262cb95 --- /dev/null +++ b/splitfs_syscall_intercept/src/relink.h @@ -0,0 +1,32 @@ +/* + * ===================================================================================== + * + * Filename: relink.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 10:07:20 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_RELINK_H +#define SPLITFS_RELINK_H + +#include "file.h" +#include "sys_util.h" +#include "inode.h" +#include "staging.h" +#include + +void perform_relink(long fd2, off_t offset2, + struct splitfs_vinode *inode, + size_t count); + +#endif diff --git a/splitfs_syscall_intercept/src/splitfs-posix.c b/splitfs_syscall_intercept/src/splitfs-posix.c new file mode 100644 index 0000000000..b7152153de --- /dev/null +++ b/splitfs_syscall_intercept/src/splitfs-posix.c @@ -0,0 +1,132 @@ + +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * pmemfile-posix.c -- library constructor / destructor + */ + +#define _GNU_SOURCE + +#include +#include + +#include "compiler_utils.h" +#include "file.h" +#include "hash_map.h" +#include "staging.h" +#include "staging_thread.h" +#include "splitfs-posix.h" +#include "sys_util.h" +#include "out.h" +#include "intel_intrin.h" +#include "execv.h" + +#define SPLITFS_POSIX_LOG_PREFIX "splitfs-posix" +#define SPLITFS_POSIX_LOG_LEVEL_VAR "SPLITFS_POSIX_LOG_LEVEL" +#define SPLITFS_POSIX_LOG_FILE_VAR "SPLITFS_POSIX_LOG_FILE" + +struct hash_map *file_inode_map = NULL; +struct hash_map *global_mmap_cache = NULL; +struct hash_map *tbl_mmap_cache = NULL; +pthread_mutex_t mmap_cache_mutex; +pthread_mutex_t tbl_mmap_mutex; +bool exit_staging_thread = false; + +/* + * splitfs_posix_init -- load-time initialization for splitfs-posix + * + * Called automatically by the run-time loader. + */ +splitfs_constructor void +splitfs_posix_init(void) +{ + + out_init(SPLITFS_POSIX_LOG_PREFIX, SPLITFS_POSIX_LOG_LEVEL_VAR, + SPLITFS_POSIX_LOG_FILE_VAR); + LOG(LDBG, NULL); + LOG(0, "constructor invoked"); + + /* Write splitfs init stuff here */ + + /* Point _mm_flush to the right instruction based on availability of + clflushopt cpu instruction */ + splitfs_init_mm_flush(); + + /* Create splitfs_file table */ + splitfs_file_table_init(); + + /* Create splitfs_vinode table */ + splitfs_inode_free_list_init(); + + /* Create file to inode mapping */ + file_inode_map = hash_map_alloc(); + + /* Create global mmap cache */ + global_mmap_cache = hash_map_alloc(); + pthread_mutex_init(&mmap_cache_mutex, NULL); + + /* Create table_mmaps for appends */ + tbl_mmap_cache = hash_map_alloc(); + pthread_mutex_init(&tbl_mmap_mutex, NULL); + + /* Create files for appends */ + splitfs_spool_init(); + + /* Start staging thread */ + splitfs_start_thread(); + + /* Restore FDs after exec */ + splitfs_restore_fd_if_exec(); +} + +/* + * libpmemfile_posix_fini -- libpmemfile-posix cleanup routine + * + * Called automatically when the process terminates. + */ +splitfs_destructor void +splitfs_posix_fini(void) +{ + LOG(LDBG, NULL); + exit_staging_thread = true; + out_fini(); +} + +/* + * pmemfile_errormsg -- return last error message + */ +const char * +splitfs_errormsg(void) +{ + return out_get_errormsg(); +} diff --git a/splitfs_syscall_intercept/src/staging.c b/splitfs_syscall_intercept/src/staging.c new file mode 100644 index 0000000000..f00d795e8d --- /dev/null +++ b/splitfs_syscall_intercept/src/staging.c @@ -0,0 +1,244 @@ +/* + * ===================================================================================== + * + * Filename: staging.c + * + * Description: + * + * Version: 1.0 + * Created: 08/04/2019 10:29:30 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "constants.h" +#include "sys_util.h" +#include "file.h" +#include "staging.h" +#include "add_delay.h" +#include "out.h" + +#define STAGING_FILE_TEMPLATE "/mnt/pmem_emul/Staging-XXXXXX" + +static struct sfile_description *free_spool_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_spool_slot_mutex = PTHREAD_MUTEX_INITIALIZER; +// static int staging_counter; + +static void get_staging_filename(char *filename) { + filename[sprintf(filename, "%s", STAGING_FILE_TEMPLATE)] = '\0'; + mktemp(filename); + filename[strlen(filename)] = '\0'; +} + +static void +create_staging_file(struct sfile_description *entry) { + + long fd = 0; + struct stat sbuf; + long ret = 0; + char filename[256]; + + if (!entry) + FATAL("entry is false"); + + // staging_counter++; + + get_staging_filename(filename); + + fd = syscall_no_intercept(SYS_open, filename, O_RDWR | O_CREAT, 0666); + if (fd < 0) { + FATAL("creating of staging file failed\n"); + } + + ret = syscall_no_intercept(SYS_fallocate, (int)fd, 0, 0, STAGING_FILE_SIZE); + if (ret < 0) { + FATAL("posix_fallocate failed\n"); + } + + ret = syscall_no_intercept(SYS_stat, filename, &sbuf); + if (ret != 0) { + FATAL("stat failed\n"); + } + + entry->fd = fd; + entry->ino = (uint32_t)sbuf.st_ino; +} + +static void +map_staging_file(struct sfile_description *entry) { + + if (!entry) + FATAL("entry is null"); + + char *prefault_buf; + + prefault_buf = calloc(1, (2*1024*1024)); + + entry->start_addr = mmap(NULL, + STAGING_FILE_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + (int)entry->fd, + 0); + + if (entry->start_addr == NULL) { + FATAL("mmap failed\n"); + } + + for (unsigned i = 0; i < (STAGING_FILE_SIZE) / (2*1024*1024); i++) { + memcpy((char*)entry->start_addr + (i*2*1024*1024), + prefault_buf, + (2*1024*1024)); + perfmodel_add_delay(0, (2*1024*1024)); + } + + entry->valid_offset = 0; + entry->start_offset = 0; + entry->end_offset = 0; + + free(prefault_buf); +} + +static struct sfile_description * +fetch_free_spool_slot(void) { + + struct sfile_description *entry; + + util_mutex_lock(&free_spool_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_spool_slots[--free_slot_count]; + + util_mutex_unlock(&free_spool_slot_mutex); + + return entry; +} + + +static void +mark_as_free_file_slot(struct sfile_description *entry) { + + util_mutex_lock(&free_spool_slot_mutex); + + free_spool_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_spool_slot_mutex); +} + +static void +setup_free_slots(void) { + + static struct sfile_description store[NUM_STAGING_FILES]; + for (unsigned i = 0; i < NUM_STAGING_FILES; i++) { + create_staging_file(&store[i]); + map_staging_file(&store[i]); + mark_as_free_file_slot(store + i); + } +} + +void +splitfs_add_to_staging_pool(struct sfile_description *staging) { + + if (staging) { + mark_as_free_file_slot(staging); + } +} + +long +splitfs_staging_file_assign(struct splitfs_file *file) { + + if (!file) + FATAL("file is null"); + + struct sfile_description *entry = fetch_free_spool_slot(); + if (entry == NULL) + return -1; + + file->vinode->staging = entry; + + return 0; +} + +void +align_valid_offset(struct sfile_description *staging, off_t alignment) { + + //ASSERT(staging); + if (!staging) + FATAL("staging is null"); + + off_t staging_alignment = staging->valid_offset % PAGE_SIZE; + off_t desired_alignment = alignment % PAGE_SIZE; + off_t diff_align = 0; + + LOG(0, "desired_alignment = %lu, staging alignment = %lu", desired_alignment, staging_alignment); + + if (staging_alignment < desired_alignment) { + diff_align = desired_alignment - staging_alignment; + staging->valid_offset += diff_align; + } else { + diff_align = PAGE_SIZE - staging_alignment; + diff_align += desired_alignment; + staging->valid_offset += diff_align; + } + + staging_alignment = staging->valid_offset % PAGE_SIZE; + //ASSERT(staging_alignment == desired_alignment); + if (staging_alignment != desired_alignment) + FATAL("Alignment is not correct"); +} + +void +get_staging_file(struct splitfs_file *file) { + + if (file->vinode->length != file->vinode->sync_length) + FATAL("Length mismatch"); + + long ret = splitfs_staging_file_assign(file); + off_t alignment = (off_t)file->vinode->sync_length; + + if (ret != 0) { + file->vinode->staging = (struct sfile_description *) malloc(sizeof(struct sfile_description)); + create_staging_file(file->vinode->staging); + map_staging_file(file->vinode->staging); + } + align_valid_offset(file->vinode->staging, alignment); +} + +void +create_and_add_staging_files(int num_files) { + + struct sfile_description *new_store[num_files]; + + for (int i = 0; i < num_files; i++) { + new_store[i] = malloc(sizeof(struct sfile_description)); + create_staging_file(new_store[i]); + map_staging_file(new_store[i]); + mark_as_free_file_slot(new_store[i]); + } +} + +void +splitfs_spool_init(void) { + + setup_free_slots(); +} diff --git a/splitfs_syscall_intercept/src/staging.h b/splitfs_syscall_intercept/src/staging.h new file mode 100644 index 0000000000..cb73e19dae --- /dev/null +++ b/splitfs_syscall_intercept/src/staging.h @@ -0,0 +1,43 @@ +/* + * ===================================================================================== + * + * Filename: staging.h + * + * Description: + * + * Version: 1.0 + * Created: 08/04/2019 11:52:12 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_STAGING_H +#define SPLITFS_STAGING_H + +#include "file.h" + +#define NUM_STAGING_FILES 10 +#define STAGING_FILE_SIZE (160*1024*1024) + +struct sfile_description { + long fd; + void *start_addr; + uint32_t ino; + off_t valid_offset; + off_t start_offset; + off_t end_offset; +}; + +long splitfs_staging_file_assign(struct splitfs_file *file); +void splitfs_add_to_staging_pool(struct sfile_description *staging); +void align_valid_offset(struct sfile_description *staging, off_t alignment); +void get_staging_file(struct splitfs_file *file); +void splitfs_spool_init(void); +void create_and_add_staging_files(int num_files); + +#endif diff --git a/splitfs_syscall_intercept/src/staging_thread.c b/splitfs_syscall_intercept/src/staging_thread.c new file mode 100644 index 0000000000..fced90d007 --- /dev/null +++ b/splitfs_syscall_intercept/src/staging_thread.c @@ -0,0 +1,90 @@ +/* + * ===================================================================================== + * + * Filename: staging_thread.c + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 11:19:23 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#include "staging_thread.h" + +static pthread_t cleaning_thread; +static pthread_cond_t cleaning_signal; +static pthread_mutex_t thread_mutex; + +static bool thread_running; +static bool thread_started; +static bool wait_for_signal; + +static void add_staging_files() { + int num_staging_files = 1; + create_and_add_staging_files(num_staging_files); + thread_running = false; +} + +static void *thread_wrapper() { + start: + pthread_mutex_lock(&thread_mutex); + wait_for_signal = true; + while(!thread_running) { + pthread_cond_wait(&cleaning_signal, &thread_mutex); + } + wait_for_signal = false; + pthread_mutex_unlock(&thread_mutex); + add_staging_files(); + if(!exit_staging_thread) + goto start; + thread_started = false; + return NULL; +} + +static void activate_thread() { + pthread_mutex_lock(&thread_mutex); + thread_running = true; + pthread_cond_signal(&cleaning_signal); + pthread_mutex_unlock(&thread_mutex); +} + +static void thread_init() { + pthread_cond_init(&cleaning_signal, NULL); + pthread_mutex_init(&thread_mutex, NULL); +} + +void splitfs_start_thread() { + if (!thread_started) { + thread_started = true; + thread_init(); + pthread_create(&cleaning_thread, NULL, &thread_wrapper, NULL); + } +} + +void splitfs_thread_wait() { + if(thread_started) { + pthread_join(cleaning_thread, NULL); + } +} + +void splitfs_exit_thread() { + if(thread_started) { + pthread_cancel(cleaning_thread); + pthread_testcancel(); + } +} + + +void splitfs_call_thread() { + if(thread_running) + return; + + activate_thread(); +} diff --git a/splitfs_syscall_intercept/src/staging_thread.h b/splitfs_syscall_intercept/src/staging_thread.h new file mode 100644 index 0000000000..f922d29b65 --- /dev/null +++ b/splitfs_syscall_intercept/src/staging_thread.h @@ -0,0 +1,18 @@ +#ifndef SPLITFS_BG_STAGING_H +#define SPLITFS_BG_STAGING_H + +#include +#include +#include +#include +#include +#include "staging.h" + +extern bool exit_staging_thread; + +void splitfs_start_thread(void); +void splitfs_thread_wait(void); +void splitfs_exit_thread(void); +void splitfs_call_thread(void); + +#endif diff --git a/splitfs_syscall_intercept/src/stat.c b/splitfs_syscall_intercept/src/stat.c new file mode 100644 index 0000000000..51af7ec620 --- /dev/null +++ b/splitfs_syscall_intercept/src/stat.c @@ -0,0 +1,110 @@ +/* + * ===================================================================================== + * + * Filename: stat.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:51:54 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "file.h" +#include "inode.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "out.h" + +static void +_splitfs_vinode_stat(struct splitfs_vinode *inode, struct stat *buf) { + + LOG(0, "inode->size = %lu, buf size = %lu, serialno = %u\n", + inode_get_uncommitted_size(inode), buf->st_size, inode->serialno); + buf->st_size = (off_t) inode_get_uncommitted_size(inode); +} + +static int +_splitfs_fstatat(const char *path, struct stat *buf, int flags) { + + LOG(LDBG, "path %s", path); + + int ret = (int) syscall_no_intercept(SYS_stat, path, buf); + if (ret != 0) + return ret; + + struct splitfs_vinode *inode = splitfs_map_vinode_check((uint32_t) buf->st_ino); + + if (inode) + _splitfs_vinode_stat(inode, buf); + + return ret; +} + +int +splitfs_fstatat(const char* path, struct stat *buf, int flags) { + + LOG(0, "Called splitfs_fstatat()"); + + if (!path) { + errno = EFAULT; + return -1; + } + + if (path[0] != '/') { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + int ret = _splitfs_fstatat(path, buf, flags); + + return ret; +} + +int +splitfs_fstat(long fd, struct splitfs_file *file, struct stat *buf) { + + + if (!file) { + errno = EFAULT; + return -1; + } + + int ret = (int) syscall_no_intercept(SYS_stat, fd, buf); + LOG(0, "Called splitfs_fstat(). fd = %ld, sbuf size = %lu", fd, buf->st_size); + + if (file->vinode) + _splitfs_vinode_stat(file->vinode, buf); + + if (ret) { + errno = ret; + return -1; + } + + return 0; +} + +int +splitfs_lstat(const char* path, struct stat* buf) { + + LOG(0, "Called splitfs_lstat()"); + return splitfs_fstatat(path, buf, 0); +} + +int +splitfs_stat(const char *path, struct stat *buf) { + + LOG(LDBG, "Called splitfs_stat()"); + return splitfs_fstatat(path, buf, 0); +} diff --git a/splitfs_syscall_intercept/src/sys_util.h b/splitfs_syscall_intercept/src/sys_util.h new file mode 100644 index 0000000000..bcaf942c75 --- /dev/null +++ b/splitfs_syscall_intercept/src/sys_util.h @@ -0,0 +1,199 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * sys_util.h -- internal utility wrappers around system functions + */ + +#ifndef SPLITFS_SYS_UTIL_H +#define SPLITFS_SYS_UTIL_H 1 + +#include +#include +#include + +#include "libsyscall_intercept_hook_point.h" +#include "compiler_utils.h" + +#define SPLITFS_PRELOAD_EXIT_NOT_SUPPORTED 95 +#define SPLITFS_PRELOAD_EXIT_TOO_MANY_FDS 96 +#define SPLITFS_PRELOAD_EXIT_GETCWD_FAILED 97 +#define SPLITFS_PRELOAD_EXIT_CWD_STAT_FAILED 98 +#define SPLITFS_PRELOAD_EXIT_POOL_OPEN_FAILED 99 +#define SPLITFS_PRELOAD_EXIT_CONFIG_ERROR 100 +#define SPLITFS_PRELOAD_EXIT_FATAL_CONDITION 128 + 6 + +void +exit_with_msg(int ret, const char *msg); + +static inline void +FATAL(const char *str) +{ + exit_with_msg(SPLITFS_PRELOAD_EXIT_FATAL_CONDITION, str); +} + +/* + * util_mutex_init -- pthread_mutex_init variant that never fails from + * caller perspective. If pthread_mutex_init failed, this function aborts + * the program. + */ +static inline void +util_mutex_init(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_init(m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_init"); + } +} + +/* + * util_mutex_destroy -- pthread_mutex_destroy variant that never fails from + * caller perspective. If pthread_mutex_destroy failed, this function aborts + * the program. + */ +static inline void +util_mutex_destroy(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_destroy(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_destroy"); + } +} + +/* + * util_mutex_lock -- pthread_mutex_lock variant that never fails from + * caller perspective. If pthread_mutex_lock failed, this function aborts + * the program. + */ +static inline void +util_mutex_lock(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_lock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_lock"); + } +} + +/* + * util_mutex_unlock -- pthread_mutex_unlock variant that never fails from + * caller perspective. If pthread_mutex_unlock failed, this function aborts + * the program. + */ +static inline void +util_mutex_unlock(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_unlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_unlock"); + } +} + +/* + * util_rwlock_init -- pthread_rwlock_init variant that never fails from + * caller perspective. If pthread_rwlock_init failed, this function aborts + * the program. + */ +static inline void +util_rwlock_init(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_init(m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_init"); + } +} + +/* + * util_rwlock_rdlock -- pthread_rwlock_rdlock variant that never fails from + * caller perspective. If pthread_rwlock_rdlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_rdlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_rdlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_rdlock"); + } +} + +/* + * util_rwlock_wrlock -- pthread_rwlock_wrlock variant that never fails from + * caller perspective. If pthread_rwlock_wrlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_wrlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_wrlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_wrlock"); + } +} + +/* + * util_rwlock_unlock -- pthread_rwlock_unlock variant that never fails from + * caller perspective. If pthread_rwlock_unlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_unlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_unlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_unlock"); + } +} + +/* + * util_rwlock_destroy -- pthread_rwlock_destroy variant that never fails from + * caller perspective. If pthread_rwlock_destroy failed, this function aborts + * the program. + */ +static inline void +util_rwlock_destroy(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_destroy(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_destroy"); + } +} + +#endif diff --git a/splitfs_syscall_intercept/src/syscall_early_filter.c b/splitfs_syscall_intercept/src/syscall_early_filter.c new file mode 100644 index 0000000000..3f1f98a5f3 --- /dev/null +++ b/splitfs_syscall_intercept/src/syscall_early_filter.c @@ -0,0 +1,217 @@ +/* + * Copyright 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * syscall_early_filter.c -- the table of early filter flags, and + * function(s) to access the table. + * + * For explanations, see syscall_early_filter.h + */ + +#include "syscall_early_filter.h" + +#include +#include "sys_util.h" + +static struct syscall_early_filter_entry filter_table[] = { + [SYS_close] = { + .must_handle = true, + }, + [SYS_creat] = { + .must_handle = true, + }, + [SYS_fallocate] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fcntl] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fdatasync] = { + .must_handle = true, + .fd_first_arg = true, + .returns_zero = true, + }, + [SYS_fstat] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fstatfs] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fsync] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_ftruncate] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_linkat] = { + .must_handle = true, + }, + [SYS_link] = { + .must_handle = true, + }, + [SYS_lseek] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_lstat] = { + .must_handle = true, + }, + [SYS_mkdirat] = { + .must_handle = false, + }, + [SYS_mkdir] = { + .must_handle = false, + }, + [SYS_mknod] = { + .must_handle = true, + }, + [SYS_mknodat] = { + .must_handle = true, + }, + [SYS_newfstatat] = { + .must_handle = true, + }, + [SYS_openat] = { + .must_handle = true, + }, + [SYS_open] = { + .must_handle = true, + }, + [SYS_pread64] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_preadv] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_pwrite64] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_pwritev] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_read] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_readv] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_renameat2] = { + .must_handle = true, + }, + [SYS_renameat] = { + .must_handle = true, + }, + [SYS_rename] = { + .must_handle = true, + }, + [SYS_stat] = { + .must_handle = true, + }, + [SYS_statfs] = { + .must_handle = true, + }, + [SYS_symlinkat] = { + .must_handle = true, + }, + [SYS_symlink] = { + .must_handle = true, + }, + [SYS_syncfs] = { + .must_handle = true, + .fd_first_arg = true, + .returns_zero = true, + }, + [SYS_truncate] = { + .must_handle = true, + }, + [SYS_unlinkat] = { + .must_handle = true, + }, + [SYS_unlink] = { + .must_handle = true, + }, + [SYS_write] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_writev] = { + .must_handle = true, + .fd_first_arg = true, + }, + + /* Syscalls not handled yet */ + [SYS_dup2] = { + .must_handle = true, + }, + [SYS_dup3] = { + .must_handle = true, + }, + [SYS_dup] = { + .must_handle = true, + }, + [SYS_execveat] = { + .must_handle = true, + }, + [SYS_execve] = { + .must_handle = true, + }, + [SYS_mmap] = { + .must_handle = true, + }, + [SYS_readahead] = { + .must_handle = true, + .fd_first_arg = true, + .returns_ENOTSUP = true, + }, +}; + +struct syscall_early_filter_entry +get_early_filter_entry(long syscall_number) +{ + if (syscall_number < 0 || + (size_t)syscall_number >= ARRAY_SIZE(filter_table)) + return (struct syscall_early_filter_entry) {false, }; + + return filter_table[syscall_number]; +} diff --git a/splitfs_syscall_intercept/src/syscall_early_filter.h b/splitfs_syscall_intercept/src/syscall_early_filter.h new file mode 100644 index 0000000000..f584b75dcb --- /dev/null +++ b/splitfs_syscall_intercept/src/syscall_early_filter.h @@ -0,0 +1,122 @@ +/* + * Copyright 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_SRC_SYSCALL_EARLY_FILTER_H +#define SPLITFS_SRC_SYSCALL_EARLY_FILTER_H + +#include +#include + +/* + * Some flags controlling syscall handling at a high level. + * These flags are contained in a table, provide information that + * depend on the syscall number of syscall to be handled, and can be used before + * parsing any arguments of a syscall (thus called "early"). + * The most important aspect to remember is: "before parsing any arguments of + * a syscall". Which really just means "syscall specific parsing...", i.e. + * parsing that is specific to a single syscall. + * In practice, some of these flags are applicable to any syscall, and some + * are only applicable to some of them. + * These flags should not be used for anything that is specific to a single + * syscall. + * + * As of this writing, this is only used in the preload.c source file. + * Please see the function called hook in preload.c + */ +struct syscall_early_filter_entry { + /* Might this be pmemfile related, or can this syscall be ignored? */ + bool must_handle; + + /* + * The fd_first_arg flag marks syscalls, which accept a file descriptor + * as their first argument. This allows libpmemfile to easily isolate + * the process of checking the first argument, and making a decision + * based on that fd being associated with pmemfile-posix or not. + * This is used to fetch pmemfile pointer and pass it to syscall + * instead of fd. One exception is close which must get fd so flag + * is not set for that syscall. + * Some obvious examples: read, write, fstat, etc... + * + * But: + * Only those which operate on the file specified by this fd. The *_at + * syscalls usually also accept an fd as a first argument, but those + * directory references must be processed in a different way. + * For example the first argument of openat is an fd, but it does not + * refer to a file that is potentially handled using libpmemfile-posix. + * Instead, the decision (to forward to libpmemfile-posix or to the + * kernel) is made after fully resolving the path. + */ + bool fd_first_arg; + + /* + * The returns_zero flag marks syscalls which operate on a file + * descriptor, and just return zero whenever that fd is associated + * with a pmemfile-posix handled file. This allows an easy + * implementation of some effectively NOP syscalls, e.g.: + * The syncfs syscall can always be considered successful when + * called with an fd referring to a pmemfile resident file -- thus + * libpmemfile can return zero (indicating success), without parsing + * any of the syscall arguments. + * + * Important: this only has meaning once it is known, that the syscall + * attempts to operate on a pmemfile handled file (kernel handled file + * descriptors of course should be forwarded to the kernel). Thus, + * it is not strictly true, that it allows libpmemfile to make a + * decision before parsing any of the arguments. + * Still, this logic can be shared between multiple syscalls, thus + * it can still be considered "early" filtering -- filtering before + * parsing the other arguments specific to the syscall. + * + * This implies, that returns_zero can only be set when the + * fd_first_arg flag is also set (this covers common cases, where + * the first argument is an fd, and zero can be returned). + */ + bool returns_zero; + + /* + * The idea behind the returns_ENOTSUP flag is the exactly the same + * as in the case of the returns_zero flag (except for the return + * value). E.g. as long as writev is not implemented for pmemfile + * handled files, the libpmemfile library can return ENOTSUP for a + * writev syscalls. + */ + bool returns_ENOTSUP; +}; + +/* + * get_early_filter_entry -- returns a filter entry with flags corresponding + * to the syscall number. When called with an invalid syscall number (e.g. -1), + * all returned flags are set to false. + */ +struct syscall_early_filter_entry get_early_filter_entry(long syscall_number); + +#endif diff --git a/splitfs_syscall_intercept/src/table_mmaps.c b/splitfs_syscall_intercept/src/table_mmaps.c new file mode 100644 index 0000000000..0c31b969d6 --- /dev/null +++ b/splitfs_syscall_intercept/src/table_mmaps.c @@ -0,0 +1,162 @@ +/* + * ===================================================================================== + * + * Filename: table_mmaps.c + * + * Description: + * + * Version: 1.0 + * Created: 08/09/2019 01:18:44 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "table_mmaps.h" +#include + +struct table_entry { + long fd_start_offset; + long fd_end_offset; + long st_start_offset; + long st_end_offset; + unsigned long buf_start; +}; + +struct table_mmap { + struct table_entry *mmaps; + int tbl_mmap_idx; +}; + +static int find_idx_to_read(off_t start_offset, + struct table_mmap *tbl) +{ + int idx_bin = 0; + int left = 0, right = tbl->tbl_mmap_idx - 1; + int mid = (right + left) / 2; + + if (right < left) { + return -1; + } + + if (mid < 0) + ASSERT(false); + if (left < 0) + ASSERT(false); + if (right < 0) + ASSERT(false); + + while (left <= right) { + mid = (right + left) / 2; + + if (tbl->mmaps[mid].fd_end_offset < start_offset) { + left = mid + 1; + continue; + } + + if (tbl->mmaps[mid].fd_end_offset >= start_offset && + tbl->mmaps[mid].fd_start_offset <= start_offset) { + idx_bin = mid; + goto out; + } + + if (tbl->mmaps[mid].fd_end_offset >= start_offset && + tbl->mmaps[mid].fd_start_offset > start_offset) { + right = mid - 1; + continue; + } + } + + idx_bin = -1; + + out: + return idx_bin; +} + +void splitfs_insert_tbl_entry(struct table_mmap *tbl, off_t fd_start_offset, + off_t st_start_offset, size_t length, unsigned long buf_start) { + + off_t st_prev_start = 0, st_prev_end = 0, fd_prev_end = 0, fd_end_offset = 0, st_end_offset = 0; + size_t prev_size; + unsigned long prev_buf_start = 0, prev_buf_end = 0; + int max_idx = 0; + + fd_end_offset = fd_start_offset + (off_t)length - 1; + st_end_offset = st_start_offset + (off_t)length - 1; + + LOG(0, "Doing insert entry. tbl_mmap_idx = %d", tbl->tbl_mmap_idx); + max_idx = tbl->tbl_mmap_idx; + if (max_idx == 0) + goto add_entry; + + st_prev_start = tbl->mmaps[max_idx-1].st_start_offset; + st_prev_end = tbl->mmaps[max_idx-1].st_end_offset; + fd_prev_end = tbl->mmaps[max_idx-1].fd_end_offset; + prev_buf_start = tbl->mmaps[max_idx-1].buf_start; + prev_size = (size_t)st_prev_end - (size_t)st_prev_start + 1; + prev_buf_end = (unsigned long) (prev_buf_start + prev_size - 1); + + if ((buf_start == prev_buf_end + 1) && + (fd_start_offset == fd_prev_end + 1)) { + tbl->mmaps[max_idx-1].fd_end_offset = fd_end_offset; + tbl->mmaps[max_idx-1].st_end_offset = st_end_offset; + return; + } + +add_entry: + tbl->mmaps[max_idx].fd_start_offset = fd_start_offset; + tbl->mmaps[max_idx].st_start_offset = st_start_offset; + tbl->mmaps[max_idx].fd_end_offset = fd_end_offset; + tbl->mmaps[max_idx].st_end_offset = st_end_offset; + tbl->mmaps[max_idx].buf_start = buf_start; + LOG(0, "inserted at idx = %d, buf_start = %p, fd_start = %ld, st_start = %ld, count = %lu", + max_idx, (void*)buf_start, fd_start_offset, st_start_offset, length); + tbl->tbl_mmap_idx++; +} + +void *splitfs_get_tbl_entry(struct table_mmap *tbl, off_t start_offset, size_t *extent_length) { + + void *mmap_addr = NULL; + *extent_length = 0; + int idx = 0; + + idx = find_idx_to_read(start_offset, tbl); + + LOG(0, "find_idx_to_read returned id = %d", idx); + if (idx != -1) { + off_t start_off_diff = start_offset - tbl->mmaps[idx].fd_start_offset; + off_t tbl_entry_start_off = tbl->mmaps[idx].st_start_offset + start_off_diff; + size_t tbl_entry_len = (size_t)tbl->mmaps[idx].st_end_offset - (size_t)tbl_entry_start_off + 1; + *extent_length = tbl_entry_len; + mmap_addr = (void *) ((unsigned long)tbl->mmaps[idx].buf_start + (unsigned long)start_off_diff); + LOG(0, "tbl_entry_len = %lu, st_end_offset = %ld, tbl_entry_start_offset = %ld, tbl entry file start off = %ld, tbl entry file end off = %ld", tbl_entry_len, + tbl->mmaps[idx].st_end_offset, tbl_entry_start_off, tbl->mmaps[idx].fd_start_offset, tbl->mmaps[idx].fd_end_offset); + } + + LOG(0, "returning mmap_addr = %p, extent_length = %lu", mmap_addr, *extent_length); + + return mmap_addr; +} + +struct table_mmap *splitfs_alloc_tbl() { + + struct table_mmap *entry = NULL; + entry = (struct table_mmap *) calloc(1, sizeof(struct table_mmap)); + entry->mmaps = (struct table_entry *) calloc(PER_NODE_MMAPS, sizeof(struct table_entry)); + entry->tbl_mmap_idx = 0; + return entry; +} + +void splitfs_clear_tbl_mmaps(struct table_mmap *tbl) { + + for (long idx = 0; idx < tbl->tbl_mmap_idx; idx++) { + size_t count = (size_t) (tbl->mmaps[idx].fd_end_offset - tbl->mmaps[idx].fd_start_offset + 1); + munmap((char *)(tbl->mmaps[idx].buf_start), count); + } + tbl->tbl_mmap_idx = 0; +} diff --git a/splitfs_syscall_intercept/src/table_mmaps.h b/splitfs_syscall_intercept/src/table_mmaps.h new file mode 100644 index 0000000000..2ae964f062 --- /dev/null +++ b/splitfs_syscall_intercept/src/table_mmaps.h @@ -0,0 +1,32 @@ +/* + * ===================================================================================== + * + * Filename: table_mmaps.h + * + * Description: + * + * Version: 1.0 + * Created: 08/09/2019 03:01:44 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_TBL_MMAPS_H +#define SPLITFS_TBL_MMAPS_H + +#include "handle_mmaps.h" + +struct table_mmap; + +void *splitfs_get_tbl_entry(struct table_mmap *tbl, off_t start_offset, size_t *extent_length); +void splitfs_insert_tbl_entry(struct table_mmap *tbl, off_t fd_start_offset, + off_t st_start_offset, size_t length, unsigned long buf_start); +struct table_mmap *splitfs_alloc_tbl(void); +void splitfs_clear_tbl_mmaps(struct table_mmap *tbl); + +#endif diff --git a/splitfs_syscall_intercept/src/truncate.c b/splitfs_syscall_intercept/src/truncate.c new file mode 100644 index 0000000000..bac4b1f059 --- /dev/null +++ b/splitfs_syscall_intercept/src/truncate.c @@ -0,0 +1,116 @@ +/* + * ===================================================================================== + * + * Filename: truncate.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:20:46 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "truncate.h" + +long +splitfs_truncate_vinode(struct splitfs_vinode *inode, off_t length) { + + bool remove_mmap = false; + inode_set_uncommitted_size(inode, (size_t)length); + inode_set_sync_size(inode, (size_t)length); + inode_set_large_file_status(inode, false); + clear_mmaps_from_ino(inode->serialno, remove_mmap); + + return 0; +} + +static long +_splitfs_truncate(const char *path, off_t length) { + + struct stat sbuf; + long ret = 0; + + ret = stat(path, &sbuf); + if (ret != 0) { + errno = EINVAL; + return -1; + } + + uint32_t serialno = (uint32_t) sbuf.st_ino; + + struct splitfs_vinode *inode = splitfs_map_vinode_check(serialno); + + if (inode == NULL) { + bool remove_mmap = false; + clear_mmaps_from_ino(serialno, remove_mmap); + ret = syscall_no_intercept(SYS_truncate, path, length); + return ret; + } + + os_rwlock_wrlock(&inode->rwlock); + splitfs_truncate_vinode(inode, length); + ret = syscall_no_intercept(SYS_truncate, path, length); + os_rwlock_unlock(&inode->rwlock); + + return ret; +} + +long +splitfs_truncate(const char* path, off_t length) { + + LOG(0, "Called splitfs_truncate()"); + long error = 0; + + if (!path) { + LOG(LUSR, "NULL path"); + errno = EFAULT; + return -1; + } + + if (length < 0) { + errno = EINVAL; + return -1; + } + + if (error != 0) + return error; + + error = _splitfs_truncate(path, length); + + return error; +} + +long +splitfs_ftruncate(long fd, struct splitfs_file *file, off_t length) { + + LOG(0, "Called splitfs_ftruncate()"); + + long ret = 0; + + util_mutex_lock(&file->mutex); + struct splitfs_vinode *inode = file->vinode; + util_mutex_unlock(&file->mutex); + + if (!inode) { + ret = syscall_no_intercept(SYS_ftruncate, fd, length); + return ret; + } + + + os_rwlock_wrlock(&inode->rwlock); + ret = splitfs_truncate_vinode(inode, length); + ret = syscall_no_intercept(SYS_ftruncate, fd, length); + os_rwlock_unlock(&inode->rwlock); + + return ret; +} diff --git a/splitfs_syscall_intercept/src/truncate.h b/splitfs_syscall_intercept/src/truncate.h new file mode 100644 index 0000000000..0595efa258 --- /dev/null +++ b/splitfs_syscall_intercept/src/truncate.h @@ -0,0 +1,30 @@ +/* + * ===================================================================================== + * + * Filename: truncate.h + * + * Description: + * + * Version: 1.0 + * Created: 08/06/2019 04:19:30 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_TRUNCATE_H +#define SPLITFS_TRUNCATE_H + +#include "utils.h" +#include "handle_mmaps.h" +#include "inode.h" +#include "splitfs-posix.h" +#include "out.h" + +long splitfs_truncate_vinode(struct splitfs_vinode *inode, off_t length); + +#endif diff --git a/splitfs_syscall_intercept/src/unlink.c b/splitfs_syscall_intercept/src/unlink.c new file mode 100644 index 0000000000..a8920c0ee3 --- /dev/null +++ b/splitfs_syscall_intercept/src/unlink.c @@ -0,0 +1,90 @@ +/* + * ===================================================================================== + * + * Filename: unlink.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:41:17 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include + +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "hash_map.h" +#include "out.h" + +static int +_splitfs_unlinkat(const char *pathname) { + + struct stat sbuf; + int ret = 0; + + ret = (int)syscall_no_intercept(SYS_lstat, pathname, &sbuf); + if (ret != 0) { + return ret; + } + + uint32_t serialno = (uint32_t) sbuf.st_ino; + bool remove_mmap = true; + LOG(0, "Called splitfs_unlinkat(). path = %s. inode = %u", pathname, serialno); + + LOG(0, "clearing mmaps"); + ret = (int) clear_mmaps_from_ino(serialno, remove_mmap); + + LOG(0, "clearing tbl mmaps"); + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + return ret; +} + +int splitfs_unlinkat(const char *pathname, long flags) { + + + int ret = 0; + + if (!pathname) { + errno = ENOENT; + return -1; + } + + if (pathname[0] != '/') { + LOG(LUSR, "NULL dir"); + errno = EFAULT; + return -1; + } + + if (flags != 0) { + errno = EINVAL; + ret = -1; + } else { + ret = _splitfs_unlinkat(pathname); + } + + if (ret == 0) { + ret = (int) syscall_no_intercept(SYS_unlink, pathname); + } + + LOG(0, "unlink done. return = %d", ret); + return ret; +} + +int splitfs_unlink(const char* pathname) { + return splitfs_unlinkat(pathname, 0); +} diff --git a/splitfs_syscall_intercept/src/utils.c b/splitfs_syscall_intercept/src/utils.c new file mode 100644 index 0000000000..4a84b7aa65 --- /dev/null +++ b/splitfs_syscall_intercept/src/utils.c @@ -0,0 +1,118 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include "utils.h" +#include "splitfs-posix.h" + +/* + * is_zeroed -- check if given memory range is all zero + */ +bool +is_zeroed(const void *addr, size_t len) +{ + /* XXX optimize */ + const char *a = (const char *)addr; + while (len-- > 0) + if (*a++) + return false; + return true; +} + +/* + * str_compare -- compares 2 strings + * + * s1 is NUL-terminated, + * s2 is not - its length is s2n + */ +int +str_compare(const char *s1, const char *s2, size_t s2n) +{ + int ret = strncmp(s1, s2, s2n); + if (ret) + return ret; + if (s1[s2n] != 0) + return 1; + return 0; +} + +/* + * str_contains -- returns true if string contains specified character in first + * len bytes + */ +bool +str_contains(const char *str, size_t len, char c) +{ + for (size_t i = 0; i < len; ++i) + if (str[i] == c) + return true; + + return false; +} + +/* + * more_than_1_component -- returns true if path contains more than one + * component + * + * Deals with slashes at the end of path. + */ +bool +more_than_1_component(const char *path) +{ + path = strchr(path, '/'); + if (!path) + return false; + + while (*path == '/') + path++; + + if (*path == 0) + return false; + + return true; +} + +/* + * component_length -- returns number of characters till the end of path + * component + */ +size_t +component_length(const char *path) +{ + const char *slash = strchr(path, '/'); + if (!slash) + return strlen(path); + return (uintptr_t)slash - (uintptr_t)path; +} diff --git a/splitfs_syscall_intercept/src/utils.h b/splitfs_syscall_intercept/src/utils.h new file mode 100644 index 0000000000..a96abaeab7 --- /dev/null +++ b/splitfs_syscall_intercept/src/utils.h @@ -0,0 +1,46 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_UTILS_H +#define SPLITFS_UTILS_H + +#include "inode.h" +#include "splitfs-posix.h" + +bool is_zeroed(const void *addr, size_t len); + +int str_compare(const char *s1, const char *s2, size_t s2n); +bool str_contains(const char *str, size_t len, char c); +bool more_than_1_component(const char *path); +size_t component_length(const char *path); + +#endif diff --git a/splitfs_syscall_intercept/src/vfd_table.c b/splitfs_syscall_intercept/src/vfd_table.c new file mode 100644 index 0000000000..3306c0ced7 --- /dev/null +++ b/splitfs_syscall_intercept/src/vfd_table.c @@ -0,0 +1,350 @@ +/* + * ===================================================================================== + * + * Filename: vfd_table.c + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 06:03:17 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include + +#include +#include + +#include "constants.h" +#include "sys_util.h" +#include "preload.h" +#include "out.h" + +struct vfile_description { + SPLITFSfile *file; + int ref_count; +}; + +static void +vf_ref_count_inc(struct vfile_description *entry) { + + __atomic_add_fetch(&entry->ref_count, 1, __ATOMIC_ACQ_REL); +} + +static void +ref_vfd_entry(struct vfile_description *entry) { + + if (entry != NULL) + vf_ref_count_inc(entry); +} + +static int +vf_ref_count_dec_and_fetch(struct vfile_description *entry) { + + return __atomic_sub_fetch(&entry->ref_count, 1, __ATOMIC_ACQ_REL); +} + +static struct vfile_description *vfd_table[OPEN_MAX]; + +static pthread_mutex_t vfd_table_mutex = PTHREAD_MUTEX_INITIALIZER; + +static struct vfile_description *free_vfile_slots[ARRAY_SIZE(vfd_table)]; +static unsigned free_slot_count; +static pthread_mutex_t free_vfile_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static bool +is_in_vfd_table_range(int number) { + + return (number >= 0) && (number < (int)ARRAY_SIZE(vfd_table)); +} + +static bool +can_be_in_vfd_table(int vfd) { + + if (!is_in_vfd_table_range(vfd)) + return false; + + return __atomic_load_n(vfd_table + vfd, __ATOMIC_CONSUME) != NULL; +} + +static void +mark_as_free_file_slot(struct vfile_description *entry) { + + util_mutex_lock(&free_vfile_slot_mutex); + + free_vfile_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_vfile_slot_mutex); +} + + +static void +unref_vfd_entry(long fd, struct vfile_description *entry) { + + if (entry == NULL) + return; + + if (vf_ref_count_dec_and_fetch(entry) == 0) { + splitfs_close(fd, entry->file); + mark_as_free_file_slot(entry); + } +} + +void splitfs_vfd_unref(int vfd) { + return unref_vfd_entry(vfd, vfd_table[vfd]); +} + +SPLITFSfile * +splitfs_vfd_ref(int vfd) { + + struct vfile_description *entry; + + util_mutex_lock(&vfd_table_mutex); + + ref_vfd_entry(vfd_table[vfd]); + entry = vfd_table[vfd]; + + util_mutex_unlock(&vfd_table_mutex); + + if (entry) + return entry->file; + else + return NULL; +} + +SPLITFSfile* +splitfs_execv_vfd_get(int vfd) { + struct vfile_description *entry; + entry = vfd_table[vfd]; + if (entry) + return entry->file; + else + return NULL; +} + +static struct vfile_description * +fetch_free_file_slot(void) { + + struct vfile_description *entry; + + util_mutex_lock(&free_vfile_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_vfile_slots[--free_slot_count]; + + util_mutex_unlock(&free_vfile_slot_mutex); + + return entry; +} + +static void +setup_free_slots(void) { + + static struct vfile_description store[ARRAY_SIZE(free_vfile_slots) - 1]; + + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) + mark_as_free_file_slot(store + i); +} + +long +splitfs_vfd_assign(long vfd, + struct splitfs_file *file) { + + struct vfile_description *entry = fetch_free_file_slot(); + if (entry == NULL) + return -ENOMEM; + + *entry = (struct vfile_description) { + .ref_count = 1, .file = file}; + + util_mutex_lock(&vfd_table_mutex); + + vfd_table[vfd] = entry; + + util_mutex_unlock(&vfd_table_mutex); + + return vfd; +} + +/* + * vfd_dup2_under_mutex -- perform dup2 + * If the old_vfd refers to entry, increase the corresponding ref_count. + * If the new_vfd refers to entry, decrease the corresponding ref_count -- this should be done by caller i.e., before the actual dup2 system call. + * Overwrite the entry pointer in the vfd_table. + * The order of the three operations does not matter, as long as the entries + * as different, and all three happen while holding the vfd_table_mutex. + * + * Important: dup2 must be atomic from the user's point of view. + */ +static int +vfd_dup2_under_mutex(int old_vfd, int new_vfd) +{ + if (new_vfd < 0) + return new_vfd; + + /* + * "If oldfd is a valid file descriptor, and newfd has the same value + * as oldfd, then dup2() does nothing, and returns newfd." + * + * It is easily verified if the old vfd is valid or not, by asking + * the kernel to dup2 the underlying (possible) memfd -- see the + * function calling this function. + */ + if (old_vfd == new_vfd) + return new_vfd; + + if (!is_in_vfd_table_range(new_vfd)) { + /* new_vfd can't be used to index the vfd_table */ + syscall_no_intercept(SYS_close, new_vfd); + exit(1); + return -ENOMEM; + } + + if (vfd_table[old_vfd] == vfd_table[new_vfd]) + return new_vfd; + + ref_vfd_entry(vfd_table[old_vfd]); + // the below commented call should be done by the caller i.e., before the actual system call for dup2 is done + // unref_vfd_entry(new_vfd, vfd_table[new_vfd]); + __atomic_store_n(vfd_table + new_vfd, vfd_table[old_vfd], + __ATOMIC_RELEASE); + + return new_vfd; +} + +/* + * pmemfile_vfd_dup -- creates a new reference to a vfile_description entry, + * if the vfd refers to one. + */ +int +splitfs_vfd_dup(int vfd) +{ + if (!can_be_in_vfd_table(vfd)) + return (int)syscall_no_intercept(SYS_dup, vfd); + + int new_vfd; + util_mutex_lock(&vfd_table_mutex); + + new_vfd = (int)syscall_no_intercept(SYS_dup, vfd); + + new_vfd = vfd_dup2_under_mutex(vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return new_vfd; +} + +int +splitfs_vfd_fcntl_dup(int vfd, int min_new_vfd) +{ + if (!can_be_in_vfd_table(vfd)) + return (int)syscall_no_intercept(SYS_fcntl, + vfd, F_DUPFD, min_new_vfd); + + int new_vfd; + util_mutex_lock(&vfd_table_mutex); + + new_vfd = (int)syscall_no_intercept(SYS_fcntl, + vfd, F_DUPFD, min_new_vfd); + + new_vfd = vfd_dup2_under_mutex(vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return new_vfd; +} + +/* + * pmemfile_vfd_dup2 -- create a new reference to a vfile_description entry, + * potentially replacing a reference to another one. + */ +int +splitfs_vfd_dup2(int old_vfd, int new_vfd) +{ + if ((!can_be_in_vfd_table(old_vfd)) && (!can_be_in_vfd_table(new_vfd))) + return (int)syscall_no_intercept(SYS_dup2, old_vfd, new_vfd); + + int result; + + util_mutex_lock(&vfd_table_mutex); + + unref_vfd_entry(new_vfd, vfd_table[new_vfd]); + + result = (int)syscall_no_intercept(SYS_dup2, old_vfd, new_vfd); + + assert(result == new_vfd); + vfd_dup2_under_mutex(old_vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return result; +} + +/* + * pmemfile_vfd_dup3 -- Almost the same as dup2, with two differences: + * It accepts an additional flag argument. + * If the old and new fd arguments are the same, both do nothing, but + * dup2 returns the specified fd, while dup3 indicates EINVAL error. + */ +int +splitfs_vfd_dup3(int old_vfd, int new_vfd, int flags) +{ + if (old_vfd == new_vfd) + return -EINVAL; + + /* + * The only flag allowed in dup3 is O_CLOEXEC, and that is ignored + * by pmemfile as of now. + * Note: once O_CLOEXEC is handled, it can be stored in the + * vfd_table -- not in the corresponding vfile_description struct, + * as the flag is specific to fd numbers. + */ + if ((flags & ~O_CLOEXEC) != 0) + return -EINVAL; + + return splitfs_vfd_dup2(old_vfd, new_vfd); +} + + /* pmemfile_vfd_close -- remove a reference from the vfd_table array (if + * there was one at vfd_table[vfd]). + * This does not necessarily close an underlying pmemfile file, as some + * vfd_reference structs given to the user might still reference that entry. + */ +long +splitfs_vfd_close(int vfd) +{ + struct vfile_description *entry = NULL; + long result = 0; + + util_mutex_lock(&vfd_table_mutex); + + entry = vfd_table[vfd]; + vfd_table[vfd] = NULL; + + util_mutex_unlock(&vfd_table_mutex); + + if (entry != NULL) { + unref_vfd_entry(vfd, entry); + result = 0; + } + + result = syscall_no_intercept(SYS_close, vfd); + return result; +} + +void +splitfs_vfd_table_init(void) { + + setup_free_slots(); +} diff --git a/splitfs_syscall_intercept/src/vfd_table.h b/splitfs_syscall_intercept/src/vfd_table.h new file mode 100644 index 0000000000..361f307521 --- /dev/null +++ b/splitfs_syscall_intercept/src/vfd_table.h @@ -0,0 +1,38 @@ +/* + * ===================================================================================== + * + * Filename: vfd_table.h + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 07:39:24 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#ifndef SPLITFS_VFD_TABLE_H +#define SPLITFS_VFD_TABLE_H + +struct vfile_description; +struct splitfs_file; + +long splitfs_vfd_assign(long vfd, struct splitfs_file *file); +int splitfs_vfd_dup(int vfd); +int splitfs_vfd_fcntl_dup(int vfd, int min_new_vfd); +int splitfs_vfd_dup2(int old_vfd, int new_vfd); +int splitfs_vfd_dup3(int old_vfd, int new_vfd, int flags); +SPLITFSfile *splitfs_vfd_ref(int vfd); +void splitfs_vfd_unref(int vfd); + +long splitfs_vfd_close(int vfd); + +void splitfs_vfd_table_init(void); + +SPLITFSfile *splitfs_execv_vfd_get(int vfd); + +#endif diff --git a/splitfs_syscall_intercept/src/write.c b/splitfs_syscall_intercept/src/write.c new file mode 100644 index 0000000000..ba534b9aba --- /dev/null +++ b/splitfs_syscall_intercept/src/write.c @@ -0,0 +1,417 @@ +/* + * ===================================================================================== + * + * Filename: write.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:44:24 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "intel_intrin.h" +#include "relink.h" +#include "staging_thread.h" +#include "add_delay.h" +#include "table_mmaps.h" +#include "out.h" + +#define MEMCPY_NON_TEMPORAL memmove_nodrain_movnt_granularity + +static size_t +write_staging_file(long fd, struct splitfs_file *file, off_t offset, + char *buf, size_t count) { + void *mmap_addr = NULL; + size_t extent_length = 0; + LOG(0, "in write_staging_file()"); + + /* + if (count == 7) { + char print_str[50]; + sprintf(print_str, "count: %d, fd: %ld, offset: %ld\n", count, fd, offset); + syscall_no_intercept(SYS_write, fileno(stderr), print_str, 24 + sizeof(int) + sizeof(long) + sizeof(long)); + //FATAL("count is 7"); + } + */ + + + if (file == NULL) + FATAL("file is NULL"); + if (buf == NULL) + FATAL("buf is NULL"); + if (fd < 0) + FATAL("fd is wrong"); + if (count > (64*1024*1024) || count < 0) + FATAL("count size is wrong"); + if (!file->vinode) + FATAL("vinode is NULL"); + if (file->vinode->length < file->vinode->sync_length) + FATAL("sync_size is wrong"); + if (offset != file->vinode->length) + FATAL("offset is wrong"); + +start: + mmap_addr = get_staging_mmap_address(file, count, + (off_t) (offset - (off_t)inode_get_sync_size(file->vinode)), &extent_length, true); + + if (mmap_addr == NULL) + FATAL("mmap addr is null"); + + if (extent_length >= count) + extent_length = count; + else { + LOG(0, "changing the staging file"); + + size_t relink_size = STAGING_FILE_SIZE - + (size_t)file->vinode->staging->valid_offset - extent_length; + + if (relink_size > (100*1024*1024UL) || relink_size < 0) { + char extent_str[50]; + sprintf(extent_str, "extent_length = %lu\n", relink_size); + syscall_no_intercept(SYS_write, fileno(stderr), extent_str, 50); + FATAL("relink size is very large"); + } + + if (relink_size > 0) + perform_relink(fd, (off_t)inode_get_sync_size(file->vinode), + file->vinode, relink_size); + + file->vinode->staging = NULL; + inode_set_sync_size(file->vinode, inode_get_uncommitted_size(file->vinode)); + splitfs_call_thread(); + goto start; + } + + if (offset + (off_t)extent_length > (off_t)inode_get_uncommitted_size(file->vinode)) + inode_set_uncommitted_size(file->vinode, (size_t)offset + extent_length); + + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + + if (extent_length != count) + FATAL("extent_length is not equal to count"); + if (mmap_addr == NULL) + FATAL("mmap address is null"); + if (buf == NULL) + FATAL("buf is null"); + + MEMCPY_NON_TEMPORAL((char *)mmap_addr, (char *)buf, extent_length); + perfmodel_add_delay(0, extent_length); + + //LOG(0, "Addr = %p, data written = %lu, inode size = %lu, sync_size = %lu", mmap_addr, extent_length, file->vinode->length, file->vinode->sync_length); + + off_t offset_in_staging = (unsigned long) mmap_addr - (unsigned long) file->vinode->staging->start_addr; + long staging_fd = file->vinode->staging->fd; + + /* + if (count == 7) { + char print_str[6]; + sprintf(print_str, "%s\n", "Done"); + syscall_no_intercept(SYS_write, fileno(stderr), print_str, 6); + } + */ + + return extent_length; +} + +static size_t +vinode_write(long fd, struct splitfs_file *file, + off_t offset, const char *buf, size_t count) { + + void *mmap_addr = NULL; + size_t extent_length = 0; + size_t len_written = 0; + size_t len_to_write = count; + LOG(0, "inode no = %u, size = %lu, write off = %ld, write count = %lu", + file->vinode->serialno, file->vinode->length, offset, count); + + /* Check for holes */ + if (offset > (off_t)inode_get_uncommitted_size(file->vinode)) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + + inode_set_uncommitted_size(file->vinode, (size_t)offset + count); + inode_set_sync_size(file->vinode, (size_t)offset + count); + + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + + len_written = (size_t) syscall_no_intercept( + SYS_pwrite64, fd, (char *)buf, + count, offset); + syscall_no_intercept(SYS_fsync, fd); + + return len_written; + } + + while (len_written < count) { + size_t len_write_iter = 0; + if (offset >= (off_t)inode_get_sync_size(file->vinode)) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + extent_length = write_staging_file(fd, file, offset, + (char *) ((unsigned long)buf + len_written), len_to_write); + goto loop_end; + } + + mmap_addr = (void *)splitfs_get_tbl_entry(file->vinode->tbl_mmap, offset, &extent_length); + if (mmap_addr == NULL) + mmap_addr = get_mmap_address(fd, file, offset, &extent_length); + + if ((size_t)offset + len_to_write >= file->vinode->sync_length) { + len_write_iter = file->vinode->sync_length - (size_t)offset; + } else { + len_write_iter = len_to_write; + } + + if (extent_length > len_write_iter) { + extent_length = len_write_iter; + } + + if (mmap_addr == NULL && extent_length == 0) { + extent_length = (size_t) syscall_no_intercept( + SYS_pwrite64, fd, (char *) (buf + len_written), + len_write_iter, offset); + } else { + MEMCPY_NON_TEMPORAL((char *)mmap_addr, + (char *)((unsigned long)buf + len_written), extent_length); + perfmodel_add_delay(0, extent_length); + } + +loop_end: + len_written += extent_length; + len_to_write -= extent_length; + offset += (off_t)extent_length; + } + return len_written; +} + +/* + * splitfs_pwritev_args_check - checks some write arguments + * The arguments here can be examined while holding the mutex for the + * SPLITFSfile instance, while there is no need to hold the lock for the + * corresponding vinode instance. + */ +static ssize_t +splitfs_pwritev_args_check(struct splitfs_file *file, + const struct iovec *iov, + int iovcnt) +{ + LOG(LDBG, "vinode %p iov %p iovcnt %d", file->vinode, iov, iovcnt); + + LOG(0, "file->flags = %ld, PFILE_WRITE = %llu\n", file->flags, PFILE_WRITE); + if (!(file->flags & PFILE_WRITE)) { + errno = EBADF; + return -1; + } + + if (iovcnt > 0 && iov == NULL) { + errno = EFAULT; + return -1; + } + + for (int i = 0; i < iovcnt; ++i) { + if (iov[i].iov_base == NULL) { + errno = EFAULT; + return -1; + } + } + + return 0; +} + +static ssize_t +splitfs_pwritev_internal(long fd, struct splitfs_file *file, + off_t offset, struct iovec *iov, int iovcnt) { + + int error = 0; + size_t sum_len = 0; + size_t ret = 0; + + LOG(LDBG, "In splitfs_pwritev_internal()"); + + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + + if ((size_t) len < 0) + len = SSIZE_MAX; + + if ((ssize_t) (sum_len + len) < 0) + len = SSIZE_MAX - sum_len; + + /* overflow check */ + if (offset + (off_t)sum_len + (off_t)len < offset) + len = SSIZE_MAX - (size_t)offset - sum_len; + + sum_len += len; + + if (len != iov[i].iov_len) + break; + } + + if (sum_len == 0) + return 0; + + /* Now write the data. + */ + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + + if ((ssize_t)len < 0) + len = SSIZE_MAX; + + if ((ssize_t) (ret + len) < 0) + len = SSIZE_MAX - ret; + + /* overflow check */ + if (offset + (off_t)len < offset) + len = SSIZE_MAX - (size_t)offset; + + if (len > 0) + vinode_write(fd, file, offset, iov[i].iov_base, len); + + ret += len; + offset += (off_t)len; + + if (len != iov[i].iov_len) + break; + } + ASSERT(ret > 0); + + if (error) { + errno = error; + return -1; + } + + _mm_sfence(); + return (ssize_t) ret; +} + + +ssize_t +splitfs_write(long fd, struct splitfs_file *file, const void* buf, size_t count) { + + struct iovec element = {.iov_base = (void *)buf, .iov_len = count}; + return splitfs_writev(fd, file, &element, 1); +} + + +/* + * pmemfile_writev_under_filelock - write to a file + * This function expects the PMEMfile instance to be locked while being called. + * Since the offset field is used to determine where to read from, and is also + * updated after a successful read operation, the PMEMfile instance can not be + * accessed by others while this is happening. + * + */ +static ssize_t +splitfs_writev_under_filelock(long fd, struct splitfs_file *file, + struct iovec *iov, int iovcnt) +{ + ssize_t ret; + + ret = splitfs_pwritev_args_check(file, iov, iovcnt); + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_pwritev_internal(fd, + file, + (off_t)file->offset, iov, iovcnt); + + + os_rwlock_unlock(&file->vinode->rwlock); + + if (ret > 0) { + file->offset += (size_t)ret; + } + + return ret; +} + +ssize_t +splitfs_writev(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt) { + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + pthread_mutex_lock(&file->mutex); + + ssize_t ret = + splitfs_writev_under_filelock(fd, file, iov, iovcnt); + + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_pwrite(long fd, struct splitfs_file *file, const void* buf, size_t count, off_t offset) { + + LOG(0, "Called splitfs_pwrite()"); + struct iovec element = {.iov_base = (void *)buf, .iov_len = count}; + return splitfs_pwritev(fd, file, &element, 1, offset); +} + +ssize_t +splitfs_pwritev(long fd, struct splitfs_file *file, struct iovec *iov, + int iovcnt, off_t offset) { + + LOG(0, "Called splitfs_pwritev()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + if (offset < 0) { + errno = EINVAL; + return -1; + } + + ssize_t ret; + + pthread_mutex_lock(&file->mutex); + + LOG(0, "checking args"); + ret = splitfs_pwritev_args_check(file, iov, iovcnt); + LOG(0, "checking args ret = %lu", ret); + + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_pwritev_internal(fd, file, offset, iov, iovcnt); + + os_rwlock_unlock(&file->vinode->rwlock); + pthread_mutex_unlock(&file->mutex); + + return ret; +} diff --git a/splitfs_syscall_intercept/tests/Makefile b/splitfs_syscall_intercept/tests/Makefile new file mode 100644 index 0000000000..a0c5b8bfda --- /dev/null +++ b/splitfs_syscall_intercept/tests/Makefile @@ -0,0 +1,19 @@ +# Run tests for splitfs + +# The current working directory +CWD=$(shell pwd) +# Root of the repo +ROOT=$(CWD)/.. +# SplitFS mount path +SFS_MNT_PATH=/mnt/pmem_emul/ +# PJD Dir +PJD_DIR=$(CWD)/pjd-fstest-20080816 +# SplitFS library file path. Either set via env variable or defaults to assigned path +SPLITFS_LIB_PATH ?= ${ROOT}/build/src/libsplitfs.so + +pjd: + export LD_PRELOAD=${SPLITFS_LIB_PATH}; \ + cd ${SFS_MNT_PATH} && prove -r ${PJD_DIR}/tests + +compile_fstest: + make -C ${PJD_DIR} all \ No newline at end of file diff --git a/splitfs_syscall_intercept/tests/README.md b/splitfs_syscall_intercept/tests/README.md new file mode 100644 index 0000000000..70317860cb --- /dev/null +++ b/splitfs_syscall_intercept/tests/README.md @@ -0,0 +1,5 @@ +###To run the pjd test, do the following: +1. Compile SplitFS. +2. Set the environment variable `SPLITFS_LIB_PATH` to point to the compiled SplitFS library artifact. +3. Move to tests directory: `cd /tests` +4. Run: `make pjd` diff --git a/splitfs_syscall_intercept/tests/a.out b/splitfs_syscall_intercept/tests/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0a72f469041aefeb89d4b3da8d129054d3005ed7 GIT binary patch literal 13800 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 +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/Makefile b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/Makefile new file mode 100644 index 0000000000..475516b00c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD: src/tools/regression/fstest/Makefile,v 1.1 2007/01/17 01:42:07 pjd Exp $ + +#CFLAGS+=-DHAS_LCHMOD +#CFLAGS+=-DHAS_CHFLAGS +#CFLAGS+=-DHAS_LCHFLAGS +#CFLAGS+=-DHAS_TRUNCATE64 +#CFLAGS+=-DHAS_STAT64 + +all: fstest + +fstest: fstest.c + gcc -Wall ${CFLAGS} fstest.c -o fstest + +clean: + rm -f fstest diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/README b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/README new file mode 100644 index 0000000000..d549e34dc2 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/README @@ -0,0 +1,28 @@ +$FreeBSD: src/tools/regression/fstest/README,v 1.1 2007/01/28 00:10:28 pjd Exp $ + +Few notes on how to use fstest in short steps: + + # cd fstest + # vi tests/conf + Change 'fs' to file system type you want to test. These can be: + UFS, ZFS, ext3, ntfs-3g and xfs. + # vi Makefile + You may need to manually tweak few things by editing CFLAGS lines + at the top of the file. + # make + It will compile fstest utility which is used by regression tests. + # cd /path/to/file/system/you/want/to/test/ + The test must be run as root user. + # prove -r /path/to/fstest/ + +That's all. Enjoy. + +Currently supported operating systems: FreeBSD, Solaris, Linux. +Currently supported file system types: UFS, ZFS, ext3, ntfs-3g, xfs. + +Author: +Pawel Jakub Dawidek + +Linux port: +Jean-Pierre Andre +Szabolcs Szakacsits diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest new file mode 100755 index 0000000000000000000000000000000000000000..326a70305394c3a75b1f45ae8b7e20b49c0e10fd GIT binary patch literal 24528 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest.c b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest.c new file mode 100644 index 0000000000..07a95711a1 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/fstest.c @@ -0,0 +1,1002 @@ +/*- + * Copyright (c) 2006-2007 Pawel Jakub Dawidek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/tools/regression/fstest/fstest.c,v 1.1 2007/01/17 01:42:07 pjd Exp $ + */ + +#ifdef linux +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAS_TRUNCATE64 +#define truncate64 truncate +#endif +#ifndef HAS_STAT64 +#define stat64 stat +#define lstat64 lstat +#endif + +#ifndef ALLPERMS +#define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) +#endif + +enum action { + ACTION_OPEN, + ACTION_CREATE, + ACTION_UNLINK, + ACTION_MKDIR, + ACTION_RMDIR, + ACTION_LINK, + ACTION_SYMLINK, + ACTION_RENAME, + ACTION_MKFIFO, + ACTION_CHMOD, +#ifdef HAS_LCHMOD + ACTION_LCHMOD, +#endif + ACTION_CHOWN, + ACTION_LCHOWN, +#ifdef HAS_CHFLAGS + ACTION_CHFLAGS, +#endif +#ifdef HAS_LCHFLAGS + ACTION_LCHFLAGS, +#endif + ACTION_TRUNCATE, + ACTION_STAT, + ACTION_LSTAT, +}; + +#define TYPE_NONE 0x0000 +#define TYPE_STRING 0x0001 +#define TYPE_NUMBER 0x0002 + +#define TYPE_OPTIONAL 0x0100 + +#define MAX_ARGS 8 + +struct syscall_desc { + char *sd_name; + enum action sd_action; + int sd_args[MAX_ARGS]; +}; + +static struct syscall_desc syscalls[] = { + { "open", ACTION_OPEN, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } }, + { "create", ACTION_CREATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "unlink", ACTION_UNLINK, { TYPE_STRING, TYPE_NONE } }, + { "mkdir", ACTION_MKDIR, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "rmdir", ACTION_RMDIR, { TYPE_STRING, TYPE_NONE } }, + { "link", ACTION_LINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "symlink", ACTION_SYMLINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "rename", ACTION_RENAME, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "mkfifo", ACTION_MKFIFO, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "chmod", ACTION_CHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAS_LCHMOD + { "lchmod", ACTION_LCHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#endif + { "chown", ACTION_CHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, + { "lchown", ACTION_LCHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAS_CHFLAGS + { "chflags", ACTION_CHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif +#ifdef HAS_LCHFLAGS + { "lchflags", ACTION_LCHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif + { "truncate", ACTION_TRUNCATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "stat", ACTION_STAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "lstat", ACTION_LSTAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { NULL, -1, { TYPE_NONE } } +}; + +struct flag { + long long f_flag; + char *f_str; +}; + +static struct flag open_flags[] = { +#ifdef O_RDONLY + { O_RDONLY, "O_RDONLY" }, +#endif +#ifdef O_WRONLY + { O_WRONLY, "O_WRONLY" }, +#endif +#ifdef O_RDWR + { O_RDWR, "O_RDWR" }, +#endif +#ifdef O_NONBLOCK + { O_NONBLOCK, "O_NONBLOCK" }, +#endif +#ifdef O_APPEND + { O_APPEND, "O_APPEND" }, +#endif +#ifdef O_CREAT + { O_CREAT, "O_CREAT" }, +#endif +#ifdef O_TRUNC + { O_TRUNC, "O_TRUNC" }, +#endif +#ifdef O_EXCL + { O_EXCL, "O_EXCL" }, +#endif +#ifdef O_SHLOCK + { O_SHLOCK, "O_SHLOCK" }, +#endif +#ifdef O_EXLOCK + { O_EXLOCK, "O_EXLOCK" }, +#endif +#ifdef O_DIRECT + { O_DIRECT, "O_DIRECT" }, +#endif +#ifdef O_FSYNC + { O_FSYNC, "O_FSYNC" }, +#endif +#ifdef O_SYNC + { O_SYNC, "O_SYNC" }, +#endif +#ifdef O_NOFOLLOW + { O_NOFOLLOW, "O_NOFOLLOW" }, +#endif +#ifdef O_NOCTTY + { O_NOCTTY, "O_NOCTTY" }, +#endif + { 0, NULL } +}; + +#ifdef HAS_CHFLAGS +static struct flag chflags_flags[] = { +#ifdef UF_NODUMP + { UF_NODUMP, "UF_NODUMP" }, +#endif +#ifdef UF_IMMUTABLE + { UF_IMMUTABLE, "UF_IMMUTABLE" }, +#endif +#ifdef UF_APPEND + { UF_APPEND, "UF_APPEND" }, +#endif +#ifdef UF_NOUNLINK + { UF_NOUNLINK, "UF_NOUNLINK" }, +#endif +#ifdef UF_OPAQUE + { UF_OPAQUE, "UF_OPAQUE" }, +#endif +#ifdef SF_ARCHIVED + { SF_ARCHIVED, "SF_ARCHIVED" }, +#endif +#ifdef SF_IMMUTABLE + { SF_IMMUTABLE, "SF_IMMUTABLE" }, +#endif +#ifdef SF_APPEND + { SF_APPEND, "SF_APPEND" }, +#endif +#ifdef SF_NOUNLINK + { SF_NOUNLINK, "SF_NOUNLINK" }, +#endif +#ifdef SF_SNAPSHOT + { SF_SNAPSHOT, "SF_SNAPSHOT" }, +#endif + { 0, NULL } +}; +#endif + +static const char *err2str(int error); + +static void +usage(void) +{ + + fprintf(stderr, "usage: fstest [-u uid] [-g gid1[,gid2[...]]] syscall args ...\n"); + exit(1); +} + +static long long +str2flags(struct flag *tflags, char *sflags) +{ + long long flags = 0; + unsigned int i; + char *f; + + for (f = strtok(sflags, ","); f != NULL; f = strtok(NULL, ",")) { + /* Support magic 'none' flag which just reset all flags. */ + if (strcmp(f, "none") == 0) + return (0); + for (i = 0; tflags[i].f_str != NULL; i++) { + if (strcmp(tflags[i].f_str, f) == 0) + break; + } + if (tflags[i].f_str == NULL) { + fprintf(stderr, "unknown flag '%s'\n", f); + exit(1); + } + flags |= tflags[i].f_flag; + } + return (flags); +} + +#ifdef HAS_CHFLAGS +static char * +flags2str(struct flag *tflags, long long flags) +{ + static char sflags[1024]; + unsigned int i; + + sflags[0] = '\0'; + for (i = 0; tflags[i].f_str != NULL; i++) { + if (flags & tflags[i].f_flag) { + if (sflags[0] != '\0') + strlcat(sflags, ",", sizeof(sflags)); + strlcat(sflags, tflags[i].f_str, sizeof(sflags)); + } + } + if (sflags[0] == '\0') + strlcpy(sflags, "none", sizeof(sflags)); + return (sflags); +} +#endif + +static struct syscall_desc * +find_syscall(const char *name) +{ + int i; + + for (i = 0; syscalls[i].sd_name != NULL; i++) { + if (strcmp(syscalls[i].sd_name, name) == 0) + return (&syscalls[i]); + } + return (NULL); +} + +static void +show_stat(struct stat64 *sp, const char *what) +{ + + if (strcmp(what, "mode") == 0) + printf("0%o", (unsigned int)(sp->st_mode & ALLPERMS)); + else if (strcmp(what, "inode") == 0) + printf("%lld", (long long)sp->st_ino); + else if (strcmp(what, "nlink") == 0) + printf("%lld", (long long)sp->st_nlink); + else if (strcmp(what, "uid") == 0) + printf("%d", (int)sp->st_uid); + else if (strcmp(what, "gid") == 0) + printf("%d", (int)sp->st_gid); + else if (strcmp(what, "size") == 0) + printf("%lld", (long long)sp->st_size); + else if (strcmp(what, "blocks") == 0) + printf("%lld", (long long)sp->st_blocks); + else if (strcmp(what, "atime") == 0) + printf("%lld", (long long)sp->st_atime); + else if (strcmp(what, "mtime") == 0) + printf("%lld", (long long)sp->st_mtime); + else if (strcmp(what, "ctime") == 0) + printf("%lld", (long long)sp->st_ctime); +#ifdef HAS_CHFLAGS + else if (strcmp(what, "flags") == 0) + printf("%s", flags2str(chflags_flags, sp->st_flags)); +#endif + else if (strcmp(what, "type") == 0) { + switch (sp->st_mode & S_IFMT) { + case S_IFIFO: + printf("fifo"); + break; + case S_IFCHR: + printf("char"); + break; + case S_IFDIR: + printf("dir"); + break; + case S_IFBLK: + printf("block"); + break; + case S_IFREG: + printf("regular"); + break; + case S_IFLNK: + printf("symlink"); + break; + case S_IFSOCK: + printf("socket"); + break; + default: + printf("unknown"); + break; + } + } else { + printf("unknown"); + } +} + +static void +show_stats(struct stat64 *sp, char *what) +{ + const char *s = ""; + char *w; + + for (w = strtok(what, ","); w != NULL; w = strtok(NULL, ",")) { + printf("%s", s); + show_stat(sp, w); + s = ","; + } + printf("\n"); +} + +static unsigned int +call_syscall(struct syscall_desc *scall, char *argv[]) +{ + struct stat64 sb; + long long flags; + unsigned int i; + char *endp; + int rval; + union { + char *str; + long long num; + } args[MAX_ARGS]; + + /* + * Verify correctness of the arguments. + */ + for (i = 0; i < sizeof(args)/sizeof(args[0]); i++) { + if (scall->sd_args[i] == TYPE_NONE) { + if (argv[i] == NULL || strcmp(argv[i], ":") == 0) + break; + fprintf(stderr, "too many arguments [%s]\n", argv[i]); + exit(1); + } else { + if (argv[i] == NULL || strcmp(argv[i], ":") == 0) { + if (scall->sd_args[i] & TYPE_OPTIONAL) + break; + fprintf(stderr, "too few arguments\n"); + exit(1); + } + if (scall->sd_args[i] & TYPE_STRING) { + if (strcmp(argv[i], "NULL") == 0) + args[i].str = NULL; + else if (strcmp(argv[i], "DEADCODE") == 0) + args[i].str = (void *)0xdeadc0de; + else + args[i].str = argv[i]; + } else if (scall->sd_args[i] & TYPE_NUMBER) { + args[i].num = strtoll(argv[i], &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid argument %u, number expected [%s]\n", i, endp); + exit(1); + } + } + } + } + /* + * Call the given syscall. + */ +#define NUM(n) (args[(n)].num) +#define STR(n) (args[(n)].str) + switch (scall->sd_action) { + case ACTION_OPEN: + flags = str2flags(open_flags, STR(1)); + if (flags & O_CREAT) { + if (i == 2) { + fprintf(stderr, "too few arguments\n"); + exit(1); + } + rval = open(STR(0), flags, (mode_t)NUM(2)); + } else { + if (i == 3) { + fprintf(stderr, "too many arguments\n"); + exit(1); + } + rval = open(STR(0), flags); + } + break; + case ACTION_CREATE: + rval = open(STR(0), O_CREAT | O_EXCL, NUM(1)); + if (rval >= 0) + close(rval); + break; + case ACTION_UNLINK: + rval = unlink(STR(0)); + break; + case ACTION_MKDIR: + rval = mkdir(STR(0), NUM(1)); + break; + case ACTION_RMDIR: + rval = rmdir(STR(0)); + break; + case ACTION_LINK: + rval = link(STR(0), STR(1)); + break; + case ACTION_SYMLINK: + rval = symlink(STR(0), STR(1)); + break; + case ACTION_RENAME: + rval = rename(STR(0), STR(1)); + break; + case ACTION_MKFIFO: + rval = mkfifo(STR(0), NUM(1)); + break; + case ACTION_CHMOD: + rval = chmod(STR(0), NUM(1)); + break; +#ifdef HAS_LCHMOD + case ACTION_LCHMOD: + rval = lchmod(STR(0), NUM(1)); + break; +#endif + case ACTION_CHOWN: + rval = chown(STR(0), NUM(1), NUM(2)); + break; + case ACTION_LCHOWN: + rval = lchown(STR(0), NUM(1), NUM(2)); + break; +#ifdef HAS_CHFLAGS + case ACTION_CHFLAGS: + rval = chflags(STR(0), str2flags(chflags_flags, STR(1))); + break; +#endif +#ifdef HAS_LCHFLAGS + case ACTION_LCHFLAGS: + rval = lchflags(STR(0), str2flags(chflags_flags, STR(1))); + break; +#endif + case ACTION_TRUNCATE: + rval = truncate64(STR(0), NUM(1)); + break; + case ACTION_STAT: + rval = stat64(STR(0), &sb); + if (rval == 0) { + show_stats(&sb, STR(1)); + return (i); + } + break; + case ACTION_LSTAT: + rval = lstat64(STR(0), &sb); + if (rval == 0) { + show_stats(&sb, STR(1)); + return (i); + } + break; + default: + fprintf(stderr, "unsupported syscall\n"); + exit(1); + } +#undef STR +#undef NUM + if (rval < 0) { + const char *serrno; + + serrno = err2str(errno); + fprintf(stderr, "%s returned %d\n", scall->sd_name, rval); + printf("%s\n", serrno); + exit(1); + } + printf("0\n"); + return (i); +} + +static void +set_gids(char *gids) +{ + gid_t *gidset; + long ngroups; + char *g, *endp; + unsigned i; + + ngroups = sysconf(_SC_NGROUPS_MAX); + assert(ngroups > 0); + gidset = malloc(sizeof(*gidset) * ngroups); + assert(gidset != NULL); + for (i = 0, g = strtok(gids, ","); g != NULL; g = strtok(NULL, ","), i++) { + if (i >= ngroups) { + fprintf(stderr, "too many gids\n"); + exit(1); + } + gidset[i] = strtol(g, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid gid '%s' - number expected\n", + g); + exit(1); + } + } + if (setgroups(i, gidset) < 0) { + fprintf(stderr, "cannot change groups: %s\n", strerror(errno)); + exit(1); + } + if (setegid(gidset[0]) < 0) { + fprintf(stderr, "cannot change effective gid: %s\n", strerror(errno)); + exit(1); + } + free(gidset); +} + +int +main(int argc, char *argv[]) +{ + struct syscall_desc *scall; + unsigned int n; + char *gids, *endp; + int uid, umsk, ch; + + uid = -1; + gids = NULL; + umsk = 0; + + while ((ch = getopt(argc, argv, "g:u:U:")) != -1) { + switch(ch) { + case 'g': + gids = optarg; + break; + case 'u': + uid = (int)strtol(optarg, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid uid '%s' - number " + "expected\n", optarg); + exit(1); + } + break; + case 'U': + umsk = (int)strtol(optarg, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid umask '%s' - number " + "expected\n", optarg); + exit(1); + } + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc < 1) { + fprintf(stderr, "too few arguments\n"); + usage(); + } + + if (gids != NULL) { + fprintf(stderr, "changing groups to %s\n", gids); + set_gids(gids); + } + if (uid != -1) { + fprintf(stderr, "changing uid to %d\n", uid); + if (setuid(uid) < 0) { + fprintf(stderr, "cannot change uid: %s\n", + strerror(errno)); + exit(1); + } + } + + /* Change umask to requested value or to 0, if not requested. */ + umask(umsk); + + for (;;) { + scall = find_syscall(argv[0]); + if (scall == NULL) { + fprintf(stderr, "syscall '%s' not supported\n", argv[0]); + exit(1); + } + argc++; + argv++; + n = call_syscall(scall, argv); + argc += n; + argv += n; + if (argv[0] == NULL) + break; + argc++; + argv++; + } + + exit(0); +} + +static const char * +err2str(int error) +{ + static char errnum[8]; + + switch (error) { +#ifdef EPERM + case EPERM: + return ("EPERM"); +#endif +#ifdef ENOENT + case ENOENT: + return ("ENOENT"); +#endif +#ifdef ESRCH + case ESRCH: + return ("ESRCH"); +#endif +#ifdef EINTR + case EINTR: + return ("EINTR"); +#endif +#ifdef EIO + case EIO: + return ("EIO"); +#endif +#ifdef ENXIO + case ENXIO: + return ("ENXIO"); +#endif +#ifdef E2BIG + case E2BIG: + return ("E2BIG"); +#endif +#ifdef ENOEXEC + case ENOEXEC: + return ("ENOEXEC"); +#endif +#ifdef EBADF + case EBADF: + return ("EBADF"); +#endif +#ifdef ECHILD + case ECHILD: + return ("ECHILD"); +#endif +#ifdef EDEADLK + case EDEADLK: + return ("EDEADLK"); +#endif +#ifdef ENOMEM + case ENOMEM: + return ("ENOMEM"); +#endif +#ifdef EACCES + case EACCES: + return ("EACCES"); +#endif +#ifdef EFAULT + case EFAULT: + return ("EFAULT"); +#endif +#ifdef ENOTBLK + case ENOTBLK: + return ("ENOTBLK"); +#endif +#ifdef EBUSY + case EBUSY: + return ("EBUSY"); +#endif +#ifdef EEXIST + case EEXIST: + return ("EEXIST"); +#endif +#ifdef EXDEV + case EXDEV: + return ("EXDEV"); +#endif +#ifdef ENODEV + case ENODEV: + return ("ENODEV"); +#endif +#ifdef ENOTDIR + case ENOTDIR: + return ("ENOTDIR"); +#endif +#ifdef EISDIR + case EISDIR: + return ("EISDIR"); +#endif +#ifdef EINVAL + case EINVAL: + return ("EINVAL"); +#endif +#ifdef ENFILE + case ENFILE: + return ("ENFILE"); +#endif +#ifdef EMFILE + case EMFILE: + return ("EMFILE"); +#endif +#ifdef ENOTTY + case ENOTTY: + return ("ENOTTY"); +#endif +#ifdef ETXTBSY + case ETXTBSY: + return ("ETXTBSY"); +#endif +#ifdef EFBIG + case EFBIG: + return ("EFBIG"); +#endif +#ifdef ENOSPC + case ENOSPC: + return ("ENOSPC"); +#endif +#ifdef ESPIPE + case ESPIPE: + return ("ESPIPE"); +#endif +#ifdef EROFS + case EROFS: + return ("EROFS"); +#endif +#ifdef EMLINK + case EMLINK: + return ("EMLINK"); +#endif +#ifdef EPIPE + case EPIPE: + return ("EPIPE"); +#endif +#ifdef EDOM + case EDOM: + return ("EDOM"); +#endif +#ifdef ERANGE + case ERANGE: + return ("ERANGE"); +#endif +#ifdef EAGAIN + case EAGAIN: + return ("EAGAIN"); +#endif +#ifdef EINPROGRESS + case EINPROGRESS: + return ("EINPROGRESS"); +#endif +#ifdef EALREADY + case EALREADY: + return ("EALREADY"); +#endif +#ifdef ENOTSOCK + case ENOTSOCK: + return ("ENOTSOCK"); +#endif +#ifdef EDESTADDRREQ + case EDESTADDRREQ: + return ("EDESTADDRREQ"); +#endif +#ifdef EMSGSIZE + case EMSGSIZE: + return ("EMSGSIZE"); +#endif +#ifdef EPROTOTYPE + case EPROTOTYPE: + return ("EPROTOTYPE"); +#endif +#ifdef ENOPROTOOPT + case ENOPROTOOPT: + return ("ENOPROTOOPT"); +#endif +#ifdef EPROTONOSUPPORT + case EPROTONOSUPPORT: + return ("EPROTONOSUPPORT"); +#endif +#ifdef ESOCKTNOSUPPORT + case ESOCKTNOSUPPORT: + return ("ESOCKTNOSUPPORT"); +#endif +#ifdef EOPNOTSUPP + case EOPNOTSUPP: + return ("EOPNOTSUPP"); +#endif +#ifdef EPFNOSUPPORT + case EPFNOSUPPORT: + return ("EPFNOSUPPORT"); +#endif +#ifdef EAFNOSUPPORT + case EAFNOSUPPORT: + return ("EAFNOSUPPORT"); +#endif +#ifdef EADDRINUSE + case EADDRINUSE: + return ("EADDRINUSE"); +#endif +#ifdef EADDRNOTAVAIL + case EADDRNOTAVAIL: + return ("EADDRNOTAVAIL"); +#endif +#ifdef ENETDOWN + case ENETDOWN: + return ("ENETDOWN"); +#endif +#ifdef ENETUNREACH + case ENETUNREACH: + return ("ENETUNREACH"); +#endif +#ifdef ENETRESET + case ENETRESET: + return ("ENETRESET"); +#endif +#ifdef ECONNABORTED + case ECONNABORTED: + return ("ECONNABORTED"); +#endif +#ifdef ECONNRESET + case ECONNRESET: + return ("ECONNRESET"); +#endif +#ifdef ENOBUFS + case ENOBUFS: + return ("ENOBUFS"); +#endif +#ifdef EISCONN + case EISCONN: + return ("EISCONN"); +#endif +#ifdef ENOTCONN + case ENOTCONN: + return ("ENOTCONN"); +#endif +#ifdef ESHUTDOWN + case ESHUTDOWN: + return ("ESHUTDOWN"); +#endif +#ifdef ETOOMANYREFS + case ETOOMANYREFS: + return ("ETOOMANYREFS"); +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: + return ("ETIMEDOUT"); +#endif +#ifdef ECONNREFUSED + case ECONNREFUSED: + return ("ECONNREFUSED"); +#endif +#ifdef ELOOP + case ELOOP: + return ("ELOOP"); +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return ("ENAMETOOLONG"); +#endif +#ifdef EHOSTDOWN + case EHOSTDOWN: + return ("EHOSTDOWN"); +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: + return ("EHOSTUNREACH"); +#endif +#ifdef ENOTEMPTY + case ENOTEMPTY: + return ("ENOTEMPTY"); +#endif +#ifdef EPROCLIM + case EPROCLIM: + return ("EPROCLIM"); +#endif +#ifdef EUSERS + case EUSERS: + return ("EUSERS"); +#endif +#ifdef EDQUOT + case EDQUOT: + return ("EDQUOT"); +#endif +#ifdef ESTALE + case ESTALE: + return ("ESTALE"); +#endif +#ifdef EREMOTE + case EREMOTE: + return ("EREMOTE"); +#endif +#ifdef EBADRPC + case EBADRPC: + return ("EBADRPC"); +#endif +#ifdef ERPCMISMATCH + case ERPCMISMATCH: + return ("ERPCMISMATCH"); +#endif +#ifdef EPROGUNAVAIL + case EPROGUNAVAIL: + return ("EPROGUNAVAIL"); +#endif +#ifdef EPROGMISMATCH + case EPROGMISMATCH: + return ("EPROGMISMATCH"); +#endif +#ifdef EPROCUNAVAIL + case EPROCUNAVAIL: + return ("EPROCUNAVAIL"); +#endif +#ifdef ENOLCK + case ENOLCK: + return ("ENOLCK"); +#endif +#ifdef ENOSYS + case ENOSYS: + return ("ENOSYS"); +#endif +#ifdef EFTYPE + case EFTYPE: + return ("EFTYPE"); +#endif +#ifdef EAUTH + case EAUTH: + return ("EAUTH"); +#endif +#ifdef ENEEDAUTH + case ENEEDAUTH: + return ("ENEEDAUTH"); +#endif +#ifdef EIDRM + case EIDRM: + return ("EIDRM"); +#endif +#ifdef ENOMSG + case ENOMSG: + return ("ENOMSG"); +#endif +#ifdef EOVERFLOW + case EOVERFLOW: + return ("EOVERFLOW"); +#endif +#ifdef ECANCELED + case ECANCELED: + return ("ECANCELED"); +#endif +#ifdef EILSEQ + case EILSEQ: + return ("EILSEQ"); +#endif +#ifdef ENOATTR + case ENOATTR: + return ("ENOATTR"); +#endif +#ifdef EDOOFUS + case EDOOFUS: + return ("EDOOFUS"); +#endif +#ifdef EBADMSG + case EBADMSG: + return ("EBADMSG"); +#endif +#ifdef EMULTIHOP + case EMULTIHOP: + return ("EMULTIHOP"); +#endif +#ifdef ENOLINK + case ENOLINK: + return ("ENOLINK"); +#endif +#ifdef EPROTO + case EPROTO: + return ("EPROTO"); +#endif + default: + snprintf(errnum, sizeof(errnum), "%d", error); + return (errnum); + } +} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/00.t new file mode 100755 index 0000000000..96050ad4f8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/00.t @@ -0,0 +1,178 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/00.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags changes flags" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..191" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} none +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 unlink ${n1} +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 lchflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} none +expect none lstat ${n1} flags +expect none stat ${n1} flags +expect 0 unlink ${n1} +expect 0 unlink ${n0} + +# successful chflags(2) updates ctime. +expect 0 create ${n0} 0644 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect 0 lchflags ${n0} ${flag} + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +# unsuccessful chflags(2) does not update ctime. +expect 0 create ${n0} 0644 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 lchflags ${n0} ${flag} + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/01.t new file mode 100755 index 0000000000..8be8a098e0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/01.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chflags ${n0}/${n1}/test UF_IMMUTABLE +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/02.t new file mode 100755 index 0000000000..00bc09a5a5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/02.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..6" + +expect 0 create ${name255} 0644 +expect 0 chflags ${name255} UF_IMMUTABLE +expect UF_IMMUTABLE stat ${name255} flags +expect 0 chflags ${name255} none +expect 0 unlink ${name255} +expect ENAMETOOLONG chflags ${name256} UF_IMMUTABLE diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/03.t new file mode 100755 index 0000000000..2130dae5dd --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/03.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..13" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chflags ${path1023} UF_IMMUTABLE +expect 0 chflags ${path1023} none +expect 0 unlink ${path1023} +expect ENAMETOOLONG chflags ${path1024} UF_IMMUTABLE +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/04.t new file mode 100755 index 0000000000..4581d5a8ed --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/04.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chflags ${n0}/${n1}/test UF_IMMUTABLE +expect ENOENT chflags ${n0}/${n1} UF_IMMUTABLE +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/05.t new file mode 100755 index 0000000000..00710735e1 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/05.t @@ -0,0 +1,35 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..16" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect UF_IMMUTABLE -u 65534 -g 65534 stat ${n1}/${n2} flags +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} none +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect UF_IMMUTABLE -u 65534 -g 65534 stat ${n1}/${n2} flags +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} none +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/06.t new file mode 100755 index 0000000000..80c089c5af --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/06.t @@ -0,0 +1,21 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chflags ${n0}/test UF_IMMUTABLE +expect ELOOP chflags ${n1}/test UF_IMMUTABLE +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/07.t new file mode 100755 index 0000000000..240e65bc9a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/07.t @@ -0,0 +1,54 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when the effective user ID does not match the owner of the file and the effective user ID is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE +expect none lstat ${n1} flags +expect 0 lchown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE +expect none lstat ${n1} flags +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/08.t new file mode 100755 index 0000000000..e076980faf --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/08.t @@ -0,0 +1,70 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK is set and the user is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..78" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 lchflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + expect EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags +done +expect 0 lchflags ${n1} none +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/09.t new file mode 100755 index 0000000000..58a2f61386 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/09.t @@ -0,0 +1,82 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK is set and securelevel is greater than 0" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..102" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +old=`sysctl -n security.jail.chflags_allowed` +sysctl security.jail.chflags_allowed=1 >/dev/null + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 lchflags ${n1} ${flag} + jexpect 1 `pwd` EPERM lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags +done +expect 0 lchflags ${n1} none +expect 0 unlink ${n1} + +sysctl security.jail.chflags_allowed=${old} >/dev/null +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/10.t new file mode 100755 index 0000000000..1f62a3e7bc --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/10.t @@ -0,0 +1,62 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM if non-super-user tries to set one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..62" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 lchflags ${n1} ${flag} + expect none lstat ${n1} flags + expect EPERM -u 65534 -g 65534 lchflags ${n1} ${flag} + expect none lstat ${n1} flags +done +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/11.t new file mode 100755 index 0000000000..a4823d4f8c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/11.t @@ -0,0 +1,70 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/11.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM if a user tries to set or remove the SF_SNAPSHOT flag" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..46" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect EPERM -u 65534 -g 65534 lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect EPERM lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect 0 lchown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect EPERM lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/12.t new file mode 100755 index 0000000000..e4671d1dbb --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/12.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/12.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..14" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chflags ${n0}/${n1} UF_IMMUTABLE + expect UF_IMMUTABLE stat ${n0}/${n1} flags + expect 0 chflags ${n0}/${n1} none + expect none stat ${n0}/${n1} flags + mount -ur /dev/md${n} + expect EROFS chflags ${n0}/${n1} UF_IMMUTABLE + expect none stat ${n0}/${n1} flags + mount -uw /dev/md${n} + expect 0 chflags ${n0}/${n1} UF_IMMUTABLE + expect UF_IMMUTABLE stat ${n0}/${n1} flags + expect 0 chflags ${n0}/${n1} none + expect none stat ${n0}/${n1} flags + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/13.t new file mode 100755 index 0000000000..6da6bf039b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chflags/13.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/13.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..2" + +expect EFAULT chflags NULL UF_IMMUTABLE +expect EFAULT chflags DEADCODE UF_IMMUTABLE diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/00.t new file mode 100755 index 0000000000..74dc5524af --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/00.t @@ -0,0 +1,161 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/00.t,v 1.2 2007/01/25 20:48:14 pjd Exp $ + +desc="chmod changes permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +if supported lchmod; then + echo "1..77" +else + echo "1..58" +fi + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect 0644 stat ${n0} mode +expect 0 chmod ${n0} 0111 +expect 0111 stat ${n0} mode +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0755 stat ${n0} mode +expect 0 chmod ${n0} 0753 +expect 0753 stat ${n0} mode +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0644 stat ${n0} mode +expect 0 chmod ${n0} 0310 +expect 0310 stat ${n0} mode +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect 0644 stat ${n1} mode +expect 0 chmod ${n1} 0321 +expect 0321 stat ${n1} mode +expect 0321 lstat ${n0} mode +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +if supported lchmod; then + expect 0 create ${n0} 0644 + expect 0 symlink ${n0} ${n1} + expect 0644 stat ${n1} mode + expect 0 lchmod ${n1} 0321 + expect 0321 lstat ${n1} mode + expect 0 lchmod ${n1} 0531 + expect 0531 lstat ${n1} mode + expect 0644 stat ${n0} mode + expect 0644 stat ${n1} mode + expect 0 unlink ${n0} + expect 0 unlink ${n1} +fi + +# successful chmod(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0111 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0753 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0310 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect 0 lchmod ${n0} 0321 + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -lt $ctime2 + expect 0 unlink ${n0} +fi + +# unsuccessful chmod(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0111 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0753 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0310 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 lchmod ${n0} 0321 + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -eq $ctime2 + expect 0 unlink ${n0} +fi + +# POSIX: If the calling process does not have appropriate privileges, and if +# the group ID of the file does not match the effective group ID or one of the +# supplementary group IDs and if the file is a regular file, bit S_ISGID +# (set-group-ID on execution) in the file's mode shall be cleared upon +# successful return from chmod(). + +expect 0 create ${n0} 0755 +expect 0 chown ${n0} 65535 65535 +expect 0 -u 65535 -g 65535 chmod ${n0} 02755 +expect 02755 stat ${n0} mode +expect 0 -u 65535 -g 65535 chmod ${n0} 0755 +expect 0755 stat ${n0} mode + +# Unfortunately FreeBSD doesn't clear set-gid bit, but returns EPERM instead. +case "${os}" in +FreeBSD) + expect EPERM -u 65535 -g 65534 chmod ${n0} 02755 + expect 0755 stat ${n0} mode + ;; +*) + expect 0 -u 65535 -g 65534 chmod ${n0} 02755 + expect 0755 stat ${n0} mode + ;; +esac +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/01.t new file mode 100755 index 0000000000..6f84c7c8fb --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chmod ${n0}/${n1}/test 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/02.t new file mode 100755 index 0000000000..7a5b4a4bb7 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 chmod ${name255} 0620 +expect 0620 stat ${name255} mode +expect 0 unlink ${name255} +expect ENAMETOOLONG chmod ${name256} 0620 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/03.t new file mode 100755 index 0000000000..eba3833d69 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chmod ${path1023} 0642 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG chmod ${too_long} 0642 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/04.t new file mode 100755 index 0000000000..2e59773d7d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chmod ${n0}/${n1}/test 0644 +expect ENOENT chmod ${n0}/${n1} 0644 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/05.t new file mode 100755 index 0000000000..1753e0915e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/05.t @@ -0,0 +1,31 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0642 +expect 0642 -u 65534 -g 65534 stat ${n1}/${n2} mode +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 chmod ${n1}/${n2} 0620 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0420 +expect 0420 -u 65534 -g 65534 stat ${n1}/${n2} mode +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/06.t new file mode 100755 index 0000000000..bb13ff523d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/06.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chmod ${n0}/test 0644 +expect ELOOP chmod ${n1}/test 0644 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/07.t new file mode 100755 index 0000000000..b3c95e8d83 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/07.t @@ -0,0 +1,31 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EPERM if the operation would change the ownership, but the effective user ID is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0642 +expect 0642 stat ${n1}/${n2} mode +expect EPERM -u 65533 -g 65533 chmod ${n1}/${n2} 0641 +expect 0642 stat ${n1}/${n2} mode +expect 0 chown ${n1}/${n2} 0 0 +expect EPERM -u 65534 -g 65534 chmod ${n1}/${n2} 0641 +expect 0642 stat ${n1}/${n2} mode +expect 0 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/08.t new file mode 100755 index 0000000000..f88239696e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/08.t @@ -0,0 +1,59 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..40" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 chmod ${n0} 0600 +expect 0600 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 chmod ${n0} 0600 +expect 0600 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/09.t new file mode 100755 index 0000000000..68580c3009 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/09.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chmod ${n0}/${n1} 0640 + expect 0640 stat ${n0}/${n1} mode + mount -ur /dev/md${n} + expect EROFS chmod ${n0}/${n1} 0600 + expect 0640 stat ${n0}/${n1} mode + mount -uw /dev/md${n} + expect 0 chmod ${n0}/${n1} 0600 + expect 0600 stat ${n0}/${n1} mode + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/10.t new file mode 100755 index 0000000000..2a996bf783 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/10.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT chmod NULL 0644 +expect EFAULT chmod DEADCODE 0644 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/11.t new file mode 100755 index 0000000000..1cba21a52b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chmod/11.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/11.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EFTYPE if the effective user ID is not the super-user, the mode includes the sticky bit (S_ISVTX), and path does not refer to a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..20" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chmod ${n1} 01755 +expect 01755 stat ${n1} mode +expect 0 rmdir ${n1} + +expect 0 create ${n1} 0644 +expect 0 chmod ${n1} 01644 +expect 01644 stat ${n1} mode +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 chmod ${n1} 01755 +expect 01755 stat ${n1} mode +expect 0 rmdir ${n1} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +case "${os}" in +FreeBSD) + expect EFTYPE -u 65534 -g 65534 chmod ${n1} 01644 + expect 0644 stat ${n1} mode + ;; +SunOS) + expect 0 -u 65534 -g 65534 chmod ${n1} 01644 + expect 0644 stat ${n1} mode + ;; +Linux) + expect 0 -u 65534 -g 65534 chmod ${n1} 01644 + expect 01644 stat ${n1} mode + ;; +esac +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/00.t new file mode 100755 index 0000000000..577170d095 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/00.t @@ -0,0 +1,376 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/00.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown changes ownership" + +dir=`dirname $0` +. ${dir}/../misc.sh + +if supported lchmod; then + echo "1..186" +else + echo "1..171" +fi + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +# super-user can always modify ownership +# 2 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 unlink ${n0} +# 8 +expect 0 mkfifo ${n0} 0644 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 unlink ${n0} +# 14 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 rmdir ${n0} +# 20 +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect 0 chown ${n1} 123 456 +expect 123,456 stat ${n1} uid,gid +expect 123,456 stat ${n0} uid,gid +expect 0 lchown ${n1} 135 579 +expect 135,579 lstat ${n1} uid,gid +expect 123,456 stat ${n1} uid,gid +expect 123,456 stat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +# non-super-user can modify file group if he is owner of a file and +# gid he is setting is in his groups list. +# 31 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532 +expect 65534,65532 lstat ${n0} uid,gid +expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531 +expect 65534,65531 lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# chown(2) return 0 if user is not owner of a file, but chown(2) is called +# with both uid and gid equal to -1. +# 39 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1 +expect 0 unlink ${n0} + +# when super-user calls chown(2), set-uid and set-gid bits are not removed. +# 43 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 65532 65531 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac +expect 0 unlink ${n0} +# 50 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 0 0 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 65534 65533 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac + +expect 0 unlink ${n0} +# 57 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 0 0 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac +expect 0 unlink ${n0} + +# when non-super-user calls chown(2) successfully, set-uid and set-gid bits are +# removed, except when both uid and gid are equal to -1. +# 64 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532 +expect 0555,65534,65532 lstat ${n0} mode,uid,gid +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533 +expect 0555,65534,65533 lstat ${n0} mode,uid,gid +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1 +case "${os}" in +Linux) + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + ;; +*) + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + ;; +esac + +expect 0 unlink ${n0} +# 79 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532 +case "${os}:${fs}" in +Linux:ext3|Linux:ntfs-3g) + expect 06555,65534,65532 lstat ${n0} mode,uid,gid + ;; +*) + expect 0555,65534,65532 lstat ${n0} mode,uid,gid + ;; +esac +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533 +case "${os}:${fs}" in +Linux:ext3|Linux:ntfs-3g) + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + ;; +*) + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + ;; +esac +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1 +expect 06555,65534,65533 lstat ${n0} mode,uid,gid +expect 0 rmdir ${n0} +# 94 +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + expect 0 lchown ${n0} 65534 65533 + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532 + expect 0555,65534,65532 lstat ${n0} mode,uid,gid + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 65533 + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 -1 + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + expect 0 unlink ${n0} +fi + +# successfull chown(2) call (except uid and gid equal to -1) updates ctime. +# 109 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 114 +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} +# 119 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 124 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 lchown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 129 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 135 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} +# 141 +expect 0 mkfifo ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 148 +expect 0 symlink ${n1} ${n0} +expect 0 lchown ${n0} 65534 65533 +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 154 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} +# 158 +expect 0 mkdir ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 rmdir ${n0} +# 162 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} +# 166 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 -- lchown ${n0} -1 -1 +ctime2=`${fstest} lstat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} + +# unsuccessful chown(2) does not update ctime. +# 170 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -- chown ${n0} 65534 -1 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} +# 174 +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} +# 178 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} +# 182 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534 +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +# 186 +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/01.t new file mode 100755 index 0000000000..b1cb2f0fb4 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chown ${n0}/${n1}/test 65534 65534 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/02.t new file mode 100755 index 0000000000..e9814bd32e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 chown ${name255} 65534 65534 +expect 65534,65534 stat ${name255} uid,gid +expect 0 unlink ${name255} +expect ENAMETOOLONG chown ${name256} 65533 65533 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/03.t new file mode 100755 index 0000000000..f8569fd156 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chown ${path1023} 65534 65534 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG chown ${too_long} 65533 65533 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/04.t new file mode 100755 index 0000000000..1395c3b68d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chown ${n0}/${n1}/test 65534 65534 +expect ENOENT chown ${n0}/${n1} 65534 65534 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/05.t new file mode 100755 index 0000000000..373fc8678d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/05.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65533 +expect 65534,65533 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65534 +expect 0 chmod ${n1} 0755 +expect 65534,65533 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65534 +expect 65534,65534 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/06.t new file mode 100755 index 0000000000..661fd864c4 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/06.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chown ${n0}/test 65534 65534 +expect ELOOP chown ${n1}/test 65534 65534 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/07.t new file mode 100755 index 0000000000..af51ec5fcd --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/07.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EPERM if the operation would change the ownership, but the effective user ID is not the super-user and the process is not an owner of the file" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect EPERM -u 65534 -g 65534 chown ${n1}/${n2} 65533 65533 +expect EPERM -u 65533 -g 65533 chown ${n1}/${n2} 65534 65534 +expect EPERM -u 65533 -g 65533 chown ${n1}/${n2} 65533 65533 +expect EPERM -u 65534 -g 65534 -- chown ${n1}/${n2} -1 65533 +expect 0 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/08.t new file mode 100755 index 0000000000..a5bbed79f6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/08.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..34" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/09.t new file mode 100755 index 0000000000..5097d00c4a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/09.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:{fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chown ${n0}/${n1} 65534 65534 + expect 65534,65534 stat ${n0}/${n1} uid,gid + mount -ur /dev/md${n} + expect EROFS chown ${n0}/${n1} 65533 65533 + expect 65534,65534 stat ${n0}/${n1} uid,gid + mount -uw /dev/md${n} + expect 0 chown ${n0}/${n1} 65533 65533 + expect 65533,65533 stat ${n0}/${n1} uid,gid + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/10.t new file mode 100755 index 0000000000..bb79067c23 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/chown/10.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT chown NULL 65534 65534 +expect EFAULT chown DEADCODE 65534 65534 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/conf b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/conf new file mode 100644 index 0000000000..5e53ea4d24 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/conf @@ -0,0 +1,8 @@ +# $FreeBSD: src/tools/regression/fstest/tests/conf,v 1.1 2007/01/17 01:42:08 pjd Exp $ +# fstest configuration file + +# Known operating systems: FreeBSD, SunOS, Linux +os=`uname` + +# Known file systems: UFS, ZFS, ext3, ntfs-3g, xfs +fs="ext3" diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/00.t new file mode 100755 index 0000000000..dcd408f357 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/00.t @@ -0,0 +1,151 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/00.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link creates hardlinks" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..82" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` + +expect 0 mkdir ${n3} 0755 +cdir=`pwd` +cd ${n3} + +expect 0 create ${n0} 0644 +expect regular,0644,1 lstat ${n0} type,mode,nlink + +expect 0 link ${n0} ${n1} +expect regular,0644,2 lstat ${n0} type,mode,nlink +expect regular,0644,2 lstat ${n1} type,mode,nlink + +expect 0 link ${n1} ${n2} +expect regular,0644,3 lstat ${n0} type,mode,nlink +expect regular,0644,3 lstat ${n1} type,mode,nlink +expect regular,0644,3 lstat ${n2} type,mode,nlink + +expect 0 chmod ${n1} 0201 +expect 0 chown ${n1} 65534 65533 + +expect regular,0201,3,65534,65533 lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,3,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect regular,0201,3,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,2,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect regular,0201,2,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n2} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,1,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n1} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect ENOENT lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 mkfifo ${n0} 0644 +expect fifo,0644,1 lstat ${n0} type,mode,nlink + +expect 0 link ${n0} ${n1} +expect fifo,0644,2 lstat ${n0} type,mode,nlink +expect fifo,0644,2 lstat ${n1} type,mode,nlink + +expect 0 link ${n1} ${n2} +expect fifo,0644,3 lstat ${n0} type,mode,nlink +expect fifo,0644,3 lstat ${n1} type,mode,nlink +expect fifo,0644,3 lstat ${n2} type,mode,nlink + +expect 0 chmod ${n1} 0201 +expect 0 chown ${n1} 65534 65533 + +expect fifo,0201,3,65534,65533 lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,3,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect fifo,0201,3,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,2,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect fifo,0201,2,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n2} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,1,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n1} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect ENOENT lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +# successful link(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect 0 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -lt $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -lt $dmtime2 +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect 0 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -lt $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -lt $dmtime2 +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +# unsuccessful link(2) does not update ctime. +expect 0 create ${n0} 0644 +expect 0 -- chown ${n0} 65534 -1 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect EACCES -u 65534 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -eq $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -eq $dmtime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0 -- chown ${n0} 65534 -1 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect EACCES -u 65534 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -eq $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -eq $dmtime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n3} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/01.t new file mode 100755 index 0000000000..be003b92f6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/01.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOTDIR if a component of either path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR link ${n0}/${n1}/test ${n0}/${n2} +expect 0 create ${n0}/${n2} 0644 +expect ENOTDIR link ${n0}/${n2} ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/02.t new file mode 100755 index 0000000000..6c34e8ea9d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/02.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENAMETOOLONG if a component of either pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` + +expect 0 create ${name255} 0644 +expect 0 link ${name255} ${n0} +expect 0 unlink ${name255} +expect 0 link ${n0} ${name255} +expect 0 unlink ${n0} +expect 0 unlink ${name255} + +expect 0 create ${n0} 0644 +expect ENAMETOOLONG link ${n0} ${name256} +expect 0 unlink ${n0} +expect ENAMETOOLONG link ${name256} ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/03.t new file mode 100755 index 0000000000..0ad3354ac1 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/03.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..16" + +n0=`namegen` + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 link ${path1023} ${n0} +expect 0 unlink ${path1023} +expect 0 link ${n0} ${path1023} +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG link ${n0} ${too_long} +unlink_too_long +expect 0 unlink ${n0} +create_too_long +expect ENAMETOOLONG link ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/04.t new file mode 100755 index 0000000000..a3b8f7f3dc --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/04.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOENT if a component of either path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT link ${n0}/${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ENOENT link ${n2} ${n0}/${n1}/test +expect 0 unlink ${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/05.t new file mode 100755 index 0000000000..a95d3d1f8b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/05.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EMLINK if the link count of the file named by name1 would exceed 32767" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs -i 1 /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + i=1 + while :; do + link ${n0}/${n1} ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + test_check $i -eq 32767 + + expect EMLINK link ${n0}/${n1} ${n0}/${n2} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/06.t new file mode 100755 index 0000000000..b0391dce80 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/06.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EACCES when a component of either path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..18" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 unlink ${n2}/${n4} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n1}/${n4} +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} + +expect 0 chmod ${n1} 0755 +expect 0 chmod ${n2} 0644 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/07.t new file mode 100755 index 0000000000..9760e35c50 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/07.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EACCES when the requested link requires writing in a directory with a mode that denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 unlink ${n2}/${n4} + +expect 0 chmod ${n2} 0555 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n1}/${n4} +expect 0 chmod ${n1} 0755 + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/08.t new file mode 100755 index 0000000000..24b764b20c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/08.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ELOOP if too many symbolic links were encountered in translating one of the pathnames" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP link ${n0}/test ${n2} +expect ELOOP link ${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ELOOP link ${n2} ${n0}/test +expect ELOOP link ${n2} ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect 0 unlink ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/09.t new file mode 100755 index 0000000000..7899fcbc3b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/09.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOENT if the source file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect ENOENT link ${n0} ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/10.t new file mode 100755 index 0000000000..61612e6b65 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/10.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EEXIST if the destination file does exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 + +expect 0 create ${n1} 0644 +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect EEXIST link ${n0} ${n1} +expect 0 rmdir ${n1} + +expect 0 symlink test ${n1} +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/11.t new file mode 100755 index 0000000000..8a7c571cf0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/11.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the source file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +case "${os}:${fs}" in +SunOS:UFS) + echo "1..10" + + expect 0 mkdir ${n0} 0755 + expect 0 link ${n0} ${n1} + expect 0 unlink ${n1} + expect 0 rmdir ${n0} + ;; +*) + echo "1..9" + + expect 0 mkdir ${n0} 0755 + expect EPERM link ${n0} ${n1} + expect 0 rmdir ${n0} + ;; +esac + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 mkdir ${n1} 0755 +expect EPERM -u 65534 -g 65534 link ${n1} ${n2} +expect 0 -u 65534 -g 65534 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/12.t new file mode 100755 index 0000000000..a9366a3449 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/12.t @@ -0,0 +1,55 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/12.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the source file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..32" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 + +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_APPEND +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_APPEND +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/13.t new file mode 100755 index 0000000000..82dca47127 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/13.t @@ -0,0 +1,56 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/13.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the parent directory of the destination file has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..32" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_APPEND +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_APPEND +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/14.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/14.t new file mode 100755 index 0000000000..40a91bca41 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/14.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/14.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EXDEV if the source and the destination files are on different file systems" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..8" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect EXDEV link ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + expect 0 create ${n1} 0644 + expect EXDEV link ${n1} ${n0}/${n2} + expect 0 unlink ${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/15.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/15.t new file mode 100755 index 0000000000..943df52fa3 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/15.t @@ -0,0 +1,38 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/15.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOSPC if the directory in which the entry for the new link is being placed cannot be extended because there is no space left on the file system containing the directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..4" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + i=0 + while :; do + link ${n0}/${n1} ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC link ${n0}/${n1} ${n0}/${n2} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/16.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/16.t new file mode 100755 index 0000000000..fad792edbc --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/16.t @@ -0,0 +1,39 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/16.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EROFS if the requested link requires writing in a directory on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..9" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + + expect 0 link ${n0}/${n1} ${n0}/${n2} + expect 0 unlink ${n0}/${n2} + mount -ur /dev/md${n} + expect EROFS link ${n0}/${n1} ${n0}/${n2} + mount -uw /dev/md${n} + expect 0 link ${n0}/${n1} ${n0}/${n2} + expect 0 unlink ${n0}/${n2} + + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/17.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/17.t new file mode 100755 index 0000000000..278e27cf81 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/link/17.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/17.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EFAULT link ${n0} NULL +expect EFAULT link ${n0} DEADCODE +expect 0 unlink ${n0} +expect EFAULT link NULL ${n0} +expect EFAULT link DEADCODE ${n0} +expect EFAULT link NULL DEADCODE +expect EFAULT link DEADCODE NULL diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/misc.sh b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/misc.sh new file mode 100644 index 0000000000..0faefcb35a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/misc.sh @@ -0,0 +1,143 @@ +# $FreeBSD: src/tools/regression/fstest/tests/misc.sh,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +ntest=1 + +name253="_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_12" +name255="${name253}34" +name256="${name255}5" +path1021="${name255}/${name255}/${name255}/${name253}" +path1023="${path1021}/x" +path1024="${path1023}x" + +echo ${dir} | egrep '^/' >/dev/null 2>&1 +if [ $? -eq 0 ]; then + maindir="${dir}/../.." +else + maindir="`pwd`/${dir}/../.." +fi +fstest="${maindir}/fstest" +. ${maindir}/tests/conf + +run_getconf() +{ + if val=$(getconf "${1}" .); then + if [ "$value" = "undefined" ]; then + echo "${1} is undefined" + exit 1 + fi + else + echo "Failed to get ${1}" + exit 1 + fi + + echo $val +} + +name_max_val=$(run_getconf NAME_MAX) +path_max_val=$(run_getconf PATH_MAX) + +name_max="_" +i=1 +while test $i -lt $name_max_val ; do + name_max="${name_max}x" + i=$(($i+1)) +done + +num_of_dirs=$(( ($path_max_val + $name_max_val) / ($name_max_val + 1) - 1 )) + +long_dir="${name_max}" +i=1 +while test $i -lt $num_of_dirs ; do + long_dir="${long_dir}/${name_max}" + i=$(($i+1)) +done +long_dir="${long_dir}/x" + +too_long="${long_dir}/${name_max}" + +create_too_long() +{ + mkdir -p ${long_dir} +} + +unlink_too_long() +{ + rm -rf ${name_max} +} + +expect() +{ + e="${1}" + shift + r=`${fstest} $* 2>/dev/null | tail -1` + echo "${r}" | egrep '^'${e}'$' >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +jexpect() +{ + s="${1}" + d="${2}" + e="${3}" + shift 3 + r=`jail -s ${s} / fstest 127.0.0.1 /bin/sh -c "cd ${d} && ${fstest} $* 2>/dev/null" | tail -1` + echo "${r}" | egrep '^'${e}'$' >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +test_check() +{ + if [ $* ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +namegen() +{ + echo "fstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | md5sum | cut -f1 -d' '`" +} + +quick_exit() +{ + echo "1..1" + echo "ok 1" + exit 0 +} + +supported() +{ + case "${1}" in + chflags) + if [ ${os} != "FreeBSD" -o ${fs} != "UFS" ]; then + return 1 + fi + ;; + lchmod) + if [ ${os} != "FreeBSD" ]; then + return 1 + fi + ;; + esac + return 0 +} + +require() +{ + if supported ${1}; then + return + fi + quick_exit +} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/00.t new file mode 100755 index 0000000000..cd39339d29 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/00.t @@ -0,0 +1,73 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="mkdir creates directories" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..36" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: The file permission bits of the new directory shall be initialized from +# mode. These file permission bits of the mode argument shall be modified by the +# process' file creation mask. +expect 0 mkdir ${n0} 0755 +expect dir,0755 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 mkdir ${n0} 0151 +expect dir,0151 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 077 mkdir ${n0} 0151 +expect dir,0100 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 070 mkdir ${n0} 0345 +expect dir,0305 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 0501 mkdir ${n0} 0345 +expect dir,0244 lstat ${n0} type,mode +expect 0 rmdir ${n0} + +# POSIX: The directory's user ID shall be set to the process' effective user ID. +# The directory's group ID shall be set to the group ID of the parent directory +# or to the effective group ID of the process. +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 mkdir ${n0} 0755 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 rmdir ${n0} +expect 0 -u 65535 -g 65534 mkdir ${n0} 0755 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 rmdir ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 mkdir ${n0} 0755 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 rmdir ${n0} + +# POSIX: Upon successful completion, mkdir() shall mark for update the st_atime, +# st_ctime, and st_mtime fields of the directory. Also, the st_ctime and +# st_mtime fields of the directory that contains the new entry shall be marked +# for update. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 mkdir ${n0} 0755 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/01.t new file mode 100755 index 0000000000..b8b5eb10bb --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR mkdir ${n0}/${n1}/test 0755 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/02.t new file mode 100755 index 0000000000..b23f9f56c0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/02.t @@ -0,0 +1,13 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +expect 0 mkdir ${name255} 0755 +expect 0 rmdir ${name255} +expect ENAMETOOLONG mkdir ${name256} 0755 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/03.t new file mode 100755 index 0000000000..6d90e5319c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/03.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkdir ${path1023} 0755 +expect 0 rmdir ${path1023} +create_too_long +expect ENAMETOOLONG mkdir ${too_long} 0755 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/04.t new file mode 100755 index 0000000000..4de4a9dc5e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOENT if a component of the path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT mkdir ${n0}/${n1}/test 0755 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/05.t new file mode 100755 index 0000000000..3631ddeefd --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/06.t new file mode 100755 index 0000000000..27057394a7 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/06.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EACCES when write permission is denied on the parent directory of the directory to be created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/07.t new file mode 100755 index 0000000000..fe311e87fe --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP mkdir ${n0}/test 0755 +expect ELOOP mkdir ${n1}/test 0755 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/08.t new file mode 100755 index 0000000000..f8d8eca64e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/08.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EPERM if the parent directory of the directory to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/09.t new file mode 100755 index 0000000000..1c5eb4d462 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/09.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkdir ${n0}/${n1} 0755 + expect 0 rmdir ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS mkdir ${n0}/${n1} 0755 + mount -uw /dev/md${n} + expect 0 mkdir ${n0}/${n1} 0755 + expect 0 rmdir ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/10.t new file mode 100755 index 0000000000..06b5c60831 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/10.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EEXIST if the named file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EEXIST mkdir ${n0} 0755 +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/11.t new file mode 100755 index 0000000000..1413b5f52a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOSPC if there are no free inodes on the file system on which the directory is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + mkdir ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC mkdir ${n0}/${n1} 0755 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/12.t new file mode 100755 index 0000000000..dfc868cd8f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkdir/12.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/12.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT mkdir NULL 0755 +expect EFAULT mkdir DEADCODE 0755 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/00.t new file mode 100755 index 0000000000..ba4843198d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/00.t @@ -0,0 +1,73 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="mkfifo creates fifo files" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..36" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: The file permission bits of the new FIFO shall be initialized from +# mode. The file permission bits of the mode argument shall be modified by the +# process' file creation mask. +expect 0 mkfifo ${n0} 0755 +expect fifo,0755 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 mkfifo ${n0} 0151 +expect fifo,0151 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 077 mkfifo ${n0} 0151 +expect fifo,0100 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 070 mkfifo ${n0} 0345 +expect fifo,0305 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 0501 mkfifo ${n0} 0345 +expect fifo,0244 lstat ${n0} type,mode +expect 0 unlink ${n0} + +# POSIX: The FIFO's user ID shall be set to the process' effective user ID. +# The FIFO's group ID shall be set to the group ID of the parent directory or to +# the effective group ID of the process. +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 mkfifo ${n0} 0755 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 -u 65535 -g 65534 mkfifo ${n0} 0755 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 mkfifo ${n0} 0755 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# POSIX: Upon successful completion, mkfifo() shall mark for update the +# st_atime, st_ctime, and st_mtime fields of the file. Also, the st_ctime and +# st_mtime fields of the directory that contains the new entry shall be marked +# for update. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 mkfifo ${n0} 0755 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/01.t new file mode 100755 index 0000000000..90a9307ed6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR mkfifo ${n0}/${n1}/test 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/02.t new file mode 100755 index 0000000000..f0d5cae129 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/02.t @@ -0,0 +1,13 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +expect 0 mkfifo ${name255} 0644 +expect 0 unlink ${name255} +expect ENAMETOOLONG mkfifo ${name256} 0644 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/03.t new file mode 100755 index 0000000000..4c1feeda3f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/03.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkfifo ${path1023} 0644 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG mkfifo ${too_long} 0644 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/04.t new file mode 100755 index 0000000000..9fbfcb2929 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOENT if a component of the path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT mkfifo ${n0}/${n1}/test 0644 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/05.t new file mode 100755 index 0000000000..0c98abc02c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/06.t new file mode 100755 index 0000000000..be99141098 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/06.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EACCES when write permission is denied on the parent directory of the file to be created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/07.t new file mode 100755 index 0000000000..3bb381e9be --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP mkfifo ${n0}/test 0644 +expect ELOOP mkfifo ${n1}/test 0644 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/08.t new file mode 100755 index 0000000000..9ea2e79e04 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/08.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkfifo ${n0}/${n1} 0644 + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS mkfifo ${n0}/${n1} 0644 + mount -uw /dev/md${n} + expect 0 mkfifo ${n0}/${n1} 0644 + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/09.t new file mode 100755 index 0000000000..e3931b70f6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/09.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EEXIST if the named file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EEXIST mkfifo ${n0} 0644 +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/10.t new file mode 100755 index 0000000000..d65f191e9d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/10.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EPERM if the parent directory of the file to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/11.t new file mode 100755 index 0000000000..6ca965b08b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOSPC if there are no free inodes on the file system on which the file is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + mkfifo ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC mkfifo ${n0}/${n1} 0644 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/12.t new file mode 100755 index 0000000000..2280194d76 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/mkfifo/12.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="mkfifo returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT mkfifo NULL 0644 +expect EFAULT mkfifo DEADCODE 0644 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/00.t new file mode 100755 index 0000000000..75d99b83ba --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/00.t @@ -0,0 +1,99 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="open opens (and eventually creates) a file" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..47" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: (If O_CREAT is specified and the file doesn't exist) [...] the access +# permission bits of the file mode shall be set to the value of the third +# argument taken as type mode_t modified as follows: a bitwise AND is performed +# on the file-mode bits and the corresponding bits in the complement of the +# process' file mode creation mask. Thus, all bits in the file mode whose +# corresponding bit in the file mode creation mask is set are cleared. +expect 0 open ${n0} O_CREAT,O_WRONLY 0755 +expect regular,0755 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 open ${n0} O_CREAT,O_WRONLY 0151 +expect regular,0151 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 077 open ${n0} O_CREAT,O_WRONLY 0151 +expect regular,0100 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 070 open ${n0} O_CREAT,O_WRONLY 0345 +expect regular,0305 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 0501 open ${n0} O_CREAT,O_WRONLY 0345 +expect regular,0244 lstat ${n0} type,mode +expect 0 unlink ${n0} + +# POSIX: (If O_CREAT is specified and the file doesn't exist) [...] the user ID +# of the file shall be set to the effective user ID of the process; the group ID +# of the file shall be set to the group ID of the file's parent directory or to +# the effective group ID of the process [...] +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 open ${n0} O_CREAT,O_WRONLY 0644 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 -u 65535 -g 65534 open ${n0} O_CREAT,O_WRONLY 0644 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 open ${n0} O_CREAT,O_WRONLY 0644 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# Update parent directory ctime/mtime if file didn't exist. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 open ${n0} O_CREAT,O_WRONLY 0644 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +# Don't update parent directory ctime/mtime if file existed. +expect 0 create ${n0} 0644 +dmtime=`${fstest} stat . mtime` +dctime=`${fstest} stat . ctime` +sleep 1 +expect 0 open ${n0} O_CREAT,O_RDONLY 0644 +mtime=`${fstest} stat . mtime` +test_check $dmtime -eq $mtime +ctime=`${fstest} stat . ctime` +test_check $dctime -eq $ctime +expect 0 unlink ${n0} + +echo test > ${n0} +expect 5 stat ${n0} size +mtime1=`${fstest} stat ${n0} mtime` +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 open ${n0} O_WRONLY,O_TRUNC +mtime2=`${fstest} stat ${n0} mtime` +test_check $mtime1 -lt $mtime2 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 stat ${n0} size +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/01.t new file mode 100755 index 0000000000..a25ec8edd2 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/01.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR open ${n0}/${n1}/test O_CREAT 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/02.t new file mode 100755 index 0000000000..6ac818e5f5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/02.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 open ${name255} O_CREAT 0620 +expect 0620 stat ${name255} mode +expect 0 unlink ${name255} +expect ENAMETOOLONG open ${name256} O_CREAT 0620 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/03.t new file mode 100755 index 0000000000..88c3226af7 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/03.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 open ${path1023} O_CREAT 0642 +expect 0642 stat ${path1023} mode +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG open ${too_long} O_CREAT 0642 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/04.t new file mode 100755 index 0000000000..10ac17a79e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/04.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOENT if a component of the path name that must exist does not exist or O_CREAT is not set and the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT open ${n0}/${n1}/test O_CREAT 0644 +expect ENOENT open ${n0}/${n1} O_RDONLY +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/05.t new file mode 100755 index 0000000000..60b4dc38f8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/05.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/06.t new file mode 100755 index 0000000000..614f66fe3a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/06.t @@ -0,0 +1,102 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/06.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when the required permissions (for reading and/or writing) are denied for the given flags" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..72" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 create ${n1} 0644 + +expect 0 -u 65534 -g 65534 chmod ${n1} 0600 +expect 0 -u 65534 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65534 -g 65534 open ${n1} O_WRONLY +expect 0 -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0060 +expect 0 -u 65533 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65534 open ${n1} O_WRONLY +expect 0 -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0006 +expect 0 -u 65533 -g 65533 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65533 open ${n1} O_WRONLY +expect 0 -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0477 +expect 0 -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0747 +expect 0 -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0774 +expect 0 -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0277 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0727 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0772 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0177 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0717 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0771 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0077 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0707 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0770 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR +# +# EACCES for opening a directory read-only with no read access +# EACCES for reading a directory with no execute access +# +cd .. +expect 0 -u 65534 -g 65534 open ${n0} O_RDONLY +expect 0 -u 65534 -g 65534 chmod ${n0} 0355 +expect EACCES -u 65534 -g 65534 open ${n0} O_RDONLY +expect 0770 -u 65534 -g 65534 stat ${n0}/${n1} mode +expect 0 -u 65534 -g 65534 chmod ${n0} 0655 +expect EACCES -u 65534 -g 65534 stat ${n0}/${n1} mode + +expect 0 -u 65534 -g 65534 chmod ${n0} 0755 +cd ${n0} +expect 0 -u 65534 -g 65534 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/07.t new file mode 100755 index 0000000000..ddf337c0ad --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/07.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/07.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when O_TRUNC is specified and write permission is denied" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..23" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 create ${n1} 0644 + +expect 0 -u 65534 -g 65534 chmod ${n1} 0477 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0747 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0774 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 chmod ${n1} 0177 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0717 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0771 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 chmod ${n1} 0077 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0707 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0770 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/08.t new file mode 100755 index 0000000000..1323d31022 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/08.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/08.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when O_CREAT is specified, the file does not exist, and the directory in which it is to be created does not permit writing" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_CREAT 0644 +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/09.t new file mode 100755 index 0000000000..bb5bbba2a3 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/09.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/09.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="O_CREAT is specified, the file does not exist, and the directory in which it is to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/10.t new file mode 100755 index 0000000000..7602904cc1 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/10.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/10.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EPERM when the named file has its immutable flag set and the file is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..28" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 open ${n0} O_WRONLY +expect 0 open ${n0} O_RDWR +expect 0 open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 open ${n0} O_WRONLY +expect 0 open ${n0} O_RDWR +expect 0 open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/11.t new file mode 100755 index 0000000000..0af364c5e0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/11.t @@ -0,0 +1,39 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/11.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EPERM when the named file has its append-only flag set, the file is to be modified, and O_TRUNC is specified or O_APPEND is not specified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..24" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect 0 open ${n0} O_WRONLY,O_APPEND +expect 0 open ${n0} O_RDWR,O_APPEND +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect EPERM open ${n0} O_RDONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_WRONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_RDWR,O_APPEND,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect 0 open ${n0} O_WRONLY,O_APPEND +expect 0 open ${n0} O_RDWR,O_APPEND +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect EPERM open ${n0} O_RDONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_WRONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_RDWR,O_APPEND,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/12.t new file mode 100755 index 0000000000..060822028c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/12.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP open ${n0}/test O_RDONLY +expect ELOOP open ${n1}/test O_RDONLY +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/13.t new file mode 100755 index 0000000000..7f37e4455c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/13.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/13.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EISDIR when he named file is a directory, and the arguments specify it is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..8" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 open ${n0} O_RDONLY +expect EISDIR open ${n0} O_WRONLY +expect EISDIR open ${n0} O_RDWR +expect EISDIR open ${n0} O_RDONLY,O_TRUNC +expect EISDIR open ${n0} O_WRONLY,O_TRUNC +expect EISDIR open ${n0} O_RDWR,O_TRUNC + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/14.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/14.t new file mode 100755 index 0000000000..2d662838f0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/14.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/14.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EROFS if the named file resides on a read-only file system, and the file is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 open ${n0}/${n1} O_WRONLY + expect 0 open ${n0}/${n1} O_RDWR + expect 0 open ${n0}/${n1} O_RDONLY,O_TRUNC + mount -ur /dev/md${n} + expect EROFS open ${n0}/${n1} O_WRONLY + expect EROFS open ${n0}/${n1} O_RDWR + expect EROFS open ${n0}/${n1} O_RDONLY,O_TRUNC + mount -uw /dev/md${n} + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/15.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/15.t new file mode 100755 index 0000000000..261f6f715d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/15.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/15.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EROFS when O_CREAT is specified and the named file would reside on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS open ${n0}/${n1} O_RDONLY,O_CREAT 0644 + mount -uw /dev/md${n} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/16.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/16.t new file mode 100755 index 0000000000..7667b55ab7 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/16.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/16.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EMLINK/ELOOP when O_NOFOLLOW was specified and the target is a symbolic link" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +case "${os}" in +FreeBSD) + expect EMLINK open ${n1} O_RDONLY,O_CREAT,O_NOFOLLOW 0644 + expect EMLINK open ${n1} O_RDONLY,O_NOFOLLOW + expect EMLINK open ${n1} O_WRONLY,O_NOFOLLOW + expect EMLINK open ${n1} O_RDWR,O_NOFOLLOW + ;; +*) + expect ELOOP open ${n1} O_RDONLY,O_CREAT,O_NOFOLLOW 0644 + expect ELOOP open ${n1} O_RDONLY,O_NOFOLLOW + expect ELOOP open ${n1} O_WRONLY,O_NOFOLLOW + expect ELOOP open ${n1} O_RDWR,O_NOFOLLOW + ;; +esac +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/17.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/17.t new file mode 100755 index 0000000000..d662d37c67 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/17.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/17.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENXIO when O_NONBLOCK is set, the named file is a fifo, O_WRONLY is set, and no process has the file open for reading" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkfifo ${n0} 0644 +expect ENXIO open ${n0} O_WRONLY,O_NONBLOCK +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/18.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/18.t new file mode 100755 index 0000000000..9c5fe31b36 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/18.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/18.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EWOULDBLOCK when O_NONBLOCK and one of O_SHLOCK or O_EXLOCK is specified and the file is locked" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..6" + + n0=`namegen` + + expect 0 create ${n0} 0644 + expect 0 open ${n0} O_RDONLY,O_SHLOCK : open ${n0} O_RDONLY,O_SHLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_EXLOCK : open ${n0} O_RDONLY,O_EXLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_SHLOCK : open ${n0} O_RDONLY,O_EXLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_EXLOCK : open ${n0} O_RDONLY,O_SHLOCK,O_NONBLOCK + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/19.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/19.t new file mode 100755 index 0000000000..9022d94bbb --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/19.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/19.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOSPC when O_CREAT is specified, the file does not exist, and there are no free inodes on the file system on which the file is being created" + + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + touch ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC open ${n0}/${i} O_RDONLY,O_CREAT 0644 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/20.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/20.t new file mode 100755 index 0000000000..db1eadaed6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/20.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/20.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ETXTBSY when the file is a pure procedure (shared text) file that is being executed and the open() system call requests write access" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..4" + + n0=`namegen` + + cp -pf `which sleep` ${n0} + ./${n0} 3 & + expect ETXTBSY open ${n0} O_WRONLY + expect ETXTBSY open ${n0} O_RDWR + expect ETXTBSY open ${n0} O_RDONLY,O_TRUNC + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/21.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/21.t new file mode 100755 index 0000000000..f969c82afb --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/21.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/21.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT open NULL O_RDONLY +expect EFAULT open DEADCODE O_RDONLY diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/22.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/22.t new file mode 100755 index 0000000000..0ab17cd650 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/22.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/22.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EEXIST when O_CREAT and O_EXCL were specified and the file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/23.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/23.t new file mode 100755 index 0000000000..d57329482c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/open/23.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/23.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EINVAL when an attempt was made to open a descriptor with an illegal combination of O_RDONLY, O_WRONLY, and O_RDWR" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` + +expect 0 create ${n0} 0644 +case "${os}" in +Linux) + expect 0 open ${n0} O_WRONLY,O_RDWR + expect 0 open ${n0} O_RDONLY,O_WRONLY,O_RDWR + ;; +*) + expect EINVAL open ${n0} O_WRONLY,O_RDWR + expect EINVAL open ${n0} O_RDONLY,O_WRONLY,O_RDWR + ;; +esac +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/00.t new file mode 100755 index 0000000000..85d1014d13 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/00.t @@ -0,0 +1,141 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/00.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename changes file name" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..79" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` + +expect 0 mkdir ${n3} 0755 +cdir=`pwd` +cd ${n3} + +expect 0 create ${n0} 0644 +expect regular,0644,1 lstat ${n0} type,mode,nlink +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode,nlink +expect regular,${inode},0644,1 lstat ${n1} type,inode,mode,nlink +expect 0 link ${n1} ${n0} +expect regular,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect regular,${inode},0644,2 lstat ${n1} type,inode,mode,nlink +expect 0 rename ${n1} ${n2} +expect regular,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect ENOENT lstat ${n1} type,mode,nlink +expect regular,${inode},0644,2 lstat ${n2} type,inode,mode,nlink +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +expect 0 mkdir ${n0} 0755 +expect dir,0755 lstat ${n0} type,mode +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode +expect dir,${inode},0755 lstat ${n1} type,inode,mode +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n0} 0644 +expect fifo,0644,1 lstat ${n0} type,mode,nlink +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode,nlink +expect fifo,${inode},0644,1 lstat ${n1} type,inode,mode,nlink +expect 0 link ${n1} ${n0} +expect fifo,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect fifo,${inode},0644,2 lstat ${n1} type,inode,mode,nlink +expect 0 rename ${n1} ${n2} +expect fifo,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect ENOENT lstat ${n1} type,mode,nlink +expect fifo,${inode},0644,2 lstat ${n2} type,inode,mode,nlink +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +expect 0 create ${n0} 0644 +rinode=`${fstest} lstat ${n0} inode` +expect regular,0644 lstat ${n0} type,mode +expect 0 symlink ${n0} ${n1} +sinode=`${fstest} lstat ${n1} inode` +expect regular,${rinode},0644 stat ${n1} type,inode,mode +expect symlink,${sinode} lstat ${n1} type,inode +expect 0 rename ${n1} ${n2} +expect regular,${rinode},0644 stat ${n0} type,inode,mode +expect ENOENT lstat ${n1} type,mode +expect symlink,${sinode} lstat ${n2} type,inode +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +# successful rename(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} lstat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +# unsuccessful link(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 symlink ${n2} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n3} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/01.t new file mode 100755 index 0000000000..ec2910156d --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/01.t @@ -0,0 +1,21 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/01.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENAMETOOLONG if a component of either pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${name255} 0644 +expect 0 rename ${name255} ${n0} +expect 0 rename ${n0} ${name255} +expect 0 unlink ${name255} + +expect 0 create ${n0} 0644 +expect ENAMETOOLONG rename ${n0} ${name256} +expect 0 unlink ${n0} +expect ENAMETOOLONG rename ${name256} ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/02.t new file mode 100755 index 0000000000..a291d6dc22 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/02.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/02.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${n0} 0644 +expect 0 rename ${n0} ${path1023} +expect 0 rename ${path1023} ${n0} +expect ENAMETOOLONG rename ${n0} ${too_long} +expect 0 unlink ${n0} +create_too_long +expect ENAMETOOLONG rename ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/03.t new file mode 100755 index 0000000000..a768393c3b --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/03.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/03.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOENT if a component of the 'from' path does not exist, or a path prefix of 'to' does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT rename ${n0}/${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ENOENT rename ${n2} ${n0}/${n1}/test +expect 0 unlink ${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/04.t new file mode 100755 index 0000000000..43406289f8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/04.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/04.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES when a component of either path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..18" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4} +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} + +expect 0 chmod ${n1} 0755 +expect 0 chmod ${n2} 0644 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/05.t new file mode 100755 index 0000000000..3b9e9b94fa --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/05.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/05.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES when the requested link requires writing in a directory with a mode that denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3} + +expect 0 chmod ${n2} 0555 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4} +expect 0 chmod ${n1} 0755 + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/06.t new file mode 100755 index 0000000000..fd88e3106a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/06.t @@ -0,0 +1,50 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/06.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the file pointed at by the 'from' argument has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..84" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 lchflags ${n0} ${flag} + expect ${flag} lstat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 lchflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/07.t new file mode 100755 index 0000000000..642e0728f6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/07.t @@ -0,0 +1,95 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/07.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the parent directory of the file pointed at by the 'from' argument has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..106" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkfifo ${n0}/${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 symlink ${n2} ${n0}/${n1} +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkfifo ${n0}/${n1} 0644 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 symlink ${n2} ${n0}/${n1} +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/08.t new file mode 100755 index 0000000000..70227f1114 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/08.t @@ -0,0 +1,95 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/08.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the parent directory of the file pointed at by the 'to' argument has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..126" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 create ${n1} 0644 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/09.t new file mode 100755 index 0000000000..2586719fb9 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/09.t @@ -0,0 +1,94 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/09.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES or EPERM if the directory containing 'from' is marked sticky, and neither the containing directory nor 'from' are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..56" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n4} 0755 +cdir=`pwd` +cd ${n4} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +expect 0 mkdir ${n1} 0755 + +# User owns both: the sticky directory and the file to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the file to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the file to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the file to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +# User owns both: the sticky directory and the fifo to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the fifo to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the fifo to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the fifo to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +# User owns both: the sticky directory and the symlink to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the symlink to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the symlink to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the symlink to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n4} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/10.t new file mode 100755 index 0000000000..3441f2e910 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/10.t @@ -0,0 +1,243 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/10.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES or EPERM if the file pointed at by the 'to' argument exists, the directory containing 'to' is marked sticky, and neither the containing directory nor 'to' are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..188" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n4} 0755 +cdir=`pwd` +cd ${n4} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 + +expect 0 mkdir ${n1} 0755 +expect 0 chmod ${n1} 01777 + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 create ${n1}/${n3} 0644 +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65533 -g 65533 mkdir ${n1}/${n3} 0755 +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 rmdir ${n0}/${n2} +expect 0 rmdir ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 mkfifo ${n1}/${n3} 0644 +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect 0 -u 65533 -g 65533 symlink test ${n1}/${n3} +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n4} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/11.t new file mode 100755 index 0000000000..53e15538d4 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/11.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/11.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ELOOP if too many symbolic links were encountered in translating one of the pathnames" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP rename ${n0}/test ${n2} +expect ELOOP rename ${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ELOOP rename ${n2} ${n0}/test +expect ELOOP rename ${n2} ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect 0 unlink ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/12.t new file mode 100755 index 0000000000..c5b03a3d35 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/12.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOTDIR if a component of either path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR rename ${n0}/${n1}/test ${n0}/${n2} +expect 0 create ${n0}/${n2} 0644 +expect ENOTDIR link ${n0}/${n2} ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/13.t new file mode 100755 index 0000000000..984351bff8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/13.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/13.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOTDIR when the 'from' argument is a directory, but 'to' is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect regular lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect fifo lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 symlink test ${n1} +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect symlink lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/14.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/14.t new file mode 100755 index 0000000000..0b708c2332 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/14.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/14.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EISDIR when the 'to' argument is a directory, but 'from' is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect regular lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect fifo lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 symlink test ${n1} +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect symlink lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/15.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/15.t new file mode 100755 index 0000000000..64a75ccb11 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/15.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/15.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EXDEV if the link named by 'to' and the file named by 'from' are on different file systems" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..14" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + + expect 0 create ${n0}/${n1} 0644 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + expect 0 mkdir ${n0}/${n1} 0755 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 rmdir ${n0}/${n1} + + expect 0 mkfifo ${n0}/${n1} 0644 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + expect 0 symlink test ${n0}/${n1} + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/16.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/16.t new file mode 100755 index 0000000000..ba2a9271e0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/16.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/16.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EROFS if the requested link requires writing in a directory on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..8" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + mount -ur /dev/md${n} + + expect EROFS rename ${n0}/${n1} ${n0}/${n2} + expect EROFS rename ${n0}/${n1} ${n2} + expect 0 create ${n2} 0644 + expect EROFS rename ${n2} ${n0}/${n2} + expect 0 unlink ${n2} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/17.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/17.t new file mode 100755 index 0000000000..c949b9641f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/17.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/17.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EFAULT rename ${n0} NULL +expect EFAULT rename ${n0} DEADCODE +expect 0 unlink ${n0} +expect EFAULT rename NULL ${n0} +expect EFAULT rename DEADCODE ${n0} +expect EFAULT rename NULL DEADCODE +expect EFAULT rename DEADCODE NULL diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/18.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/18.t new file mode 100755 index 0000000000..d3fb3a4c86 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/18.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/18.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EINVAL when the 'from' argument is a parent directory of 'to'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 + +expect EINVAL rename ${n0} ${n0}/${n1} +expect EINVAL rename ${n0} ${n0}/${n1}/${n2} + +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/19.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/19.t new file mode 100755 index 0000000000..82e3864ec5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/19.t @@ -0,0 +1,30 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/19.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EINVAL when an attempt is made to rename '.' or '..'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 + +case "${os}" in +Linux) + expect EBUSY rename ${n0}/${n1}/. ${n2} + expect EBUSY rename ${n0}/${n1}/.. ${n2} + ;; +*) + expect EINVAL rename ${n0}/${n1}/. ${n2} + expect EINVAL rename ${n0}/${n1}/.. ${n2} + ;; +esac + +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/20.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/20.t new file mode 100755 index 0000000000..82ea13a290 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rename/20.t @@ -0,0 +1,35 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/20.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EEXIST or ENOTEMPTY if the 'to' argument is a directory and is not empty" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..16" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n1} 0755 + +expect 0 create ${n1}/${n2} 0644 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 mkdir ${n1}/${n2} 0755 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 rmdir ${n1}/${n2} + +expect 0 mkfifo ${n1}/${n2} 0644 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 symlink test ${n1}/${n2} +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/00.t new file mode 100755 index 0000000000..8e49f035b3 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/00.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/00.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir removes directories" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect dir lstat ${n0} type +expect 0 rmdir ${n0} +expect ENOENT lstat ${n0} type + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rmdir ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/01.t new file mode 100755 index 0000000000..d7b8345b58 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/01.t @@ -0,0 +1,30 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/01.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENOTDIR if a component of the path is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR rmdir ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/02.t new file mode 100755 index 0000000000..a37a7a46c5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/02.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 mkdir ${name255} 0755 +expect 0 rmdir ${name255} +expect ENOENT rmdir ${name255} +expect ENAMETOOLONG rmdir ${name256} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/03.t new file mode 100755 index 0000000000..fbbf241374 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/03.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkdir ${path1023} 0755 +expect 0 rmdir ${path1023} +expect ENOENT rmdir ${path1023} +create_too_long +expect ENAMETOOLONG rmdir ${too_long} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/04.t new file mode 100755 index 0000000000..1984c0a1a6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/04.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENOENT if the named directory does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 rmdir ${n0} +expect ENOENT rmdir ${n0} +expect ENOENT rmdir ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/05.t new file mode 100755 index 0000000000..f4a39d52ec --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/05.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/05.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP rmdir ${n0}/test +expect ELOOP rmdir ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/06.t new file mode 100755 index 0000000000..e552f95bdd --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/06.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/06.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EEXIST or ENOTEMPTY the named directory contains files other than '.' and '..' in it" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..20" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 symlink test ${n0}/${n1} +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 mkfifo ${n0}/${n1} 0644 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/07.t new file mode 100755 index 0000000000..78af4755fe --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/07.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/07.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/08.t new file mode 100755 index 0000000000..a8994d0eea --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/08.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/08.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES when write permission is denied on the directory containing the link to be removed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/09.t new file mode 100755 index 0000000000..0471f67077 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/09.t @@ -0,0 +1,49 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/09.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EPERM if the named file has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_NOUNLINK +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_NOUNLINK +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_APPEND +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_APPEND +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/10.t new file mode 100755 index 0000000000..9d2ae7a86e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/10.t @@ -0,0 +1,52 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/10.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EPERM if the parent directory of the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_APPEND +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_APPEND +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/11.t new file mode 100755 index 0000000000..2ed725769c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/11.t @@ -0,0 +1,40 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/11.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES or EPERM if the directory containing the directory to be removed is marked sticky, and neither the containing directory nor the directory to be removed are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +# User owns both: the sticky directory and the directory to be removed. +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n0}/${n1} +# User owns the directory to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 mkdir ${n0}/${n1} 0755 +expect 0 -u 65533 -g 65533 rmdir ${n0}/${n1} +# User owns the sticky directory, but doesn't own the directory to be removed. +expect 0 -u 65533 -g 65533 mkdir ${n0}/${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n0}/${n1} +# User doesn't own the sticky directory nor the directory to be removed. +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n1} 0755 +expect "EACCES|EPERM" -u 65533 -g 65533 rmdir ${n0}/${n1} +expect 0 rmdir ${n0}/${n1} + +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/12.t new file mode 100755 index 0000000000..55e8829c49 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/12.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/12.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EINVAL if the last component of the path is '.' or '..'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +expect EINVAL rmdir ${n0}/${n1}/. +case "${os}" in +FreeBSD) + expect EINVAL rmdir ${n0}/${n1}/.. + ;; +Linux) + expect 'ENOTEMPTY|EEXIST' rmdir ${n0}/${n1}/.. + ;; +*) + expect EEXIST rmdir ${n0}/${n1}/.. + ;; +esac +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/13.t new file mode 100755 index 0000000000..8f9d04cb4e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/13.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/13.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EBUSY if the directory to be removed is the mount point for a mounted file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..3" + + n0=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect EBUSY rmdir ${n0} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/14.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/14.t new file mode 100755 index 0000000000..a1e136d8a2 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/14.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/14.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkdir ${n0}/${n1} 0755 + mount -ur /dev/md${n} + expect EROFS rmdir ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 rmdir ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/15.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/15.t new file mode 100755 index 0000000000..5468863309 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/rmdir/15.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/15.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT rmdir NULL +expect EFAULT rmdir DEADCODE diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/00.t new file mode 100755 index 0000000000..26c80a8808 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/00.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/00.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink creates symbolic links" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect regular,0644 lstat ${n0} type,mode +expect 0 symlink ${n0} ${n1} +expect symlink lstat ${n1} type +expect regular,0644 stat ${n1} type,mode +expect 0 unlink ${n0} +expect ENOENT stat ${n1} type,mode +expect 0 unlink ${n1} + +expect 0 mkdir ${n0} 0755 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 symlink test ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/01.t new file mode 100755 index 0000000000..bf9495b94f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/01.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOTDIR if a component of the name2 path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR symlink test ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/02.t new file mode 100755 index 0000000000..2ab046ca54 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/02.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/02.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENAMETOOLONG if a component of the name2 pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..7" + +n0=`namegen` + +expect 0 symlink ${name255} ${n0} +expect 0 unlink ${n0} +expect 0 symlink ${n0} ${name255} +expect 0 unlink ${name255} + +expect ENAMETOOLONG symlink ${n0} ${name256} +expect 0 symlink ${name256} ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/03.t new file mode 100755 index 0000000000..570594b886 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/03.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/03.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` + +expect 0 symlink ${path1023} ${n0} +expect 0 unlink ${n0} +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 symlink ${n0} ${path1023} +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG symlink ${n0} ${too_long} +expect ENAMETOOLONG symlink ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/04.t new file mode 100755 index 0000000000..e6b1d20ae4 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/04.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOENT if a component of the name2 path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT symlink test ${n0}/${n1}/test +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/05.t new file mode 100755 index 0000000000..932eabc5b6 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/05.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/05.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EACCES when a component of the name2 path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 + +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/06.t new file mode 100755 index 0000000000..0a93657ec5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/06.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/06.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EACCES if the parent directory of the file to be created denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 + +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/07.t new file mode 100755 index 0000000000..596df07d39 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/07.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ELOOP if too many symbolic links were encountered in translating the name2 path name" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP symlink test ${n0}/test +expect ELOOP symlink test ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/08.t new file mode 100755 index 0000000000..55ec809c49 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/08.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/08.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EEXIST if the name2 argument already exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..9" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EEXIST symlink test ${n0} +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect EEXIST symlink test ${n0} +expect 0 rmdir ${n0} + +expect 0 symlink test ${n0} +expect EEXIST symlink test ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/09.t new file mode 100755 index 0000000000..6458925bca --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/09.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/09.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EPERM if the parent directory of the file named by name2 has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/10.t new file mode 100755 index 0000000000..c7697d797c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/10.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/10.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EROFS if the file name2 would reside on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + + expect 0 symlink test ${n0}/${n1} + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS symlink test ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 symlink test ${n0}/${n1} + expect 0 unlink ${n0}/${n1} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/11.t new file mode 100755 index 0000000000..bdf177197f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/11.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOSPC if there are no free inodes on the file system on which the symbolic link is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + ln -s test ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC symlink test ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/12.t new file mode 100755 index 0000000000..2893e64c55 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/symlink/12.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/12.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` + +expect EFAULT symlink NULL ${n0} +expect EFAULT symlink DEADCODE ${n0} +expect EFAULT symlink test NULL +expect EFAULT symlink test DEADCODE +expect EFAULT symlink NULL DEADCODE +expect EFAULT symlink DEADCODE NULL diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/00.t new file mode 100755 index 0000000000..ad43b5353f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/00.t @@ -0,0 +1,51 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/00.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate descrease/increase file size" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..21" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +expect 0 create ${n0} 0644 +expect 0 truncate ${n0} 1234567 +expect 1234567 lstat ${n0} size +expect 0 truncate ${n0} 567 +expect 567 lstat ${n0} size +expect 0 unlink ${n0} + +dd if=/dev/random of=${n0} bs=12345 count=1 >/dev/null 2>&1 +expect 0 truncate ${n0} 23456 +expect 23456 lstat ${n0} size +expect 0 truncate ${n0} 1 +expect 1 lstat ${n0} size +expect 0 unlink ${n0} + +# successful truncate(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 truncate ${n0} 123 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +# unsuccessful truncate(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 truncate ${n0} 123 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/01.t new file mode 100755 index 0000000000..7e477d1ab8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/01.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR truncate ${n0}/${n1}/test 123 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/02.t new file mode 100755 index 0000000000..b104ec63c7 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/02.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 truncate ${name255} 123 +expect 123 stat ${name255} size +expect 0 unlink ${name255} +expect ENAMETOOLONG truncate ${name256} 123 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/03.t new file mode 100755 index 0000000000..0cad07fe37 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/03.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 truncate ${path1023} 123 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG truncate ${too_long} 123 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/04.t new file mode 100755 index 0000000000..44891ed28a --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/04.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT truncate ${n0}/${n1}/test 123 +expect ENOENT truncate ${n0}/${n1} 123 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/05.t new file mode 100755 index 0000000000..fe5a7d5428 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/05.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/05.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 truncate ${n1}/${n2} 123 +expect 123 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 truncate ${n1}/${n2} 1234 +expect 0 chmod ${n1} 0755 +expect 123 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 -u 65534 -g 65534 truncate ${n1}/${n2} 1234 +expect 1234 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/06.t new file mode 100755 index 0000000000..66f73ac9b0 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/06.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/06.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EACCES if the named file is not writable by the user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 create ${n1} 0644 +expect EACCES -u 65534 -g 65534 truncate ${n1} 123 +expect 0 chown ${n1} 65534 65534 +expect 0 chmod ${n1} 0444 +expect EACCES -u 65534 -g 65534 truncate ${n1} 123 +expect 0 unlink ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/07.t new file mode 100755 index 0000000000..1954d83324 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/07.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP truncate ${n0}/test 123 +expect ELOOP truncate ${n1}/test 123 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/08.t new file mode 100755 index 0000000000..6adfb69c40 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/08.t @@ -0,0 +1,59 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/08.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..40" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 truncate ${n0} 123 +expect 123 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 truncate ${n0} 123 +expect 123 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/09.t new file mode 100755 index 0000000000..735cfe5448 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/09.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/09.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EISDIR if the named file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EISDIR truncate ${n0} 123 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/10.t new file mode 100755 index 0000000000..436cc10137 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/10.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/10.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 truncate ${n0}/${n1} 123 + expect 123 stat ${n0}/${n1} size + mount -ur /dev/md${n} + expect EROFS truncate ${n0}/${n1} 1234 + expect 123 stat ${n0}/${n1} size + mount -uw /dev/md${n} + expect 0 truncate ${n0}/${n1} 1234 + expect 1234 stat ${n0}/${n1} size + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/11.t new file mode 100755 index 0000000000..418b8f5678 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/11.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/11.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ETXTBSY the file is a pure procedure (shared text) file that is being executed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..2" + + n0=`namegen` + + cp -pf `which sleep` ${n0} + ./${n0} 3 & + expect ETXTBSY truncate ${n0} 123 + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/12.t new file mode 100755 index 0000000000..4091fdc84c --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/12.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/12.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EFBIG or EINVAL if the length argument was greater than the maximum file size" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 create ${n0} 0644 +r=`${fstest} truncate ${n0} 999999999999999 2>/dev/null` +case "${r}" in +EFBIG|EINVAL) + expect 0 stat ${n0} size + ;; +0) + expect 999999999999999 stat ${n0} size + ;; +*) + echo "not ok ${ntest}" + ntest=`expr ${ntest} + 1` + ;; +esac +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/13.t new file mode 100755 index 0000000000..ac0523c937 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/13.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/13.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EINVAL if the length argument was less than 0" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EINVAL -- truncate ${n0} -1 +expect EINVAL -- truncate ${n0} -999999 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/14.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/14.t new file mode 100755 index 0000000000..67d7b4cf0f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/truncate/14.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/14.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT truncate NULL 123 +expect EFAULT truncate DEADCODE 123 diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/00.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/00.t new file mode 100755 index 0000000000..e0e8b618db --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/00.t @@ -0,0 +1,115 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/00.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink removes regular files, symbolic links, fifos and sockets" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..55" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect regular lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +expect 0 symlink ${n1} ${n0} +expect symlink lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +expect 0 mkfifo ${n0} 0644 +expect fifo lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +# TODO: sockets removal + +# successful unlink(2) updates ctime. +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0 link ${n0} ${n1} +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +# unsuccessful unlink(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 unlink ${n0} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 unlink ${n0} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 mkfifo ${n0}/${n1} 0644 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 symlink test ${n0}/${n1} +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/01.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/01.t new file mode 100755 index 0000000000..41ca70edab --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/01.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR unlink ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/02.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/02.t new file mode 100755 index 0000000000..af9a386473 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/02.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 create ${name255} 0644 +expect 0 unlink ${name255} +expect ENOENT unlink ${name255} +expect ENAMETOOLONG unlink ${name256} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/03.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/03.t new file mode 100755 index 0000000000..646e26ba88 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/03.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 unlink ${path1023} +expect ENOENT unlink ${path1023} +create_too_long +expect ENAMETOOLONG unlink ${too_long} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/04.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/04.t new file mode 100755 index 0000000000..d6746d3089 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/04.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect 0 unlink ${n0} +expect ENOENT unlink ${n0} +expect ENOENT unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/05.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/05.t new file mode 100755 index 0000000000..7593e7f9a4 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/05.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/05.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/06.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/06.t new file mode 100755 index 0000000000..e063c6a57e --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/06.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/06.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES when write permission is denied on the directory containing the link to be removed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/07.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/07.t new file mode 100755 index 0000000000..48dfd4a975 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/07.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP unlink ${n0}/test +expect ELOOP unlink ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/08.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/08.t new file mode 100755 index 0000000000..54bcf1aa0f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/08.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/08.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the named file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +case "${os}:${fs}" in +SunOS:UFS) + expect 0 unlink ${n0} + expect ENOENT rmdir ${n0} + ;; +Linux:*) + # Non-POSIX value returned by Linux since 2.1.132 + expect EISDIR unlink ${n0} + expect 0 rmdir ${n0} + ;; +*) + expect EPERM unlink ${n0} + expect 0 rmdir ${n0} + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/09.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/09.t new file mode 100755 index 0000000000..245987d086 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/09.t @@ -0,0 +1,49 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/09.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the named file has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/10.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/10.t new file mode 100755 index 0000000000..ab1ee1f2a2 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/10.t @@ -0,0 +1,52 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/10.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the parent directory of the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/11.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/11.t new file mode 100755 index 0000000000..bc7fa368dc --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/11.t @@ -0,0 +1,68 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/11.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES or EPERM if the directory containing the file is marked sticky, and neither the containing directory nor the file to be removed are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..33" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +# User owns both: the sticky directory and the file to be removed. +expect 0 -u 65534 -g 65534 create ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the file to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 create ${n0}/${n1} 0644 +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the file to be removed. +expect 0 -u 65533 -g 65533 create ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the file to be removed. +expect 0 -u 65534 -g 65534 create ${n0}/${n1} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +# User owns both: the sticky directory and the fifo to be removed. +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the fifo to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the fifo to be removed. +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the fifo to be removed. +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n1} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +# User owns both: the sticky directory and the symlink to be removed. +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n1} +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the symlink to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n1} +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the symlink to be removed. +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n1} +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the symlink to be removed. +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n1} +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/12.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/12.t new file mode 100755 index 0000000000..eebef25cd1 --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/12.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/12.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + mount -ur /dev/md${n} + expect EROFS unlink ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/13.t b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/13.t new file mode 100755 index 0000000000..984094110f --- /dev/null +++ b/splitfs_syscall_intercept/tests/pjd-fstest-20080816/tests/unlink/13.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/13.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT unlink NULL +expect EFAULT unlink DEADCODE diff --git a/splitfs_syscall_intercept/tests/rw_experiment.c b/splitfs_syscall_intercept/tests/rw_experiment.c new file mode 100644 index 0000000000..0e1f89fff8 --- /dev/null +++ b/splitfs_syscall_intercept/tests/rw_experiment.c @@ -0,0 +1,176 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FSIZE (2ULL*1024*1024*1024) +#define IOSIZE (512*1024*1024) +#define BLKSIZE (4*1024) +#define CLSIZE (64) + +char *addr; +struct timeval start,end; +int precomputed_rand[FSIZE/CLSIZE]; + + +void precompute_rand(unsigned long datasize) { + + int i = 0; + int num_blocks = IOSIZE / datasize; + + for (i = 0; i < num_blocks; i++) + precomputed_rand[i] = rand() % (IOSIZE - datasize); +} + + +void performExperiment(int operation, uint32_t datasize, int seq, char *buf, int fd) { + + uint32_t num_blks; + unsigned long long offset = 0; + unsigned int r = 0; + int write_size = 0; + int i = 0, j = 0; + int num_clines = 0; + + num_blks = IOSIZE / datasize; + + printf("%s: data size = %u, num_blocks = %d\n", __func__, datasize, num_blks); + + + gettimeofday(&start, NULL); + + r = 0; + offset = 0; + i = 0; + + if(operation == 0) { + for(i = 0; i < num_blks; i++) + { + if(pread64(fd, buf, datasize, offset) != datasize) { + perror("read failed\n"); + printf("%s: offset = %llu\n", __func__, offset); + exit(-1); + } + offset += datasize; + r = precomputed_rand[i]; + + if(seq == 0) + offset = r; + } + } else if(operation == 1) { + for(i = 0; i < num_blks; i++) + { + if(write_size = (pwrite64(fd, buf, datasize, offset)) != datasize) { + perror("write failed\n"); + printf("%s: Returned value = %d. Offset = %llu\n", __func__, write_size, offset); + exit(-1); + } + + offset += datasize; + r = precomputed_rand[i]; + + if(seq == 0) + offset = r; + } + + fsync(fd); + } + + gettimeofday(&end, NULL); +} + +void parseArgs(char *argv[], int *operation, int *seq, uint32_t *datasize) { + + char datasizestr[100]; + char size_granularity; + + if ((strcmp(argv[1], "write") == 0)) { + *operation = 1; + } + + else if ((strcmp(argv[1], "read") == 0)) { + *operation = 0; + } + + if ((strcmp(argv[2], "seq") == 0)) { + *seq = 1; + } + + else if ((strcmp(argv[2], "rand") == 0)) { + *seq = 0; + } + + strcpy(datasizestr, argv[3]); + + *datasize = atoi(datasizestr); + + printf("The arguments passed are: operation = %d, seq = %d, rw_size = %u\n", *operation, *seq, *datasize); + +} + +/* Example usage: ./a.out read seq 4096 */ + +int main(int argc, char *argv[]) { + + int fd; + time_t curtime; + unsigned int i,t; + char *buf; + int seq; + uint32_t datasize; + int operation = 2; + + if(argc < 4) { + perror("Usage: ./a.out "); + exit(-1); + } + + parseArgs(argv, &operation, &seq, &datasize); + + fd = open("/mnt/pmem_emul/test.txt", O_RDWR | O_CREAT, 0666); + if(fd < 0) { + perror("file not opened!\n"); + exit(-1); + } + + buf = (char *)malloc(sizeof(char)*datasize); + + printf("################ STARTING HERE ##################\n"); + + srand(5); + precompute_rand(datasize); + + for(i = 0; i < sizeof(buf); i++) + buf[i] = 'R'; + + performExperiment(operation, datasize, seq, buf, fd); + + //pause(); + + t =(end.tv_sec-start.tv_sec)*1000000 + (end.tv_usec-start.tv_usec); + + + printf("\nTime for %dMB ops = %u\n", IOSIZE/(1024*1024), t); + + close(fd); + + return 0; +} diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_dup2.c b/splitfs_syscall_intercept/tests/unit_tests/test_dup2.c new file mode 100644 index 0000000000..aea2151e74 --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_dup2.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +#define ORIG_FILE "/mnt/pmem_emul/dup_orig" +#define REPLACE_FILE "/mnt/pmem_emul/dup_replace" + +int main() { + int fd, fd2, ret; + + // Create a file + fd = open(ORIG_FILE, O_CREAT | O_EXCL, 0644); + assert(fd >= 0); + + // Create another file + fd2 = open(REPLACE_FILE, O_CREAT | O_EXCL, 0644); + assert(fd2 >= 0); + + // Dup the first file into the file descriptor of the second file. + ret = dup2(fd, fd2); + assert(ret == fd2); + + // Cleanup + ret = close(fd); + assert(ret == 0); + + ret = close(fd2); + assert(ret == 0); + + ret = unlink(ORIG_FILE); + assert(ret == 0); + + ret = unlink(REPLACE_FILE); + assert(ret == 0); + + return 0; +} diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_execv_new_process.c b/splitfs_syscall_intercept/tests/unit_tests/test_execv_new_process.c new file mode 100644 index 0000000000..9c27f7bbf5 --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_execv_new_process.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/execv" + +void cleanup() { + int ret; + + ret = unlink(FILE_PATH); + assert(ret==0); +} + +int main(int argc, char **argv) { + int ret, fd; + char buf[256]; + assert(argc>=1); + + fd = atoi(argv[0]); + + ret = read(fd, buf, 5); + assert(ret == 5); + buf[ret] = '\0'; + + ret = strncmp(buf, "hello", 5); + assert(ret==0); + + printf("The string read in the new process is: %s\n", buf); + + cleanup(); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_execv_old_process.c b/splitfs_syscall_intercept/tests/unit_tests/test_execv_old_process.c new file mode 100644 index 0000000000..dac24792ab --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_execv_old_process.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/execv" +#define NEW_PROCESS_PATH "execv_new" + +int main() { + int fd, ret; + char fd_string[10]; + char *argv[] = {"", NULL}; + + fd = open(FILE_PATH, O_RDWR | O_CREAT | O_EXCL, 0666); + assert(fd>=0); + + ret = write(fd, "xxhello", 7); + assert(ret==7); + + ret = lseek(fd, 2, SEEK_SET); + assert(ret==2); + + ret = sprintf(fd_string, "%d", fd); + fd_string[ret] = '\0'; + + argv[0] = fd_string; + + ret = execv(NEW_PROCESS_PATH, argv); + assert(ret!=-1); +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_open.c b/splitfs_syscall_intercept/tests/unit_tests/test_open.c new file mode 100644 index 0000000000..eb81716f42 --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_open.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/test_open" + +int main() { + int fd, ret; + char fd_string[10]; + char *argv[] = {"", NULL}; + + fd = open(FILE_PATH, O_CREAT | O_EXCL, 0666); + assert(fd>=0); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_opendir.c b/splitfs_syscall_intercept/tests/unit_tests/test_opendir.c new file mode 100644 index 0000000000..49b6430785 --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_opendir.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +int main() { + DIR *dir; + + dir = opendir("/home/om/wspace/splitfs-new/tests/pjd-fstest-20080816/tests/chflags"); + assert(dir != NULL); +} diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_redirect.c b/splitfs_syscall_intercept/tests/unit_tests/test_redirect.c new file mode 100644 index 0000000000..a1483f3e7a --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_redirect.c @@ -0,0 +1,53 @@ +/** + * Context: This was developed to reproduce a bug in pjd tests that echoed something and redirected to a file. + * A simpler version of the problem is: bash -c "echo text > file" + * This program further simplifies the above command to debug the crux of the problem. + * + * + * In this test we try to replicate the dup calls w.r.t the following command: bash -c "echo text > file" + * It includes the following e.g dup calls: + * (i) fcntl(1, F_DUPFD, 10) + * (ii) dup2(3, 1) + * (iii) dup2(10, 1) +*/ + +#include +#include +#include +#include +#include +#include + +#define ORIG_FILE "/mnt/pmem_emul/redirect" + +int main() { + int fd, backup, ret; + + // Create a file + fd = open(ORIG_FILE, O_RDWR | O_CREAT | O_EXCL, 0666); + assert(fd >= 0); + + // Backup stdout + backup = dup2(1, 10); + assert(backup == 10); + + // Dup the redirect file into stdout + ret = dup2(fd, 1); + assert(ret == 1); + + // Close the original redirect fd + close(fd); + + // Write something onto stdout (which is now pointing to redirect) + ret = write(1, "hello\n", 6); + assert(ret == 6); + + // Restore stdout from backup + ret = dup2(backup, 1); + assert(ret == 1); + + ret = close(backup); + assert(ret == 0); + + return 0; +} diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_symlink.c b/splitfs_syscall_intercept/tests/unit_tests/test_symlink.c new file mode 100644 index 0000000000..e756aedf11 --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_symlink.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +#define TARGET_FILE_PATH "/mnt/pmem_emul/target" +#define SYM_FILE_PATH "/mnt/pmem_emul/sym" + +int main() { + int fd, ret; + char buf[256]; + + // Create the target file + fd = open(TARGET_FILE_PATH, O_CREAT | O_RDWR, 0666); + assert(fd >= 0); + + // Write something into the file + ret = write(fd, "hello\n", 6); + assert(ret == 6); + + // Close the file + ret = close(fd); + assert(ret == 0); + + // Create a symlink + ret = symlink(TARGET_FILE_PATH, SYM_FILE_PATH); + assert(ret == 0); + + // Delete the actual file first + ret = unlink(TARGET_FILE_PATH); + assert(ret == 0); + + // Delete the symlink next + ret = unlink(SYM_FILE_PATH); + assert(ret == 0); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/tests/unit_tests/test_write.c b/splitfs_syscall_intercept/tests/unit_tests/test_write.c new file mode 100644 index 0000000000..3024a452bc --- /dev/null +++ b/splitfs_syscall_intercept/tests/unit_tests/test_write.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/test_write" + +int main() { + int fd, ret; + char writeBuf[] = "Hello World!\n"; + + fd = open(FILE_PATH, O_RDWR | O_CREAT, 0644); + assert(fd>=0); + + ret = write(fd, writeBuf, strlen(writeBuf)); + assert(ret == strlen(writeBuf)); + + // Cleanup + ret = unlink(FILE_PATH); + assert(ret == 0); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/CMakeLists.txt b/splitfs_syscall_intercept/utils/CMakeLists.txt new file mode 100644 index 0000000000..dc78c3365c --- /dev/null +++ b/splitfs_syscall_intercept/utils/CMakeLists.txt @@ -0,0 +1,376 @@ +cmake_minimum_required(VERSION 3.3) +project(splitfs C CXX) + +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) + +set(VERSION_MAJOR 0) +set(VERSION_MINOR 0) +set(VERSION_PATCH 0) +set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) + +include(FindThreads) +include(CMakeDependentOption) + +# XXX rename libpmemfile, since the whole repo is also just +# called pmemfile! +option(BUILD_LIBSPLITFS + "build libsplitfs (requires libsyscall_intercept)" ON) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "RelWithDebInfo") +endif (NOT CMAKE_BUILD_TYPE) + +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + execute_process(COMMAND git describe + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET) + if(NOT SRCVERSION) + execute_process(COMMAND git log -1 --format=%h + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() +else() + execute_process(COMMAND cat .version + OUTPUT_VARIABLE SRCVERSION + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() + +if(WIN32) + message(FATAL_ERROR "Windows is not supported") +endif() + +include(FindPerl) +if(NOT PERL_FOUND) + message(FATAL_ERROR "Perl not found") +endif() +if (PERL_VERSION_STRING VERSION_LESS 5.16) + message(FATAL_ERROR "Too old Perl (<5.16)") +endif() + +add_definitions(-DSRCVERSION="${SRCVERSION}") +add_definitions(-DPMEMFILE_MAJOR_VERSION=${VERSION_MAJOR}) +add_definitions(-DPMEMFILE_MINOR_VERSION=${VERSION_MINOR}) +if(NOT WIN32) + add_definitions(-DUSE_VALGRIND) +endif() + +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) +include(GNUInstallDirs) +find_package(PkgConfig QUIET) + +include_directories(include) + +set(CMAKE_C_STANDARD 99) +set(CMAKE_CXX_STANDARD 11) + +function(join SEP OUT VALUES) + string(REPLACE ";" "${SEP}" JOIN_TMP "${VALUES}") + set(${OUT} "${JOIN_TMP}" PARENT_SCOPE) +endfunction() + +# Checks whether flag is supported by current C compiler and appends +# it to the relevant cmake variable. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_c_flag flag) + string(REPLACE - _ flag2 ${flag}) + string(REPLACE " " _ flag2 ${flag2}) + string(REPLACE = "_" flag2 ${flag2}) + set(check_name "C_HAS_${flag2}") + + check_c_compiler_flag("${flag}" "${check_name}") + + if (${${check_name}}) + if (${ARGC} EQUAL 1) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") + else() + set(CMAKE_C_FLAGS_${ARGV1} "${CMAKE_C_FLAGS_${ARGV1}} ${flag}") + endif() + endif() +endmacro() + +# Checks whether flag is supported by current C++ compiler and appends +# it to the relevant cmake variable. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_cxx_flag flag) + string(REPLACE - _ flag2 ${flag}) + string(REPLACE " " _ flag2 ${flag2}) + string(REPLACE = "_" flag2 ${flag2}) + set(check_name "CXX_HAS_${flag2}") + + check_cxx_compiler_flag(${flag} ${check_name}) + + if (${${check_name}}) + if (${ARGC} EQUAL 1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") + else() + set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${flag}") + endif() + endif() +endmacro() + +# Checks whether flag is supported by current C & C++ compilers and appends +# it to the relevant cmake variables. +# 1st argument is a flag +# 2nd (optional) argument is a build type (debug, release, relwithdebinfo) +macro(add_flag flag) + add_c_flag(${flag} ${ARGN}) + add_cxx_flag(${flag} ${ARGN}) +endmacro() + +add_flag(-Wall) +add_flag(-Wpointer-arith) +add_flag(-Wunused-macros) +add_flag(-Wsign-conversion) +add_flag(-Wsign-compare) +add_flag(-Wconversion) +add_flag(-Wunreachable-code-return) +add_flag(-Wmissing-variable-declarations) +add_flag(-fno-common) +add_flag(-Ofast) +add_flag(-funroll-loops) +add_flag(-ftree-vectorize) +add_flag(-m64) + +# Conditionally using the -Wno-missing-field-initializers flag. +# +# As of 2017, the following clang erroneously issues a warning for +# the following code: +# +# struct x { int a; int b; int c; }; +# +# struct x variable = {0}; +# +# The warning is meant to warn about fields not being initialized while +# using this syntax in C++, but the clang warns while compiling C as well. +# +# See: https://llvm.org/bugs/show_bug.cgi?id=21689 +# See also: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36750 +if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang") + add_c_flag(-Wno-missing-field-initializers) +endif() + +add_c_flag(-Wmissing-prototypes) + +check_c_compiler_flag(-Wl,-z,relro LINKER_HAS_RELRO) +if(LINKER_HAS_RELRO) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,relro") +endif() + +check_c_compiler_flag(-Wl,--warn-common LINKER_HAS_WARN_COMMON) +if(LINKER_HAS_WARN_COMMON) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--warn-common") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--warn-common") +endif() + +add_flag(-ggdb RELWITHDEBINFO) +add_flag(-ggdb DEBUG) +add_flag(-DDEBUG DEBUG) + +add_flag(-ggdb RELWITHDEBINFO) +add_flag(-fno-omit-frame-pointer RELWITHDEBINFO) + +add_flag("-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2" RELEASE) + +add_flag(-D_LARGEFILE64_SOURCE) + +option(USE_ASAN "enable AddressSanitizer (debugging) (using with +BUILD_LIBSPLITFS=ON is experimental)" OFF) +option(USE_UBSAN "enable UndefinedBehaviorSanitizer (debugging) (using with +BUILD_LIBSPLITFS=ON is experimental)" OFF) +set(ASAN_RUNTIME "" CACHE STRING "(experimental) path to preloadable lib for sanitizers e.g.: /usr/lib/gcc/x86_64-linux-gnu/6/libasan.so") + +macro(add_sanitizer_flag flag) + if(BUILD_LIBSPLITFS) + message(WARNING "Sanitizers might be incompatible with LIBSPLITFS. + Running tests with sanitizers and BUILD_LIBSPLITFS is experimental") + endif() + + set(SAVED_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) + set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES} -fsanitize=${flag}") + + check_c_compiler_flag("-fsanitize=${flag}" C_HAS_ASAN_UBSAN) + if(C_HAS_ASAN_UBSAN) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${flag}") + endif() + + check_cxx_compiler_flag("-fsanitize=${flag}" CXX_HAS_ASAN_UBSAN) + if(CXX_HAS_ASAN_UBSAN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${flag}") + endif() + + if(C_HAS_ASAN_UBSAN OR CXX_HAS_ASAN_UBSAN) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${flag}") + endif() + + set(CMAKE_REQUIRED_LIBRARIES ${SAVED_CMAKE_REQUIRED_LIBRARIES}) +endmacro() + +if(USE_ASAN) + add_sanitizer_flag(address) +endif() +if(USE_UBSAN) + add_sanitizer_flag(undefined) +endif() + +if(DEVELOPER_MODE) + add_flag(-Werror) + + check_c_compiler_flag(-Wl,--fatal-warnings LINKER_HAS_FATAL_WARNINGS) + if(LINKER_HAS_FATAL_WARNINGS) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--fatal-warnings") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--fatal-warnings") + endif() +endif(DEVELOPER_MODE) + +# Generates cstyle-$name target and attaches it as a dependency of global +# "cstyle" target. This target verifies C style of files in current source dir. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_cstyle name) + if(${ARGC} EQUAL 1) + add_custom_target(cstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cstyle + ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.h) + else() + add_custom_target(cstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cstyle ${ARGN}) + endif() + add_dependencies(cstyle cstyle-${name}) +endfunction() + +# Generates cppstyle-$name and cppformat-$name targets and attaches them +# as dependencies of global "cstyle" and "cppformat" targets. +# cppstyle-$name target verifies C++ style of files in current source dir. +# cppformat-$name target reformats files in current source dir. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_cppstyle name) + if(NOT CLANG_FORMAT) + return() + endif() + + if(${ARGC} EQUAL 1) + add_custom_target(cppstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + check + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp + ) + add_custom_target(cppformat-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + format + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp + ) + else() + add_custom_target(cppstyle-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + check + ${ARGN} + ) + add_custom_target(cppformat-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/cppstyle + ${CLANG_FORMAT} + format + ${ARGN} + ) + endif() + + add_dependencies(cppstyle cppstyle-${name}) + add_dependencies(cppformat cppformat-${name}) +endfunction() + +# Generates check-whitespace-$name target and attaches it as a dependency +# of global "check-whitespace" target. This target verifies C files in current +# source dir do not have any whitespace errors. +# If more arguments are used, then they are used as files to be checked +# instead. +# ${name} must be unique. +function(add_check_whitespace name) + if(${ARGC} EQUAL 1) + add_custom_target(check-whitespace-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace + ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.h) + else() + add_custom_target(check-whitespace-${name} + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace ${ARGN}) + endif() + add_dependencies(check-whitespace check-whitespace-${name}) +endfunction() + +add_custom_target(checkers ALL) +add_custom_target(cstyle) +add_custom_target(cppstyle) +add_custom_target(cppformat) +add_custom_target(check-whitespace) + +add_custom_target(check-whitespace-main + COMMAND ${PERL_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/utils/check_whitespace) +add_dependencies(check-whitespace check-whitespace-main) + +add_custom_target(tests) + +option(DEVELOPER_MODE "enable developer checks" OFF) +if(DEVELOPER_MODE) + find_program(CLANG_FORMAT NAMES clang-format-3.9 clang-format-3.8) + if (NOT CLANG_FORMAT) + message(WARNING "clang-format not found - C++ sources will not be checked (needed version: 3.8 or 3.9)") + endif() + + execute_process(COMMAND ${PERL_EXECUTABLE} -MText::Diff -e "" + ERROR_QUIET + RESULT_VARIABLE PERL_TEXT_DIFF_STATUS) + if (PERL_TEXT_DIFF_STATUS) + message(FATAL_ERROR "Text::Diff Perl module not found (install libtext-diff-perl or perl-Text-Diff)") + endif() + + add_dependencies(checkers cstyle) + add_dependencies(checkers cppstyle) + add_dependencies(checkers check-whitespace) +endif(DEVELOPER_MODE) + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" + IMMEDIATE @ONLY) + +add_custom_target(uninstall + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) + +if(PKG_CONFIG_FOUND) + pkg_check_modules(LIBUNWIND QUIET libunwind) +else() + find_package(LIBUNWIND QUIET) +endif() +if(NOT LIBUNWIND_FOUND) + message(WARNING "libunwind not found. Stack traces from tests will not be reliable") +endif() + +if(BUILD_LIBSPLITFS) + add_subdirectory(src) +endif() + diff --git a/splitfs_syscall_intercept/utils/README.md b/splitfs_syscall_intercept/utils/README.md new file mode 100644 index 0000000000..bf530819e3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/README.md @@ -0,0 +1,8 @@ +# SplitFS + +###How to use +1. At the root of the repo create a build directory: `mkdir build && cd build` +2. Do cmake to generate makefile: `cmake ../` # Include -DCMAKE_BUILD_TYPE=Debug if you want to enable logging. +3. Run make: `make` +4. You should see the .so file at `build/src/libsplitfs.so` +5. Run application using: `LD_PRELOAD=/build/src/libsplitfs.so ` diff --git a/splitfs_syscall_intercept/utils/build/CMakeCache.txt b/splitfs_syscall_intercept/utils/build/CMakeCache.txt new file mode 100644 index 0000000000..8fed23aff2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeCache.txt @@ -0,0 +1,600 @@ +# This is the CMakeCache file. +# For build in directory: /home/om/wspace/splitfs-new/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//(experimental) path to preloadable lib for sanitizers e.g.: /usr/lib/gcc/x86_64-linux-gnu/6/libasan.so +ASAN_RUNTIME:STRING= + +//build libsplitfs (requires libsyscall_intercept) +BUILD_LIBSPLITFS:BOOL=ON + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING=Debug + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//user executables (bin) +CMAKE_INSTALL_BINDIR:PATH=bin + +//read-only architecture-independent data (DATAROOTDIR) +CMAKE_INSTALL_DATADIR:PATH= + +//read-only architecture-independent data root (share) +CMAKE_INSTALL_DATAROOTDIR:PATH=share + +//documentation root (DATAROOTDIR/doc/PROJECT_NAME) +CMAKE_INSTALL_DOCDIR:PATH= + +//C header files (include) +CMAKE_INSTALL_INCLUDEDIR:PATH=include + +//info documentation (DATAROOTDIR/info) +CMAKE_INSTALL_INFODIR:PATH= + +//object code libraries (lib) +CMAKE_INSTALL_LIBDIR:PATH=lib + +//program executables (libexec) +CMAKE_INSTALL_LIBEXECDIR:PATH=libexec + +//locale-dependent data (DATAROOTDIR/locale) +CMAKE_INSTALL_LOCALEDIR:PATH= + +//modifiable single-machine data (var) +CMAKE_INSTALL_LOCALSTATEDIR:PATH=var + +//man documentation (DATAROOTDIR/man) +CMAKE_INSTALL_MANDIR:PATH= + +//C header files for non-gcc (/usr/include) +CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//system admin executables (sbin) +CMAKE_INSTALL_SBINDIR:PATH=sbin + +//modifiable architecture-independent data (com) +CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com + +//read-only single-machine data (etc) +CMAKE_INSTALL_SYSCONFDIR:PATH=etc + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=splitfs + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//enable developer checks +DEVELOPER_MODE:BOOL=OFF + +//Path to a program. +PERL_EXECUTABLE:FILEPATH=/usr/bin/perl + +//pkg-config executable +PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/bin/pkg-config + +//enable AddressSanitizer (debugging) (using with +//\nBUILD_LIBSPLITFS=ON is experimental) +USE_ASAN:BOOL=OFF + +//enable UndefinedBehaviorSanitizer (debugging) (using with +//\nBUILD_LIBSPLITFS=ON is experimental) +USE_UBSAN:BOOL=OFF + +//Value Computed by CMake +splitfs_BINARY_DIR:STATIC=/home/om/wspace/splitfs-new/build + +//Value Computed by CMake +splitfs_SOURCE_DIR:STATIC=/home/om/wspace/splitfs-new + +//Dependencies for the target +splitfs_shared_LIB_DEPENDS:STATIC=general;syscall_intercept;general;cap;general;-lpthread;general;dl;general;rt;general;-Wl,--version-script=/home/om/wspace/splitfs-new/src/libsplitfs.map; + +//Dependencies for target +splitfs_static_unscoped_LIB_DEPENDS:STATIC= + + +######################## +# INTERNAL cache entries +######################## + +CAP_CFLAGS:INTERNAL= +CAP_CFLAGS_I:INTERNAL= +CAP_CFLAGS_OTHER:INTERNAL= +CAP_FOUND:INTERNAL=1 +CAP_INCLUDEDIR:INTERNAL=/usr/include +CAP_INCLUDE_DIRS:INTERNAL= +CAP_LDFLAGS:INTERNAL=-L/lib64;-lcap +CAP_LDFLAGS_OTHER:INTERNAL= +CAP_LIBDIR:INTERNAL=/lib64 +CAP_LIBRARIES:INTERNAL=cap +CAP_LIBRARY_DIRS:INTERNAL=/lib64 +CAP_LIBS:INTERNAL= +CAP_LIBS_L:INTERNAL= +CAP_LIBS_OTHER:INTERNAL= +CAP_LIBS_PATHS:INTERNAL= +CAP_PREFIX:INTERNAL=/usr +CAP_STATIC_CFLAGS:INTERNAL= +CAP_STATIC_CFLAGS_I:INTERNAL= +CAP_STATIC_CFLAGS_OTHER:INTERNAL= +CAP_STATIC_INCLUDE_DIRS:INTERNAL= +CAP_STATIC_LDFLAGS:INTERNAL=-L/lib64;-lcap;-lattr +CAP_STATIC_LDFLAGS_OTHER:INTERNAL= +CAP_STATIC_LIBDIR:INTERNAL= +CAP_STATIC_LIBRARIES:INTERNAL=cap;attr +CAP_STATIC_LIBRARY_DIRS:INTERNAL=/lib64 +CAP_STATIC_LIBS:INTERNAL= +CAP_STATIC_LIBS_L:INTERNAL= +CAP_STATIC_LIBS_OTHER:INTERNAL= +CAP_STATIC_LIBS_PATHS:INTERNAL= +CAP_VERSION:INTERNAL=2.24 +CAP_libcap_INCLUDEDIR:INTERNAL= +CAP_libcap_LIBDIR:INTERNAL= +CAP_libcap_PREFIX:INTERNAL= +CAP_libcap_VERSION:INTERNAL= +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/om/wspace/splitfs-new/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=5 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Have symbol pthread_create +CMAKE_HAVE_LIBC_CREATE:INTERNAL= +//Have library pthreads +CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= +//Have library pthread +CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 +//Have include pthread.h +CMAKE_HAVE_PTHREAD_H:INTERNAL=1 +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/om/wspace/splitfs-new +//ADVANCED property for variable: CMAKE_INSTALL_BINDIR +CMAKE_INSTALL_BINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATADIR +CMAKE_INSTALL_DATADIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATAROOTDIR +CMAKE_INSTALL_DATAROOTDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DOCDIR +CMAKE_INSTALL_DOCDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INCLUDEDIR +CMAKE_INSTALL_INCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INFODIR +CMAKE_INSTALL_INFODIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBDIR +CMAKE_INSTALL_LIBDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBEXECDIR +CMAKE_INSTALL_LIBEXECDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALEDIR +CMAKE_INSTALL_LOCALEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALSTATEDIR +CMAKE_INSTALL_LOCALSTATEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_MANDIR +CMAKE_INSTALL_MANDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_OLDINCLUDEDIR +CMAKE_INSTALL_OLDINCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SBINDIR +CMAKE_INSTALL_SBINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SHAREDSTATEDIR +CMAKE_INSTALL_SHAREDSTATEDIR-ADVANCED:INTERNAL=1 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SYSCONFDIR +CMAKE_INSTALL_SYSCONFDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=2 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.5 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Test CXX_HAS__DDEBUG +CXX_HAS__DDEBUG:INTERNAL=1 +//Test CXX_HAS__D_LARGEFILE64_SOURCE +CXX_HAS__D_LARGEFILE64_SOURCE:INTERNAL=1 +//Test CXX_HAS__Ofast +CXX_HAS__Ofast:INTERNAL=1 +//Test CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 +CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2:INTERNAL=1 +//Test CXX_HAS__Wall +CXX_HAS__Wall:INTERNAL=1 +//Test CXX_HAS__Wconversion +CXX_HAS__Wconversion:INTERNAL=1 +//Test CXX_HAS__Wmissing_variable_declarations +CXX_HAS__Wmissing_variable_declarations:INTERNAL= +//Test CXX_HAS__Wpointer_arith +CXX_HAS__Wpointer_arith:INTERNAL=1 +//Test CXX_HAS__Wsign_compare +CXX_HAS__Wsign_compare:INTERNAL=1 +//Test CXX_HAS__Wsign_conversion +CXX_HAS__Wsign_conversion:INTERNAL=1 +//Test CXX_HAS__Wunreachable_code_return +CXX_HAS__Wunreachable_code_return:INTERNAL= +//Test CXX_HAS__Wunused_macros +CXX_HAS__Wunused_macros:INTERNAL=1 +//Test CXX_HAS__fno_common +CXX_HAS__fno_common:INTERNAL=1 +//Test CXX_HAS__fno_omit_frame_pointer +CXX_HAS__fno_omit_frame_pointer:INTERNAL=1 +//Test CXX_HAS__ftree_vectorize +CXX_HAS__ftree_vectorize:INTERNAL=1 +//Test CXX_HAS__funroll_loops +CXX_HAS__funroll_loops:INTERNAL=1 +//Test CXX_HAS__ggdb +CXX_HAS__ggdb:INTERNAL=1 +//Test CXX_HAS__m64 +CXX_HAS__m64:INTERNAL=1 +//Test C_HAS__DDEBUG +C_HAS__DDEBUG:INTERNAL=1 +//Test C_HAS__D_LARGEFILE64_SOURCE +C_HAS__D_LARGEFILE64_SOURCE:INTERNAL=1 +//Test C_HAS__Ofast +C_HAS__Ofast:INTERNAL=1 +//Test C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 +C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2:INTERNAL=1 +//Test C_HAS__Wall +C_HAS__Wall:INTERNAL=1 +//Test C_HAS__Wconversion +C_HAS__Wconversion:INTERNAL=1 +//Test C_HAS__Wmissing_prototypes +C_HAS__Wmissing_prototypes:INTERNAL=1 +//Test C_HAS__Wmissing_variable_declarations +C_HAS__Wmissing_variable_declarations:INTERNAL= +//Test C_HAS__Wpointer_arith +C_HAS__Wpointer_arith:INTERNAL=1 +//Test C_HAS__Wsign_compare +C_HAS__Wsign_compare:INTERNAL=1 +//Test C_HAS__Wsign_conversion +C_HAS__Wsign_conversion:INTERNAL=1 +//Test C_HAS__Wunreachable_code_return +C_HAS__Wunreachable_code_return:INTERNAL= +//Test C_HAS__Wunused_macros +C_HAS__Wunused_macros:INTERNAL=1 +//Test C_HAS__fno_common +C_HAS__fno_common:INTERNAL=1 +//Test C_HAS__fno_omit_frame_pointer +C_HAS__fno_omit_frame_pointer:INTERNAL=1 +//Test C_HAS__ftree_vectorize +C_HAS__ftree_vectorize:INTERNAL=1 +//Test C_HAS__funroll_loops +C_HAS__funroll_loops:INTERNAL=1 +//Test C_HAS__ggdb +C_HAS__ggdb:INTERNAL=1 +//Test C_HAS__m64 +C_HAS__m64:INTERNAL=1 +//Details about finding Perl +FIND_PACKAGE_MESSAGE_DETAILS_Perl:INTERNAL=[/usr/bin/perl][v5.22.1()] +//Details about finding Threads +FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] +LIBUNWIND_CFLAGS:INTERNAL= +LIBUNWIND_CFLAGS_I:INTERNAL= +LIBUNWIND_CFLAGS_OTHER:INTERNAL= +LIBUNWIND_FOUND:INTERNAL= +LIBUNWIND_INCLUDEDIR:INTERNAL= +LIBUNWIND_LIBDIR:INTERNAL= +LIBUNWIND_LIBS:INTERNAL= +LIBUNWIND_LIBS_L:INTERNAL= +LIBUNWIND_LIBS_OTHER:INTERNAL= +LIBUNWIND_LIBS_PATHS:INTERNAL= +LIBUNWIND_PREFIX:INTERNAL= +LIBUNWIND_STATIC_CFLAGS:INTERNAL= +LIBUNWIND_STATIC_CFLAGS_I:INTERNAL= +LIBUNWIND_STATIC_CFLAGS_OTHER:INTERNAL= +LIBUNWIND_STATIC_LIBDIR:INTERNAL= +LIBUNWIND_STATIC_LIBS:INTERNAL= +LIBUNWIND_STATIC_LIBS_L:INTERNAL= +LIBUNWIND_STATIC_LIBS_OTHER:INTERNAL= +LIBUNWIND_STATIC_LIBS_PATHS:INTERNAL= +LIBUNWIND_VERSION:INTERNAL= +LIBUNWIND_libunwind_INCLUDEDIR:INTERNAL= +LIBUNWIND_libunwind_LIBDIR:INTERNAL= +LIBUNWIND_libunwind_PREFIX:INTERNAL= +LIBUNWIND_libunwind_VERSION:INTERNAL= +//Test LINKER_HAS_RELRO +LINKER_HAS_RELRO:INTERNAL=1 +//Test LINKER_HAS_WARN_COMMON +LINKER_HAS_WARN_COMMON:INTERNAL=1 +//ADVANCED property for variable: PERL_EXECUTABLE +PERL_EXECUTABLE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE +PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 +SYSCALL_INTERCEPT_CFLAGS:INTERNAL=-I/usr/include/capstone +SYSCALL_INTERCEPT_CFLAGS_I:INTERNAL= +SYSCALL_INTERCEPT_CFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_FOUND:INTERNAL=1 +SYSCALL_INTERCEPT_INCLUDEDIR:INTERNAL=/usr/include +SYSCALL_INTERCEPT_INCLUDE_DIRS:INTERNAL=/usr/include/capstone +SYSCALL_INTERCEPT_LDFLAGS:INTERNAL=-lsyscall_intercept +SYSCALL_INTERCEPT_LDFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_LIBDIR:INTERNAL=/usr/lib/x86_64-linux-gnu +SYSCALL_INTERCEPT_LIBRARIES:INTERNAL=syscall_intercept +SYSCALL_INTERCEPT_LIBRARY_DIRS:INTERNAL= +SYSCALL_INTERCEPT_LIBS:INTERNAL= +SYSCALL_INTERCEPT_LIBS_L:INTERNAL= +SYSCALL_INTERCEPT_LIBS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_LIBS_PATHS:INTERNAL= +SYSCALL_INTERCEPT_PREFIX:INTERNAL=/usr +SYSCALL_INTERCEPT_STATIC_CFLAGS:INTERNAL=-I/usr/include/capstone +SYSCALL_INTERCEPT_STATIC_CFLAGS_I:INTERNAL= +SYSCALL_INTERCEPT_STATIC_CFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_INCLUDE_DIRS:INTERNAL=/usr/include/capstone +SYSCALL_INTERCEPT_STATIC_LDFLAGS:INTERNAL=-lsyscall_intercept;-ldl;-lcapstone +SYSCALL_INTERCEPT_STATIC_LDFLAGS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBDIR:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBRARIES:INTERNAL=syscall_intercept;dl;capstone +SYSCALL_INTERCEPT_STATIC_LIBRARY_DIRS:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_L:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_OTHER:INTERNAL= +SYSCALL_INTERCEPT_STATIC_LIBS_PATHS:INTERNAL= +SYSCALL_INTERCEPT_VERSION:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_INCLUDEDIR:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_LIBDIR:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_PREFIX:INTERNAL= +SYSCALL_INTERCEPT_libsyscall_intercept_VERSION:INTERNAL= +//CMAKE_INSTALL_PREFIX during last run +_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/usr/local +__pkg_config_checked_CAP:INTERNAL=1 +__pkg_config_checked_LIBUNWIND:INTERNAL=1 +__pkg_config_checked_SYSCALL_INTERCEPT:INTERNAL=1 +prefix_result:INTERNAL=/lib64 + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake new file mode 100644 index 0000000000..f40522e627 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake @@ -0,0 +1,67 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "5.4.0") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake new file mode 100644 index 0000000000..013ee9298f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake @@ -0,0 +1,68 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "5.4.0") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..4e87d56e36ad8f7c9cc3768c49b5acfa7236baa5 GIT binary patch literal 8640 zcmeHNeQXrR6`#BF$2o@cL4cT#mQ4$-q4MVJ8pnWI_I$Qk6WdT@)3nsA&%U#L2NSgPWDZP+DM7UA?pg+C0rF)11n=1 zTh5lT5|7v=;Md@^fCi_=GbEQ;Fw|frY9UIjFPAitwd9Ls zmP(Q_g#*aLwt78W1=-6pBo)z)Dj|u7D)OoXuS)PpPKbt)r2b*w@Yf~$bvZTAP}fkf zCVtIHw8gaLiW$QEkZ?5Q)({5Wl672Tj3n{C1w3r$r%hgA*eU9})3{8D{*e?admtL= ztFLo3rjm<*z<;dHnBhUVgc@@8XTOzW?yDolpMwvEv7Bdgd&6=jCIS#mBDw<$ZBC zfh?tJ&=m(e`*GUUGsD2Vku-w| z(-;m$VubW3Q^r6f7GXwfSGy4kC&Gh~q!~_hwFjc{Shy?L7Y(yWY#?qVBYVQ}0V6bG zCYTWp1fFrmi-?-bNFXH7syI2iNIsxWEU+LY`UVC=kWQ# zXN*#%m`C`mQ9W3uk6m}`&lJB|rZD~KakF^xYaBe|K8>Y}W!9X6qRh%OaIILbK@RmH zEV_Cr18L<8pbs2G08`D4*7W%udiouG?4MIxx?0bU;|$Qxp2P{LpFNB7XYvog`*5IQ zc@tyD9)yN<>(w~l^s#A=p1!hc=`r+#&6(G80t+&i!1yTySsa2c|KQ); z!O0mHIMCBm`pL-+y5kM~{EWFU>#dx;RV)WTR{eXwQ3ma2sd?Q%oQy%kdfq6$K@==KK=N0J)OFAw)r-;^O@%B`k{*7@5Omu z@%p%<`8FXB=OMSD8QHGz@$i4!zs;Y{_`CgGZ3k9%lqk@-1Jx+Ewx(~jrZ2Ruy29_- z$xmF98)h;Y{plN~Qge~Uqb>bjTl!WLc*rbxTOT{^(AQo|y{C_zac}SOf6w3J-{Ch- zAIw$y0o-Tq4=nJOI|^n8W33%6o7d$%Hrss-J=i~v2m2!1VSj;uW2tLBzO#zq_tqzw z%wCXgXx|35Xey|4})Zl9`EzcMo;B)u4a#Nps3MP^=z^3@$DFx;J9f7+e@c$SA4c@<)6d}0+7qJ{?M+!B!_kryJCR&5Zp57z4AHsB>C78QJ<2k~oiY=YmO?*6?U?Lrs zdETE1VGpl3uG6?q3H^vDx7h#tE1hHInzo64%J{}WV4YIc-It1)DP@gXr~0bvQ(UWg zqNZN;)u}bLtE>X0)>l*StM{#yeaN~CW>tezlVP|=&g^+Pzt9CGrmcNZcD@wa7iZ^5 zAzqT5Plb3Xv%3#2n4NV03hm1n&4WVxp6q-n#Aly}u-wJwz`<6_H|2R3o6CA_@!a_= zpX6dT=Oi$2<(>Zu?dN6V3x)W6b{KY}a&obIv+=y@*07c$%?%gMzSL0rWS zzb|`E$>+H6X%f$CAwK(jjO8wybE<{YYLxSW&tVa}naLqm4%ayctR8avaeZ^b`S`GO zU(hq+mn2*jxV)}5asRpVG_40)IX-(l_Xt0xA!tUZD68+ z$eqUF6xcW*B5<%wL-TB!fSldrI^iLD-8b+1R$Z(cfllZfV)t z++}q68{3+(Y92@XoKZ6=7N=?X;jGUSRLhH}SwX(f6jWnsa`&(q>;q{gEICBENDP94 zBTS9O&9Dl0r`ik-3T-f!Qu|U72zN(9Ohs)dm>gniXm ziEuQC1d$twnoQ+!LKU*=U>sC4JPKDHt5g$l9)DEBLt;`5g}@1E7S)s;0Q{#+70_f#h?)*Xf zd;zl#$lzIn_|r}eG(4AZ!On>eW4sl!#D_NyPut+?f*qVY0K@D;A*F8I9( z6Ui4LpU>|V{9eJQ_Hq(jWc{ZSpWde;C{Q-Xh}DIYIf9{C@!#Z#D7hJVf7{C&c|1(;+*5=sp~h z>Zk8J)7U9Ua(hW9`99d>w?BKn5)~-uBrg$<Kib6@{bW^^GzhT?ee{PZGE%*NjmM+)-Uu%1oAOHXW literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..02597532eff5f5e939c78f5e7765bf1f4388740a GIT binary patch literal 8656 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 Y!jHxy-1BeRcI}^AY>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if !defined(__STDC_VERSION__) + "90" +#elif __STDC_VERSION__ >= 201000L + "11" +#elif __STDC_VERSION__ >= 199901L + "99" +#else +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdC/a.out b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0abd21ce8dad9af37207bc298c44d2eb9b0d82f7 GIT binary patch literal 8800 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 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if __cplusplus >= 201402L + "14" +#elif __cplusplus >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out b/splitfs_syscall_intercept/utils/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..e52b547670e5014917a116b7273fbb1d63c20394 GIT binary patch literal 8808 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeDirectoryInformation.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..7d0be58f5c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/om/wspace/splitfs-new") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/om/wspace/splitfs-new/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeError.log b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeError.log new file mode 100644 index 0000000000..776dbfd98f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeError.log @@ -0,0 +1,123 @@ +Determining if the pthread_create exist failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b10d4/fast" +/usr/bin/make -f CMakeFiles/cmTC_b10d4.dir/build.make CMakeFiles/cmTC_b10d4.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o +/usr/bin/cc -o CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c +Linking C executable cmTC_b10d4 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b10d4.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o -o cmTC_b10d4 -rdynamic +CMakeFiles/cmTC_b10d4.dir/CheckSymbolExists.c.o: In function `main': +CheckSymbolExists.c:(.text+0x16): undefined reference to `pthread_create' +collect2: error: ld returned 1 exit status +CMakeFiles/cmTC_b10d4.dir/build.make:97: recipe for target 'cmTC_b10d4' failed +make[1]: *** [cmTC_b10d4] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_b10d4/fast' failed +make: *** [cmTC_b10d4/fast] Error 2 + +File /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckSymbolExists.c: +/* */ +#include + +int main(int argc, char** argv) +{ + (void)argv; +#ifndef pthread_create + return ((int*)(&pthread_create))[argc]; +#else + (void)argc; + return 0; +#endif +} + +Determining if the function pthread_create exists in the pthreads failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_416c8/fast" +/usr/bin/make -f CMakeFiles/cmTC_416c8.dir/build.make CMakeFiles/cmTC_416c8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.5/Modules/CheckFunctionExists.c +Linking C executable cmTC_416c8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_416c8.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_416c8.dir/CheckFunctionExists.c.o -o cmTC_416c8 -rdynamic -lpthreads +/usr/bin/ld: cannot find -lpthreads +collect2: error: ld returned 1 exit status +CMakeFiles/cmTC_416c8.dir/build.make:97: recipe for target 'cmTC_416c8' failed +make[1]: *** [cmTC_416c8] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_416c8/fast' failed +make: *** [cmTC_416c8/fast] Error 2 + + +Performing C SOURCE FILE Test C_HAS__Wunreachable_code_return failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_04959/fast" +/usr/bin/make -f CMakeFiles/cmTC_04959.dir/build.make CMakeFiles/cmTC_04959.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_04959.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__Wunreachable_code_return -Wunreachable-code-return -o CMakeFiles/cmTC_04959.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +cc: error: unrecognized command line option '-Wunreachable-code-return' +CMakeFiles/cmTC_04959.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_04959.dir/src.c.o' failed +make[1]: *** [CMakeFiles/cmTC_04959.dir/src.c.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_04959/fast' failed +make: *** [cmTC_04959/fast] Error 2 + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wunreachable_code_return failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5bccb/fast" +/usr/bin/make -f CMakeFiles/cmTC_5bccb.dir/build.make CMakeFiles/cmTC_5bccb.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_5bccb.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__Wunreachable_code_return -Wunreachable-code-return -o CMakeFiles/cmTC_5bccb.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +c++: error: unrecognized command line option '-Wunreachable-code-return' +CMakeFiles/cmTC_5bccb.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_5bccb.dir/src.cxx.o' failed +make[1]: *** [CMakeFiles/cmTC_5bccb.dir/src.cxx.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_5bccb/fast' failed +make: *** [cmTC_5bccb/fast] Error 2 + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wmissing_variable_declarations failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_14f93/fast" +/usr/bin/make -f CMakeFiles/cmTC_14f93.dir/build.make CMakeFiles/cmTC_14f93.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_14f93.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__Wmissing_variable_declarations -Wmissing-variable-declarations -o CMakeFiles/cmTC_14f93.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +cc: error: unrecognized command line option '-Wmissing-variable-declarations' +CMakeFiles/cmTC_14f93.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_14f93.dir/src.c.o' failed +make[1]: *** [CMakeFiles/cmTC_14f93.dir/src.c.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_14f93/fast' failed +make: *** [cmTC_14f93/fast] Error 2 + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wmissing_variable_declarations failed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e6654/fast" +/usr/bin/make -f CMakeFiles/cmTC_e6654.dir/build.make CMakeFiles/cmTC_e6654.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e6654.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__Wmissing_variable_declarations -Wmissing-variable-declarations -o CMakeFiles/cmTC_e6654.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +c++: error: unrecognized command line option '-Wmissing-variable-declarations' +CMakeFiles/cmTC_e6654.dir/build.make:65: recipe for target 'CMakeFiles/cmTC_e6654.dir/src.cxx.o' failed +make[1]: *** [CMakeFiles/cmTC_e6654.dir/src.cxx.o] Error 1 +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Makefile:126: recipe for target 'cmTC_e6654/fast' failed +make: *** [cmTC_e6654/fast] Error 2 + +Source file was: +int main() { return 0; } diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeOutput.log b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000000..0f91e104c1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,1107 @@ +The system is: Linux - 4.13.0 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/om/wspace/splitfs-new/build/CMakeFiles/3.5.1/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/om/wspace/splitfs-new/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_fdac6/fast" +/usr/bin/make -f CMakeFiles/cmTC_fdac6.dir/build.make CMakeFiles/cmTC_fdac6.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_fdac6 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_fdac6.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_fdac6.dir/testCCompiler.c.o -o cmTC_fdac6 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4e298/fast" +/usr/bin/make -f CMakeFiles/cmTC_4e298.dir/build.make CMakeFiles/cmTC_4e298.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c +Linking C executable cmTC_4e298 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4e298.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -o cmTC_4e298 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4e298' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cca8gFNB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_4e298 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_4e298/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_4e298.dir/build.make CMakeFiles/cmTC_4e298.dir/build] + ignore line: [make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp'] + ignore line: [Building C object CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTC_4e298] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4e298.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -o cmTC_4e298 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_4e298' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/cca8gFNB.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_4e298 /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cca8gFNB.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_4e298] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] + arg [CMakeFiles/cmTC_4e298.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5] ==> [/usr/lib/gcc/x86_64-linux-gnu/5] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting C [-std=c11] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_f907f/fast" +/usr/bin/make -f CMakeFiles/cmTC_f907f.dir/build.make CMakeFiles/cmTC_f907f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_f907f.dir/feature_tests.c.o +/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_f907f.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_f907f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_f907f.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_f907f.dir/feature_tests.c.o -o cmTC_f907f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:1c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c99] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b6c88/fast" +/usr/bin/make -f CMakeFiles/cmTC_b6c88.dir/build.make CMakeFiles/cmTC_b6c88.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o +/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_b6c88 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b6c88.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_b6c88.dir/feature_tests.c.o -o cmTC_b6c88 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c90] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5afbe/fast" +/usr/bin/make -f CMakeFiles/cmTC_5afbe.dir/build.make CMakeFiles/cmTC_5afbe.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o +/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_5afbe +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_5afbe.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_5afbe.dir/feature_tests.c.o -o cmTC_5afbe -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:0c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:0c_variadic_macros +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_6009c/fast" +/usr/bin/make -f CMakeFiles/cmTC_6009c.dir/build.make CMakeFiles/cmTC_6009c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_6009c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_6009c.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_6009c.dir/testCXXCompiler.cxx.o -o cmTC_6009c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b06ef/fast" +/usr/bin/make -f CMakeFiles/cmTC_b06ef.dir/build.make CMakeFiles/cmTC_b06ef.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_b06ef +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b06ef.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b06ef -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_b06ef' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjmNSb6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_b06ef /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_b06ef/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_b06ef.dir/build.make CMakeFiles/cmTC_b06ef.dir/build] + ignore line: [make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_b06ef] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b06ef.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_b06ef -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_b06ef' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjmNSb6.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_b06ef /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccjmNSb6.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b06ef] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] + arg [CMakeFiles/cmTC_b06ef.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5] ==> [/usr/lib/gcc/x86_64-linux-gnu/5] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_cb8f3/fast" +/usr/bin/make -f CMakeFiles/cmTC_cb8f3.dir/build.make CMakeFiles/cmTC_cb8f3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_cb8f3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_cb8f3.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_cb8f3.dir/feature_tests.cxx.o -o cmTC_cb8f3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_8c779/fast" +/usr/bin/make -f CMakeFiles/cmTC_8c779.dir/build.make CMakeFiles/cmTC_8c779.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_8c779 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8c779.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_8c779.dir/feature_tests.cxx.o -o cmTC_8c779 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e2019/fast" +/usr/bin/make -f CMakeFiles/cmTC_e2019.dir/build.make CMakeFiles/cmTC_e2019.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_e2019 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e2019.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_e2019.dir/feature_tests.cxx.o -o cmTC_e2019 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates +Determining if the include file pthread.h exists passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_1cf57/fast" +/usr/bin/make -f CMakeFiles/cmTC_1cf57.dir/build.make CMakeFiles/cmTC_1cf57.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o +/usr/bin/cc -o CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/CheckIncludeFile.c +Linking C executable cmTC_1cf57 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1cf57.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_1cf57.dir/CheckIncludeFile.c.o -o cmTC_1cf57 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Determining if the function pthread_create exists in the pthread passed with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e17af/fast" +/usr/bin/make -f CMakeFiles/cmTC_e17af.dir/build.make CMakeFiles/cmTC_e17af.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.5/Modules/CheckFunctionExists.c +Linking C executable cmTC_e17af +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e17af.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_e17af.dir/CheckFunctionExists.c.o -o cmTC_e17af -rdynamic -lpthread +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + + +Performing C SOURCE FILE Test C_HAS__Wall succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d3373/fast" +/usr/bin/make -f CMakeFiles/cmTC_d3373.dir/build.make CMakeFiles/cmTC_d3373.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d3373.dir/src.c.o +/usr/bin/cc -DC_HAS__Wall -Wall -o CMakeFiles/cmTC_d3373.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d3373 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d3373.dir/link.txt --verbose=1 +/usr/bin/cc -DC_HAS__Wall CMakeFiles/cmTC_d3373.dir/src.c.o -o cmTC_d3373 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wall succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_07142/fast" +/usr/bin/make -f CMakeFiles/cmTC_07142.dir/build.make CMakeFiles/cmTC_07142.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_07142.dir/src.cxx.o +/usr/bin/c++ -DCXX_HAS__Wall -Wall -o CMakeFiles/cmTC_07142.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_07142 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_07142.dir/link.txt --verbose=1 +/usr/bin/c++ -DCXX_HAS__Wall CMakeFiles/cmTC_07142.dir/src.cxx.o -o cmTC_07142 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wpointer_arith succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d74b8/fast" +/usr/bin/make -f CMakeFiles/cmTC_d74b8.dir/build.make CMakeFiles/cmTC_d74b8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d74b8.dir/src.c.o +/usr/bin/cc -Wall -DC_HAS__Wpointer_arith -Wpointer-arith -o CMakeFiles/cmTC_d74b8.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d74b8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d74b8.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -DC_HAS__Wpointer_arith CMakeFiles/cmTC_d74b8.dir/src.c.o -o cmTC_d74b8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wpointer_arith succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_091e2/fast" +/usr/bin/make -f CMakeFiles/cmTC_091e2.dir/build.make CMakeFiles/cmTC_091e2.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_091e2.dir/src.cxx.o +/usr/bin/c++ -Wall -DCXX_HAS__Wpointer_arith -Wpointer-arith -o CMakeFiles/cmTC_091e2.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_091e2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_091e2.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -DCXX_HAS__Wpointer_arith CMakeFiles/cmTC_091e2.dir/src.cxx.o -o cmTC_091e2 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wunused_macros succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_c8936/fast" +/usr/bin/make -f CMakeFiles/cmTC_c8936.dir/build.make CMakeFiles/cmTC_c8936.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_c8936.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -DC_HAS__Wunused_macros -Wunused-macros -o CMakeFiles/cmTC_c8936.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_c8936 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c8936.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -DC_HAS__Wunused_macros CMakeFiles/cmTC_c8936.dir/src.c.o -o cmTC_c8936 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wunused_macros succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4c1dd/fast" +/usr/bin/make -f CMakeFiles/cmTC_4c1dd.dir/build.make CMakeFiles/cmTC_4c1dd.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_4c1dd.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -DCXX_HAS__Wunused_macros -Wunused-macros -o CMakeFiles/cmTC_4c1dd.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_4c1dd +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4c1dd.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -DCXX_HAS__Wunused_macros CMakeFiles/cmTC_4c1dd.dir/src.cxx.o -o cmTC_4c1dd -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wsign_conversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_a23f0/fast" +/usr/bin/make -f CMakeFiles/cmTC_a23f0.dir/build.make CMakeFiles/cmTC_a23f0.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_a23f0.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -DC_HAS__Wsign_conversion -Wsign-conversion -o CMakeFiles/cmTC_a23f0.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_a23f0 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a23f0.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -DC_HAS__Wsign_conversion CMakeFiles/cmTC_a23f0.dir/src.c.o -o cmTC_a23f0 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wsign_conversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_2db3f/fast" +/usr/bin/make -f CMakeFiles/cmTC_2db3f.dir/build.make CMakeFiles/cmTC_2db3f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_2db3f.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -DCXX_HAS__Wsign_conversion -Wsign-conversion -o CMakeFiles/cmTC_2db3f.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_2db3f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_2db3f.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -DCXX_HAS__Wsign_conversion CMakeFiles/cmTC_2db3f.dir/src.cxx.o -o cmTC_2db3f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wsign_compare succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ffab1/fast" +/usr/bin/make -f CMakeFiles/cmTC_ffab1.dir/build.make CMakeFiles/cmTC_ffab1.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_ffab1.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DC_HAS__Wsign_compare -Wsign-compare -o CMakeFiles/cmTC_ffab1.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_ffab1 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ffab1.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DC_HAS__Wsign_compare CMakeFiles/cmTC_ffab1.dir/src.c.o -o cmTC_ffab1 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wsign_compare succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_8405c/fast" +/usr/bin/make -f CMakeFiles/cmTC_8405c.dir/build.make CMakeFiles/cmTC_8405c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_8405c.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DCXX_HAS__Wsign_compare -Wsign-compare -o CMakeFiles/cmTC_8405c.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_8405c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8405c.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -DCXX_HAS__Wsign_compare CMakeFiles/cmTC_8405c.dir/src.cxx.o -o cmTC_8405c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wconversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d1eb7/fast" +/usr/bin/make -f CMakeFiles/cmTC_d1eb7.dir/build.make CMakeFiles/cmTC_d1eb7.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d1eb7.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DC_HAS__Wconversion -Wconversion -o CMakeFiles/cmTC_d1eb7.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d1eb7 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d1eb7.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DC_HAS__Wconversion CMakeFiles/cmTC_d1eb7.dir/src.c.o -o cmTC_d1eb7 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Wconversion succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_116b3/fast" +/usr/bin/make -f CMakeFiles/cmTC_116b3.dir/build.make CMakeFiles/cmTC_116b3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_116b3.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DCXX_HAS__Wconversion -Wconversion -o CMakeFiles/cmTC_116b3.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_116b3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_116b3.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -DCXX_HAS__Wconversion CMakeFiles/cmTC_116b3.dir/src.cxx.o -o cmTC_116b3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__fno_common succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_5637f/fast" +/usr/bin/make -f CMakeFiles/cmTC_5637f.dir/build.make CMakeFiles/cmTC_5637f.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_5637f.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__fno_common -fno-common -o CMakeFiles/cmTC_5637f.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_5637f +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_5637f.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DC_HAS__fno_common CMakeFiles/cmTC_5637f.dir/src.c.o -o cmTC_5637f -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__fno_common succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_886ed/fast" +/usr/bin/make -f CMakeFiles/cmTC_886ed.dir/build.make CMakeFiles/cmTC_886ed.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_886ed.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__fno_common -fno-common -o CMakeFiles/cmTC_886ed.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_886ed +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_886ed.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -DCXX_HAS__fno_common CMakeFiles/cmTC_886ed.dir/src.cxx.o -o cmTC_886ed -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Ofast succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_69761/fast" +/usr/bin/make -f CMakeFiles/cmTC_69761.dir/build.make CMakeFiles/cmTC_69761.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_69761.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DC_HAS__Ofast -Ofast -o CMakeFiles/cmTC_69761.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_69761 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_69761.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DC_HAS__Ofast CMakeFiles/cmTC_69761.dir/src.c.o -o cmTC_69761 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__Ofast succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_e879c/fast" +/usr/bin/make -f CMakeFiles/cmTC_e879c.dir/build.make CMakeFiles/cmTC_e879c.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_e879c.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DCXX_HAS__Ofast -Ofast -o CMakeFiles/cmTC_e879c.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_e879c +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_e879c.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -DCXX_HAS__Ofast CMakeFiles/cmTC_e879c.dir/src.cxx.o -o cmTC_e879c -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__funroll_loops succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3acd4/fast" +/usr/bin/make -f CMakeFiles/cmTC_3acd4.dir/build.make CMakeFiles/cmTC_3acd4.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3acd4.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DC_HAS__funroll_loops -funroll-loops -o CMakeFiles/cmTC_3acd4.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3acd4 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3acd4.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DC_HAS__funroll_loops CMakeFiles/cmTC_3acd4.dir/src.c.o -o cmTC_3acd4 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__funroll_loops succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_66ac3/fast" +/usr/bin/make -f CMakeFiles/cmTC_66ac3.dir/build.make CMakeFiles/cmTC_66ac3.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_66ac3.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DCXX_HAS__funroll_loops -funroll-loops -o CMakeFiles/cmTC_66ac3.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_66ac3 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_66ac3.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -DCXX_HAS__funroll_loops CMakeFiles/cmTC_66ac3.dir/src.cxx.o -o cmTC_66ac3 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__ftree_vectorize succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_78641/fast" +/usr/bin/make -f CMakeFiles/cmTC_78641.dir/build.make CMakeFiles/cmTC_78641.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_78641.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DC_HAS__ftree_vectorize -ftree-vectorize -o CMakeFiles/cmTC_78641.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_78641 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_78641.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DC_HAS__ftree_vectorize CMakeFiles/cmTC_78641.dir/src.c.o -o cmTC_78641 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__ftree_vectorize succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_bde70/fast" +/usr/bin/make -f CMakeFiles/cmTC_bde70.dir/build.make CMakeFiles/cmTC_bde70.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_bde70.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DCXX_HAS__ftree_vectorize -ftree-vectorize -o CMakeFiles/cmTC_bde70.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_bde70 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_bde70.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -DCXX_HAS__ftree_vectorize CMakeFiles/cmTC_bde70.dir/src.cxx.o -o cmTC_bde70 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__m64 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_66318/fast" +/usr/bin/make -f CMakeFiles/cmTC_66318.dir/build.make CMakeFiles/cmTC_66318.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_66318.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DC_HAS__m64 -m64 -o CMakeFiles/cmTC_66318.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_66318 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_66318.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DC_HAS__m64 CMakeFiles/cmTC_66318.dir/src.c.o -o cmTC_66318 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__m64 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_465a7/fast" +/usr/bin/make -f CMakeFiles/cmTC_465a7.dir/build.make CMakeFiles/cmTC_465a7.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_465a7.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DCXX_HAS__m64 -m64 -o CMakeFiles/cmTC_465a7.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_465a7 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_465a7.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -DCXX_HAS__m64 CMakeFiles/cmTC_465a7.dir/src.cxx.o -o cmTC_465a7 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__Wmissing_prototypes succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_172d2/fast" +/usr/bin/make -f CMakeFiles/cmTC_172d2.dir/build.make CMakeFiles/cmTC_172d2.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_172d2.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DC_HAS__Wmissing_prototypes -Wmissing-prototypes -o CMakeFiles/cmTC_172d2.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_172d2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_172d2.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DC_HAS__Wmissing_prototypes CMakeFiles/cmTC_172d2.dir/src.c.o -o cmTC_172d2 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test LINKER_HAS_RELRO succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ed1d5/fast" +/usr/bin/make -f CMakeFiles/cmTC_ed1d5.dir/build.make CMakeFiles/cmTC_ed1d5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_ed1d5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_RELRO -Wl,-z,relro -o CMakeFiles/cmTC_ed1d5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_ed1d5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ed1d5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_RELRO CMakeFiles/cmTC_ed1d5.dir/src.c.o -o cmTC_ed1d5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test LINKER_HAS_WARN_COMMON succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3aab5/fast" +/usr/bin/make -f CMakeFiles/cmTC_3aab5.dir/build.make CMakeFiles/cmTC_3aab5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3aab5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_WARN_COMMON -Wl,--warn-common -o CMakeFiles/cmTC_3aab5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3aab5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3aab5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DLINKER_HAS_WARN_COMMON -Wl,-z,relro CMakeFiles/cmTC_3aab5.dir/src.c.o -o cmTC_3aab5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C SOURCE FILE Test C_HAS__ggdb succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3d5c8/fast" +/usr/bin/make -f CMakeFiles/cmTC_3d5c8.dir/build.make CMakeFiles/cmTC_3d5c8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_3d5c8.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__ggdb -ggdb -o CMakeFiles/cmTC_3d5c8.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_3d5c8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3d5c8.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__ggdb -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_3d5c8.dir/src.c.o -o cmTC_3d5c8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__ggdb succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_31fc8/fast" +/usr/bin/make -f CMakeFiles/cmTC_31fc8.dir/build.make CMakeFiles/cmTC_31fc8.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_31fc8.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__ggdb -ggdb -o CMakeFiles/cmTC_31fc8.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_31fc8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_31fc8.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__ggdb -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_31fc8.dir/src.cxx.o -o cmTC_31fc8 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__DDEBUG succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d0924/fast" +/usr/bin/make -f CMakeFiles/cmTC_d0924.dir/build.make CMakeFiles/cmTC_d0924.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_d0924.dir/src.c.o +/usr/bin/cc -DDEBUG -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__DDEBUG -o CMakeFiles/cmTC_d0924.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_d0924 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d0924.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__DDEBUG -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_d0924.dir/src.c.o -o cmTC_d0924 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__DDEBUG succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_d444a/fast" +/usr/bin/make -f CMakeFiles/cmTC_d444a.dir/build.make CMakeFiles/cmTC_d444a.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_d444a.dir/src.cxx.o +/usr/bin/c++ -DDEBUG -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__DDEBUG -o CMakeFiles/cmTC_d444a.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_d444a +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_d444a.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__DDEBUG -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_d444a.dir/src.cxx.o -o cmTC_d444a -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__fno_omit_frame_pointer succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_77eb5/fast" +/usr/bin/make -f CMakeFiles/cmTC_77eb5.dir/build.make CMakeFiles/cmTC_77eb5.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_77eb5.dir/src.c.o +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__fno_omit_frame_pointer -fno-omit-frame-pointer -o CMakeFiles/cmTC_77eb5.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_77eb5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_77eb5.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__fno_omit_frame_pointer -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_77eb5.dir/src.c.o -o cmTC_77eb5 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__fno_omit_frame_pointer succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_b3856/fast" +/usr/bin/make -f CMakeFiles/cmTC_b3856.dir/build.make CMakeFiles/cmTC_b3856.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_b3856.dir/src.cxx.o +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__fno_omit_frame_pointer -fno-omit-frame-pointer -o CMakeFiles/cmTC_b3856.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_b3856 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_b3856.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__fno_omit_frame_pointer -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_b3856.dir/src.cxx.o -o cmTC_b3856 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_515aa/fast" +/usr/bin/make -f CMakeFiles/cmTC_515aa.dir/build.make CMakeFiles/cmTC_515aa.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_515aa.dir/src.c.o +/usr/bin/cc -D_FORTIFY_SOURCE=2 -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -U_FORTIFY_SOURCE -o CMakeFiles/cmTC_515aa.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_515aa +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_515aa.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_515aa.dir/src.c.o -o cmTC_515aa -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_ae990/fast" +/usr/bin/make -f CMakeFiles/cmTC_ae990.dir/build.make CMakeFiles/cmTC_ae990.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_ae990.dir/src.cxx.o +/usr/bin/c++ -D_FORTIFY_SOURCE=2 -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -U_FORTIFY_SOURCE -o CMakeFiles/cmTC_ae990.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_ae990 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_ae990.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__U_FORTIFY_SOURCE__D_FORTIFY_SOURCE_2 -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_ae990.dir/src.cxx.o -o cmTC_ae990 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } +Performing C SOURCE FILE Test C_HAS__D_LARGEFILE64_SOURCE succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4df69/fast" +/usr/bin/make -f CMakeFiles/cmTC_4df69.dir/build.make CMakeFiles/cmTC_4df69.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4df69.dir/src.c.o +/usr/bin/cc -D_LARGEFILE64_SOURCE -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__D_LARGEFILE64_SOURCE -o CMakeFiles/cmTC_4df69.dir/src.c.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.c +Linking C executable cmTC_4df69 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4df69.dir/link.txt --verbose=1 +/usr/bin/cc -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -DC_HAS__D_LARGEFILE64_SOURCE -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_4df69.dir/src.c.o -o cmTC_4df69 -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main(void) { return 0; } +Performing C++ SOURCE FILE Test CXX_HAS__D_LARGEFILE64_SOURCE succeeded with the following output: +Change Dir: /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4db8a/fast" +/usr/bin/make -f CMakeFiles/cmTC_4db8a.dir/build.make CMakeFiles/cmTC_4db8a.dir/build +make[1]: Entering directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_4db8a.dir/src.cxx.o +/usr/bin/c++ -D_LARGEFILE64_SOURCE -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__D_LARGEFILE64_SOURCE -o CMakeFiles/cmTC_4db8a.dir/src.cxx.o -c /home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp/src.cxx +Linking CXX executable cmTC_4db8a +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4db8a.dir/link.txt --verbose=1 +/usr/bin/c++ -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -DCXX_HAS__D_LARGEFILE64_SOURCE -Wl,-z,relro -Wl,--warn-common CMakeFiles/cmTC_4db8a.dir/src.cxx.o -o cmTC_4db8a -rdynamic +make[1]: Leaving directory '/home/om/wspace/splitfs-new/build/CMakeFiles/CMakeTmp' + +Source file was: +int main() { return 0; } diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeRuleHashes.txt b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000000..a255d50ed7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,7 @@ +# Hashes of file build rules. +dbe7a445bb23af4ce9213ce72db1ba2e CMakeFiles/check-whitespace-main +56711551edaeab2832fe2940a7efde14 CMakeFiles/uninstall +5bf7eb62e08edcd8658261ec079ce85c src/CMakeFiles/check-whitespace-splitfs +796f68a5fdfc90ef8c9ab430552dcefe src/CMakeFiles/cstyle-splitfs +cdd7bef2cd2417a99fce4d326c10de5d src/CMakeFiles/splitfs_static +c84f578580c5c1bc1802d967a63f277a src/libsplitfs.a diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000000..ac6b9130f8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,151 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/feature_tests.c" + "CMakeFiles/feature_tests.cxx" + "../cmake_uninstall.cmake.in" + "../src/CMakeLists.txt" + "/usr/share/cmake-3.5/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.5/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.5/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.5/Modules/CMakeConfigurableFile.in" + "/usr/share/cmake-3.5/Modules/CMakeDependentOption.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.5/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseArguments.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.5/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.5/Modules/CheckCCompilerFlag.cmake" + "/usr/share/cmake-3.5/Modules/CheckCSourceCompiles.cmake" + "/usr/share/cmake-3.5/Modules/CheckCXXCompilerFlag.cmake" + "/usr/share/cmake-3.5/Modules/CheckCXXSourceCompiles.cmake" + "/usr/share/cmake-3.5/Modules/CheckFunctionExists.c" + "/usr/share/cmake-3.5/Modules/CheckIncludeFile.c.in" + "/usr/share/cmake-3.5/Modules/CheckIncludeFile.cmake" + "/usr/share/cmake-3.5/Modules/CheckLibraryExists.cmake" + "/usr/share/cmake-3.5/Modules/CheckSymbolExists.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MIPSpro-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/FindCygwin.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageMessage.cmake" + "/usr/share/cmake-3.5/Modules/FindPerl.cmake" + "/usr/share/cmake-3.5/Modules/FindPkgConfig.cmake" + "/usr/share/cmake-3.5/Modules/FindThreads.cmake" + "/usr/share/cmake-3.5/Modules/GNUInstallDirs.cmake" + "/usr/share/cmake-3.5/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.5/Modules/MultiArchCross.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.5/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "cmake_uninstall.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "src/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/cppformat.dir/DependInfo.cmake" + "CMakeFiles/cppstyle.dir/DependInfo.cmake" + "CMakeFiles/checkers.dir/DependInfo.cmake" + "CMakeFiles/tests.dir/DependInfo.cmake" + "CMakeFiles/check-whitespace.dir/DependInfo.cmake" + "CMakeFiles/cstyle.dir/DependInfo.cmake" + "CMakeFiles/uninstall.dir/DependInfo.cmake" + "CMakeFiles/check-whitespace-main.dir/DependInfo.cmake" + "src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_static.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_o.dir/DependInfo.cmake" + "src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake" + "src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake" + ) diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile2 b/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000000..f75b644687 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/Makefile2 @@ -0,0 +1,571 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# The main recursive all target +all: + +.PHONY : all + +# The main recursive preinstall target +preinstall: + +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Target rules for target CMakeFiles/cppformat.dir + +# All Build rule for target. +CMakeFiles/cppformat.dir/all: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/depend + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cppformat" +.PHONY : CMakeFiles/cppformat.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cppformat.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cppformat.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cppformat.dir/rule + +# Convenience name for target. +cppformat: CMakeFiles/cppformat.dir/rule + +.PHONY : cppformat + +# clean rule for target. +CMakeFiles/cppformat.dir/clean: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/clean +.PHONY : CMakeFiles/cppformat.dir/clean + +# clean rule for target. +clean: CMakeFiles/cppformat.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/cppstyle.dir + +# All Build rule for target. +CMakeFiles/cppstyle.dir/all: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/depend + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cppstyle" +.PHONY : CMakeFiles/cppstyle.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cppstyle.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cppstyle.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cppstyle.dir/rule + +# Convenience name for target. +cppstyle: CMakeFiles/cppstyle.dir/rule + +.PHONY : cppstyle + +# clean rule for target. +CMakeFiles/cppstyle.dir/clean: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/clean +.PHONY : CMakeFiles/cppstyle.dir/clean + +# clean rule for target. +clean: CMakeFiles/cppstyle.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/checkers.dir + +# All Build rule for target. +CMakeFiles/checkers.dir/all: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/depend + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target checkers" +.PHONY : CMakeFiles/checkers.dir/all + +# Include target in all. +all: CMakeFiles/checkers.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/checkers.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/checkers.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/checkers.dir/rule + +# Convenience name for target. +checkers: CMakeFiles/checkers.dir/rule + +.PHONY : checkers + +# clean rule for target. +CMakeFiles/checkers.dir/clean: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/clean +.PHONY : CMakeFiles/checkers.dir/clean + +# clean rule for target. +clean: CMakeFiles/checkers.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/tests.dir + +# All Build rule for target. +CMakeFiles/tests.dir/all: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/depend + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target tests" +.PHONY : CMakeFiles/tests.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/tests.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/tests.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/tests.dir/rule + +# Convenience name for target. +tests: CMakeFiles/tests.dir/rule + +.PHONY : tests + +# clean rule for target. +CMakeFiles/tests.dir/clean: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/clean +.PHONY : CMakeFiles/tests.dir/clean + +# clean rule for target. +clean: CMakeFiles/tests.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/check-whitespace.dir + +# All Build rule for target. +CMakeFiles/check-whitespace.dir/all: CMakeFiles/check-whitespace-main.dir/all +CMakeFiles/check-whitespace.dir/all: src/CMakeFiles/check-whitespace-splitfs.dir/all + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/depend + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace" +.PHONY : CMakeFiles/check-whitespace.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/check-whitespace.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/check-whitespace.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/check-whitespace.dir/rule + +# Convenience name for target. +check-whitespace: CMakeFiles/check-whitespace.dir/rule + +.PHONY : check-whitespace + +# clean rule for target. +CMakeFiles/check-whitespace.dir/clean: + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/clean +.PHONY : CMakeFiles/check-whitespace.dir/clean + +# clean rule for target. +clean: CMakeFiles/check-whitespace.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/cstyle.dir + +# All Build rule for target. +CMakeFiles/cstyle.dir/all: src/CMakeFiles/cstyle-splitfs.dir/all + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/depend + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cstyle" +.PHONY : CMakeFiles/cstyle.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/cstyle.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/cstyle.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/cstyle.dir/rule + +# Convenience name for target. +cstyle: CMakeFiles/cstyle.dir/rule + +.PHONY : cstyle + +# clean rule for target. +CMakeFiles/cstyle.dir/clean: + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/clean +.PHONY : CMakeFiles/cstyle.dir/clean + +# clean rule for target. +clean: CMakeFiles/cstyle.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/uninstall.dir + +# All Build rule for target. +CMakeFiles/uninstall.dir/all: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/depend + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target uninstall" +.PHONY : CMakeFiles/uninstall.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/uninstall.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/uninstall.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/uninstall.dir/rule + +# Convenience name for target. +uninstall: CMakeFiles/uninstall.dir/rule + +.PHONY : uninstall + +# clean rule for target. +CMakeFiles/uninstall.dir/clean: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/clean +.PHONY : CMakeFiles/uninstall.dir/clean + +# clean rule for target. +clean: CMakeFiles/uninstall.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/check-whitespace-main.dir + +# All Build rule for target. +CMakeFiles/check-whitespace-main.dir/all: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/depend + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace-main" +.PHONY : CMakeFiles/check-whitespace-main.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/check-whitespace-main.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/check-whitespace-main.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : CMakeFiles/check-whitespace-main.dir/rule + +# Convenience name for target. +check-whitespace-main: CMakeFiles/check-whitespace-main.dir/rule + +.PHONY : check-whitespace-main + +# clean rule for target. +CMakeFiles/check-whitespace-main.dir/clean: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/clean +.PHONY : CMakeFiles/check-whitespace-main.dir/clean + +# clean rule for target. +clean: CMakeFiles/check-whitespace-main.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory src + +# Convenience name for "all" pass in the directory. +src/all: src/CMakeFiles/splitfs_static.dir/all +src/all: src/CMakeFiles/splitfs_o.dir/all +src/all: src/CMakeFiles/splitfs_static_unscoped.dir/all +src/all: src/CMakeFiles/splitfs_shared.dir/all + +.PHONY : src/all + +# Convenience name for "clean" pass in the directory. +src/clean: src/CMakeFiles/check-whitespace-splitfs.dir/clean +src/clean: src/CMakeFiles/splitfs_static.dir/clean +src/clean: src/CMakeFiles/splitfs_o.dir/clean +src/clean: src/CMakeFiles/cstyle-splitfs.dir/clean +src/clean: src/CMakeFiles/splitfs_static_unscoped.dir/clean +src/clean: src/CMakeFiles/splitfs_shared.dir/clean + +.PHONY : src/clean + +# Convenience name for "preinstall" pass in the directory. +src/preinstall: + +.PHONY : src/preinstall + +#============================================================================= +# Target rules for target src/CMakeFiles/check-whitespace-splitfs.dir + +# All Build rule for target. +src/CMakeFiles/check-whitespace-splitfs.dir/all: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/depend + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target check-whitespace-splitfs" +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/all + +# Build rule for subdir invocation for target. +src/CMakeFiles/check-whitespace-splitfs.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/check-whitespace-splitfs.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/rule + +# Convenience name for target. +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/rule + +.PHONY : check-whitespace-splitfs + +# clean rule for target. +src/CMakeFiles/check-whitespace-splitfs.dir/clean: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/clean +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/check-whitespace-splitfs.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_static.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_static.dir/all: src/CMakeFiles/splitfs_static_unscoped.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=31 "Built target splitfs_static" +.PHONY : src/CMakeFiles/splitfs_static.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_static.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_static.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 31 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_static.dir/rule + +# Convenience name for target. +splitfs_static: src/CMakeFiles/splitfs_static.dir/rule + +.PHONY : splitfs_static + +# clean rule for target. +src/CMakeFiles/splitfs_static.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/clean +.PHONY : src/CMakeFiles/splitfs_static.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_static.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_o.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_o.dir/all: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 "Built target splitfs_o" +.PHONY : src/CMakeFiles/splitfs_o.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_o.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_o.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 29 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_o.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_o.dir/rule + +# Convenience name for target. +splitfs_o: src/CMakeFiles/splitfs_o.dir/rule + +.PHONY : splitfs_o + +# clean rule for target. +src/CMakeFiles/splitfs_o.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/clean +.PHONY : src/CMakeFiles/splitfs_o.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_o.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/cstyle-splitfs.dir + +# All Build rule for target. +src/CMakeFiles/cstyle-splitfs.dir/all: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/depend + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num= "Built target cstyle-splitfs" +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/all + +# Build rule for subdir invocation for target. +src/CMakeFiles/cstyle-splitfs.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/cstyle-splitfs.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/rule + +# Convenience name for target. +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/rule + +.PHONY : cstyle-splitfs + +# clean rule for target. +src/CMakeFiles/cstyle-splitfs.dir/clean: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/clean +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/cstyle-splitfs.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_static_unscoped.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_static_unscoped.dir/all: src/CMakeFiles/splitfs_o.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=32 "Built target splitfs_static_unscoped" +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_static_unscoped.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_static_unscoped.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static_unscoped.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/rule + +# Convenience name for target. +splitfs_static_unscoped: src/CMakeFiles/splitfs_static_unscoped.dir/rule + +.PHONY : splitfs_static_unscoped + +# clean rule for target. +src/CMakeFiles/splitfs_static_unscoped.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/clean +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_static_unscoped.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/splitfs_shared.dir + +# All Build rule for target. +src/CMakeFiles/splitfs_shared.dir/all: src/CMakeFiles/splitfs_o.dir/all + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/depend + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=30 "Built target splitfs_shared" +.PHONY : src/CMakeFiles/splitfs_shared.dir/all + +# Include target in all. +all: src/CMakeFiles/splitfs_shared.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/splitfs_shared.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_shared.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/splitfs_shared.dir/rule + +# Convenience name for target. +splitfs_shared: src/CMakeFiles/splitfs_shared.dir/rule + +.PHONY : splitfs_shared + +# clean rule for target. +src/CMakeFiles/splitfs_shared.dir/clean: + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/clean +.PHONY : src/CMakeFiles/splitfs_shared.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/splitfs_shared.dir/clean + +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/TargetDirectories.txt b/splitfs_syscall_intercept/utils/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000000..ce43e18879 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,26 @@ +/home/om/wspace/splitfs-new/build/CMakeFiles/install.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/rebuild_cache.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/edit_cache.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cppformat.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cppstyle.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/checkers.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/tests.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/cstyle.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/uninstall.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace-main.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/list_install_components.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/install/strip.dir +/home/om/wspace/splitfs-new/build/CMakeFiles/install/local.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/check-whitespace-splitfs.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/rebuild_cache.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/list_install_components.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/cstyle-splitfs.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install/strip.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static_unscoped.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/install/local.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_shared.dir +/home/om/wspace/splitfs-new/build/src/CMakeFiles/edit_cache.dir diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/build.make new file mode 100644 index 0000000000..fb02f240e8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace-main. + +# Include the progress variables for this target. +include CMakeFiles/check-whitespace-main.dir/progress.make + +CMakeFiles/check-whitespace-main: + /usr/bin/perl /home/om/wspace/splitfs-new/utils/check_whitespace + +check-whitespace-main: CMakeFiles/check-whitespace-main +check-whitespace-main: CMakeFiles/check-whitespace-main.dir/build.make + +.PHONY : check-whitespace-main + +# Rule to build all files generated by this target. +CMakeFiles/check-whitespace-main.dir/build: check-whitespace-main + +.PHONY : CMakeFiles/check-whitespace-main.dir/build + +CMakeFiles/check-whitespace-main.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake +.PHONY : CMakeFiles/check-whitespace-main.dir/clean + +CMakeFiles/check-whitespace-main.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace-main.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/check-whitespace-main.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake new file mode 100644 index 0000000000..a0ae55aa4c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/check-whitespace-main" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace-main.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace-main.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/build.make new file mode 100644 index 0000000000..e60a27a3ed --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace. + +# Include the progress variables for this target. +include CMakeFiles/check-whitespace.dir/progress.make + +check-whitespace: CMakeFiles/check-whitespace.dir/build.make + +.PHONY : check-whitespace + +# Rule to build all files generated by this target. +CMakeFiles/check-whitespace.dir/build: check-whitespace + +.PHONY : CMakeFiles/check-whitespace.dir/build + +CMakeFiles/check-whitespace.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace.dir/cmake_clean.cmake +.PHONY : CMakeFiles/check-whitespace.dir/clean + +CMakeFiles/check-whitespace.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/check-whitespace.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/check-whitespace.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake new file mode 100644 index 0000000000..2e0a4b29e3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/check-whitespace.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/build.make new file mode 100644 index 0000000000..b8df3465c6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for checkers. + +# Include the progress variables for this target. +include CMakeFiles/checkers.dir/progress.make + +checkers: CMakeFiles/checkers.dir/build.make + +.PHONY : checkers + +# Rule to build all files generated by this target. +CMakeFiles/checkers.dir/build: checkers + +.PHONY : CMakeFiles/checkers.dir/build + +CMakeFiles/checkers.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/checkers.dir/cmake_clean.cmake +.PHONY : CMakeFiles/checkers.dir/clean + +CMakeFiles/checkers.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/checkers.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/checkers.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/cmake_clean.cmake new file mode 100644 index 0000000000..d72f5401fa --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/checkers.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.internal b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/checkers.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cmake.check_cache b/splitfs_syscall_intercept/utils/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000000..3dccd73172 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/build.make new file mode 100644 index 0000000000..c96ceddd8d --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cppformat. + +# Include the progress variables for this target. +include CMakeFiles/cppformat.dir/progress.make + +cppformat: CMakeFiles/cppformat.dir/build.make + +.PHONY : cppformat + +# Rule to build all files generated by this target. +CMakeFiles/cppformat.dir/build: cppformat + +.PHONY : CMakeFiles/cppformat.dir/build + +CMakeFiles/cppformat.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cppformat.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cppformat.dir/clean + +CMakeFiles/cppformat.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cppformat.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cppformat.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/cmake_clean.cmake new file mode 100644 index 0000000000..fec845697e --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cppformat.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppformat.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/build.make new file mode 100644 index 0000000000..9f10756885 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cppstyle. + +# Include the progress variables for this target. +include CMakeFiles/cppstyle.dir/progress.make + +cppstyle: CMakeFiles/cppstyle.dir/build.make + +.PHONY : cppstyle + +# Rule to build all files generated by this target. +CMakeFiles/cppstyle.dir/build: cppstyle + +.PHONY : CMakeFiles/cppstyle.dir/build + +CMakeFiles/cppstyle.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cppstyle.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cppstyle.dir/clean + +CMakeFiles/cppstyle.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cppstyle.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cppstyle.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake new file mode 100644 index 0000000000..038336d8b8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cppstyle.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cppstyle.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/build.make new file mode 100644 index 0000000000..e1902f6ae9 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cstyle. + +# Include the progress variables for this target. +include CMakeFiles/cstyle.dir/progress.make + +cstyle: CMakeFiles/cstyle.dir/build.make + +.PHONY : cstyle + +# Rule to build all files generated by this target. +CMakeFiles/cstyle.dir/build: cstyle + +.PHONY : CMakeFiles/cstyle.dir/build + +CMakeFiles/cstyle.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/cstyle.dir/cmake_clean.cmake +.PHONY : CMakeFiles/cstyle.dir/clean + +CMakeFiles/cstyle.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/cstyle.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/cstyle.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/cmake_clean.cmake new file mode 100644 index 0000000000..ac65d5a1dc --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cstyle.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/cstyle.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.bin b/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.bin new file mode 100755 index 0000000000000000000000000000000000000000..24939d193bbcef29063a395a70cc6c6ee560c767 GIT binary patch literal 12696 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.c b/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.c new file mode 100644 index 0000000000..6590dded23 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.c @@ -0,0 +1,34 @@ + + const char features[] = {"\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 +"1" +#else +"0" +#endif +"c_function_prototypes\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_restrict\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L +"1" +#else +"0" +#endif +"c_static_assert\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_variadic_macros\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.cxx b/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.cxx new file mode 100644 index 0000000000..b93418c6ed --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/feature_tests.cxx @@ -0,0 +1,405 @@ + + const char features[] = {"\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/progress.marks b/splitfs_syscall_intercept/utils/build/CMakeFiles/progress.marks new file mode 100644 index 0000000000..f5c89552bd --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +32 diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/build.make new file mode 100644 index 0000000000..0890446879 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/build.make @@ -0,0 +1,72 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for tests. + +# Include the progress variables for this target. +include CMakeFiles/tests.dir/progress.make + +tests: CMakeFiles/tests.dir/build.make + +.PHONY : tests + +# Rule to build all files generated by this target. +CMakeFiles/tests.dir/build: tests + +.PHONY : CMakeFiles/tests.dir/build + +CMakeFiles/tests.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/tests.dir/cmake_clean.cmake +.PHONY : CMakeFiles/tests.dir/clean + +CMakeFiles/tests.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/tests.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/tests.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/cmake_clean.cmake new file mode 100644 index 0000000000..910f04d829 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/cmake_clean.cmake @@ -0,0 +1,5 @@ + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/tests.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/tests.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/build.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/build.make new file mode 100644 index 0000000000..2fde4feed0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for uninstall. + +# Include the progress variables for this target. +include CMakeFiles/uninstall.dir/progress.make + +CMakeFiles/uninstall: + /usr/bin/cmake -P /home/om/wspace/splitfs-new/build/cmake_uninstall.cmake + +uninstall: CMakeFiles/uninstall +uninstall: CMakeFiles/uninstall.dir/build.make + +.PHONY : uninstall + +# Rule to build all files generated by this target. +CMakeFiles/uninstall.dir/build: uninstall + +.PHONY : CMakeFiles/uninstall.dir/build + +CMakeFiles/uninstall.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/uninstall.dir/cmake_clean.cmake +.PHONY : CMakeFiles/uninstall.dir/clean + +CMakeFiles/uninstall.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/CMakeFiles/uninstall.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/uninstall.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/cmake_clean.cmake new file mode 100644 index 0000000000..027952dfb7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/uninstall" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/uninstall.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/progress.make b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/CMakeFiles/uninstall.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/Makefile b/splitfs_syscall_intercept/utils/build/Makefile new file mode 100644 index 0000000000..80aea12a24 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/Makefile @@ -0,0 +1,378 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles /home/om/wspace/splitfs-new/build/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named cppformat + +# Build rule for target. +cppformat: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cppformat +.PHONY : cppformat + +# fast build rule for target. +cppformat/fast: + $(MAKE) -f CMakeFiles/cppformat.dir/build.make CMakeFiles/cppformat.dir/build +.PHONY : cppformat/fast + +#============================================================================= +# Target rules for targets named cppstyle + +# Build rule for target. +cppstyle: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cppstyle +.PHONY : cppstyle + +# fast build rule for target. +cppstyle/fast: + $(MAKE) -f CMakeFiles/cppstyle.dir/build.make CMakeFiles/cppstyle.dir/build +.PHONY : cppstyle/fast + +#============================================================================= +# Target rules for targets named checkers + +# Build rule for target. +checkers: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 checkers +.PHONY : checkers + +# fast build rule for target. +checkers/fast: + $(MAKE) -f CMakeFiles/checkers.dir/build.make CMakeFiles/checkers.dir/build +.PHONY : checkers/fast + +#============================================================================= +# Target rules for targets named tests + +# Build rule for target. +tests: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 tests +.PHONY : tests + +# fast build rule for target. +tests/fast: + $(MAKE) -f CMakeFiles/tests.dir/build.make CMakeFiles/tests.dir/build +.PHONY : tests/fast + +#============================================================================= +# Target rules for targets named check-whitespace + +# Build rule for target. +check-whitespace: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace +.PHONY : check-whitespace + +# fast build rule for target. +check-whitespace/fast: + $(MAKE) -f CMakeFiles/check-whitespace.dir/build.make CMakeFiles/check-whitespace.dir/build +.PHONY : check-whitespace/fast + +#============================================================================= +# Target rules for targets named cstyle + +# Build rule for target. +cstyle: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cstyle +.PHONY : cstyle + +# fast build rule for target. +cstyle/fast: + $(MAKE) -f CMakeFiles/cstyle.dir/build.make CMakeFiles/cstyle.dir/build +.PHONY : cstyle/fast + +#============================================================================= +# Target rules for targets named uninstall + +# Build rule for target. +uninstall: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 uninstall +.PHONY : uninstall + +# fast build rule for target. +uninstall/fast: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build +.PHONY : uninstall/fast + +#============================================================================= +# Target rules for targets named check-whitespace-main + +# Build rule for target. +check-whitespace-main: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace-main +.PHONY : check-whitespace-main + +# fast build rule for target. +check-whitespace-main/fast: + $(MAKE) -f CMakeFiles/check-whitespace-main.dir/build.make CMakeFiles/check-whitespace-main.dir/build +.PHONY : check-whitespace-main/fast + +#============================================================================= +# Target rules for targets named check-whitespace-splitfs + +# Build rule for target. +check-whitespace-splitfs: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 check-whitespace-splitfs +.PHONY : check-whitespace-splitfs + +# fast build rule for target. +check-whitespace-splitfs/fast: + $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build +.PHONY : check-whitespace-splitfs/fast + +#============================================================================= +# Target rules for targets named splitfs_static + +# Build rule for target. +splitfs_static: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_static +.PHONY : splitfs_static + +# fast build rule for target. +splitfs_static/fast: + $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build +.PHONY : splitfs_static/fast + +#============================================================================= +# Target rules for targets named splitfs_o + +# Build rule for target. +splitfs_o: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_o +.PHONY : splitfs_o + +# fast build rule for target. +splitfs_o/fast: + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build +.PHONY : splitfs_o/fast + +#============================================================================= +# Target rules for targets named cstyle-splitfs + +# Build rule for target. +cstyle-splitfs: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 cstyle-splitfs +.PHONY : cstyle-splitfs + +# fast build rule for target. +cstyle-splitfs/fast: + $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build +.PHONY : cstyle-splitfs/fast + +#============================================================================= +# Target rules for targets named splitfs_static_unscoped + +# Build rule for target. +splitfs_static_unscoped: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_static_unscoped +.PHONY : splitfs_static_unscoped + +# fast build rule for target. +splitfs_static_unscoped/fast: + $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build +.PHONY : splitfs_static_unscoped/fast + +#============================================================================= +# Target rules for targets named splitfs_shared + +# Build rule for target. +splitfs_shared: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 splitfs_shared +.PHONY : splitfs_shared + +# fast build rule for target. +splitfs_shared/fast: + $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build +.PHONY : splitfs_shared/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... edit_cache" + @echo "... cppformat" + @echo "... cppstyle" + @echo "... checkers" + @echo "... tests" + @echo "... check-whitespace" + @echo "... cstyle" + @echo "... uninstall" + @echo "... check-whitespace-main" + @echo "... list_install_components" + @echo "... install/strip" + @echo "... install/local" + @echo "... check-whitespace-splitfs" + @echo "... splitfs_static" + @echo "... splitfs_o" + @echo "... cstyle-splitfs" + @echo "... splitfs_static_unscoped" + @echo "... splitfs_shared" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/utils/build/cmake_install.cmake b/splitfs_syscall_intercept/utils/build/cmake_install.cmake new file mode 100644 index 0000000000..68e706ac73 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/cmake_install.cmake @@ -0,0 +1,50 @@ +# Install script for directory: /home/om/wspace/splitfs-new + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/om/wspace/splitfs-new/build/src/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/om/wspace/splitfs-new/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/splitfs_syscall_intercept/utils/build/cmake_uninstall.cmake b/splitfs_syscall_intercept/utils/build/cmake_uninstall.cmake new file mode 100644 index 0000000000..9b495ebcfd --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/cmake_uninstall.cmake @@ -0,0 +1,22 @@ +# From: https://cmake.org/Wiki/CMake_FAQ + +if(NOT EXISTS "/home/om/wspace/splitfs-new/build/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: /home/om/wspace/splitfs-new/build/install_manifest.txt") +endif(NOT EXISTS "/home/om/wspace/splitfs-new/build/install_manifest.txt") + +file(READ "/home/om/wspace/splitfs-new/build/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program("/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/CMakeDirectoryInformation.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000000..7d0be58f5c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/om/wspace/splitfs-new") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/om/wspace/splitfs-new/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make new file mode 100644 index 0000000000..92a07ef15a --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for check-whitespace-splitfs. + +# Include the progress variables for this target. +include src/CMakeFiles/check-whitespace-splitfs.dir/progress.make + +src/CMakeFiles/check-whitespace-splitfs: + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/perl /home/om/wspace/splitfs-new/utils/check_whitespace /home/om/wspace/splitfs-new/src/*.c /home/om/wspace/splitfs-new/src/*.h + +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/build.make + +.PHONY : check-whitespace-splitfs + +# Rule to build all files generated by this target. +src/CMakeFiles/check-whitespace-splitfs.dir/build: check-whitespace-splitfs + +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/build + +src/CMakeFiles/check-whitespace-splitfs.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/clean + +src/CMakeFiles/check-whitespace-splitfs.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/check-whitespace-splitfs.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake new file mode 100644 index 0000000000..640aa87432 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/check-whitespace-splitfs" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/check-whitespace-splitfs.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/check-whitespace-splitfs.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/build.make new file mode 100644 index 0000000000..655a92fe5c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/build.make @@ -0,0 +1,76 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for cstyle-splitfs. + +# Include the progress variables for this target. +include src/CMakeFiles/cstyle-splitfs.dir/progress.make + +src/CMakeFiles/cstyle-splitfs: + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/perl /home/om/wspace/splitfs-new/utils/cstyle /home/om/wspace/splitfs-new/src/*.c /home/om/wspace/splitfs-new/src/*.h + +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/build.make + +.PHONY : cstyle-splitfs + +# Rule to build all files generated by this target. +src/CMakeFiles/cstyle-splitfs.dir/build: cstyle-splitfs + +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/build + +src/CMakeFiles/cstyle-splitfs.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/clean + +src/CMakeFiles/cstyle-splitfs.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/cstyle-splitfs.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake new file mode 100644 index 0000000000..e205bc9f8f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/cstyle-splitfs" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/cstyle-splitfs.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/cstyle-splitfs.dir/progress.make @@ -0,0 +1 @@ + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/progress.marks b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/progress.marks new file mode 100644 index 0000000000..f5c89552bd --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/progress.marks @@ -0,0 +1 @@ +32 diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/C.includecache b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/C.includecache new file mode 100644 index 0000000000..d0fe232bb6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/C.includecache @@ -0,0 +1,860 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/splitfs-posix.h +sys/stat.h +- +sys/types.h +- +sys/uio.h +- +sys/vfs.h +- +utime.h +- + +/home/om/wspace/splitfs-new/src/add_delay.c +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h + +/home/om/wspace/splitfs-new/src/add_delay.h +fcntl.h +- +string.h +- +sys/mman.h +- +sys/stat.h +- +pthread.h +- +stdint.h +- +pm_util.h +/home/om/wspace/splitfs-new/src/pm_util.h + +/home/om/wspace/splitfs-new/src/compiler_utils.h + +/home/om/wspace/splitfs-new/src/constants.h + +/home/om/wspace/splitfs-new/src/execv.c +sys/mman.h +- +sys/stat.h +- +fcntl.h +- +errno.h +- +stdio.h +- +syscall.h +- +unistd.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +constants.h +/home/om/wspace/splitfs-new/src/constants.h +vfd_table.h +/home/om/wspace/splitfs-new/src/vfd_table.h +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +execv.h +/home/om/wspace/splitfs-new/src/execv.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h + +/home/om/wspace/splitfs-new/src/execv.h + +/home/om/wspace/splitfs-new/src/fallocate.c +stdlib.h +- +inttypes.h +- +errno.h +- +fcntl.h +- +unistd.h +- +limits.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/file.c +stdlib.h +- +inttypes.h +- +syscall.h +- +sys/types.h +- +sys/stat.h +- +unistd.h +- +fcntl.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +truncate.h +/home/om/wspace/splitfs-new/src/truncate.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/file.h +stddef.h +- +inode.h +/home/om/wspace/splitfs-new/src/inode.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h + +/home/om/wspace/splitfs-new/src/fsync.c +stdlib.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +out.h +/home/om/wspace/splitfs-new/src/out.h +splitfs-posix.h +- +syscall.h +- + +/home/om/wspace/splitfs-new/src/handle_mmaps.c +stdlib.h +- +sys/mman.h +- +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h + +/home/om/wspace/splitfs-new/src/handle_mmaps.h +inttypes.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/hash_map.c +errno.h +- +stddef.h +- +stdlib.h +- +string.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/hash_map.h +stdint.h +- +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/inode.c +stdlib.h +- +inttypes.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/inode.h +stdint.h +- +time.h +- +stdbool.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h + +/home/om/wspace/splitfs-new/src/intel_intrin.c +stdlib.h +- +cpuid.h +- +stdio.h +- +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h + +/home/om/wspace/splitfs-new/src/intel_intrin.h +sys/mman.h +- +stdio.h +- +string.h +- +fcntl.h +- +stdlib.h +- +unistd.h +- +errno.h +- +sys/mman.h +- +math.h +- +string.h +- +sys/types.h +- +linux/perf_event.h +- +linux/hw_breakpoint.h +- +sys/ioctl.h +- +asm/unistd.h +- +inttypes.h +- +sched.h +- +sys/time.h +- +sys/resource.h +- +sys/stat.h +- +sys/prctl.h +- +sys/wait.h +- +sys/syscall.h +- +emmintrin.h +- +stdbool.h +- + +/home/om/wspace/splitfs-new/src/lseek.c +errno.h +- +unistd.h +- +fcntl.h +- +limits.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/mmap_pool.c +stdlib.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +mmap_pool.h +/home/om/wspace/splitfs-new/src/mmap_pool.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/mmap_pool.h + +/home/om/wspace/splitfs-new/src/os_thread.h + +/home/om/wspace/splitfs-new/src/os_thread_pthread.c +errno.h +- +pthread.h +- +stdlib.h +- +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/os_util.h + +/home/om/wspace/splitfs-new/src/os_util_linux.c +limits.h +- +stdio.h +- +string.h +- +sys/types.h +- +unistd.h +- +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h + +/home/om/wspace/splitfs-new/src/out.c +stdlib.h +- +stdio.h +- +stdarg.h +- +string.h +- +errno.h +- +syscall.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +os_thread.h +/home/om/wspace/splitfs-new/src/os_thread.h +os_util.h +/home/om/wspace/splitfs-new/src/os_util.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/out.h +stdarg.h +- +stddef.h +- +stdlib.h +- +unistd.h +- +pthread.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h + +/home/om/wspace/splitfs-new/src/path_resolve.c +assert.h +- +stdbool.h +- +fcntl.h +- +stdlib.h +- +inttypes.h +- +syscall.h +- +sys/stat.h +- +errno.h +- +string.h +- +unistd.h +- +stdio.h +- +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/pm_util.h + +/home/om/wspace/splitfs-new/src/preload.c +assert.h +- +fcntl.h +- +stdarg.h +- +stdbool.h +- +stdio.h +- +syscall.h +- +stdlib.h +- +inttypes.h +- +string.h +- +errno.h +- +setjmp.h +- +pthread.h +- +unistd.h +- +sys/socket.h +- +sys/stat.h +- +sys/types.h +- +sys/un.h +- +stdio.h +- +limits.h +- +linux/fs.h +- +utime.h +- +sys/fsuid.h +- +sys/capability.h +- +dlfcn.h +- +limits.h +- +asm-generic/errno.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +syscall_early_filter.h +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/preload.h +stdbool.h +- +sys/stat.h +- +stddef.h +- +pthread.h +- +linux/limits.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +vfd_table.h +/home/om/wspace/splitfs-new/src/vfd_table.h + +/home/om/wspace/splitfs-new/src/read.c +stdlib.h +- +stdio.h +- +string.h +- +limits.h +- +inttypes.h +- +syscall.h +- +sys/mman.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/relink.c +stdlib.h +- +syscall.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/relink.h +file.h +/home/om/wspace/splitfs-new/src/file.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +splitfs-posix.h +- + +/home/om/wspace/splitfs-new/src/splitfs-posix.c +limits.h +- +stdio.h +- +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h +file.h +/home/om/wspace/splitfs-new/src/file.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +out.h +/home/om/wspace/splitfs-new/src/out.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +execv.h +/home/om/wspace/splitfs-new/src/execv.h + +/home/om/wspace/splitfs-new/src/staging.c +stdlib.h +- +assert.h +- +stdbool.h +- +fcntl.h +- +syscall.h +- +stdio.h +- +inttypes.h +- +sys/mman.h +- +string.h +- +libsyscall_intercept_hook_point.h +- +splitfs-posix.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +file.h +/home/om/wspace/splitfs-new/src/file.h +staging.h +/home/om/wspace/splitfs-new/src/staging.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/staging.h +file.h +/home/om/wspace/splitfs-new/src/file.h + +/home/om/wspace/splitfs-new/src/staging_thread.c +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h + +/home/om/wspace/splitfs-new/src/staging_thread.h +stdlib.h +- +pthread.h +- +stdatomic.h +- +sys/mman.h +- +stdbool.h +- +staging.h +/home/om/wspace/splitfs-new/src/staging.h + +/home/om/wspace/splitfs-new/src/stat.c +stdlib.h +- +inttypes.h +- +syscall.h +- +errno.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/sys_util.h +errno.h +- +string.h +- +pthread.h +- +libsyscall_intercept_hook_point.h +/home/om/wspace/splitfs-new/src/libsyscall_intercept_hook_point.h +compiler_utils.h +/home/om/wspace/splitfs-new/src/compiler_utils.h + +/home/om/wspace/splitfs-new/src/syscall_early_filter.c +syscall_early_filter.h +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +stdlib.h +- +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h + +/home/om/wspace/splitfs-new/src/syscall_early_filter.h +stdbool.h +- +sys/syscall.h +- + +/home/om/wspace/splitfs-new/src/table_mmaps.c +stdlib.h +- +stdbool.h +- +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +sys/mman.h +- + +/home/om/wspace/splitfs-new/src/table_mmaps.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h + +/home/om/wspace/splitfs-new/src/truncate.c +stdlib.h +- +inttypes.h +- +syscall.h +- +limits.h +- +truncate.h +/home/om/wspace/splitfs-new/src/truncate.h + +/home/om/wspace/splitfs-new/src/truncate.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/unlink.c +stdlib.h +- +inttypes.h +- +syscall.h +- +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +hash_map.h +/home/om/wspace/splitfs-new/src/hash_map.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/utils.c +errno.h +- +time.h +- +string.h +- +utils.h +/home/om/wspace/splitfs-new/src/utils.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h + +/home/om/wspace/splitfs-new/src/utils.h +inode.h +/home/om/wspace/splitfs-new/src/inode.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h + +/home/om/wspace/splitfs-new/src/vfd_table.c +stdlib.h +- +assert.h +- +stdbool.h +- +fcntl.h +- +syscall.h +- +libsyscall_intercept_hook_point.h +- +splitfs-posix.h +- +constants.h +/home/om/wspace/splitfs-new/src/constants.h +sys_util.h +/home/om/wspace/splitfs-new/src/sys_util.h +preload.h +/home/om/wspace/splitfs-new/src/preload.h +out.h +/home/om/wspace/splitfs-new/src/out.h + +/home/om/wspace/splitfs-new/src/vfd_table.h + +/home/om/wspace/splitfs-new/src/write.c +stdlib.h +- +limits.h +- +inttypes.h +- +syscall.h +- +file.h +/home/om/wspace/splitfs-new/src/file.h +splitfs-posix.h +/home/om/wspace/splitfs-new/src/splitfs-posix.h +utils.h +/home/om/wspace/splitfs-new/src/utils.h +handle_mmaps.h +/home/om/wspace/splitfs-new/src/handle_mmaps.h +intel_intrin.h +/home/om/wspace/splitfs-new/src/intel_intrin.h +relink.h +/home/om/wspace/splitfs-new/src/relink.h +staging_thread.h +/home/om/wspace/splitfs-new/src/staging_thread.h +add_delay.h +/home/om/wspace/splitfs-new/src/add_delay.h +table_mmaps.h +/home/om/wspace/splitfs-new/src/table_mmaps.h +out.h +/home/om/wspace/splitfs-new/src/out.h + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake new file mode 100644 index 0000000000..733120e03a --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake @@ -0,0 +1,59 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_C + "/home/om/wspace/splitfs-new/src/add_delay.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" + "/home/om/wspace/splitfs-new/src/execv.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" + "/home/om/wspace/splitfs-new/src/fallocate.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" + "/home/om/wspace/splitfs-new/src/file.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" + "/home/om/wspace/splitfs-new/src/fsync.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" + "/home/om/wspace/splitfs-new/src/handle_mmaps.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + "/home/om/wspace/splitfs-new/src/hash_map.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" + "/home/om/wspace/splitfs-new/src/inode.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" + "/home/om/wspace/splitfs-new/src/intel_intrin.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + "/home/om/wspace/splitfs-new/src/lseek.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" + "/home/om/wspace/splitfs-new/src/mmap_pool.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + "/home/om/wspace/splitfs-new/src/os_thread_pthread.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + "/home/om/wspace/splitfs-new/src/os_util_linux.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + "/home/om/wspace/splitfs-new/src/out.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" + "/home/om/wspace/splitfs-new/src/path_resolve.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" + "/home/om/wspace/splitfs-new/src/preload.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" + "/home/om/wspace/splitfs-new/src/read.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" + "/home/om/wspace/splitfs-new/src/relink.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" + "/home/om/wspace/splitfs-new/src/splitfs-posix.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + "/home/om/wspace/splitfs-new/src/staging.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" + "/home/om/wspace/splitfs-new/src/staging_thread.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" + "/home/om/wspace/splitfs-new/src/stat.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" + "/home/om/wspace/splitfs-new/src/syscall_early_filter.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + "/home/om/wspace/splitfs-new/src/table_mmaps.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + "/home/om/wspace/splitfs-new/src/truncate.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" + "/home/om/wspace/splitfs-new/src/unlink.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" + "/home/om/wspace/splitfs-new/src/utils.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" + "/home/om/wspace/splitfs-new/src/vfd_table.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" + "/home/om/wspace/splitfs-new/src/write.c" "/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + ) +set(CMAKE_C_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_C + "PMEMFILE_MAJOR_VERSION=0" + "PMEMFILE_MINOR_VERSION=0" + "SRCVERSION=\"a5a036a\"" + "USE_VALGRIND" + ) + +# The include file search paths: +set(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/capstone" + "../src/.." + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/build.make new file mode 100644 index 0000000000..3e77fecd67 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/build.make @@ -0,0 +1,833 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_o.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_o.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_o.dir/flags.make + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building C object src/CMakeFiles/splitfs_o.dir/add_delay.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/add_delay.c.o -c /home/om/wspace/splitfs-new/src/add_delay.c + +src/CMakeFiles/splitfs_o.dir/add_delay.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/add_delay.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/add_delay.c > CMakeFiles/splitfs_o.dir/add_delay.c.i + +src/CMakeFiles/splitfs_o.dir/add_delay.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/add_delay.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/add_delay.c -o CMakeFiles/splitfs_o.dir/add_delay.c.s + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides: src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/add_delay.c.o + + +src/CMakeFiles/splitfs_o.dir/execv.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building C object src/CMakeFiles/splitfs_o.dir/execv.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/execv.c.o -c /home/om/wspace/splitfs-new/src/execv.c + +src/CMakeFiles/splitfs_o.dir/execv.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/execv.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/execv.c > CMakeFiles/splitfs_o.dir/execv.c.i + +src/CMakeFiles/splitfs_o.dir/execv.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/execv.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/execv.c -o CMakeFiles/splitfs_o.dir/execv.c.s + +src/CMakeFiles/splitfs_o.dir/execv.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/execv.c.o.requires + +src/CMakeFiles/splitfs_o.dir/execv.c.o.provides: src/CMakeFiles/splitfs_o.dir/execv.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/execv.c.o.provides + +src/CMakeFiles/splitfs_o.dir/execv.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/execv.c.o + + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/fallocate.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building C object src/CMakeFiles/splitfs_o.dir/fallocate.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/fallocate.c.o -c /home/om/wspace/splitfs-new/src/fallocate.c + +src/CMakeFiles/splitfs_o.dir/fallocate.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/fallocate.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/fallocate.c > CMakeFiles/splitfs_o.dir/fallocate.c.i + +src/CMakeFiles/splitfs_o.dir/fallocate.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/fallocate.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/fallocate.c -o CMakeFiles/splitfs_o.dir/fallocate.c.s + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides: src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/fallocate.c.o + + +src/CMakeFiles/splitfs_o.dir/file.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building C object src/CMakeFiles/splitfs_o.dir/file.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/file.c.o -c /home/om/wspace/splitfs-new/src/file.c + +src/CMakeFiles/splitfs_o.dir/file.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/file.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/file.c > CMakeFiles/splitfs_o.dir/file.c.i + +src/CMakeFiles/splitfs_o.dir/file.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/file.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/file.c -o CMakeFiles/splitfs_o.dir/file.c.s + +src/CMakeFiles/splitfs_o.dir/file.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/file.c.o.requires + +src/CMakeFiles/splitfs_o.dir/file.c.o.provides: src/CMakeFiles/splitfs_o.dir/file.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/file.c.o.provides + +src/CMakeFiles/splitfs_o.dir/file.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/file.c.o + + +src/CMakeFiles/splitfs_o.dir/fsync.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/fsync.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building C object src/CMakeFiles/splitfs_o.dir/fsync.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/fsync.c.o -c /home/om/wspace/splitfs-new/src/fsync.c + +src/CMakeFiles/splitfs_o.dir/fsync.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/fsync.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/fsync.c > CMakeFiles/splitfs_o.dir/fsync.c.i + +src/CMakeFiles/splitfs_o.dir/fsync.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/fsync.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/fsync.c -o CMakeFiles/splitfs_o.dir/fsync.c.s + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides: src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides + +src/CMakeFiles/splitfs_o.dir/fsync.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/fsync.c.o + + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building C object src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o -c /home/om/wspace/splitfs-new/src/handle_mmaps.c + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/handle_mmaps.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/handle_mmaps.c > CMakeFiles/splitfs_o.dir/handle_mmaps.c.i + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/handle_mmaps.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/handle_mmaps.c -o CMakeFiles/splitfs_o.dir/handle_mmaps.c.s + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o + + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building C object src/CMakeFiles/splitfs_o.dir/hash_map.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/hash_map.c.o -c /home/om/wspace/splitfs-new/src/hash_map.c + +src/CMakeFiles/splitfs_o.dir/hash_map.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/hash_map.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/hash_map.c > CMakeFiles/splitfs_o.dir/hash_map.c.i + +src/CMakeFiles/splitfs_o.dir/hash_map.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/hash_map.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/hash_map.c -o CMakeFiles/splitfs_o.dir/hash_map.c.s + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides: src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/hash_map.c.o + + +src/CMakeFiles/splitfs_o.dir/inode.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building C object src/CMakeFiles/splitfs_o.dir/inode.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/inode.c.o -c /home/om/wspace/splitfs-new/src/inode.c + +src/CMakeFiles/splitfs_o.dir/inode.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/inode.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/inode.c > CMakeFiles/splitfs_o.dir/inode.c.i + +src/CMakeFiles/splitfs_o.dir/inode.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/inode.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/inode.c -o CMakeFiles/splitfs_o.dir/inode.c.s + +src/CMakeFiles/splitfs_o.dir/inode.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/inode.c.o.requires + +src/CMakeFiles/splitfs_o.dir/inode.c.o.provides: src/CMakeFiles/splitfs_o.dir/inode.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/inode.c.o.provides + +src/CMakeFiles/splitfs_o.dir/inode.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/inode.c.o + + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building C object src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/intel_intrin.c.o -c /home/om/wspace/splitfs-new/src/intel_intrin.c + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/intel_intrin.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/intel_intrin.c > CMakeFiles/splitfs_o.dir/intel_intrin.c.i + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/intel_intrin.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/intel_intrin.c -o CMakeFiles/splitfs_o.dir/intel_intrin.c.s + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o + + +src/CMakeFiles/splitfs_o.dir/lseek.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/lseek.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building C object src/CMakeFiles/splitfs_o.dir/lseek.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/lseek.c.o -c /home/om/wspace/splitfs-new/src/lseek.c + +src/CMakeFiles/splitfs_o.dir/lseek.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/lseek.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/lseek.c > CMakeFiles/splitfs_o.dir/lseek.c.i + +src/CMakeFiles/splitfs_o.dir/lseek.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/lseek.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/lseek.c -o CMakeFiles/splitfs_o.dir/lseek.c.s + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides: src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides + +src/CMakeFiles/splitfs_o.dir/lseek.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/lseek.c.o + + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building C object src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/mmap_pool.c.o -c /home/om/wspace/splitfs-new/src/mmap_pool.c + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/mmap_pool.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/mmap_pool.c > CMakeFiles/splitfs_o.dir/mmap_pool.c.i + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/mmap_pool.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/mmap_pool.c -o CMakeFiles/splitfs_o.dir/mmap_pool.c.s + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o + + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread_pthread.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building C object src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o -c /home/om/wspace/splitfs-new/src/os_thread_pthread.c + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/os_thread_pthread.c > CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/os_thread_pthread.c -o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o + + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util_linux.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building C object src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/os_util_linux.c.o -c /home/om/wspace/splitfs-new/src/os_util_linux.c + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/os_util_linux.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/os_util_linux.c > CMakeFiles/splitfs_o.dir/os_util_linux.c.i + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/os_util_linux.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/os_util_linux.c -o CMakeFiles/splitfs_o.dir/os_util_linux.c.s + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o + + +src/CMakeFiles/splitfs_o.dir/out.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building C object src/CMakeFiles/splitfs_o.dir/out.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/out.c.o -c /home/om/wspace/splitfs-new/src/out.c + +src/CMakeFiles/splitfs_o.dir/out.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/out.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/out.c > CMakeFiles/splitfs_o.dir/out.c.i + +src/CMakeFiles/splitfs_o.dir/out.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/out.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/out.c -o CMakeFiles/splitfs_o.dir/out.c.s + +src/CMakeFiles/splitfs_o.dir/out.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/out.c.o.requires + +src/CMakeFiles/splitfs_o.dir/out.c.o.provides: src/CMakeFiles/splitfs_o.dir/out.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/out.c.o.provides + +src/CMakeFiles/splitfs_o.dir/out.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/out.c.o + + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/path_resolve.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building C object src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/path_resolve.c.o -c /home/om/wspace/splitfs-new/src/path_resolve.c + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/path_resolve.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/path_resolve.c > CMakeFiles/splitfs_o.dir/path_resolve.c.i + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/path_resolve.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/path_resolve.c -o CMakeFiles/splitfs_o.dir/path_resolve.c.s + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o + + +src/CMakeFiles/splitfs_o.dir/preload.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building C object src/CMakeFiles/splitfs_o.dir/preload.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/preload.c.o -c /home/om/wspace/splitfs-new/src/preload.c + +src/CMakeFiles/splitfs_o.dir/preload.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/preload.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/preload.c > CMakeFiles/splitfs_o.dir/preload.c.i + +src/CMakeFiles/splitfs_o.dir/preload.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/preload.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/preload.c -o CMakeFiles/splitfs_o.dir/preload.c.s + +src/CMakeFiles/splitfs_o.dir/preload.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/preload.c.o.requires + +src/CMakeFiles/splitfs_o.dir/preload.c.o.provides: src/CMakeFiles/splitfs_o.dir/preload.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/preload.c.o.provides + +src/CMakeFiles/splitfs_o.dir/preload.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/preload.c.o + + +src/CMakeFiles/splitfs_o.dir/read.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/read.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building C object src/CMakeFiles/splitfs_o.dir/read.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/read.c.o -c /home/om/wspace/splitfs-new/src/read.c + +src/CMakeFiles/splitfs_o.dir/read.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/read.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/read.c > CMakeFiles/splitfs_o.dir/read.c.i + +src/CMakeFiles/splitfs_o.dir/read.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/read.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/read.c -o CMakeFiles/splitfs_o.dir/read.c.s + +src/CMakeFiles/splitfs_o.dir/read.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/read.c.o.requires + +src/CMakeFiles/splitfs_o.dir/read.c.o.provides: src/CMakeFiles/splitfs_o.dir/read.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/read.c.o.provides + +src/CMakeFiles/splitfs_o.dir/read.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/read.c.o + + +src/CMakeFiles/splitfs_o.dir/relink.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building C object src/CMakeFiles/splitfs_o.dir/relink.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/relink.c.o -c /home/om/wspace/splitfs-new/src/relink.c + +src/CMakeFiles/splitfs_o.dir/relink.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/relink.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/relink.c > CMakeFiles/splitfs_o.dir/relink.c.i + +src/CMakeFiles/splitfs_o.dir/relink.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/relink.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/relink.c -o CMakeFiles/splitfs_o.dir/relink.c.s + +src/CMakeFiles/splitfs_o.dir/relink.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/relink.c.o.requires + +src/CMakeFiles/splitfs_o.dir/relink.c.o.provides: src/CMakeFiles/splitfs_o.dir/relink.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/relink.c.o.provides + +src/CMakeFiles/splitfs_o.dir/relink.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/relink.c.o + + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/splitfs-posix.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building C object src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o -c /home/om/wspace/splitfs-new/src/splitfs-posix.c + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/splitfs-posix.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/splitfs-posix.c > CMakeFiles/splitfs_o.dir/splitfs-posix.c.i + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/splitfs-posix.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/splitfs-posix.c -o CMakeFiles/splitfs_o.dir/splitfs-posix.c.s + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o + + +src/CMakeFiles/splitfs_o.dir/staging.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building C object src/CMakeFiles/splitfs_o.dir/staging.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/staging.c.o -c /home/om/wspace/splitfs-new/src/staging.c + +src/CMakeFiles/splitfs_o.dir/staging.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/staging.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/staging.c > CMakeFiles/splitfs_o.dir/staging.c.i + +src/CMakeFiles/splitfs_o.dir/staging.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/staging.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/staging.c -o CMakeFiles/splitfs_o.dir/staging.c.s + +src/CMakeFiles/splitfs_o.dir/staging.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/staging.c.o.requires + +src/CMakeFiles/splitfs_o.dir/staging.c.o.provides: src/CMakeFiles/splitfs_o.dir/staging.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/staging.c.o.provides + +src/CMakeFiles/splitfs_o.dir/staging.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/staging.c.o + + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building C object src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/staging_thread.c.o -c /home/om/wspace/splitfs-new/src/staging_thread.c + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/staging_thread.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/staging_thread.c > CMakeFiles/splitfs_o.dir/staging_thread.c.i + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/staging_thread.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/staging_thread.c -o CMakeFiles/splitfs_o.dir/staging_thread.c.s + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o + + +src/CMakeFiles/splitfs_o.dir/stat.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/stat.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building C object src/CMakeFiles/splitfs_o.dir/stat.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/stat.c.o -c /home/om/wspace/splitfs-new/src/stat.c + +src/CMakeFiles/splitfs_o.dir/stat.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/stat.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/stat.c > CMakeFiles/splitfs_o.dir/stat.c.i + +src/CMakeFiles/splitfs_o.dir/stat.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/stat.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/stat.c -o CMakeFiles/splitfs_o.dir/stat.c.s + +src/CMakeFiles/splitfs_o.dir/stat.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/stat.c.o.requires + +src/CMakeFiles/splitfs_o.dir/stat.c.o.provides: src/CMakeFiles/splitfs_o.dir/stat.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/stat.c.o.provides + +src/CMakeFiles/splitfs_o.dir/stat.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/stat.c.o + + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building C object src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o -c /home/om/wspace/splitfs-new/src/syscall_early_filter.c + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/syscall_early_filter.c > CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/syscall_early_filter.c -o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o + + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building C object src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/table_mmaps.c.o -c /home/om/wspace/splitfs-new/src/table_mmaps.c + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/table_mmaps.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/table_mmaps.c > CMakeFiles/splitfs_o.dir/table_mmaps.c.i + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/table_mmaps.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/table_mmaps.c -o CMakeFiles/splitfs_o.dir/table_mmaps.c.s + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o + + +src/CMakeFiles/splitfs_o.dir/truncate.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building C object src/CMakeFiles/splitfs_o.dir/truncate.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/truncate.c.o -c /home/om/wspace/splitfs-new/src/truncate.c + +src/CMakeFiles/splitfs_o.dir/truncate.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/truncate.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/truncate.c > CMakeFiles/splitfs_o.dir/truncate.c.i + +src/CMakeFiles/splitfs_o.dir/truncate.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/truncate.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/truncate.c -o CMakeFiles/splitfs_o.dir/truncate.c.s + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides: src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides + +src/CMakeFiles/splitfs_o.dir/truncate.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/truncate.c.o + + +src/CMakeFiles/splitfs_o.dir/unlink.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/unlink.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building C object src/CMakeFiles/splitfs_o.dir/unlink.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/unlink.c.o -c /home/om/wspace/splitfs-new/src/unlink.c + +src/CMakeFiles/splitfs_o.dir/unlink.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/unlink.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/unlink.c > CMakeFiles/splitfs_o.dir/unlink.c.i + +src/CMakeFiles/splitfs_o.dir/unlink.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/unlink.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/unlink.c -o CMakeFiles/splitfs_o.dir/unlink.c.s + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides: src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides + +src/CMakeFiles/splitfs_o.dir/unlink.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/unlink.c.o + + +src/CMakeFiles/splitfs_o.dir/utils.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building C object src/CMakeFiles/splitfs_o.dir/utils.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/utils.c.o -c /home/om/wspace/splitfs-new/src/utils.c + +src/CMakeFiles/splitfs_o.dir/utils.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/utils.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/utils.c > CMakeFiles/splitfs_o.dir/utils.c.i + +src/CMakeFiles/splitfs_o.dir/utils.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/utils.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/utils.c -o CMakeFiles/splitfs_o.dir/utils.c.s + +src/CMakeFiles/splitfs_o.dir/utils.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/utils.c.o.requires + +src/CMakeFiles/splitfs_o.dir/utils.c.o.provides: src/CMakeFiles/splitfs_o.dir/utils.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/utils.c.o.provides + +src/CMakeFiles/splitfs_o.dir/utils.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/utils.c.o + + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building C object src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/vfd_table.c.o -c /home/om/wspace/splitfs-new/src/vfd_table.c + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/vfd_table.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/vfd_table.c > CMakeFiles/splitfs_o.dir/vfd_table.c.i + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/vfd_table.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/vfd_table.c -o CMakeFiles/splitfs_o.dir/vfd_table.c.s + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o + + +src/CMakeFiles/splitfs_o.dir/write.c.o: src/CMakeFiles/splitfs_o.dir/flags.make +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/write.c + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building C object src/CMakeFiles/splitfs_o.dir/write.c.o" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -o CMakeFiles/splitfs_o.dir/write.c.o -c /home/om/wspace/splitfs-new/src/write.c + +src/CMakeFiles/splitfs_o.dir/write.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/splitfs_o.dir/write.c.i" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -E /home/om/wspace/splitfs-new/src/write.c > CMakeFiles/splitfs_o.dir/write.c.i + +src/CMakeFiles/splitfs_o.dir/write.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/splitfs_o.dir/write.c.s" + cd /home/om/wspace/splitfs-new/build/src && /usr/bin/cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -S /home/om/wspace/splitfs-new/src/write.c -o CMakeFiles/splitfs_o.dir/write.c.s + +src/CMakeFiles/splitfs_o.dir/write.c.o.requires: + +.PHONY : src/CMakeFiles/splitfs_o.dir/write.c.o.requires + +src/CMakeFiles/splitfs_o.dir/write.c.o.provides: src/CMakeFiles/splitfs_o.dir/write.c.o.requires + $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.o.provides.build +.PHONY : src/CMakeFiles/splitfs_o.dir/write.c.o.provides + +src/CMakeFiles/splitfs_o.dir/write.c.o.provides.build: src/CMakeFiles/splitfs_o.dir/write.c.o + + +splitfs_o: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/execv.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/file.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/fsync.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/inode.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/lseek.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/out.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/preload.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/read.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/relink.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/staging.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/stat.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/truncate.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/unlink.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/utils.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/write.c.o +splitfs_o: src/CMakeFiles/splitfs_o.dir/build.make + +.PHONY : splitfs_o + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_o.dir/build: splitfs_o + +.PHONY : src/CMakeFiles/splitfs_o.dir/build + +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/add_delay.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/execv.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/fallocate.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/file.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/fsync.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/hash_map.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/inode.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/lseek.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/out.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/preload.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/read.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/relink.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/staging.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/stat.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/truncate.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/unlink.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/utils.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o.requires +src/CMakeFiles/splitfs_o.dir/requires: src/CMakeFiles/splitfs_o.dir/write.c.o.requires + +.PHONY : src/CMakeFiles/splitfs_o.dir/requires + +src/CMakeFiles/splitfs_o.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_o.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_o.dir/clean + +src/CMakeFiles/splitfs_o.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_o.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake new file mode 100644 index 0000000000..88de8a598b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/cmake_clean.cmake @@ -0,0 +1,36 @@ +file(REMOVE_RECURSE + "CMakeFiles/splitfs_o.dir/add_delay.c.o" + "CMakeFiles/splitfs_o.dir/execv.c.o" + "CMakeFiles/splitfs_o.dir/fallocate.c.o" + "CMakeFiles/splitfs_o.dir/file.c.o" + "CMakeFiles/splitfs_o.dir/fsync.c.o" + "CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" + "CMakeFiles/splitfs_o.dir/hash_map.c.o" + "CMakeFiles/splitfs_o.dir/inode.c.o" + "CMakeFiles/splitfs_o.dir/intel_intrin.c.o" + "CMakeFiles/splitfs_o.dir/lseek.c.o" + "CMakeFiles/splitfs_o.dir/mmap_pool.c.o" + "CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" + "CMakeFiles/splitfs_o.dir/os_util_linux.c.o" + "CMakeFiles/splitfs_o.dir/out.c.o" + "CMakeFiles/splitfs_o.dir/path_resolve.c.o" + "CMakeFiles/splitfs_o.dir/preload.c.o" + "CMakeFiles/splitfs_o.dir/read.c.o" + "CMakeFiles/splitfs_o.dir/relink.c.o" + "CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" + "CMakeFiles/splitfs_o.dir/staging.c.o" + "CMakeFiles/splitfs_o.dir/staging_thread.c.o" + "CMakeFiles/splitfs_o.dir/stat.c.o" + "CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" + "CMakeFiles/splitfs_o.dir/table_mmaps.c.o" + "CMakeFiles/splitfs_o.dir/truncate.c.o" + "CMakeFiles/splitfs_o.dir/unlink.c.o" + "CMakeFiles/splitfs_o.dir/utils.c.o" + "CMakeFiles/splitfs_o.dir/vfd_table.c.o" + "CMakeFiles/splitfs_o.dir/write.c.o" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_o.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.internal b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.internal new file mode 100644 index 0000000000..c32c6905dc --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.internal @@ -0,0 +1,319 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o + /home/om/wspace/splitfs-new/src/add_delay.c + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/pm_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/execv.c + /home/om/wspace/splitfs-new/src/execv.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/fallocate.c + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/file.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.c + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/truncate.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/fsync.c + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.c + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/hash_map.c + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/inode.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.c + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o + /home/om/wspace/splitfs-new/src/intel_intrin.c + /home/om/wspace/splitfs-new/src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/lseek.c + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/mmap_pool.c + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_thread_pthread.c + /home/om/wspace/splitfs-new/src/out.h +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/os_util_linux.c +src/CMakeFiles/splitfs_o.dir/out.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/os_util.h + /home/om/wspace/splitfs-new/src/out.c + /home/om/wspace/splitfs-new/src/out.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/path_resolve.c + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/preload.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/preload.c + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/syscall_early_filter.h + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/read.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/read.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/relink.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/relink.c + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/execv.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/splitfs-posix.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/staging.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/staging.c + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.c + /home/om/wspace/splitfs-new/src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/stat.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/stat.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/syscall_early_filter.c + /home/om/wspace/splitfs-new/src/syscall_early_filter.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.c + /home/om/wspace/splitfs-new/src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/truncate.c + /home/om/wspace/splitfs-new/src/truncate.h + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/unlink.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/utils.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/utils.c + /home/om/wspace/splitfs-new/src/utils.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/constants.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/preload.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/vfd_table.c + /home/om/wspace/splitfs-new/src/vfd_table.h +src/CMakeFiles/splitfs_o.dir/write.c.o + ../include/splitfs-posix.h + /home/om/wspace/splitfs-new/src/add_delay.h + /home/om/wspace/splitfs-new/src/compiler_utils.h + /home/om/wspace/splitfs-new/src/file.h + /home/om/wspace/splitfs-new/src/handle_mmaps.h + /home/om/wspace/splitfs-new/src/hash_map.h + /home/om/wspace/splitfs-new/src/inode.h + /home/om/wspace/splitfs-new/src/intel_intrin.h + /home/om/wspace/splitfs-new/src/mmap_pool.h + /home/om/wspace/splitfs-new/src/os_thread.h + /home/om/wspace/splitfs-new/src/out.h + /home/om/wspace/splitfs-new/src/pm_util.h + /home/om/wspace/splitfs-new/src/relink.h + /home/om/wspace/splitfs-new/src/staging.h + /home/om/wspace/splitfs-new/src/staging_thread.h + /home/om/wspace/splitfs-new/src/sys_util.h + /home/om/wspace/splitfs-new/src/table_mmaps.h + /home/om/wspace/splitfs-new/src/utils.h + /home/om/wspace/splitfs-new/src/write.c diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.make new file mode 100644 index 0000000000..c680cbe650 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/depend.make @@ -0,0 +1,319 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.c +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/add_delay.c.o: ../src/pm_util.h + +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.c +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/execv.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/execv.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/fallocate.c +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/fallocate.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/file.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.c +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/truncate.h +src/CMakeFiles/splitfs_o.dir/file.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/fsync.c +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/fsync.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.c +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.c +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/hash_map.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.c +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/inode.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.c +src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o: ../src/intel_intrin.h + +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/lseek.c +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/lseek.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.c +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/os_thread_pthread.c +src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o: ../src/out.h + +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o: ../src/os_util_linux.c + +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/os_util.h +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.c +src/CMakeFiles/splitfs_o.dir/out.c.o: ../src/out.h + +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/path_resolve.c +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/path_resolve.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.c +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/syscall_early_filter.h +src/CMakeFiles/splitfs_o.dir/preload.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/read.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/read.c +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/read.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.c +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/relink.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/execv.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/splitfs-posix.c +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.c +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/staging.c.o: ../src/sys_util.h + +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.c +src/CMakeFiles/splitfs_o.dir/staging_thread.c.o: ../src/staging_thread.h + +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/stat.c +src/CMakeFiles/splitfs_o.dir/stat.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.c +src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o: ../src/syscall_early_filter.h + +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.c +src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o: ../src/table_mmaps.h + +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.c +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/truncate.h +src/CMakeFiles/splitfs_o.dir/truncate.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/unlink.c +src/CMakeFiles/splitfs_o.dir/unlink.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.c +src/CMakeFiles/splitfs_o.dir/utils.c.o: ../src/utils.h + +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/constants.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/preload.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.c +src/CMakeFiles/splitfs_o.dir/vfd_table.c.o: ../src/vfd_table.h + +src/CMakeFiles/splitfs_o.dir/write.c.o: ../include/splitfs-posix.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/add_delay.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/compiler_utils.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/file.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/handle_mmaps.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/hash_map.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/inode.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/intel_intrin.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/mmap_pool.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/os_thread.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/out.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/pm_util.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/relink.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/staging.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/staging_thread.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/sys_util.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/table_mmaps.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/utils.h +src/CMakeFiles/splitfs_o.dir/write.c.o: ../src/write.c + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/flags.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/flags.make new file mode 100644 index 0000000000..7f6695e41c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/progress.make new file mode 100644 index 0000000000..bc905f9ec9 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_o.dir/progress.make @@ -0,0 +1,30 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 +CMAKE_PROGRESS_9 = 9 +CMAKE_PROGRESS_10 = 10 +CMAKE_PROGRESS_11 = 11 +CMAKE_PROGRESS_12 = 12 +CMAKE_PROGRESS_13 = 13 +CMAKE_PROGRESS_14 = 14 +CMAKE_PROGRESS_15 = 15 +CMAKE_PROGRESS_16 = 16 +CMAKE_PROGRESS_17 = 17 +CMAKE_PROGRESS_18 = 18 +CMAKE_PROGRESS_19 = 19 +CMAKE_PROGRESS_20 = 20 +CMAKE_PROGRESS_21 = 21 +CMAKE_PROGRESS_22 = 22 +CMAKE_PROGRESS_23 = 23 +CMAKE_PROGRESS_24 = 24 +CMAKE_PROGRESS_25 = 25 +CMAKE_PROGRESS_26 = 26 +CMAKE_PROGRESS_27 = 27 +CMAKE_PROGRESS_28 = 28 +CMAKE_PROGRESS_29 = 29 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake new file mode 100644 index 0000000000..bf06eedb87 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake @@ -0,0 +1,18 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + ) + + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/build.make new file mode 100644 index 0000000000..961e900331 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/build.make @@ -0,0 +1,152 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_shared.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_shared.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_shared.dir/flags.make + +# Object files for target splitfs_shared +splitfs_shared_OBJECTS = + +# External object files for target splitfs_shared +splitfs_shared_EXTERNAL_OBJECTS = \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/execv.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/file.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/fsync.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/inode.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/lseek.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/out.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/preload.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/read.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/relink.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/staging.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/stat.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/truncate.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/unlink.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/utils.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_o.dir/write.c.o +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_shared.dir/build.make +src/libsplitfs.so.0.0.0: src/CMakeFiles/splitfs_shared.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Linking C shared library libsplitfs.so" + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/splitfs_shared.dir/link.txt --verbose=$(VERBOSE) + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_symlink_library libsplitfs.so.0.0.0 libsplitfs.so.0 libsplitfs.so + +src/libsplitfs.so.0: src/libsplitfs.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate src/libsplitfs.so.0 + +src/libsplitfs.so: src/libsplitfs.so.0.0.0 + @$(CMAKE_COMMAND) -E touch_nocreate src/libsplitfs.so + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_shared.dir/build: src/libsplitfs.so + +.PHONY : src/CMakeFiles/splitfs_shared.dir/build + +src/CMakeFiles/splitfs_shared.dir/requires: + +.PHONY : src/CMakeFiles/splitfs_shared.dir/requires + +src/CMakeFiles/splitfs_shared.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_shared.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_shared.dir/clean + +src/CMakeFiles/splitfs_shared.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_shared.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_shared.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake new file mode 100644 index 0000000000..8c53c55127 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "libsplitfs.pdb" + "libsplitfs.so" + "libsplitfs.so.0.0.0" + "libsplitfs.so.0" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_shared.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.internal b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/flags.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/flags.make new file mode 100644 index 0000000000..c0a5cc5653 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND -Dsplitfs_shared_EXPORTS + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/link.txt b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/link.txt new file mode 100644 index 0000000000..71b5cc9b6b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -Wl,-z,relro -Wl,--warn-common -shared -Wl,-soname,libsplitfs.so.0 -o libsplitfs.so.0.0.0 CMakeFiles/splitfs_o.dir/add_delay.c.o CMakeFiles/splitfs_o.dir/execv.c.o CMakeFiles/splitfs_o.dir/fallocate.c.o CMakeFiles/splitfs_o.dir/file.c.o CMakeFiles/splitfs_o.dir/fsync.c.o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o CMakeFiles/splitfs_o.dir/hash_map.c.o CMakeFiles/splitfs_o.dir/inode.c.o CMakeFiles/splitfs_o.dir/intel_intrin.c.o CMakeFiles/splitfs_o.dir/lseek.c.o CMakeFiles/splitfs_o.dir/mmap_pool.c.o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o CMakeFiles/splitfs_o.dir/os_util_linux.c.o CMakeFiles/splitfs_o.dir/out.c.o CMakeFiles/splitfs_o.dir/path_resolve.c.o CMakeFiles/splitfs_o.dir/preload.c.o CMakeFiles/splitfs_o.dir/read.c.o CMakeFiles/splitfs_o.dir/relink.c.o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o CMakeFiles/splitfs_o.dir/staging.c.o CMakeFiles/splitfs_o.dir/staging_thread.c.o CMakeFiles/splitfs_o.dir/stat.c.o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o CMakeFiles/splitfs_o.dir/table_mmaps.c.o CMakeFiles/splitfs_o.dir/truncate.c.o CMakeFiles/splitfs_o.dir/unlink.c.o CMakeFiles/splitfs_o.dir/utils.c.o CMakeFiles/splitfs_o.dir/vfd_table.c.o CMakeFiles/splitfs_o.dir/write.c.o -lsyscall_intercept -lcap -lpthread -ldl -lrt -Wl,--version-script=/home/om/wspace/splitfs-new/src/libsplitfs.map diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/progress.make new file mode 100644 index 0000000000..3040898ab1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_shared.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 30 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/build.make new file mode 100644 index 0000000000..f4d7368c4f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/build.make @@ -0,0 +1,81 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Utility rule file for splitfs_static. + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_static.dir/progress.make + +src/CMakeFiles/splitfs_static: src/libsplitfs.a + + +src/libsplitfs.a: src/libsplitfs_unscoped.a + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generating libsplitfs.a" + cd /home/om/wspace/splitfs-new/build/src && objcopy --localize-hidden `sed -n 's/^\s*\([a-zA-Z0-9_]*\);$$/-G\ \1/p' /home/om/wspace/splitfs-new/src/libsplitfs.map` libsplitfs_unscoped.a libsplitfs.a + +splitfs_static: src/CMakeFiles/splitfs_static +splitfs_static: src/libsplitfs.a +splitfs_static: src/CMakeFiles/splitfs_static.dir/build.make + +.PHONY : splitfs_static + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_static.dir/build: splitfs_static + +.PHONY : src/CMakeFiles/splitfs_static.dir/build + +src/CMakeFiles/splitfs_static.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_static.dir/clean + +src/CMakeFiles/splitfs_static.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_static.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake new file mode 100644 index 0000000000..7e0291a09f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/splitfs_static" + "libsplitfs.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/splitfs_static.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.internal b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/progress.make new file mode 100644 index 0000000000..a3100dd4e8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 31 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake new file mode 100644 index 0000000000..19fab2149b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make new file mode 100644 index 0000000000..6d066c27bb --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/build.make @@ -0,0 +1,146 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/splitfs_static_unscoped.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/splitfs_static_unscoped.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/splitfs_static_unscoped.dir/flags.make + +# Object files for target splitfs_static_unscoped +splitfs_static_unscoped_OBJECTS = + +# External object files for target splitfs_static_unscoped +splitfs_static_unscoped_EXTERNAL_OBJECTS = \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/add_delay.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/execv.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fallocate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/file.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/fsync.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/hash_map.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/inode.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/lseek.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/out.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/path_resolve.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/preload.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/read.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/relink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/staging_thread.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/stat.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/truncate.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/unlink.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/utils.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/vfd_table.c.o" \ +"/home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_o.dir/write.c.o" + +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/add_delay.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/execv.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/fallocate.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/file.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/fsync.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/hash_map.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/inode.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/lseek.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/out.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/preload.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/read.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/relink.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/staging.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/stat.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/truncate.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/unlink.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/utils.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_o.dir/write.c.o +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_static_unscoped.dir/build.make +src/libsplitfs_unscoped.a: src/CMakeFiles/splitfs_static_unscoped.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/om/wspace/splitfs-new/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Linking C static library libsplitfs_unscoped.a" + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/splitfs_static_unscoped.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/splitfs_static_unscoped.dir/build: src/libsplitfs_unscoped.a + +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/build + +src/CMakeFiles/splitfs_static_unscoped.dir/requires: + +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/requires + +src/CMakeFiles/splitfs_static_unscoped.dir/clean: + cd /home/om/wspace/splitfs-new/build/src && $(CMAKE_COMMAND) -P CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/clean + +src/CMakeFiles/splitfs_static_unscoped.dir/depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/om/wspace/splitfs-new /home/om/wspace/splitfs-new/src /home/om/wspace/splitfs-new/build /home/om/wspace/splitfs-new/build/src /home/om/wspace/splitfs-new/build/src/CMakeFiles/splitfs_static_unscoped.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/depend + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake new file mode 100644 index 0000000000..54d9c4a6a4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "libsplitfs_unscoped.pdb" + "libsplitfs_unscoped.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang C) + include(CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake new file mode 100644 index 0000000000..6e5066cc09 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libsplitfs_unscoped.a" +) diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make new file mode 100644 index 0000000000..d827cd848f --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make new file mode 100644 index 0000000000..7f6695e41c --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile C with /usr/bin/cc +C_FLAGS = -Wall -Wpointer-arith -Wunused-macros -Wsign-conversion -Wsign-compare -Wconversion -fno-common -Ofast -funroll-loops -ftree-vectorize -m64 -Wmissing-prototypes -D_LARGEFILE64_SOURCE -g -ggdb -DDEBUG -fPIC -std=gnu99 + +C_DEFINES = -DPMEMFILE_MAJOR_VERSION=0 -DPMEMFILE_MINOR_VERSION=0 -DSRCVERSION=\"a5a036a\" -DUSE_VALGRIND + +C_INCLUDES = -I/home/om/wspace/splitfs-new/include -I/usr/include/capstone -I/home/om/wspace/splitfs-new/src/.. + diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt new file mode 100644 index 0000000000..fe613badc3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libsplitfs_unscoped.a CMakeFiles/splitfs_o.dir/add_delay.c.o CMakeFiles/splitfs_o.dir/execv.c.o CMakeFiles/splitfs_o.dir/fallocate.c.o CMakeFiles/splitfs_o.dir/file.c.o CMakeFiles/splitfs_o.dir/fsync.c.o CMakeFiles/splitfs_o.dir/handle_mmaps.c.o CMakeFiles/splitfs_o.dir/hash_map.c.o CMakeFiles/splitfs_o.dir/inode.c.o CMakeFiles/splitfs_o.dir/intel_intrin.c.o CMakeFiles/splitfs_o.dir/lseek.c.o CMakeFiles/splitfs_o.dir/mmap_pool.c.o CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o CMakeFiles/splitfs_o.dir/os_util_linux.c.o CMakeFiles/splitfs_o.dir/out.c.o CMakeFiles/splitfs_o.dir/path_resolve.c.o CMakeFiles/splitfs_o.dir/preload.c.o CMakeFiles/splitfs_o.dir/read.c.o CMakeFiles/splitfs_o.dir/relink.c.o CMakeFiles/splitfs_o.dir/splitfs-posix.c.o CMakeFiles/splitfs_o.dir/staging.c.o CMakeFiles/splitfs_o.dir/staging_thread.c.o CMakeFiles/splitfs_o.dir/stat.c.o CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o CMakeFiles/splitfs_o.dir/table_mmaps.c.o CMakeFiles/splitfs_o.dir/truncate.c.o CMakeFiles/splitfs_o.dir/unlink.c.o CMakeFiles/splitfs_o.dir/utils.c.o CMakeFiles/splitfs_o.dir/vfd_table.c.o CMakeFiles/splitfs_o.dir/write.c.o +/usr/bin/ranlib libsplitfs_unscoped.a diff --git a/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make new file mode 100644 index 0000000000..044b5ab390 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/CMakeFiles/splitfs_static_unscoped.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 32 + diff --git a/splitfs_syscall_intercept/utils/build/src/Makefile b/splitfs_syscall_intercept/utils/build/src/Makefile new file mode 100644 index 0000000000..42cb546467 --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/Makefile @@ -0,0 +1,1148 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/om/wspace/splitfs-new + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/om/wspace/splitfs-new/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles /home/om/wspace/splitfs-new/build/src/CMakeFiles/progress.marks + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/om/wspace/splitfs-new/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +src/CMakeFiles/check-whitespace-splitfs.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/check-whitespace-splitfs.dir/rule +.PHONY : src/CMakeFiles/check-whitespace-splitfs.dir/rule + +# Convenience name for target. +check-whitespace-splitfs: src/CMakeFiles/check-whitespace-splitfs.dir/rule + +.PHONY : check-whitespace-splitfs + +# fast build rule for target. +check-whitespace-splitfs/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/check-whitespace-splitfs.dir/build.make src/CMakeFiles/check-whitespace-splitfs.dir/build +.PHONY : check-whitespace-splitfs/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_static.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static.dir/rule +.PHONY : src/CMakeFiles/splitfs_static.dir/rule + +# Convenience name for target. +splitfs_static: src/CMakeFiles/splitfs_static.dir/rule + +.PHONY : splitfs_static + +# fast build rule for target. +splitfs_static/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_static.dir/build.make src/CMakeFiles/splitfs_static.dir/build +.PHONY : splitfs_static/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_o.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_o.dir/rule +.PHONY : src/CMakeFiles/splitfs_o.dir/rule + +# Convenience name for target. +splitfs_o: src/CMakeFiles/splitfs_o.dir/rule + +.PHONY : splitfs_o + +# fast build rule for target. +splitfs_o/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/build +.PHONY : splitfs_o/fast + +# Convenience name for target. +src/CMakeFiles/cstyle-splitfs.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/cstyle-splitfs.dir/rule +.PHONY : src/CMakeFiles/cstyle-splitfs.dir/rule + +# Convenience name for target. +cstyle-splitfs: src/CMakeFiles/cstyle-splitfs.dir/rule + +.PHONY : cstyle-splitfs + +# fast build rule for target. +cstyle-splitfs/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/cstyle-splitfs.dir/build.make src/CMakeFiles/cstyle-splitfs.dir/build +.PHONY : cstyle-splitfs/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_static_unscoped.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_static_unscoped.dir/rule +.PHONY : src/CMakeFiles/splitfs_static_unscoped.dir/rule + +# Convenience name for target. +splitfs_static_unscoped: src/CMakeFiles/splitfs_static_unscoped.dir/rule + +.PHONY : splitfs_static_unscoped + +# fast build rule for target. +splitfs_static_unscoped/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_static_unscoped.dir/build.make src/CMakeFiles/splitfs_static_unscoped.dir/build +.PHONY : splitfs_static_unscoped/fast + +# Convenience name for target. +src/CMakeFiles/splitfs_shared.dir/rule: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/splitfs_shared.dir/rule +.PHONY : src/CMakeFiles/splitfs_shared.dir/rule + +# Convenience name for target. +splitfs_shared: src/CMakeFiles/splitfs_shared.dir/rule + +.PHONY : splitfs_shared + +# fast build rule for target. +splitfs_shared/fast: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_shared.dir/build.make src/CMakeFiles/splitfs_shared.dir/build +.PHONY : splitfs_shared/fast + +add_delay.o: add_delay.c.o + +.PHONY : add_delay.o + +# target to build an object file +add_delay.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.o +.PHONY : add_delay.c.o + +add_delay.i: add_delay.c.i + +.PHONY : add_delay.i + +# target to preprocess a source file +add_delay.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.i +.PHONY : add_delay.c.i + +add_delay.s: add_delay.c.s + +.PHONY : add_delay.s + +# target to generate assembly for a file +add_delay.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/add_delay.c.s +.PHONY : add_delay.c.s + +execv.o: execv.c.o + +.PHONY : execv.o + +# target to build an object file +execv.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.o +.PHONY : execv.c.o + +execv.i: execv.c.i + +.PHONY : execv.i + +# target to preprocess a source file +execv.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.i +.PHONY : execv.c.i + +execv.s: execv.c.s + +.PHONY : execv.s + +# target to generate assembly for a file +execv.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/execv.c.s +.PHONY : execv.c.s + +fallocate.o: fallocate.c.o + +.PHONY : fallocate.o + +# target to build an object file +fallocate.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.o +.PHONY : fallocate.c.o + +fallocate.i: fallocate.c.i + +.PHONY : fallocate.i + +# target to preprocess a source file +fallocate.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.i +.PHONY : fallocate.c.i + +fallocate.s: fallocate.c.s + +.PHONY : fallocate.s + +# target to generate assembly for a file +fallocate.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fallocate.c.s +.PHONY : fallocate.c.s + +file.o: file.c.o + +.PHONY : file.o + +# target to build an object file +file.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.o +.PHONY : file.c.o + +file.i: file.c.i + +.PHONY : file.i + +# target to preprocess a source file +file.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.i +.PHONY : file.c.i + +file.s: file.c.s + +.PHONY : file.s + +# target to generate assembly for a file +file.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/file.c.s +.PHONY : file.c.s + +fsync.o: fsync.c.o + +.PHONY : fsync.o + +# target to build an object file +fsync.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.o +.PHONY : fsync.c.o + +fsync.i: fsync.c.i + +.PHONY : fsync.i + +# target to preprocess a source file +fsync.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.i +.PHONY : fsync.c.i + +fsync.s: fsync.c.s + +.PHONY : fsync.s + +# target to generate assembly for a file +fsync.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/fsync.c.s +.PHONY : fsync.c.s + +handle_mmaps.o: handle_mmaps.c.o + +.PHONY : handle_mmaps.o + +# target to build an object file +handle_mmaps.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.o +.PHONY : handle_mmaps.c.o + +handle_mmaps.i: handle_mmaps.c.i + +.PHONY : handle_mmaps.i + +# target to preprocess a source file +handle_mmaps.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.i +.PHONY : handle_mmaps.c.i + +handle_mmaps.s: handle_mmaps.c.s + +.PHONY : handle_mmaps.s + +# target to generate assembly for a file +handle_mmaps.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/handle_mmaps.c.s +.PHONY : handle_mmaps.c.s + +hash_map.o: hash_map.c.o + +.PHONY : hash_map.o + +# target to build an object file +hash_map.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.o +.PHONY : hash_map.c.o + +hash_map.i: hash_map.c.i + +.PHONY : hash_map.i + +# target to preprocess a source file +hash_map.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.i +.PHONY : hash_map.c.i + +hash_map.s: hash_map.c.s + +.PHONY : hash_map.s + +# target to generate assembly for a file +hash_map.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/hash_map.c.s +.PHONY : hash_map.c.s + +inode.o: inode.c.o + +.PHONY : inode.o + +# target to build an object file +inode.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.o +.PHONY : inode.c.o + +inode.i: inode.c.i + +.PHONY : inode.i + +# target to preprocess a source file +inode.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.i +.PHONY : inode.c.i + +inode.s: inode.c.s + +.PHONY : inode.s + +# target to generate assembly for a file +inode.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/inode.c.s +.PHONY : inode.c.s + +intel_intrin.o: intel_intrin.c.o + +.PHONY : intel_intrin.o + +# target to build an object file +intel_intrin.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.o +.PHONY : intel_intrin.c.o + +intel_intrin.i: intel_intrin.c.i + +.PHONY : intel_intrin.i + +# target to preprocess a source file +intel_intrin.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.i +.PHONY : intel_intrin.c.i + +intel_intrin.s: intel_intrin.c.s + +.PHONY : intel_intrin.s + +# target to generate assembly for a file +intel_intrin.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/intel_intrin.c.s +.PHONY : intel_intrin.c.s + +lseek.o: lseek.c.o + +.PHONY : lseek.o + +# target to build an object file +lseek.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.o +.PHONY : lseek.c.o + +lseek.i: lseek.c.i + +.PHONY : lseek.i + +# target to preprocess a source file +lseek.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.i +.PHONY : lseek.c.i + +lseek.s: lseek.c.s + +.PHONY : lseek.s + +# target to generate assembly for a file +lseek.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/lseek.c.s +.PHONY : lseek.c.s + +mmap_pool.o: mmap_pool.c.o + +.PHONY : mmap_pool.o + +# target to build an object file +mmap_pool.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.o +.PHONY : mmap_pool.c.o + +mmap_pool.i: mmap_pool.c.i + +.PHONY : mmap_pool.i + +# target to preprocess a source file +mmap_pool.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.i +.PHONY : mmap_pool.c.i + +mmap_pool.s: mmap_pool.c.s + +.PHONY : mmap_pool.s + +# target to generate assembly for a file +mmap_pool.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/mmap_pool.c.s +.PHONY : mmap_pool.c.s + +os_thread_pthread.o: os_thread_pthread.c.o + +.PHONY : os_thread_pthread.o + +# target to build an object file +os_thread_pthread.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.o +.PHONY : os_thread_pthread.c.o + +os_thread_pthread.i: os_thread_pthread.c.i + +.PHONY : os_thread_pthread.i + +# target to preprocess a source file +os_thread_pthread.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.i +.PHONY : os_thread_pthread.c.i + +os_thread_pthread.s: os_thread_pthread.c.s + +.PHONY : os_thread_pthread.s + +# target to generate assembly for a file +os_thread_pthread.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_thread_pthread.c.s +.PHONY : os_thread_pthread.c.s + +os_util_linux.o: os_util_linux.c.o + +.PHONY : os_util_linux.o + +# target to build an object file +os_util_linux.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.o +.PHONY : os_util_linux.c.o + +os_util_linux.i: os_util_linux.c.i + +.PHONY : os_util_linux.i + +# target to preprocess a source file +os_util_linux.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.i +.PHONY : os_util_linux.c.i + +os_util_linux.s: os_util_linux.c.s + +.PHONY : os_util_linux.s + +# target to generate assembly for a file +os_util_linux.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/os_util_linux.c.s +.PHONY : os_util_linux.c.s + +out.o: out.c.o + +.PHONY : out.o + +# target to build an object file +out.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.o +.PHONY : out.c.o + +out.i: out.c.i + +.PHONY : out.i + +# target to preprocess a source file +out.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.i +.PHONY : out.c.i + +out.s: out.c.s + +.PHONY : out.s + +# target to generate assembly for a file +out.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/out.c.s +.PHONY : out.c.s + +path_resolve.o: path_resolve.c.o + +.PHONY : path_resolve.o + +# target to build an object file +path_resolve.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.o +.PHONY : path_resolve.c.o + +path_resolve.i: path_resolve.c.i + +.PHONY : path_resolve.i + +# target to preprocess a source file +path_resolve.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.i +.PHONY : path_resolve.c.i + +path_resolve.s: path_resolve.c.s + +.PHONY : path_resolve.s + +# target to generate assembly for a file +path_resolve.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/path_resolve.c.s +.PHONY : path_resolve.c.s + +preload.o: preload.c.o + +.PHONY : preload.o + +# target to build an object file +preload.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.o +.PHONY : preload.c.o + +preload.i: preload.c.i + +.PHONY : preload.i + +# target to preprocess a source file +preload.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.i +.PHONY : preload.c.i + +preload.s: preload.c.s + +.PHONY : preload.s + +# target to generate assembly for a file +preload.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/preload.c.s +.PHONY : preload.c.s + +read.o: read.c.o + +.PHONY : read.o + +# target to build an object file +read.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.o +.PHONY : read.c.o + +read.i: read.c.i + +.PHONY : read.i + +# target to preprocess a source file +read.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.i +.PHONY : read.c.i + +read.s: read.c.s + +.PHONY : read.s + +# target to generate assembly for a file +read.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/read.c.s +.PHONY : read.c.s + +relink.o: relink.c.o + +.PHONY : relink.o + +# target to build an object file +relink.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.o +.PHONY : relink.c.o + +relink.i: relink.c.i + +.PHONY : relink.i + +# target to preprocess a source file +relink.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.i +.PHONY : relink.c.i + +relink.s: relink.c.s + +.PHONY : relink.s + +# target to generate assembly for a file +relink.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/relink.c.s +.PHONY : relink.c.s + +splitfs-posix.o: splitfs-posix.c.o + +.PHONY : splitfs-posix.o + +# target to build an object file +splitfs-posix.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.o +.PHONY : splitfs-posix.c.o + +splitfs-posix.i: splitfs-posix.c.i + +.PHONY : splitfs-posix.i + +# target to preprocess a source file +splitfs-posix.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.i +.PHONY : splitfs-posix.c.i + +splitfs-posix.s: splitfs-posix.c.s + +.PHONY : splitfs-posix.s + +# target to generate assembly for a file +splitfs-posix.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/splitfs-posix.c.s +.PHONY : splitfs-posix.c.s + +staging.o: staging.c.o + +.PHONY : staging.o + +# target to build an object file +staging.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.o +.PHONY : staging.c.o + +staging.i: staging.c.i + +.PHONY : staging.i + +# target to preprocess a source file +staging.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.i +.PHONY : staging.c.i + +staging.s: staging.c.s + +.PHONY : staging.s + +# target to generate assembly for a file +staging.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging.c.s +.PHONY : staging.c.s + +staging_thread.o: staging_thread.c.o + +.PHONY : staging_thread.o + +# target to build an object file +staging_thread.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.o +.PHONY : staging_thread.c.o + +staging_thread.i: staging_thread.c.i + +.PHONY : staging_thread.i + +# target to preprocess a source file +staging_thread.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.i +.PHONY : staging_thread.c.i + +staging_thread.s: staging_thread.c.s + +.PHONY : staging_thread.s + +# target to generate assembly for a file +staging_thread.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/staging_thread.c.s +.PHONY : staging_thread.c.s + +stat.o: stat.c.o + +.PHONY : stat.o + +# target to build an object file +stat.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.o +.PHONY : stat.c.o + +stat.i: stat.c.i + +.PHONY : stat.i + +# target to preprocess a source file +stat.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.i +.PHONY : stat.c.i + +stat.s: stat.c.s + +.PHONY : stat.s + +# target to generate assembly for a file +stat.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/stat.c.s +.PHONY : stat.c.s + +syscall_early_filter.o: syscall_early_filter.c.o + +.PHONY : syscall_early_filter.o + +# target to build an object file +syscall_early_filter.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.o +.PHONY : syscall_early_filter.c.o + +syscall_early_filter.i: syscall_early_filter.c.i + +.PHONY : syscall_early_filter.i + +# target to preprocess a source file +syscall_early_filter.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.i +.PHONY : syscall_early_filter.c.i + +syscall_early_filter.s: syscall_early_filter.c.s + +.PHONY : syscall_early_filter.s + +# target to generate assembly for a file +syscall_early_filter.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/syscall_early_filter.c.s +.PHONY : syscall_early_filter.c.s + +table_mmaps.o: table_mmaps.c.o + +.PHONY : table_mmaps.o + +# target to build an object file +table_mmaps.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.o +.PHONY : table_mmaps.c.o + +table_mmaps.i: table_mmaps.c.i + +.PHONY : table_mmaps.i + +# target to preprocess a source file +table_mmaps.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.i +.PHONY : table_mmaps.c.i + +table_mmaps.s: table_mmaps.c.s + +.PHONY : table_mmaps.s + +# target to generate assembly for a file +table_mmaps.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/table_mmaps.c.s +.PHONY : table_mmaps.c.s + +truncate.o: truncate.c.o + +.PHONY : truncate.o + +# target to build an object file +truncate.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.o +.PHONY : truncate.c.o + +truncate.i: truncate.c.i + +.PHONY : truncate.i + +# target to preprocess a source file +truncate.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.i +.PHONY : truncate.c.i + +truncate.s: truncate.c.s + +.PHONY : truncate.s + +# target to generate assembly for a file +truncate.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/truncate.c.s +.PHONY : truncate.c.s + +unlink.o: unlink.c.o + +.PHONY : unlink.o + +# target to build an object file +unlink.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.o +.PHONY : unlink.c.o + +unlink.i: unlink.c.i + +.PHONY : unlink.i + +# target to preprocess a source file +unlink.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.i +.PHONY : unlink.c.i + +unlink.s: unlink.c.s + +.PHONY : unlink.s + +# target to generate assembly for a file +unlink.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/unlink.c.s +.PHONY : unlink.c.s + +utils.o: utils.c.o + +.PHONY : utils.o + +# target to build an object file +utils.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.o +.PHONY : utils.c.o + +utils.i: utils.c.i + +.PHONY : utils.i + +# target to preprocess a source file +utils.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.i +.PHONY : utils.c.i + +utils.s: utils.c.s + +.PHONY : utils.s + +# target to generate assembly for a file +utils.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/utils.c.s +.PHONY : utils.c.s + +vfd_table.o: vfd_table.c.o + +.PHONY : vfd_table.o + +# target to build an object file +vfd_table.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.o +.PHONY : vfd_table.c.o + +vfd_table.i: vfd_table.c.i + +.PHONY : vfd_table.i + +# target to preprocess a source file +vfd_table.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.i +.PHONY : vfd_table.c.i + +vfd_table.s: vfd_table.c.s + +.PHONY : vfd_table.s + +# target to generate assembly for a file +vfd_table.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/vfd_table.c.s +.PHONY : vfd_table.c.s + +write.o: write.c.o + +.PHONY : write.o + +# target to build an object file +write.c.o: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.o +.PHONY : write.c.o + +write.i: write.c.i + +.PHONY : write.i + +# target to preprocess a source file +write.c.i: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.i +.PHONY : write.c.i + +write.s: write.c.s + +.PHONY : write.s + +# target to generate assembly for a file +write.c.s: + cd /home/om/wspace/splitfs-new/build && $(MAKE) -f src/CMakeFiles/splitfs_o.dir/build.make src/CMakeFiles/splitfs_o.dir/write.c.s +.PHONY : write.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... check-whitespace-splitfs" + @echo "... splitfs_static" + @echo "... splitfs_o" + @echo "... rebuild_cache" + @echo "... list_install_components" + @echo "... cstyle-splitfs" + @echo "... install/strip" + @echo "... splitfs_static_unscoped" + @echo "... install/local" + @echo "... splitfs_shared" + @echo "... edit_cache" + @echo "... add_delay.o" + @echo "... add_delay.i" + @echo "... add_delay.s" + @echo "... execv.o" + @echo "... execv.i" + @echo "... execv.s" + @echo "... fallocate.o" + @echo "... fallocate.i" + @echo "... fallocate.s" + @echo "... file.o" + @echo "... file.i" + @echo "... file.s" + @echo "... fsync.o" + @echo "... fsync.i" + @echo "... fsync.s" + @echo "... handle_mmaps.o" + @echo "... handle_mmaps.i" + @echo "... handle_mmaps.s" + @echo "... hash_map.o" + @echo "... hash_map.i" + @echo "... hash_map.s" + @echo "... inode.o" + @echo "... inode.i" + @echo "... inode.s" + @echo "... intel_intrin.o" + @echo "... intel_intrin.i" + @echo "... intel_intrin.s" + @echo "... lseek.o" + @echo "... lseek.i" + @echo "... lseek.s" + @echo "... mmap_pool.o" + @echo "... mmap_pool.i" + @echo "... mmap_pool.s" + @echo "... os_thread_pthread.o" + @echo "... os_thread_pthread.i" + @echo "... os_thread_pthread.s" + @echo "... os_util_linux.o" + @echo "... os_util_linux.i" + @echo "... os_util_linux.s" + @echo "... out.o" + @echo "... out.i" + @echo "... out.s" + @echo "... path_resolve.o" + @echo "... path_resolve.i" + @echo "... path_resolve.s" + @echo "... preload.o" + @echo "... preload.i" + @echo "... preload.s" + @echo "... read.o" + @echo "... read.i" + @echo "... read.s" + @echo "... relink.o" + @echo "... relink.i" + @echo "... relink.s" + @echo "... splitfs-posix.o" + @echo "... splitfs-posix.i" + @echo "... splitfs-posix.s" + @echo "... staging.o" + @echo "... staging.i" + @echo "... staging.s" + @echo "... staging_thread.o" + @echo "... staging_thread.i" + @echo "... staging_thread.s" + @echo "... stat.o" + @echo "... stat.i" + @echo "... stat.s" + @echo "... syscall_early_filter.o" + @echo "... syscall_early_filter.i" + @echo "... syscall_early_filter.s" + @echo "... table_mmaps.o" + @echo "... table_mmaps.i" + @echo "... table_mmaps.s" + @echo "... truncate.o" + @echo "... truncate.i" + @echo "... truncate.s" + @echo "... unlink.o" + @echo "... unlink.i" + @echo "... unlink.s" + @echo "... utils.o" + @echo "... utils.i" + @echo "... utils.s" + @echo "... vfd_table.o" + @echo "... vfd_table.i" + @echo "... vfd_table.s" + @echo "... write.o" + @echo "... write.i" + @echo "... write.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/om/wspace/splitfs-new/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/splitfs_syscall_intercept/utils/build/src/cmake_install.cmake b/splitfs_syscall_intercept/utils/build/src/cmake_install.cmake new file mode 100644 index 0000000000..03c635148b --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/cmake_install.cmake @@ -0,0 +1,102 @@ +# Install script for directory: /home/om/wspace/splitfs-new/src + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee]|[Nn][Oo][Nn][Ee]|[Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + file(RPATH_CHECK + FILE "${file}" + RPATH "") + endif() + endforeach() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" + ) + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "${file}") + endif() + endif() + endforeach() + endif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee]|[Nn][Oo][Nn][Ee]|[Rr][Ee][Ll][Ww][Ii][Tt][Hh][Dd][Ee][Bb][Ii][Nn][Ff][Oo])$") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + file(RPATH_CHECK + FILE "${file}" + RPATH "") + endif() + endforeach() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug" TYPE SHARED_LIBRARY FILES + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0.0.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so.0" + "/home/om/wspace/splitfs-new/build/src/libsplitfs.so" + ) + foreach(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/splitfs_debug/libsplitfs.so" + ) + if(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "${file}") + endif() + endif() + endforeach() + endif("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Dd][Ee][Bb][Uu][Gg])$") +endif() + diff --git a/splitfs_syscall_intercept/utils/build/src/libsplitfs.a b/splitfs_syscall_intercept/utils/build/src/libsplitfs.a new file mode 100644 index 0000000000000000000000000000000000000000..2dde12d997691b847b4a692c94ee7eb8c5b5ad83 GIT binary patch literal 729156 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 yxrU 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 B1`YrK literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/build/src/libsplitfs.so b/splitfs_syscall_intercept/utils/build/src/libsplitfs.so new file mode 120000 index 0000000000..e1939fe0df --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/libsplitfs.so @@ -0,0 +1 @@ +libsplitfs.so.0 \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0 b/splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0 new file mode 120000 index 0000000000..1d62d8ebad --- /dev/null +++ b/splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0 @@ -0,0 +1 @@ +libsplitfs.so.0.0.0 \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0.0.0 b/splitfs_syscall_intercept/utils/build/src/libsplitfs.so.0.0.0 new file mode 100755 index 0000000000000000000000000000000000000000..bc6e561e651cfa466800bd6ac6e1e888a1b5e789 GIT binary patch literal 352568 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Ξ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¨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�Q;jy=cFz&6MmP@bfQ1P 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ð$FZ>syYbiQr3$O0Mov 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

E!jqoFv0Mj$Nj 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

CZBLnRDEcwNy!==U9th=GGT7F6HJk|0IjQh4Gmd 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 QtVe5^_wtVw2;C~ zt9KziC#9I)`-OA`{U&rp`=E<~KPb%QGsxTLLZSYCRQ-P@*?zF=-yAT6igcPjc7~)F zPUvPoq~?WG{}3u-A67rpnq4?yx*Y#+Dr34FX)Pd~BrT8WBxz0DCHd#-Q(Dgz(%M2Q zO9+)KM@Z57W&_ox45<_0#An*rf>_+j;xc zrVMF^p%MS3>haIz_Iz7Dc1OJKG^}45NK;ZsX;Z<5^-pPSrr(6Ftf4hFt<`3#U>}|^ zU5=10E3IHjjb>m zTD*`37)oagK<7W}kq*z0s^jK-N zH>BfBkCoQ;`ZYeK^&BC+j+<7diC-q%jUTq^_*XEO{|9y9|L!nXwvhJXl6;VeE^P?A z|8Xc}&6Ui@$L`^Ub2R3X{!50qY_X=6gvi^bCx8T}Y2K3x4t7btCLODE~a z1S+kf{?BlMvUa5@D?O=ylQbVq5&VlolAHT~hFw^v*I&#{H?-&NKN!L;eG(Yj*M@>F zyO5&lAC%50t#XCTAVZ*ZMrkcCWKtOdr87$FQ$o6r5XfaT0J{(YdFry)e?J*P_)()p#6r1f;^BnQoT|H|s4NU2|qyno{SZ>sD= zulc@Ub{zf4!AGUPf39oqhvfZv zA{O#!t>4eS!U^44`p;zRpP>zzZ-qerE@?hU@^T1azVqt)$mXlreWlye*X!w*K@R+X z-v86U|7qa=G|+DitR6)D&qj1XzQ2D2E^LB9Wc>RFxgF1&)!o%OtEH`>wY#xt)~5OM z67%NFY;9@l-ZXPj-Umr00^!oA;PO6X zrYqUl(q53ej`~`h^xD$4cD8sncO|-$Ev@i@EV;R(smlbY6W?MYa${37V4RtfY+2s~ z7rvX2TN0HHjJsRfP28?zeNtUW*U%%A>g>YhiS><*ok9a&lhAj!0pld=lg%PYS4V3L zJTp7myIM9O7$v58W1;mjzNY%l*3Gz&uQl03oH^H&Q@9~6l2^i(Hc&J)btDt(+S|`f zbhHC7L>q9SUy^Q@H}P>>V_T4=MsP4xl5^v!@9Jvml<3`UEzp(08(W(jC^JZ!E`w~V zXT3p7C$H&-h%;N-PBE2q2ry%!uljy;|JIwLJN#VyF2(PveQ?BbqeE6jH#SFy#70MZ z{N|s;@?y6{H${%~uZvbEfqiltk?cbFuIMY?O)teyIU{yU?6&Co$Sgm)ZeMKKNej=2 zoqIyz+OM6oaP8Nk6JsYwzql? zwsg<~(NUK~+m~)wR2$98J$FDP`s(?Y4Dh3$85sLbwEL0)(dfe$G{gVMfJmJW--8$A zvTt8>WGpwiHsEqybkou^XCnG9&L{FO4~*@LzHxr?{vN5Dpj+O~hX0-}7Tj0Ut};0s;j7Ci-2-AKP`y)6wCpqMKql zv02euw%run<1NMSQZU%PrTKyAilx!xlhHabjlLbdDSBw^H&5SuP4uwHd_Q{3P1nTo z%VtII+ZH?d>F#LhuIP_1j2!Jp{}_oS6Vc5l7lX&mTUI>~U2;kE#AI|a@#q}@O}>5M zlhNO9jV$$}H~5k1espN0%#U6hi8V*}T(~d#2QPA>AN};U*sAEQTTybRxJE}0zbX37 zXyhpWb71?uEjK*?Zjbu=qK|qgqwj6IKl=TxDAVuykz@R5J6QcZ;L=Nf7lwCfrH=r5YD5VJ-97)XEYDV zyu3A*j9%`?o{arxbOI9l=GIFf42o(q0&m?4iMWoTzWF!Bx}%SKp!q4DNJSsG5Q$3I zEr=ie`&O`g&x2MTi|o7kq=nJfw>C#7N9Oq`qGa?*FLHt(y>}Zp-+19~qOV3SiC%YM zGWv%|bM$;9@;v4J=`FA{&;*sPPf z^8+h-*|yy1Wl%JfdCU2$B6Uu*TL$@uMFs;*B-WzSXh?K6p^w#I zm)0;)94{*`G33&t1HV%hOQR$=p0ZSFRW&HQ7Q~JCz_i(o0>da z>AH^cw_a6WTU|&3sf>xXrcESJBNV}6Z0u}FHYL{7W7jvP7`L?5cXoK@7GjECQ@8>}Ush5Bk%Q}m z6HseuZSCsB;<}3B+Oo=uM1q;uSeaIR^61xA-t1mpqmr8pp3IoF{b%85ERdr=;X|d4) zDFrpYw7LRn!7=6Coo!u-(u&I3nz|~lX;Vuw(cTvLJL)yTTMba`dNj5|DbA!qeOi<9iTMWC(s&xGtb<~(r#ckB}t*z*UNUMnr z^{w5ebg5OARwq`XA>yYTRnl}OHMIy?UgNd4x2?^A1g0EMO9Tl~c`&%RY;h$!qz%_p zl@^yRE<;01G+V-xx(X7-i4~>QHI!ZQhja>BA55vWx1yOtx9jUW&y~7VRGcU&Th5un z%na4vYiirjVf3~hS9zm>8c%yiQyZx;l}=%8ZFQoiwy=0vVM$3fhpaduQC40xyC6}y zc=7B4h}?!+)oJ>-74uSIMP*Bvz93OmR6}YitS$9)D%sYKf{@vyx3;x?4cZl78}2PG ztSzJ-$jlED&A24IPbqdbHKS8s+t$>WgStsQgmk^qU2*r8pC~cILwQ+6Dc>Z{-8HTs zH@##~!;ss+-O|<0nxo-?`nB#BbSGvGouK*yiIA?*4)=5zhcMWH9QA^H2kFc zVRIXLpr7)pd2>j0^X6!jQ|!LTicXO*b{yobwFHkdTF((maDkRuBuvs;zdB~CDp;B%mxnyrcHsyUrDAQXiNcT>fRE(VxhsJKG`BE zRhK48>Z&+nAGB_yRY~J4-1?4Qjz&$+ZJ#NMmdkqFD-SW6TkF@FaxF+KM(;?4B?YD$!#c@-7blzJUqbQ`-zYgp6r5@;Pz6cgLSN}^;*bs_XykG8nJrFCDI2M zCPU8UKpkOO1=_sndAdAIYfOhJqbW+4YEzvV?T{7r+MQe9wySz$sk9+7Q!`8uvzn^1 z3hjd1o143Eo1RHSXMstYv@lj(xKid1HSCwZJ{UF6Z|X$*2T$o@YYG>a2J-?FWo2b` zNkRwj>e3~ptEzYwWQIyaEv#8xQ5>(Xtf;K3p_v)6qY=Nj9GOW3V<*9;QKjWx=e0q{ z^+9zHwQiO!=^OgUPCa&FIW*4w-um_R9cEYxIvEa>Chz>?D1CDjRxDrKjenFNhiT;YRB zl0C%GFw)M=lhdv##UwsnSuGQIt}!~9<$eL}zPSa1T!Joo#D6|n1!T=8YYtg+Jydp# zT8#x>V+*Ej$%b{*7bnd*m^qwdyL zR+ORMQiBdE0S$oNZ8Z3jFx9n)EtjxWF37FPks$DW-(pW_;Sc52E z*l7)`QyD>viL?Z*R~2Lu#Fie4#we8qKWV`t%sO7BX`hv}@@i zbmfK}JIEkQH;7kUSzex4Sz5LvUTd;IGV63^Ip=^TxHJM{!c>n7Gx;aq{GeMQaJKou zY=eAgyWruBW>l%Vs3NLB&0U+@q(`)-YAJPNSj9+^s`hm?ag4;IWHSd&tZQnecB}kk zQb9?VRjruEGQ=yfEKjjS5GLB__b>>W;u7UFr_>7?8C_`Ug9XHDaEzCh)S)#mp}Lje znVU=zXu?3fKz&0)6Xu@SUiA>X7OU@F&-t}eqei#MkI)Sz5bYfkp^cCMa&KG_lV@vp+OM-f2-PGq(jyyW&(+f=O(*nH@{{ z1S<^g3EAq?jA{7M$(&B>q^D+W+U1+t?!d5*9S<|nH&u-Dg#yPcT*pR?FL`Ft!M$p# z&oXnX!WE&zQ%&4-20Hb^u0df5#vqJ_m?6>JlQ)qzGJW+w^i0Rl`d02o*wO}igboiv1W2%F_C)ug%#3Fk=wkoK5Ls8R`lE!ZonoP+O z?&Kbf?3FdGx+(L#-(b3$Brod;tv$U@mt^EdA5*-nsuGJV6SJytrD;6U>=M=3t})r7 zKCHM9C8{G19>Q=W(_Yc>atI5s8f~`HERnQ|(s*iWKdTpGiH?wHIkc0APQa9PO}w-m z3w?;Z7$fA8<-AQ)zk$~K*z{?KLd_J3D9mi3xO#P!$$%^rWZ@gMMI!CH^(3wQKYGpu6JDYR<8a&BfS3WMKJeT!&4WZ{TNq_GAhJwE}&Vr zhD#MKe^lp-X_16FPusklhS7!>YzSG87eR*ZP%8v_McQ*F&CsT8P|;E6XtT1?;)C8n|6+AbWIHnXuOlUu?6KwcRy0i<^_vZ?LH%eEL$NX zni4IwO-s_r0JaoqmjT@mDEdSUwl%PJy!LJ=FVU(S7DYaLD8a@ z>N7j&s9)P8D<64MLS1Z5-@z!^*xqd_g2*V%nq{OpQLrv7J*}>61)5M$n@|vD8cw67 zwUrSx58mn^O^4052uJzqG88_nO{-SgYtvwWt>*_7Nm|pG`e)|myn}5$@u0$zk(B!! zGZdn&$;M-Ib8B~(slgbdYD#$#jn+zy)hUhw7np7K8hC~XS!v>2R8~>qEvcx>DPFK3 zXKwDC+`OEEy!?52^YRwt%v?Wj4y_3dqNW8v4{+B&nfy}hFgUOYc(nu+la4`}en z3qVy_F>GGG&FtuGPjV2rbz&EgS{pXi(AmfWJHzgy4E?DMXD)tkNpbOsIn(OaV7A+B zayWBdH~aFp=FiK`o0FSgFx|!V%Lh9auafZ~LHCBlawc?93XG2dHpF4oE;+G$Ixs8b`EqC@u_N z<&A)=iN{sZq7gY)4k#Ki?TUegBl0dCR5)V(_Q6X=?8%9IBWuKbK;Q+EfLF=T`QULU zbHW+?^b1~B60a+wB_nb!C3&_FtQzrLPGo%+%TcIulnk8%@>eA;pZSEiS42Q?DaGAB zpgn8E_(GO>$ykDOsT)k#+HiTZrT` z{PzegU&aYq(Gm14Iw}ctv~O2WyoL5!x5%lo`mm#+bbC{GIA+` z3x{$&DwnYSyf{f&9^k!ofY`VuN-x%gm?*ur6JnzD)=-Fv(wi}k!C9?%K`F(b>$cED z>AfGv91cIxKPR|eNl(W-6R!H;Iw>^KkXJ`fLf9a0lu+>7U+i8C+lTy{BqS!kq<_LY z9Q<7PDcy4a40H5{caPfML>cDR_ zph|&{!x^#gJ*gnjXIZ|KGwKaXdBpV!ej^rc*P*Bvc2X|MlggJe{0AJAFO}P_8Bt6B zN>9I0Z?x?V+|i(S3?Ozyy+ir};){AXq&UPxJ)FNBVxs0Y;Ixpaxeho4pOl6X5cP7> z@L^oV)9W*xmW+eZ)94Qs`lFnXBLsJImLs_H4z)K`aB3g6IiB&s+&9{IzR*|MAlxSi zexidf6x{v(pjhzD4t<&6UvltD!Jl&QI>DPA{0zaLckp__FL&^@f`8M&$s09SH}?sl z>mbr=v*&HkfM1sZzbylPPX_#Z8So!wz<-?q|5FBhDRMa)Epm^H4Ltq=dp`sHaL|S6 z;T+{7LjaG*z>WYt@voAGuGi5|&%lTJ>oESOWWeJY@Z}lsvoqk`8Su+8;MZlqZ_j|= zn*o0&1OBTF_@6W2gP`{?y&akXpOOKen*m>(0k6$~H)p_;8SqOo;8$nBKbHajY6krN z4EU27@Ru^+zt4cbn*sk1X%|(}5$i1~F|>!U@*0@|KQ;qCGXq|f0T14rZZPY))D9j$ zK9OB?cI!rNE?x#p<`&ow_IZ24-P`N4XMqR#%p~Ju#6EAzguJ|#J8!|9+0H%)HZ*fj z$jeKA&CY&UqiaunkYl}q=e#wRTV9;+!J0$X0{={FfiguoL z(58pH(W99+`#G>uE>a4!ZKgg6P3>L;PrsDH zyf>o0=3qli5qaN0H_Z4+o`&%gD%-Om5Z`QKYM4AK3A}wG>N`SxLM={dBFp1H+QOji zaE(WKHCv+mR-xHc4c*3+eIN8|WEPko%;<633jW_aU`$m8ywSobuF`MJfPccmZT?SN zIL$$o<>G$hh*D`K`h2bc=)@!>TtG|H@~n#fR30ihs<)ZFwHffd99JpKS5@yM-^b z@KGcP49QPlhiJMv7H+3|oQ2zZILE^6{B{XWKX!h%S@d>(X`VyI)#noyek#IM&gU%L zmgfz@X+MkB_)1Un88XDb5dVt*U2s~-5xtrL7-z{)FvUrd2j(OTr?rjpq4^0JqAkL| z;%^G>%JUbC-j-*-;I2Fai7|}I(`vll@fL2&L*p_TSDr0`ABV6~{HvVXEk4Iu__Y?F z#TI^J2Kw7A`Xv_q*DO44;rCg1nT7wr!iz2ZXM(%(?-iW%Lwg>YulFrJw*13n-^8Uq zRB(!B%YU@sZn^~)AKc{~q`SbvZF!bi{B3!vEqa^J4vT)N#s8~P#X8`#(4x2XzuUrXJ#Uu{K$4TjR+Z;D3%BXt&VUaZ zg2*t$hmOEjKH~&;^EJVuxAV2c!mBMlJr-`u^SuoCuPvMoaZ`DQXTbyGmdj)duSK}h z&k&sC&$aM*7QL19bMe*;_~jY! z&u74&&VY{_1|`C{=}r@z@--Fzs{cHT-kv`!vv6C_Nei#D_*`q@HvQ8X@c+($zir{P z7pZbaaPun}%2zr56|c5%x^zhK+bw*Rh5ydNS6g^Yw!(@3=@x#1h0`8@@?UD6o0|O6Bho4g`Z>L*|Hx&a@Je;u@=6@!cVmD1`A&yxZD4qVbR)!iiq-n*=AU$ii>SKrhXa(`>TnDL-V0Pc#0N z{}BYjkesvdulTV9!Vvvh{41VMAdKcKX}liIjmZ$6hkvDCOdyQQN7qxzr`3=J$L|wP zX(=Dd3mKPByMY6F8pXd!eviZNI{Yi2ZGsbj`ae_V4Odxs0o+P|o#2#iiG_braN;rB z!tWB?rT>maKgXhfI0OAN7X4g{{wEpe1;)-au7gz%er1}^dTW7S^Q9z2f2ex!E7J;o zl6ItpOZUV0QNVMh;^-4bs&|ABlm3_50~y74$@ook9x{aI;9u7*)c2Ahd@{R?HACFW z=Px24>70z>KNH4U4;8;c+DV}y59sSe&bWi;2>(h4|Gp@R`Ytlc|3NBfm^J1nz~2$Y zuXpgZ;|-woQ~7+F3Ib-k`3d+uCjGM3Po;lB^m)BQ|DD4Pp!HMfZ;?vzb%*{<=@=ey z@S!5-%MQLw{J(SXi$wmn9K2fizwh8PM9)Jcp32!O`5o)vugE-dl7rWeG>ngP@GO~! z&2{ka2%orv?-zWzgXfT7F#3Ll%2_HEzrmqDRq!?kFEMPq%?|#=XcMr*!QYT_yvD%` z#~J#Y9DHZQ;9qg@EWzn{92u4WG4Vg;;3tXy1qXjr%4?5<4-@_T(ZMH+9{%Rw?}$7D zIeAKa1WbI`{-B-{TzoN78T4bMU(j zd#}jBe;{~;gFhqV*Xa)aRjCj3ypN2^pJ%*Yr-KXZ(Q`dAN`IE<`LhmwzUb$62R|U? z_)Q1@hxGFgI{3|^|EC@Nb2WZcvIJ|+YH zXa|2v>dhnvZ+Qu3e!0k3DYQ^`e(Y9R5d1J%7@{=L`Ow{i+H3FGQ_jpD!>3?B z<^50k`7gA?&yD_070C3h;g6wx?l!zL;_!#zZ^C{H^jpk#Mqu7+Yxr02Kf~}c#HX|2 z>@Rv4ej@s}o`&;2PG7^fqrc5E{6oZfnBfbcA8q&!?C;|YZw>vShChyWQegP0h}$&7 zccMKP8Qul^(J_W!jDD%a@XJw;#~OYO@~t-f71Y-hTn$c^1g!_%;w zZTOo!?ihYI_M-z0pRWa!X}sYp!Q+O%0soIMydLd&hT-p`zUCOdAL2aE@NKAszc!qY%>QWk30VHk@QqkbL4U?LTnL_O_-i=M%4-|` zM12F!e>xc+gMM$rbA!#jnBiX`-`dcPn2;hRREi#Y5s{59~84POWTx#45c z4!<>gf9#LD4gUzog+B~G1nsH??9u|Hm1AAf46j2|wRA{0h_yuOnIBhtSV_Y4jJv{`ZF8j(*@5!{6iiKiV(t ze-D3J8P4-^{tiI>KB&hIMqda!T@9yy`x>4L|1%B$2chhZRP@9R0&8!+T*rT4#71ex7Fd797_$TaNwWJi{lWom^!2L1-se7@mT7 zUS~M(OWthw5|nGJ;rS@nV}`SzdeQI<=zlSMKH6tn#9LQuoKHi;+S~9y5ug5sw?%s! zZFmXzB*SYZ51r;1J_h~sv4&rTd{-L26#k!P_@`*k7aHCV@w~?HdEmT`XB^&xou`cc zebnPttf&4Z)ca$GUxjwU-{q*^j&i+Y^dAS|@mLP(Q{g9%OXNSHee!uK@^j#id`H8d z$oc#0-iGu1vbW*;A>Sc}Uj+LH89p5CZIa=4pnew_-XC^q4DYB8%f#~|`oAao$#q75 z6!P6{_%*1niwy6I`vdnH{tEcxhM$S^gqI9I5cS9FY5KVo{(ollBT?_a82%*ASN}A; zE6UX#`P2UG;JpoRhvVR6!?&RxR~fzp{5D4W_S_!2ZkRF{*~e7Xm39m&hpMh`B<)BaeP^BcpA>5`1~97w_(4&)aa+9 zU%JO|w!=pZ|2O(c-shwJzR34uqdy1z(T|3Ih~shu$2Z!kgP;7}jQkD6ZHUqT7VLK3 z!G`Pmx;hmaJ{f+@HT(v&dTD{ArvIJZLzNi?15K2m1353@<~y{AoDjlZO3|apn*anTB75I1e|Rc4ipf3j05w zYoPrRDAzipUxNPaYQx_^e|s~yHYe;7zDJK4J@32m_dU&bU-+)GSB(BS?5FQKT=n`4 zu}&X4yr(Q@<2d-G!&U!)ie>uF;i|t;9gyjFhpT=c>=!BMzZoC4^L7qb{Rz-_H~cN| zn8P(+{$8GK_!=AsCxA1aaML^7(Z|FNr#TK+e>$QPiX9%KSmuizu6jO4wG^EB>brkB zZ83a8fV~@yoeJc8Yl!|aqvvx}PaFLV*#FG%#o&9P-OF4ceuk9SJ^>`cNzo)~s zy|EwY?r_!jL3@iiT=gthe}}8S7W%;sS3S!+%HgWt34Pq~qj4Oc>~OWiIL`xT9KP2) zWIEo_t9`y_xZdc0_tldz_bE zZ1_>&eEx#^t>8BseK$CJzsa`*`MziPTJYZ-?v}R|j$@4fMbPIM{xo>L;V*;F23P-k z%K!aw9A9AcJD@+#=y@Ky&f(f_r^49=hpT;_-=5=e)qf8C1rAp|&wHE`Tre; z^Y?>$93B(>IQg&B^A7JJ%lnV?vG)czY zcqg2PZ*}au{ygGv^@siWzm1)XVCQ4Q9|Zr(@b|%a-CIy2a6Jd&_~J4;s$jzn(C5jzhj5 z7(L$`{M_(WxDNfs*tr09TH}6?##47)ErU+HKcq2;$^XmbzfRfED_89t9Ct=LT+4MQ z@}1z=*SNigd=Gc@G2uM_nd5M^lZoq>g@#vvFE;j5;Lphp*K(oz_0D&=`ZERkn;h=y zA2J-5``$ASS3CEkTyGfuJorzB?~Qy@weymR@u#2N9Ip2N4m(*6ckAmQhpYZp=of;s zzBb`}vd-|Y)Crl^7|#1(ryI`e@$(Jm_4rkW^LqRi!+AY^pW(dU^@QQPPJh|(^(gNS z!&{*p{$M!I&pY8|ImRas6+FmrUbh@-_#xQeXB*DAEi{~Qt1_H%JKk`{?Nq}Vx3djr z+%7eoal6rQzVCXU;k=G`-0;0||Kdf%d7tnd!?RE?zZg#Yt#l`siSa)Q_0_@f`Pg6f zH9T?sVmSR7Z}=VPZzqHEI5H3RON^fNSmkg{-i7|B&fz_Uvwl}QT$2Z*U9EGt>RIn+ zI$V>FLw}CLRnPWtslzon1=q7zIb8K@CpSA>ldnO4hr?CR_Vb{_HQ65Z{)od>&vx~a z;oKkJH=O;Br}<`ov7q6_>&IKdVCc1*xAv?L?2UuOuZehcCLk; z!G^yJo@;m)^q+Z#PX(W3_(t&QhCc*8*YKafOAQ}{`y-WxF9ff3cudO0@}A&uE$@}k zuLoz`_}uwfhQEY(-el}VasT4>5d9NIe<}1Y82tyZ|AwPi|L38;b~;@B{}=3hVeIg| zh!(oBOuD%qAA9S9OzmU-%;zbRd>8q~9Ijo}8u_o&z?eVt+nXkJtaF`4#r#>K9exRa z#)GR&?LUj_$4TJYZZ)|bcIG%-%e4vD&kGHI9K6EtKf&t_AB7W$RfboApKAEk;F}G9 z3;Y7Z^Kia?iNiI?a$OIu#e`H+p7+m~KTE{_YsBY8aPHTqW23hW=k>{lhQA2?E^x-b zrB=R7o%RprPh;AP+u(W?D%u)oIeBfzgVya@as;4JSvH73*j4p)CpLcWg~ehv6`V}A|o zzwYQ`VrMh#?{v7@e-d`SF`U;ezZ(0uz<#u+Y%CM~-v;{~9j^A<<2<{E;X}ZCf=5KF zCU(I7frftvUTV09fk|7v(U#OG$i$AG_NcrExhhF=H1Pi9aM*30YQ z`GyZb+)51}jJTa>_|f2Z8P4~Do;RHDw|rta&rkfphQw9+NqvuAf&W@3+74%;z3mTf z^&^b_BD#r@Lb zj2&K|oNV~Hu)oppyTLby*uOc1KV|Iv8+Kkc`iJ4?S4QvQyzToCeVaZ({21p0pic*9 zeE3{`mf=4k-?@hKzU~TR|4`UJ$?zrMry0H({A|N{9(CTHGK0 z+1U9Rc2dycGd?|HLA=roKN!4|;S0dKfzzLdkniD!^Lgm$jvX~I5Bv2(hig+f74|C( zzX817@aMo+I$RO$Zvv;Et8qPeouk)$zk{9IjD7?3&l-K_{beJWUJTKHV)Ub+|J>*= zfcsz!u~A7d7f8nIM4GI8~zmR{KfDuz*icc(KGOSH8}m> zQyr6OtKoe9`&DCSDD1pz_-yc7thFRph&m;lG0SHav#&lEH>g0M9kN416p&<4k|18GQrvM;ZMq@PE0{-vRvz zM*lJNXFJ?&x0g6v+wBX`-(Yx)G+8OrF2j3)w;U9#XFPYnpLD~cIM3)}cyI6?;EWHS z3Okbx-vB<%*tr^ZmK)CZ6V5hvZh)PO41XT{ zYQw(;zsc|}IIiDiIQ92|v%Js2&+iP6vg=oF*x4*S;_J`DUJhqn$w;{Scx z;o3h;f&MGQe*$lx9c;`v+yy=WoN;cC^NC@G4*?%*_-yd;#{P4#f2`pHQUgEEGn~)2 zY&HDwHi7;{!}*=QPYr)m3nEiyPB3SAV`ztkhED@uY4}d?s|_zlxn4GW1^9P{cY^=z zhXnpG&OE>D1WrGx?`QPaAkOk#AAh1g2Kxs)yoD&%1Tyb%hif}&3;iO)8(Ib%tTucb z_$F}mzo-1qZ6D~*H+p_I>1Lznb5mO#uKV4SDAzNN9rd5n8xB|h*C5{?jGd|dgDw6r z{6z5R&|p2|b_MKoa=4rCK!@7upc-2N1-ovxY|Drywc%n|0(d(9jj{hR%VZt%m=I-z%Rsoa6L8AHrWXoP%n= z8N%N){D(aPe?AJ~pBg@Y&p`iW2>-$G(^>`kpF_AeGFZ?0y{AL4+#-ah8J?pJOs4iB zyo=$V!hZJ6QqTxkdf;gNM!Z#Ss z=NL~9;pZ6MsY_u0{1ASb;c;}hSB3B!3?GK_-WRtSIJ@R!gpeH_BSF#Htsd*6ic-G+}wd4CJx(cB;&-0!NZ#R!VfWgBl^kw z5MF3FzvnR{gwHj+s%uc*c_Dm};cEi9wPaDdgW-#CygNOF zpKbV$c#h()A^Z}<7otD8B7|RW_)$0k`bP-A!|(=__wEqB&G1R+&mRflPaD1f`^)no z{8hu>M10;1;i&$^@AzCsH=5ummVb__8a-dqU5gw)V<-3>Dw3&pFl)kbTPVTrf$l(~ zC!c8eb674m9E<)pUo=fWX}8Ac$yXYFE0))X@J)u(&%cH6D-Ear4;YR`?=i!1`@wr5 zguh|;x0`u|G^=eRYDC;jJp!{pc;-?eWV|7;b?L_Oo5YdEjhCWP?A4X6Jc zuZZ@^=Nmo!=X=c52i|$!I-{qbXNK^<8h$qnT@k|hoeN#9`w{)T+vv%+8BYKCzBTP& zH~09RQ}XlR53m2oY5ylB z_W6DZ_2jP@J;#0B5yJUB0@|VfKN>yxABNL^j*CD${QlPdxQ-;}_y&Uvr~ToE^L&Ei z5YP_K8;&%3ey6M?gmb)o+Ubnr&2pnBUv2o_&~yBJ+95y7==q-hWg(p7;nPkI?B8zm zq(6rmJ{NYTI^4Cx=f~*}#}%n@^lJZE*x~n2)J6~a&+$nT?#J5a86FiO4~yh{k*&+zUz|Ks@2 zv_n3`=zBoV?I$oqF=4jD9lgb9`p%$t#Wi2wfh}*;v zUSK%KGnpO2iw(aI_KywWHHH`AI)~%#SpUy8`ZHnwvJifq;pantdkDYRaE|xF@wDj= zIiEu$XMEl^cE~?8{A2j@RS4(vm9*ay@o9nI@hop=cn|0~&NlVrJ&k@a^!%PD_2k2i zp7q6XkErMUkvT?x0m@tIa6P5%sf|`9j*~aMlaQZDKsx-Ub>y$7>qt zaIF{o+?ROYop#tB_`5t zf*v6})9?vc=6E@@&-ff>^o+x_5I)E7i%{Ou5WduK#^Lx7&T-M{=Orlb8AeZjp5cto zRU!OF!xgvy@u1zhYhEFj$dW% ze`55s|DEBq&+p384()RsEOPq4AD#~-r~QG3)BZ5SX`kb1(GKk&Y4o&TW;pHh`+l@T z`y7{xoc7N)c4+?+!)gB-!)c%6ds+KW8a?g5Y&h+|Z8+_7oG@$uPot;(ws?M!dfM+` zIPG)1G3pr~e!r2N_Qx4Jv>!K|_Bn1D?a=-bqo@64;Cij8_tW0fmosEK-sqX{TEm&| z86kE!E*kymiv8{eV~76SWjOPF&~T35!to<%|4`gdf63^7!+p|s4IhO2bo{O??XX-N zkByw;wx!`YUvhqzt+T`Rl4FeqQ>OhKuIIxXkEoB~9QS63!(BUL9Ikd)-U){Dy}2VC z?%J8{aJ4fQ@hLW(;{zP)aMw<)!_^MoH$UER#`6@1yLLE^9plMy2uOCyp~mI~?!mM@O&u7NOln@PH!q9Pg-&;h#a@$#B+t55qmQ z+dhW#`k&tmV7@bPJvrLwInL*J!>@;)-wU7}es6T9(Z344{f+?nVx!*$eXZeNf%Cfq z%r_0!Kc^V|p5SK~-Us}G5PrGgqoKdi@NwXG7|!on+3ytay7zITUjREVhVVBHuYvv} z!&icTVK~2=wL66KeHzA--_1(v>^JMg{e*wOen-Q3J-lxS?``;Nu#;mruZKq&{w?$q z4c`r3V0Z^y|I9YLD|oTt{lSkloa4gP7(Nzyjt9xO@%R37jh_AR6^3^}d;YuO?B6)9 zq_zLN(bN80hSUBBhSNUBr?mE4u4l+wU`{%T7joT;t=Z=Q6f8N({_Rsu&2kon8$#@Gd{gR2;(Fvpqv!SJT@F|2=%8Cj zj6X^{9KZB+N3YjYygvQVa9)RgZaA;scN@;@cmL*v*k!)I;rCaLdrD4!GWBMMqo+SP zhSQ%>hSQ%z4W~ax7*2mU-m3Md*68Wa8pG+&2E*ykxrWo9iw&ng9Ou>g^Dm>PKhGLY ze_k=1{_HTE{_HfI{&0L*>rWcSktL@;oeify`x;Jv`Wa4tatx~nLi8NpmwJu^yxiy+ACCKL^%sZeIUcapZwt|L z++VBz$mlr^FvtC+o;(%f+LH5mQ;z#f&hdT+gy=brFZFz0^9ZBoxVs$R*XsEl4RY!^ z?k_p*pC4kM;{jX!y&-yz6KwVGgy=aQF!dZaI1bH z{b7bvzrb+nk2Re7Qw`_1zGoWF@!W1Ooch}hr~Wy^sejdQ>c2Cb`d;dsN;b6nyvM$g{`I1aJZ7l-IMKC#uG9HQsA#a4fH zh@RsXQ%^siGWx{$y@pf&rQy_boMUT$&jT9AlX{MSZ1uxJ^c)x2>Su@O>kRLOhel5@ zd=xmxMW%g@pM0&+bDZSc9Il7(SwS%q;}+8nfA@LG(Wi)(&u715_)FM-KQ{bxJ~x@! zIG(iM#&Fv2WH{~jFr4-|j#|r9H-gZ?-Qcu_{~;7DMZh4nyKe_&P$D+<1=&oW~<*EqUSix)N?%N+l`*% zDs%j1tA8y-&vBZq{+AFv$9uN={rWbJKmFl2&D1BxTQ>R`I4(>!oc--g!+Cwm@t&>y z6-H0{YYnIUjfT@c$APx?Z!&t03(aw$sV9HI=zF2O90!_uj{p39h@RsyQ_u78F8xgW zVV~nPTm9$|J;!gh`r;5h$1SFw;}xH5^t{io$>A-;|H<$b(5Lhd3POL#+ZxXCfxCuqevgB8{to*CjGla` z;Wt3f@sDYT`5tNX9QU}y;cZbTI^%fB*3NoIuk}Scn;ow8%ZcL_s~vqr3%Ad`TOGY} zJig`KXZS`Kdc^R*fpa`#+Nb^#qrV*bZynxRSQ&U?++tZ)U#RamAP~_09nkOVaJBOy zIL9Zp`hy+4+J6fANe)*#r-8S^ysgY}OVuZMd^mAm0x~a#1oI`&b~qkA;3|KvdaXyz zN2k&n0d)ychgA-|%Yi%M8CC{5r$= zyWuT{^StG5!&%<#hV%FL*9}kAPDrL5hV%FIorcrC--*a}x?1;l{(haR3o?;EkKeB| z4Ciw%T@B~&*Bsx4cDmv~l56xa@NtIoIhMHL{Jndg;YF~s*zlvks}1LKDJu-;@7J3R zUjsYm8_xITE;F3ZpIm1+fA8LAIKKn?gyDB1-|dF;xs=xp=kM2F8_wUUcN;zw?Z-oZ z$@=2&&Z&kMLLW1nzsIq^r=9H7pgnOM3-WQ`xyFvyCeV*FJR3Z2IQJtSPiTKT^ox!D zZSZQtc|UxG;XH5OY&h?Oop1PMI51ykIPX(kXE?8Gwi(XruO|%W_0e|2Y3Fsr8K18W z52EaOyA9`gsfXi|#*^oIx=pI#I~2;4;c)l7h2uS_9p!9p>r6XT8#;ADKWg(m+~KbM zn7>ufhry&zN(|@mn8$I|>i=wP^tsXR0MArMWTJit;x*TBjsvj4aK3lO@y2L}*FnRO zkIvjU7dqT6ua{MO+|s)F3uInb6U-MgRa06qKdY{EMV*&bGQV!Vm$jg_*7HGDePu=Y zlG2LfysVlkU8h^;WaTto%#}r&5W)PKy83FM^2+kM;`uc-^VLE^Q@WyD^75CC-xJ%7Q1n$l(1IzSaw3mYxZubE%Ds8ovJm}mx7lvkG0 zsuau1T3EGoX=$Z+R#{b7nswL_GY3gw7A}FE(#6GPHS?F2`qlcs{u2`mTIFb-347y^ zO6*Tq&PXVNgg!>2yUw^^G4Z$X_8_?pC-eu%qUM8c)9VUlZ*VkAP|y1e*Ov)^1e#|8 z50sSJwA=Fn;<|(~NW{!?jx0Aqu>BAhY8rw1#Blo0`4m~NX}kSSY(LFx z&-iish1kAH{o#GV9cFu5f5*uB=ISqFTd?77WTf?{c{6|3-!fr(h_~^Nbr2{M^}$lp z<-f>^=JHSdSFi>1(fsw$M0@0?3R4$t`LmHf`)iT-lP&+rLYvD!)=d7|lx_Zh6{bzq zmOuA@SpKs@^3QE1e~q)v|4Lz6{uKG|PUDb29zRU1vgN-))~HR6(@NnSY|nN^ZkPWl zD=bqjw|_5}TLyEhy;X2?@h?RAvlj;2Y5l89w)`ryHg$_JhwER@`$3I6lhwW=>nu}w zc44s5LfkJ2mYQm}%ZldwU(+kFT0J?~QvKI^71sZcgf*A{*~bUl!Hr;{8SM^X&E@}f zO<;ANtk+5N*H;K^{yz(AF8>dZfA)Wg-}kb8bNLt623EHtL(N|wEw=gVc*)J>-*JtI zWjfmI*jC$GKy&%WFo1eIFyohBk5xARuE;+dI?k$32~us{n_+^OKj#O8Y`^k~VEYj? zh&i|8d?2|2BVJ-CX|O&B6BhS~zF2`PY=r zFUeY%RW&#kOxc+0EJz1`M+_V0uNgXQ=+F^jaA*`hMx;_p3K?yz*brC z)$6~=E6O{v{TVk&%r;H_GrnoMY;rT;n zbybgY3mPV7_Ki2xWfryHZ=&ZFY)ma^D9Fq%h!$jyYrkP1v01QjZf0!q#@+=RPsog` zy~S!Te`7`FyvZAv?Dl;q*jSR8?YP~@<(wxUm?T>iH2j)3BX9Pfb(!-DbG8+1EXa)c z+s4;E5-S+>d;3%LzC=O4-wQ^4l;8fa&*KeW#v3X!#hs51$@wt8{>S#~-w-RiK9$NT z%WA*hI`zVvvZd|CO~NL=@nV;PsPD{S78>+&A9vW?XRmkeqFj zXFsG6e5{T;jQD3z`IbW8RrK+3N`3+wkzUc(@ z<(GKFV}Uabe>|uyDcD}ZULBWUFV2rV67TnDJo0dUbc(G`tY+_r~N=FU8xB ze>Ohq3H7Kzs=ncg$?N}Yzpg=C$lEwo+TO&>uF?X6NNFI@q|m@LMBApuH`Zmwa-N)( zH~WD)*>JXBPY?#B+PE%rgRCiN_`|QchOY`5{-v!5H6X#s@QW>iM9CNLY9*y=zn>Rh zzpefHN=a)zg@O``auPd&6l>ROf2e$15W50tYtp9u$A+8u{J?3tt?Utb zGp83ceBsyds~zm&+1Yrp;;F&sbX5iRUdN9WDWJ38-}yyAz;{QV^73u%;}UA{SgtCU5j)dd4) zNKO*p>|Ia&rp~XC?L2K+ebu^z|ILDiAAPr^CU=dL0w#9OT_=cz0_^ge{M(z2_xcBh zh%E%@KkD?D=jY-7Dch|5k#yDe^V|KX}O@%3M{U-z~MWU2ibQNi)GC(4=mx+jF?ZK})sGv4r3 z{GpFq#5WZTm;UX`7HdClT~`_3bYez)?ZKkEOmy+Je?;o$$lsK@N%A*ZH(LI-sOv9( zTh{F@e_PeHjjw&&-=eN2ky@Nc9g|4SNTkFPwip*5^>f{l_}bMOUfnR6#k{&fGRyYr zddqB_SGS+c3cb3nGMnes?J2WrPjmcgjrv%>%@5b({^eHwZq4UaiZ@P~NAOF}BrQOj&MsdqtwUSjcLFENv0=kY z+CDbTl&B)ljc;L`Pb1c|2AtQfnuE;L;H~8<(F@Nnge~Y@>M5;WIDo&(k zCQ^qdQhE8KcGs2UuU#R{ak$K+IcCXBnqwcCNppY58k+u2CQB zw{3Q6F#h;9ZI9Xx8#Tf;QVyvIZH6BdY@F;RT3CGJfth|2e50V@TRD{O{OU*TSx=O6 zn}=nOVPlns8q}Z|jyJsC$aYX$wmm-X-=>8>yOt!IX>elHd^6pZH!WzUU8MfdbvmUh zg1I@nx{E#O)PwU0X_<1&?UboUP-#o=-y<7)jZWCQ@;D_udsjJRwDS)c^(`e%eINES zDBGMoKl#6~r|}-VxN2$X;HssAm)BO$UsyW0wz{IcuB>)YW$E(4wKWR|2j{%&DCEj%!_MP38OwZ+>lUX-!>uRb{MfetAWGP3h=ZuUbEcm^fWuQ&}q>`4)7;V!2_u zNU|<2E3YW^lKJmHHrBWAva0fuSpR<6{XDtVEcaQ9;g6KqFM&5Y+pUKiwVDj38Tctkm$VP}TD-0|bE3gdwk=w; zl**C&M*bbPXe3n?(G)ECSMAYY@X%wJ|e)aQXdiIZ`FE=CjG7Yww}94${lQV z%)!a6iVu}^i-6Blo*JYVC~p^}%amsX>BS2q-6=?yYr1ogKK3g~clFxzZ9Qj;WaJ04 z^@(~U2$HLkbhVb+OS??|TrSdfr%0j?JYJ(-B1)}NwTs!q_y6_OZ$`=mm!DVaw@Lp~ zf4We%4t!4Ct?9te)SoroHPHW}=~$5dRnvWg^lzFDe)3HHUDLS%|3lN`{GW1Dy@)Qv zgN2B{P#7$v_zS@=*{LleRpQ>fU`?w?y(|R3O{bZm|Mk8Q0-|44U)Yz zsP?qHYlM&U(ykSIqs5BvSZi<3aqR|9q0x4O)IPjxm!&e_yX-x>-z4b{WhLGoJ^c3V z=ex%~>S$^Q>Gi!m_Eq~q^W0;Gd~8Y=_A+5df#69sN_DHK3dZ)WW!@* z^~A|ngA?5*%X+WYiw<#;k0z-)6FU^zX%`9PPXKp{Tl*dnrfzRUNFE z@2~j-Yvw1{MDlb^lPwUCgIg+OkNv(ly3+l_f$avlL13F$e-CO>9k%=0i zAbH591U)nOlka77mes}ooTm&%{MebCebc*Sp$UlAalG;zs8obC|x|vQf{S&#{Zyu7` zUl(Jtj-N)9LD1zC$BW#{+z(KN4s74E+>6}L?J|}2lyey`@&I!R%JqmY_R{)yr^q9{ zN5Q||Sxg+j1jkqGlP<(J-FKp-`b~kL{~Sp~w_LZnUnxjGK3Xf{{myp!XeE)%$uTE(G#TrXxtp7d{UWJXGAKiSYl(<0e}BS*H_vTaqXqhqGg6kx-)Swj>|WJsaHJ@bos|9|(r*H3BuACvRKg7%V^F`>($tM1)(zLEqU3^? zD81ThYDb)JT%6>l;%IU~0@J8^uuFN7(i^o6_|>DqYg9%44lgiL-%=XV|Bot4InfW= zYWX|0#g^?7+GI?0d_{c+N@GEqFzu@=#+VA@PeittzL(;*)<_+z6BNejjA12=@m&M?)^M-%y^!xKSwLcH&o7yK2 z@jLCe{Z2bDbAfN>p9$Fo$&D{eZu~dh*grx(CQ6<586y4s^@`!8uJFC==4Gh4p}HpW z6ORwNw8lSG5qi-H88|xqq;BgJ(?5})cytO5M?a}frbRmkaNoxj+ZK5#`lV=Qb^;D}vgspiLHehqk_4mdO5w>TpXM^Ulo+aw!pKnbRyU9|F z_8a*A2_J?xX_~zvKgrKf|F3QH;~;1660!0ByKU~2jsC}NQ))F)d!}vv=QcG(9=5T$ zMB8?XG^tv@QMrvr8&!F*wcpH>4m8;tt_@_-<(|JY=-JFv{}49KKZG^iB@+9Rw$SIA z%|uI?C~}hq+gs|nX|cLAEtZ@K9jW_7!jvC9{}`cd#c#3cUWT^Epv9&oT8mchMAUHP zqBe5y^IL41X|ZYkb(iXL{cEeV$R=zQw9vH3AhXOCJ4ShAkBII=DO(B?LHVofKEDP9 zjD8oHDf^<#W@t>8OQEOfxkizYqGX}`V_@KaZixT4(f?fIf3ERA*Z7~C@IUZ(bQ6D{ zmR|X);M|~je~qIDYPs8Ar}tKZpn`GgYTB* zrRhcySxns{VIfy!ZMsB~>)IyQ$+<)%lHXCcXt%$Y-%-Ehw?}UYTskx@^E>MH?dg!5 zC-oMc1hu1MQC`%ErUw41y5n$P(y62Pa9}sNK{3)_?wl1lxLZ)JKHc&=#?pp$(~P^c zOt>oNT3J#IwG=3Hy?kAq#^oY?m?Q443;7*~b?YIq>CqNz7(#S|I zA}L0+d~)N=uRJV{PG+HN$H<~qt*(_49Ee3}y$5&GRx&or(?n&uw)BIN3%ZHt9oz^= zuoF`*QW0+^le{ex_2j}SAv6h!Bi;-q-^Hzgh<6N=?*p~)q#M1IOUyuo#%f}bHY46t zCNG37acjeBy{)CwT`r{k23!RD%0SojFU>~0X-wV=Rm7XlK(i@c_N7dpn~d90v%F2+~P3wS7!e+s8C5Uz6U2<)i=FrjJ1lRPzeSD`c`&BE-e|WTsBZ z5*J&q)EM2$Oq8#XNq+t|;uSN=mK5;{1MA7Z&3Q_%lRnJ-Pd+5A&uto-xyh`86zjPt z(MIPoc~T+_vsk{Q?L=RctkPN5HXT0zA=XH-;h*F%rju{XPGj8j5wMk(4LGhL zVLB}lfnb6ISsXgM}91=okdt#mvH+?EBO?w z_$0d=U=v9+on}pQyGWva6^EHlN}BYWn-Qs75)qrpWCng)k=*ZYax&F)yBXYW8ltIP zFp_gI4^F1I#0*4eJ#T7$D$Spa``B{U!Q?3kG?U5c2`6ST$!yh$sh4so=|q#Azo`?` z=)}x~`MFHeU~n46rKI^L{nj4{`S_$QZnZ6mY-G3<%l@CkkhDFksqH2OrtRcb)0=M9 zq^|5%etWUoHQR``pqLjVid)F!jS1AGRWrXa3CUcl|IgxE`t0r-q zfmX|!Y_8{L^BIDDQLc5E%m+&GmU~QBCU@CeR&(JpN67TEu8<3_`p+upS>$q$>G!~- z{%%>#g~9UUqE0GgdMubPONgso*hD*a> zUxZB3$JW}twaV>rDFJ;EZPJM#)zp=#bmg^#E7O@|=0S(UrLGBArZdT$10k1^el%%1 zP5qcgKi*9EF_%f^9P~_F8j zKaOFNIR`>6CH-h}cFaJ=61EDN9GXDWnWVvH4(exMzj!(sMXC!EhMI(-=~mO5Zq=j` zn{G9$=~hje;79OqPk7i|udxlT?n<~klgSqT^N0HUk=!J1a-!LE!x_zOI3sjJj$9%) zKbWL}6z?w{)2d-NAE89=j0`LyTPMo9i;)|#5ymYYJp8~KM^BXybo&PI)+hF%~%-_O%2j*X5{w?O+ zc_D^5uk`5;2dc@ysonp!yxWj(HS)9fUJ4P9|JVFB!an1BE0*nb+kdMsdrCGBr)E4K zgW1H)>N$W~nBI1kZSi$MAl+W%AhdvF2hh+kR7nLuB4>2Owv-my5p)#YXi)rw7TlL#rlLliEJZ| zmRE^R&NgLpd2ByO*ZWY`>q`xSB&(|0;$Z7w5wB4M3w7m7RV6v75!hQgzizQWv0PtS zE<8wA)oT`FZ}I%fl8Vw|eFH-s6(a9}6qm>dJjVr#G6YcL_2R39Wud%+5xn5Au(Z0a zcyU$LlH%&Bgy$$?kXdO>O{IF{_fBp6zuE?(cSj9K2Wb>s6^)(P2f=x4j}w z->B(-dmpa7E&AuGqUf5)fzgv!7qv)<_SoDa68%6#>sL>T{^F(di$qUZePFar>ZGSr z4@iAFI{6Y24Nn;n5!sXj|G4k$n_eH>B6@O*$PZ6Ndlp6e7L6S{HahLVo1RPUIA(15 zN)gu_;rX1d}MKn52w9$vW)UxPtsjqH{?w!&n5*?c|E^_3NUW%yeQe)9Q zZKh^cnBQXnNiH=uxRfV~)Bnb;-!QvyP13x;nLkWD$wJ<$bI36!|c; z%xd(H<{kM*bg#P9%>^lAI^Fiy=r5~MJ4i~cZc(cTc8q=}R=d0u*@&7^nw?ZWCMAlW|_?9SClWR^ona2SJl+%&*$#D zEgs%$5}9u173WVW7ESSj`L(49VepcTS5YM|DEWWtD{IB1y!WH8wUpNuSIGM_rNIkC zH15CrQ(RoBLsW_FnuQ5#i%RQ?>lRcL%j-ln$LU^#BFeZ`Qc~`c#Y^jDc&lO`$*@kb z38O~EhGz}S%8m`m&KZ$CB70P9(9#jZM2~WW2IvfTZ76fs|M-lQSzG9ptAbPnyQM5K^0Y1)wQx%S5sO# zXj$pPx~dupih#oW3G&w;T53>rjSMxVtHfH3gv5!9h69n2s;Keg@tPo#$x_yo_(k%A zCC~M1y#2SZN-IkOLu#YAtYZG6T5rK|b)^y>>7X=(s8;DOipykJuZl!n>88aC>uZV^ zR#nt5mHOA=ytK8*`(|EARlW2YzIJ&{d0lC7wG5k8Tvbs*L1Hdz{LZkrLOLhE!4U*i zQR~TTW##iL#Ot6XYA3g{s#1&>SI;jQ=G7ioxezai`T0pzEGexCy3wGIF4nsDWqxC8 z)Qs40g4e(j&7iilqAUnZBXx1{l5#C}u|N8m#JO~#Cvjk5eCp@nxB6J)Z6)Tl^Ouzd zRU=P<7uQt!lT?{)lFYmZ23^U0PG7*;nYhfx$7s ztCyBCVwhi1CF-pf#BWMc%TmQsNOfP=OY+eCfyHcS%PUIs zB}lDbG!4npf5*^oBVJiW)qF8uT~#Z=@hiL5^V^CoG&l2#$5&NV$l=f3Ng7o=8n3=7%`-9(^uzccWU$c|B7;prYyQKgj<^p&F5jwSJGqnA98 zYS85UO3&Y0i;GL8>1$ZDnI`0=GP0hm(j%uDn(qfr6xHR@{?Nb44&he?cDh8}`Q7N! z(xnTlkMpa+Z+5!BGN8e(RfqQ&B_G+7a)Oz(I9(blv)bzNN_9dOhyTYqb6#0hAA&vJ z?;q+b>uXC(hIrcZYSH|DYSH|qp0xRr+B)5rB?A@JNKUft0vSfHzB<@Pf;U<r>m}GTES{w8ro4f}Lqu5PSwIXh_=c%JHDY3l0S)Iyf*i zvg=n7_C8ZpiE{hF_xA`2{dT1L&CnsbU)1W+u+fXHo_E-U38Q0uXD*P}bL)cx&Y%(X z{!-4WoDo^s!?JRQ^fN~yIfIf%v-~Nta+()ekrCf-dmXorYoBWjb)A!#Yq=|!{B=au+dZIEnoB}O{=kF6&2Ova{Bp2bd{HGZD?>5KEy ztB;aA+i0Fmixy8y(K0u6W@6fM-dEn2RUNG zBl0%hIGO9DG004H8#g}D8%OYm=InV!smzZB_UjguTHeAktf|E*J%*k!En4R5daYW;_L-lMexoz%9FRNgJjJaGeAzS|p z(?28h&nW#fT>r=r%movM>YqUDt8;viGemKY_;Xmnl<|25#ZwMFbowDPif81FFF2$) zaeCxm8{tfpC%t--#?zffr?5B+ZSG2f!O?A#SLV&$Vo*sVv(DwHJrAc@|3on1v~ykG zPHMlu{3riTp-eX46lv!=sh#ffpZYcq z*L*YOzfKtrck>+#Zu33f;cj{5acO_jeD%DQ`EGK!=F8*$ISzO8)$#OnviZK^@By-( z_Jc7^0{uXT@1>5&q;>|$f9hvAJj>x%JKQbTE#Nxa$I;*Aa5tWBINUAQJK(llzdPLZ zzdcUrtp7T|g-*%`%YT+@s>5CXj|SIl_I30n4tM=r;&8WIr#bfBcDTPfB9qRt2SBc9t798^>pk!<#6@$1o^Mi3l4Yv{J^pA*4Hl%A12!~ZYel5 z)YYy(ZNSx^0~~z^hr9X8+aCU;di7J!*L51^*mwQO!Ktd|t9>l}In?1J9L@m{R6o+; z=Q;XZhu`XO*ZxBecgy<(xcZ;z*x|qkEEnVdrlWV`@QY*LE$^QWcl{ZR=MA)6Zad*O zR+PJb=0UIi^m6-fa(k9PYNOJcqmXr-tyw4(}&fG0s)sw*9Ph zxLYqLIoyrIh2UCVHx8FN-1YNghmUgn2?oLn;^y{CBibh8Gt|)+I^5Nx+4|=83^w)u z@_4SBb(a4+R=7^oknaTpdj+d~JF1_r1(Zo%Q1U0;Tw}+n9};SZ+bYsyw@$RLb*a;s zV3y#iIBw+|{w^{pG@RdH{n?2TJ)O@ zM*j}{*=%@Ql2!**Gcmy46^3&dmzxa_?$>zUy@nr(`g+{(-B{M)TXmv8zroLU4SyfY zpBa8P;_#Eg2;^^~{CsnTd_DX*!`Lsv^4|>ak7d63LOU=Qk05H2hEKqsWJT@;*$4;X3q{PJE4r`c2UFH~LA?=NisOrw%rJ zEBrg$@XO)nY{QR1`&?-F)u{Jt4W9}9ZHDgy{r!gb#qyJeZ$mqI#c&<=O((v`#rOpG zH$Cr5qyH4;`o-|u;ZG~fX-7wU)2V~ux5Cc8hM$RePB45F@+&kvur33(8?J*1>QrO+ zcUb226#e`J_Rll=5%A{yF9Ba-cs2Z7Zg>ge zd8XlyVfj+Sd&8f<8~!-rbEn~*vHY~*Ps7iT4Br5M*grA;*MoP%oIDs2SFQmK=YBET zaQ=>ah~d0nQ)u{P_;-}yCFoDe4BrF#zZlN@I42n11NwD_v%C$4@5J&J!v~>W?lF7< z{Cv`I#_eUp8MjXjXWV`;oc{lAIP(n#K~A2ZFrItBFV-XDnPs>?y1cZlTyX7v(RBP4 zSLEnBpbhGb-!P?pmUofS>ouoN6%Nqb!+#F2$Ln$Cdp7pFbBw+c z$B_#huK6;aydGDXUWbm8|2qBC(W^fnz|Or6XI-iO8HcO>WCZU8hpT>^{MTuR!&T4Y z@<$F=KmSC&--GL-nm$GT>-3wWSNpvFX^r~;8XvV^f%pU?-v;eOIs5Z&M!y%@c~8SH z03YaZH{a0?SNr@HT7lv0?`9gFf%bh2ILpg7p_e*b>#MK)*J+t!NBzl0+}1kWj|1$V z?$~kTd5)u3JD0)El@3=s-@?v~hI63TI}NW#Jw0GJ@B2LLa5vv)9IpAk2Rl2!)jf?v zhWyv*3x{jDZh`;lxF4d6%J~{`KXA5_gRuP&!%M)&7=9`^AC0GdzMg!H$#*sUSza@A9prFzg|DDYak!iB0*AZ#Ryo|w_XNXvzvgs@YrY(*;aYH=X}e-OzSZbI zMcke-`sY#auNdAM@qNee{@@=N`+P^d6&^8Reet@lx8c{rpP`1o4<2{88_%O0uJP5>1H9JZuKiOS?%KcH;c8#+rRsE(;fDm+yVvkq@a+zF^Zmf#n(sL1cRO73 zOMaN2*yaGsyN z3eI-I=SO~Y^tzu;#(wmx!!-`{vt_z0$fWU6{d(v-8U7)7H;1bomg@kAtDSP}w|yP1 zdX{$xxcaa4xJLf#bhyK{9(f;lx?@L=cVDCZFLb!(`vmf>F#Hejdc)^nKU`(_X7IHR zck?~n;hOJL(4Py=dZGUpJ9@Pf)56Jgqr=q>f8f8<@DXU=4;X$H_`?o&?LP<3IM35O zWO~iv>I&cT|Jt$R#}oE{F#6%xkD^+6GO@g^u(M_uE<>^TQ!j_R`*p6vH90Skdy^fm zescevYj_>}DK~s0__>B(2!55}x1xW()o@<#JYe`I(7)txw_G1PT$5{1u3sJQw)2iS zF=IS=zixoxkHY_4!~X!E>~Pngc@B5|sdBjb6UBMs`QWGe;u9WFYqv!Ktk2rd5 zKcA!hJn3+^|9RQrs{b1O)Q5&2kM_6A;cox)y~EWG+vU#=S3R#ETi^#aEtl#yqCVO< zT=nd)I)ZaQl2!iH$I+`D)?c=x*O2km&|F8a`)MKK8F#qanG3(C8m>bT>omvkC%}sx z?%F>Voc_=At;lPV4p&!rJ$brgNB#K&_O}@Qqd2d-)bPKe{oH8yli&|I+-;vPJ6x+| zp8VHom&4W1LvTFWZTL{wZ>dhp#QkUtcn8DF!TUJe^=FL3(L{W^g${S?_gKS!LwuGS zz9;;@&hY)g?=*Y>`16L(1b^G`3h-TqUjqJz!`^8i%W$_n^PQ;cox% zPlu~MOaI7puftXUJs6!H1Za1Q3s7LGA)vwZ9F8$CGfaD0Rjj$U0^1b@aj zT>asB-JuRw>1EK*GW-qjqa3bwu;`UJT%|fVwN6VM?#5vyIQ<{31(fM(!#O0w?Z(cd z+PGwTz;KRD`lR6;!0Bbfd7u3C5dLq&FT_spUI^c1_z38~2;tuw-W~nS?hyW`;T(f6 ziibAXPRQFD-U)F_58-TPm+8%Dk>7 zm@j6kMuuX@l9$r!ye$9y;;aSoW@uJTl`g0}CrcjbcNgV}ewAm*W9sEgN-K`zTA8b< zlF|kBi{$nFvMMp?r{^zNps(y>NnV(2q?}(fzj9HjWEqILy!ka7q&J%+TxV@HFFHLRv zuM%c$>X!T9#^)MSu~vIm$o3bHQ7fKz!GDS0ZK7$;|E{b2%@g~n`mb%r`v0&n^@-(_ zq(6-~IGESqyahN>R+i&AS<&3~*Bu&cF@hUn&h0pV4ci-;_YStVoZFFqj_pmDy&c$| z&*M?g@^kqUNi-L~Y{YK`gc?8HmAJhw>!g!UDdD0gKaLu zc}q80>?8ke{<=>#m;Z_*g6;V{V6fD*t;#{HymCp_!mO&nF`csgzrmj%9sC_JY?u#o za)t~G$h@|z4=Fe_C6X*rM80W~Tw;zgz!LUlCF6WNPTtY#;^ocGo0Z@2XWq=b8Tk!A z&YYg#@N#~`v+{-UuJQFRwqLi8*vj8HH?umvUcOVWFH{w5JUlhNv15GWlCG22KiPiW z7-1q$Eok^AXItLP{Dz$c4SzhSkCg7zY~t&;%{j9D2JIs9*Pf8MLcUply`=qh`3;Zz z^Sp*_@lAe=)lhts-(AKx`H$UBZuq${=gFLH59q#(t#%efC#2?Y6l(7Bu`= z5cwj=u3?FM|NY$ubUzD#d_i46@`LcZ#E$2DOMTOD1rMGge**J?m+R-qt8wl3^Wt{> zt~^=sAGY81>>vMey&uh8{}fUC{U%C$9Qy^q_u)Hb`i>OHx8NnxoicY_EaKqn=jF9A z{kk}ZUWqx&GU|>0>2xCbG?lKdkP$p$buzqGEITp$h4RY!iVAOec}0Z`W29e9*U^ls zV*dCP{&(0lC_4R@G0@~2@j=@S)bd-U4AxRrvs4CSQSKE_r;}TyZWGXYo%~7ND1Tm& z|80&}5k1HCCsugmqR(5%t=cjfmL<|% z>q{s90zA@Pv(qV9?7`=Og2jEbcslK+eDLLS>^IAsN}){vXC$`SQai1j3nzoO{I?N?tW)h>_)P? z2j4hMY&=>v))yC5ubEEMuev4H9wKYs2~4NdswUc28oa&~>Q9BT+VeXMzY%FSk?ytD z1|IX*%b%3oM6&H+`;(@1j3mGXn-jDqAwu}L_!j?0B#sr)EH6RwIbNo*1cN0xFgiv)=H~&Y2E4y zRa=+Vx>Wt2@60*(&YQd!m$sjOfAdM+o%zn0GiT1sojdp5x#x`Vqr?AGPQkRVu8{cn zN)aDlT}lW+VD^2_MN*CW=8NQpXuyR<{-S@6VZ+<-IQRL7o z#&uMtPX^~uJ=t{>d4odoFyA>8lD*iI6zBFvF8qGMk5rcJF^l|#X?I(F#W5Cjyx}^F z-Z)V{l^h`XaC0@#cc?W;M=zVv2VS?rw&SV6F#raKgrOWE6TuRd?cC%uMWV7|)mDQg zHIYs)1R|7Zu?H=ds5iknQBB_dS865~JreyJQ;`jBiAuE)V$mK+NzFtk(Yc-wizMm` zft%~NL24$`#S(po30-HEM5S5?aaJ8w#0e5L zg*ZNr5GS-3;`sJLoM6|E=OzfV^?@!er@!yWM^smFdlbk7-XWi3Qj&CNmm^46h#p{r z-wsn5c!G~)$zGzktwbPBq5x?pQAvHmJdO!`;q6PgTuO;(4>c0?;QOTGbLp^=t%#CJ3aqn4oFEvA-E zR3oy=@kOdX;9!0D-E0^C+lGmK8^;OFAjh*^%(o0AH|0i~o2qNbEH6@GvzU}1W{IiC zBubZ4qM#cUqNX{OOre-Ih+_;PE6bFc>9;o&9M?jzHr)sFFKnQg7K^&Cs5gTB-O$As zzZ97^@6yn9KY>}>`<01XdNWAz(0u&n<7X9qj>XS!@Kc1JY52K@took%28`o|dL#wj z37qRvpNe@KW&74N8`;ranQyw%7dejgOKpTO59UnCRO&c3tt)nXJUf!Uy%{ogTMHwg zrlnKQ3@1HV_sy<~B^za;$2Lsr8`7nYw5?%^jn(#sc4N$h!uTTDFce!iY@#>5Ene6R zB@?G&7N{OJIF(W0XbelwEGMKA#`@OSFbm`vkn~#-Q;vdHf*(8ckbF+ zDVqrWA2&k$T@6>#nXB$8>1f-o#EPLm{UfO9_iODl)}<|*n^w9=S$ABYw(R({(m+8x z+lvd*+FhqqE&7LML3&{Fzi&IS3&{x^h7#0+08ae(Z55_TwK2#4rcFZqtU1|P98;s* zA$GD*ZTALWCCD022=M$E_$&eVh)aL$R}4BsmrwR=M{1P3@2W_$elCQ2g!$5RZk?b1SV1mFYdU-0t)Qoxc1PwWK03?K#IDfBP+E`St(lDa%q*C1)x%giBBfS&IR=h;vzR~T7X;z|sZKgYd=z{g z)5|qb@Yk4bsYU-6rkBSELf?()DlPiq+=vbSSa@enUu)stWBxy~@M+Bdb_@SLr(d@4r#LOoOGH0g8JAmN!NrzL8rLuQPdVM! z!dJ6ABP{%V=0DEDWxkkh;qqfT7=PBnPiOuzUZmcmnI4XX5Cred^htaae7&Ukh+-U7<&ThjO3As8 zj9df9`B(vv!chhe`t1sJoTCjK^cON-WZv4qb1`c|$@pPVngI@amQUeG5-#Pt53m2O!rfnMVX`p|E zJD48L#C1@@0|u_5tcO2Z{G0j7li2J68A!S_z1W~ZlAdjN>&9d*C-h;a4>KhBmdT3VY<^Y_X^Y2;qSIrm~Qf9D{;aN!zRuDw=KdB z^a$Nbzi1^oP60>ceq3X-iC zNSMu&Am?+wLAlk+w35zw3CiEV^@>de@I`32Yis+DOaog0ZZUi}fSU-}70 zocnhD_Yel2A}2*vc!>v|*yIyj>X+lglo79dG9KPg(9aWf9KTXdj=wc9pNeeNa(NR& zT*?XlI%D?vQ^4gn2_YY){Q~2@H=h2?z44%h{_w0r%8OpR6K2m{1UZ{n|MIFI7=kT7 z(zfiNyNl&7W#%{?vG2*QAE!yY`m=gd28Flv!TYuAA3J$s*bKQwLdW&5w?}xwSMdz#wR(n7rChQ1!ZYqZ!s0f+vk@v_9^Sl$y^T=$a{S6Jfe=YCJi%7_+@p4 zZ5WzF72u?rJR)t=faZN1X?6Vqkv1*7&WyBn%KO;QRIz0%R>tp{g_`@S}@+FD*PNnNmHPp`g>NlHq_`^}*K@K&)1Zmpz3I=T%}Z#!_O&_zhPY9*kUJ)iUe zTy3aol0L+hp5y;)Lsa9RAg(R3C4Gu`mc~CrJgnoNBc83}|3W-h$G<>4U&p^hya3Yy z&1WtW5uI>VLc6I>3aG>~os;CkvTvzQbaEF`LYr<+3b~NBUgvaGi6)&$b89GPlTP$- zXHcR=CockN$p;rM( zqgCQ|os;8^q%wEu#8@TUKAp&O>!_ZG^nFRv<*E;|l6IkyT1VF?OU63B8_nfD_yJm* zLHm&V6V@qoC8bi)nGn0{7K#8xS1R;OK{E-(bE9scRkdX#AA1`Cs)powh;n?shC7Au zJPELqyZ}*EDm!`A7@EU%sT2Kik{m4}!X%BC0@v~;uLj;#<5fy_9bdbY@SZwejd(8| zKM59)vz)Z-qTEnHbZ$ook3xwf=CHxCK(m*`v=1-n1P|!Znog z)Iqhc)4&Fz#*)KHg19|*rBWs?m;CFhctHII)vvbOk*wmK)Ng0?8&bd8dPf%(PgTEN z)o(ZTOWR_>In;SlE>)wN-FdRF%Fah2o-$WK z_#1xJ6bqs@s_8mn(92!y=k_x9XZJF91=Ghc955oi#1AOpvHS@oK99pP5Gs!0)r)o* zkMBk2R%1t;u&LM26cNhs?xNX5x=_!fOXCjKE5*UAvp>Hyov73jFD7 z3VdKz2OF2N_HsI-pHp!PqN~(c?csDo|LM-%AeujxBkrzSrE?MSyU**Ej{9g26|&nF z2yJSoS?MEB(jJghNv7_r+_Nx=NTBws;O>GYe6P#^l);)$8x#!PfEf$->rUuKMEfJ^ z9@U*R;y0vI2t0Jwl-Mi{PK^gn!@2G=(UjBUfk(H*P%3d!ZotWfx4|lOd1IhNX&bs1 zr)}sy$=hDE+dMCtHp`2q|ImwOWP2=9-}6~?&-N&Kbn~K_oxNz6xBTe)j@#WGo|c&! zOzW4nxOaCqgE~CW%iDWSQ`ayjHFY}W(=5SJQh#zfp)~p9P()*@bL{@~Q0(sY6iz1V z&Fo!-KaEk@1>aS6!FSW!~8OA?odC>+-Kg)*oofT-*cW7v*)~zxoy5EGlq3v*?Hd&bwIG9%%l5Er6Jwl z1k?uin4Rh*^}rYaLmtaueHLJ#`$0|zL1bo@w4BV6{!blek}v`F!0Ufy*Q+zOxv^oa zY=JFnTt8+_C3!@zE|1OFls_>#ar_wCm(sjx%$nNfvG(5Bu`0`3VCy?1y0M`pbAqk0 zw7Ipqj`q3IHHkN$$YxnO{b@}+rlw}%c)eW~Ual!dvko@Va-sEQO>1>=@?}U7s)_k% z)Y}S66%ae}!A`#o)wP-wy9ag5*nGRTtdTY#meuPF-gg<3h}pJVxv8>zgU-ed#AxLP zve`gsnk{Ln)8md}!ABi;Na*4~er8}?*2=&N#ks{>(_U zX#T9|%);X0=)y?RoJHjKQdz@@LwM}$!}ZW7wuxYqd}--jBF zme-N*bQ%?EQtF89?Bt;6kmlpKR@a4;8~T1WO$nof^n{KrS5wXpb7 zRZ~~i6i*0@KsgWARa4XaZPC=-Y9n2AHJNHDUmI;KTVG#8o3>A>uZ%XXt*)ZFFs5_~ z5P#c;J<;;!22yuT^ZHt~Ssl(Y)Rkt|8cqV2#H9;)&<~g+2X{I^N!WJh%zyXEh-49>G9g_#n7a-bq(d-f_nO9!q(i{K<;GzS;ovVJmOtLowGWBE0Z@;h+7*bmR~|$` z@5_+bB0;rVI2P0N-t&N%%%FZU5QAxY8IiGBLI3{T%UG;p?MK=Q#=VCkTta{Mo2+~* zdrT-&p%QchV1;UxPIjhQIFdonOM;(SOHsd9e0*C1d`ANOdkOIGC%|t^fIpA`e=Y(3 z_XK#5PSoynrd~<;2y(mIgYlgj_V8hhmolEs#|ebT(@%uy&$ak0Wjt*0sY<}-lmz$% z32^LvMY|+WQib~y&_6=B`K^eIyyp_o%T?aHUzLlBG3U#ADkm>DKYy~6z~ZcWlYWI{ zQcPB#XP6&l zPJNwJ*F|r+r|&+!WbBpNSW1b6F-sZ&Ecs?q44-Kn_N_a3SxXfeV7dCL2DS;0*@L?2306v8Nh0j=k6i_eD zLn$wN9DoB8`UMn60H2}sFZd#W6m0%@ii!X}cy=lDl>jN&{AI0R%X5|{Z&&Zx297og z|26|3Zs0O6LCz5dewjgkxPk9td=woqX9@r77zZDd{$|EOKa&21UiPp8$G_nBQ5*q$ zj-Y?R_XDJ0^M6dkipOY*3;k0DKE}XbVBF^avVrFq^sgH@#)j~J$G~$9oMAi+^X7VB z=syJ1YmUP%3T;15DF5GXR{vGTlhhi zbCZSN%lLK+4`YB)xKtlJ`N`0Y3RhWpXO{m*7Jdcu`Kg7ER?ko!=Y9(p|J09L_+vak z{$SxfxxIh3@K&z(Jqy2;<^R;e%b0&Mmy`ZwGVfam!3VPZ11rYzv zSv;O!uyDL2MtIZ0_pv@duyC?orNS2$K9A*;7sR5^cNss7kAgqUd`;d)`NT#CGsp~KBrssi#Wa2!e_Dk=UKS;+m>&Sgntdof4N0} z1LN`ymC&zdI{79^@Kn~%ofaRt-q`-KZ)QC_Xwm0#`f&?yWO<&l@SiaL2MZs{_@6BN zXqNNO7Cwi^znmY^uHQ4C_bmF!++QDAcrEjnZ?}Zchun`}S@Z#}H<|N={!!MCe9I#E zzZlQ5=;fQZVHW-(*EiL|#jouQ#vw+C+ls?-i(dSNi=Ro*<31ux{|Ge}AGNuHa9Lk~ z9z#>^Lu5V^T<&wOHu&&Rrc&gm!@wbD7$Ai^EIeDo%4{K`;17CP-#lZ`b60`P5r0{r zH`@iES%um86RliCjUGGH~GsqRl?^y<|BT+1;3E-QiBiLCF`X17B1_g zQ!V@k=5vmP?_+$IfsbMghno!?^*+pbcUkyLj6Z4MxKEMrqJe|YYn*Y&!rx~6V+;Qq zQin+#ldAWQte zK~A&YYYlqTdn|}4{ETstU;62OgPx}bMK6B3!5=uQ(Rt0{Bj?ZC7CxEN;vZP*J(cG@ z+kf{it~`bFQE#@AME_(lE_}v=fWk0?9{14_##r=n?W*fZt=`ySX3tCcq!I@J^f-e`_MA;0G-F!@0fBB*6b< z;pcMtl?3=(7GBHz|B?Xz(84QOKOZN+zp(K4nO<+$_wR!Q*Sn&9{1iTq^bYCvcqS%I z3Zl1n`8@5N03T@KzvlIT=?@+2dBK^T;xErSP@l|E=x%eK2_usNaIQ+FbJefL&3Tw% zMQ`$vvcjL$7E`a#fQP(Ul6vL35atSioAqW}xXi2Xfslgm(J6X1%fi`wG}1mI(YHvr3c z4HJ%fWQ+(tf^j}QDW$_~iC9PQFaxfI;AxjHWuj~OD2K2__=sy4c;cC<8A>^EoC#7~ z>X%~yV|MwwxSY%fob=i+yTmJ{8fOV8|0+%N!|2`AQ{2=sp|Ka^by#6cY{yV@Y zX_)AsXS@G45Qep&t^Ze9P@yLh73}oMgvP5scd(|HaT2B^=6)$J_&J23DqDZ=bNw>k z5s32b(-HHSUH=t?rPIIN{sPvU&=ZLYcKTvMmFI{@V#>RmD(lWricALe8~mZzepR{GlPbKn7n-!<0l+*opjj zKVQsB$rzj&{`J?%wQz8ZVXwyDHcs%*DSaGFXE=)(P#clatC(Pza zkaHo|Ux0)WY}%J8FJAqdxc;47HcUsXSM2&fCd}qZknB@O7kC5}j;FtpIQql;VJR=;ALoQUcYybmTps&J%wQ$s z$`1Oq{9x%52uEQs{lf;MU4IH;@#-(-7n5R>gUD2{>*qb5p2I5r<#|{I9oN6|E&BM} z$w%t1*T4C<=-Kj6ha@OaQWVfmq%5a!(c(z!7Yie2y?ZT*RS{`R8lFwrk=AX)t|TCD zUu64N>D%zeC9-4JFq}z|yT-1sZ5ms@zA|#p`e^0)=9;k!BX>6`3*lpy?On#D6=~}$ zk=9FxU8$h+hh0m@N4E{Tfeyl4L0qJg`ANx~HF|4YV=EiI07&kQO&JAL-=iqdC&9%+4f zcIz{RR6KT^5tB4$_HQ0JWM)TUpSr0+2@Rs#pRXhJw zio>DCukn9%^4H{7kT)yEN%Pwf!p^a*!{5+qINq8WVtoO<9T)^Dt}Dl5gMFG}SXlprqe=(AAD`BW6wDZ&SmH+G>W8>$E>c_J4MCWdC2rM_La?+@~Y^KRNoW z*T15PJ+lAc_{hkoBksdzy{Xb8A68-%wd$jEk#AFBG0VR2I5M07A8zwn5AEGgRcZ0J zJ`|2je(8)kk=ExUBM%k@XHoT66}94k>fHmwbu|YflOJr#H#$l+S37i5ou$SR+`*Cf zFGoiHHL_#dblgk7b36REsWDNws_+CF7PHWQ6G#HX-`k;J%y@-<^l(H&=nQWwDUD1i zSr+eHYJEkwr0s~v_I<@|mCKs@MB2`%N0r5`Z^cOHJdo=(ymfYcggoDk`<(ivEj7|s zP0sb+OW$@A5$tuGu=4<&fm%ni+GabmNpoM_?Y7X=fjOHf3LH=8+i9rG4$*u^IrpG! zaqC~fo06JWo<7wgZOtK-AK9U*AhPx}kIq&XsK}$U!zf?e`ZtPZBPz{2Gyu9vpvMB_ z(Rj7=8)=&zI#lYFquKjS_#A|u7t#RCGN$m^kI~RCe>AeA=fk)XN4CE9eq`h`G(aza zZ<`$pzAE0K9#a;zzEQlR={F&q=cZmCq^1{<1&)KyeM+i@!$MdUZKu;>8HH8)rKmLTE5(e}(P*jk%XTU)ZlyDCCTn$Om^eC=HdLzTGgS_!_M=UGG;giM zS*`j0sjcmR%-S*6Eoxo$h0H^<^i;weS|7Bgqb$FC5sk`ulmDK+{Rx_XsZ$>FX8z`) z$d1bASK=HgJh3o}6Q!X2c@k-x89MY1l}*(Dm-_R%F@KUR7B%Y~ocYODT6^a3R!K>j(zjvRss}Nh<~+z_dqfd>Bs=I@8P;Q0b(@?Ebdi5lQR@DP7v)~il7oz< z`VMr)YoHp93OZuP|C7+R@rP9}xLm!g5 zL0|>?c(UOXIC!iotD$dIcz><>w4$u3l2H0OrlJdd!&27dB?iatMO9yASQvTn#@AZd z=IVKm)EdV+`@z0?`A-XLnqFcby{cl}u)yYkb)1v@@B6gubb3B9QrtS7F~^H;_M>O| z1ZVl^79ZVO?G@XGXpH;IHXzA*=T4`qe9GN^^fp90g|JIr%Qz!Y5_zYKm(UEGgB9YZELfCt-6}mXng5vLcNt zS5G8T&e%wxj&AnRGocSB75W%Rq+K7Q6q{g4X@Qii;7*~5l-*6qzq3ouCzMd~cgd{> z10A1m5u!Ri?Rtu9IlD~XMe!_+7o0}%{yJWGHpRm_J`?R4rsK20Gh4@xL679>`1}_s zp0DF2Z&SQL$5-|zK_fc83h`w+egfiab^IiVyva#by+?}>)zX0OkmplB*iQExiZJy< zze7_0`2|&?8Osx)G_LBd!Hc{TJd|@YF95*Mg^hiFko}4V~(^ zNJMnPRf!Uv2&lv|oghz4BwndbbaEf0#9EyQxsbMAC%URclTM_$P~0Y+=;1D+M2k*j zx+^KMMJIZ?j}y18I+5kRK#6m8VlcUXBHKwiG1C1bC9c$oQ7Un*P8^{UH|WG@mAG9e za$GEQ?$U{|O16DEk>_G}>qFWgP%7I_O5KG<>OQyzQI79MbGZ+GpawskzvmOyDHNi9 zR6`eHs}2Qcz5&NEUyDCq)YG6mY_b)09p_AppQ44^nu{7$6xxO?o^2$f9YYw_4rF4jCi)@*^)64 zdmnnhcW*{M3hRbtOi|*f3NogHB%slROx|ZVgI=-Tj z;_%%IvZQfF6zWiglg6o)cVE!_MMZD~ zQS@5x1S=5f*R;Og394z9ghj_|vc}*%CTsM`n$={X2;4DlrPSn(fqeR#4VNE?(JNc( z90YgQZ&TQWjXNGnL>NeY?@m;+F{K6pawkoq+JhJEJAI(?^qU`>I~iPp7acew48hFc z792s{GI%+|VQAS5ZVoOKgYRH?@b!{EM5re9r5&T>3%HShVP{G`Bj%d9*96I_bE_&2!7^Hz82Ow#AKXwh(PgfpMoyq?OE!rXDx zY|`3L_qaf4#!&b8U>ACF7DIWBrVMr&;DYva(7L%qil1e{f*HeN>0xgUoX7i|H|kGh zRQ=1Tay{L>OoVFE`AUyix6S>SAT{*eHZ{%;M-lg0{32Yg4>TapOqBt7tqjO)@H2z^ z!@+-HD4cAMxE(Lj(qb^oJt2(5mK{>%Y{oM81&K>f`JkEg)Z)Y>PhEGa}b2ot{% zV2V%+WjNXL%>WVz?nQ(1V_zl%kDIL}FlaB7L8@owI-GC^9o-1xuyq1K~lV)<s*+z zAs2GqFthtcF|~Wf&GhQU>q0#0Q9<%M>drGz@;i3tE-Krhw%T{+wr}2@y{YlvMKbi` zL@FCASxh%CZkKJ1Lwb^Lj(l&Tx%pcNM36JC{@CQ+*yIC}R4?xa5KsT?3Y%?Eyq>C|Wt`WBuRl3rE+C#3?!BA1*k{_; zUq?J0Z>Jve5*JazD|-zkV)_j;XJ|jovwo|1zFiIn=}syZhiJ8$K6^MB(5k+uFL6sK zuIJDt(6ByJSK|6UzF)QDo-_wKp?f9@?$h{1SmAZh&>qr3Ps<6bujbFo39dWn1?hqq zZF!g5XI~{TJe_+@O*kP98$$FF-sFh;^7F)Sa1LjAr?}*gn#?&9q+|g{Udy2Qd^YEX zA16JS!CiMFj+tb(g!jzS5r7O;;n?R~N1-?`tMl#Z6?I+&S5>tyrGuAL@}ukpVxXYzXcM6eEfVur_w+= zRSpVu*c_aoaNjwRZV|kJsjpTE2V-4k$AfVq<$u$`NLB`^^@{>$(r<#n=x6zg!*E-q ziW)=CJ1f6tFow}&3htU;K+^9x7+J$Kq(A?5T)f`LDC|RePdo}Eock?C;hAXJFmvr# z4}^mI?yqSecx%X*MTlHP+#R`~k#%IQF6r+a?`RPcK*?{eOivA1Qx2xGqz3=`;GYZs zfi>l>?oVt@ABYXkP1WpEG z#Dx0mGPjVj^abwl8foFKu6cB<&^(Tr-*4piz!0g)x}}Kpp8Pb8ewTJ<^_^1quW_Y@81#2mN@adOWPCdTsQ{d%x|m^H^l1d&PP@ z<9cwP$v*tL&#lMrUDF&hEDZm5%rTp`mAja>mE)RYroG3p_M6jv`^_2JT66bI!&-9> zq7G>r$oaIe%bcLBGWQe{$%pyonZwGubFXBNo*t3LT3HUKj_>2rl7YP2iCty72++yp z^wq|mVQ`r%qi2{t>lpLQ1N_nfnqLO`Wsn@?n`nlC=I{VFFY|bJaqnfR%aweC$*FiI z2#1KxXgWU)i_ybS0QE_M;X((=NBH)n4>#KuBVe{!Cp`g4rRwRTFrF(uLPAFnd7&GK8H2yvn*EUrjp_B9(1wIGo`0HaGwF1d?b=ZndAFFGvia~ zLODSfMAIhfrm-}W#yjKt6e&gJLw-<9R#v?!a+GQc@tA@LjCD^{S#({V=GUlAW>25! zpthrJyVwOW0I?|a0U8hzWO{a;#S&d37kFohL{DNU$@$1#yhl<$_6a3=p9d|LsP}B# zSt6CnaWF^z$;W_`yGP=mGUhrZ60P=_uac;U5`*%19^YLod&a2%WHutw2i0sX!bhAI+`k;&0(?*9u!99np%SL^~bP z3XN#6BiaKj=bya}SS(Thd$WZS9Y)tt1U>#GHG@%7heWGl2z4R<_mAJI(jhUt{_RTT z^Al4mHd8at7hA`~%!=@#kuAkXdx|KLs3^p3f7WBW0fLZpRB0;HiY`oADK9!V^K=dV zuXLpFA>pNXu`j$t#WDzWtVAoBD&WXXug|=m^IAMkizWIO4_YYEzcQr9lBC4JbDUG_ zDK79QkJl0@C8j3g%@rcTOe54DjM8$vz zNh8rrT7VYS-lUqAe29>O5%|N>u8AXp8np%4fe& zOYZ-k&ph7ncrB6WI}D}L+0(_z=-IR1!2Wv#6kT+6PS5J(A?-8mAJ_Cu0 z5FIl}B+>6#pE&O&{t{!IoJMDZ<5xbED+jH_MNui5c4$ku-8lY)*-0BZIzLLeinG0T zE|%!c9<)%RzhFp@c}d+vi(7;^6W}FWV2{VEL`v=VAzj@6y@s=X;*qS9=+8Z9kudVB zZ+F^=5A-%J)sZItz%*xgty!{#qkawT*1>w8B0X^PN|i`dO1sVpyW253!EddO^<@$< zrG`G2_zKPoIC*;{F5CmoxOM|Tc#Yz6Ne;cx@wm;8K@-U#Wl4GwLkbd(j+5WZb8wRuH+&N}uX^OZe60cWFALARm^!U32aq@2_i zZ;c?P3ZL{Ey--;1<|^Wxk1Lrv>Xj;ysLv=WjJ9};qPB?ZnL#TbA)>@@^{~7>5*P0A zhO6*8gUjjRD%`#wgC>$g%DPU}E=W+KQm1>8Hio3wRg8t4Mjoz$T+2CehO4cyj)tpf zRl2DoT2b2|uP54FyM^RamaZdqFEfq23#Rp!M5TBfZOJQSA?c`w5DO|6hB~5^Mh*8G zS0Yg<9%l%T{T4Oc&$R1kD;k0+%^}8QPraF^sr_HEYx7rMQi%#{lGNrHNBFOpK|ih> zr;WsCcv#*Zi3|65r;YGR=W_bA5pEM>P`@cUW|t*V?SdUh50@4QDGskRXoDt0d3;Rw zv-F%V855Ww&PgPV6+L#;BSL!_v+IcVG^RPrtGYy@Qany$+n8ENI;!Dzru`<8Kf<)n z_|i!94G&r<(Sr=dyLo+%^S()~cmbmC`M8kkK>Bzfg(KEMo+jPF_?>**$H#~H_#__> z@bQm)e36fD^U*#Ce_2VCGQn1xkkj__mpA!&4E*&XWb<(WAI0+N3Qn)$qdalYrTpJS z{N<5}@Q*Mbzod?hVSGFvySgM+kDW{XX*#duMEH3&djW zZl<#z5X4f`8*rxk6(8+~1XABWIsa2WCaPaHc6Mj^?0bB>{(mu@_BTv#Zg};c#Ydao zUJ}dVRMxaMy)41z@PxgVk8;tr=|}RFRj$TgM{lorWc4Ad9h?7~%>P|J+Sg>8UarIG zEO#$HPUE9ZkKOYKVlhyzvWe(_%Jh%%baH@?uk%snuSD~UePw>1%O#?>FIaNDk;|Nx z-v5>B!`I0t_4*}sYzxcN%18TZVAIPL09)q~?&srotzYJLTc3&Kg?WYm-Hg!PkNY{j z#&ju=7)XE32aR9jNpy8}Q==v!kDz1Ml$Vcf=WKL>I4J!ZR<=`8_zP9WGCW75)pg^@ zK_^WWL>g^ws;&|5p5z#G&5@kdR8dh`MRA$|#3d<}kSOVa{gKkm7k_>#d0a*t9A=cy#6=Ny%olCu;7NuIKbif9E{l{-Zz>FZWFOI7oo;m!0& z_u0^dq(HE0C)@`Ij&v#BFjd8Ai(;@xV3ZrIT^8)IQ~hoU)=mxf*d46R3HG>U&y;E7 zLR(jb1}6oB^~>Nr| zJw~y>HewJ7p`q8ifqdfe7TLB6Bn3l{<5&GmLF`!k1pm5u8S$*>fam`F zty{tK_V>JCpGB!Q~oX7}04iR`J(q#2_8sT-K+hK2@j zI5QlabM@~8%*|S2_KN2KSl9Yv_YNY`jc|Q{b-Cg$?C>vO-#5#*VRV)WWSO< zmr~c@YsskciAjA!JyTWIT+;-lJJDE&lHz5vv6Ad+MwM68#+o|12BDKYPq*vWHC56V zfzjydnsw#1@IR|+N5ya~Wp;OM*?RKTs(t@TM=MvKhMQNSZ)g&)!HxBFwQ17+TQ@dT zH&v3S;RdgB4JTPKu7=qkCJj6GLCSt{;d(V%)~H*8kr736Fgz_^rQ{g3x~zuOBqN{v zpyq;3`GGy9wmeGSN6Fd&4JK+eohFTlHCIe*-+0K z9zmnEFGzC!})<7ZnymPug>>o&`v5?ch{( z2dqRWRVvQ*=y94hL~9$B1LadIv5s&yP~~0|sp*v)NK|mr11&036-iOMhO)eIi%|qe zRrv9X6glYIZJbcE+Eq&X-2saRs)@9HlEVTNYP+ob}+R=wTbwYH&oX*!F_E< z%RkfStMocaW4O~6S8>|gF)0JO@GM&ReyFvBSLjlE>)lx0M84X|VKU9&v=l0*Qwd-SKCJM!mUH*FGLwO9=CnhzMPC)oB4r9d1&_?T<>O5xXd({#83|XhToLs?H z)~Xd@V?9YOt^g@Qtm#ryzII&{20)ZoUwHYgsw6`qJnwj;iO6XJqt2|TCXc@?uIG|l z88D$SrpB$~O<9~T{o^Z*NE>L_D3`g8cEQJ|HhW3N0v00&Zl|eQ;!l=Ks4Lm&Ao*=q z7e#TOOcRD0KQaZ$M7bJ1h1XZEFRwpEjY8i)b+l?d&B8GgP?N(KJT>FAbH^-ht}z`= zP~7y?sAf{}7EKK!LD#biJnc0)SO(YOGKkZK+Qn|5)pTt5KV}E*bn=1=bsZeKQz2Rd zIC^Pd3C$B0_-JudlRFymbTuB!JwkUKIQ5PkN2*p+*LQOeOkZQD;GTNC<8I1u`*rOc z+DXgx@r3s0JheG(Mq0-Cfx@(`vxBqJ!dsK(rtJ#`m%3fj!i14O;2CM5xwO|$eVwz2 z%UzD+oV1LyQEqE+ep>i6qJ5CO3O|w-nnPTIXT#fYgb`)SeaBM^K+Hl8ie7Gt#oohm2<@6{clxO`e;U8(5T1qF;}^Kk;>YdI|s#%43#!njf%#qny})z&Cf4sB*tp@M$F zUxN4f4*~IfI)g4quLk0UpcB6v;`wgYeCTu3IN?9%i&=eC)2@bizL@J2RkHp9&nVHP z;`~_7z)xX%{yx*o+03{HaAYgvm^aLDu1X|35fh~N4#rQk@QYQtlRCG}tScFp@gaG; zRV3Mg2_Q3ErxMA|IuoS$O^jb^;kPrc%lVnVWL(}P_&FFSJ z3HZQQNIZFdlmNe#`Iqu3tma~>cW(mvhZEqxNr3+@0sedf{M`ij2ZTdEvYSIbZB3)+ zVZd+aC(iN_8!Zgv;bFX+{P_0+_TtQc;=r$*3!leB1j<|^? z=Mcp+$Kgjgkyh@cCnA}TpFEY5r-<^DTj@OQYg*CeDZ;!-PJB<(d{Zko5HZg>l!Iks zQEjbWJ6aOQuJhDlH5QUpl)c;(rm})nw-$U0saCVmn0p~%8qYs=yW1*$cEbxpb>F}% z)p)l^=q7oTli5St!Hv$eO|85p8e0nerT73R0^@=Y~ z;A0Iu*WlCNz^58~%zh~{aFfpxgUiMGtd_GG+--)kh;A6J88{;Tu>a(vw zZ?;!_q=J4R{Y$@(NkG5Dz{eT%ml^nx2EL1N@W)zO_+M|}ScM9Hn}LT7{9%JX)^I{E zzAC|guz}BnVkiI~LjOWPk8vDKJ)B|C4>jn|NkD(0f#(|ZdkuV|fgdvPNd}%m@1PKn zje9zgbA*9UHt=x6av+-(cWV3_jXQt=8Kx1Ha6mH}&>I#-Zoo2EF)_ zhCC*{!%KP4BTvqwUW@}X^)}7GO})WD9|Gu2y`5s%9C&2jZq0{V9hdUL$}!=gtW2&o}`MA{rzy$#$PSKKUWy^&`kx) zx!b}|XZ%MNF8%&93m5tCws7IUmvPi-o)^C}aI;;1H29e3#YYBij(?bOL;!!Yy-ECt zNBR-@2&(~5u<6s8z{Y=S;CWO|^zdeadU-lgR+DAypuVp7q0oi?@l2>)i22l5_;haE$rdhO*vL2){xYAQW6_H)^m8Y_y}P*HYb<*C zR`&)A@66-iXBIB~y4S)d@x1nH3*XIr4p_MChs#~_ zWO?u$2|@6EoR%-n1&5tvgaH=4e4-(rqYJ&PW5kD(;Fq&JGb}#x9n*XZpRcR+tlVS@=mT{|y#?i1qn%3%`T)CVCbAyOivYr&mar0XL;naYN6l7eDW=Nc~>&a z!e3)PB^E9_mStzN@ZZaNUTe|I{X>(5kK^{XSh%bM&bRP1roYm{4{^QMS@;U>-`g$x z7^c6^!n2wGV;24^*26Ov9^!s{)xwWvJ-=(=&vJjshsL6}OvVr6`UMyL4z}>;xLtA| zD)cfACR_9omVdT|AI0(?XW=_p?h`EhX693E;iqzYn=QPY`J83ppK|&F3m0F_S6lcA zT<;AQ{&UvbFDx8uP=sGucqf+UDGMLK`h3yCf6DZSEWD2Kk1hP4eBK6`pY%($7RSl3 z@ZOx3`i1^}=0D1!KZo@&$-*ySe3pgF{lIY+F5~P(3%`!}th4apoZe*NcQd_wwkz_> zm#I4}`kAb+t1LW^`TWSj_c6V!(}cf#nfbXzFYD}1JT8R(6Q=8K;rqE?$aawmLf^vj z$S0+Of6Vj71dBev=TV`Bi&<&;*i`s@#r@l0(f^Lyd!~i6n9g|?KAY3uxA2}U=iL^5 zJ?r6N3qOtJ`JIJ7!t%Uq;pebGA6xi9)POYm*=oQv+$F6Ts>joOBny7g}Yp@ ze1ReI|AF=YzD2*7)18=~(0|JG@`Z)q8(GiuEqd{_y28Tm8adDh$4IKASr}KD|c?j(SA9*jb*P<8sf5*7UIg0teV9;kW zhQmPv2Y)i*ufhij_%y4{_#A7{gU|b5LSco0gU?@Bo~VJF z^lJ?q^y7HGI+<~iU%r?;#h?eDT-MLI1`a-_F`pe4p91ce>kJ&@1n*!FZZmL@{)PEJ zWZ+<3K>rB8HE__2oPW0PFPP6E#&LlBrHudGz#+d}_dhjolRl72L==z>dgXeDj;V}; zE##3eTQd!M@R9R(m_ZLcMCczO$H2iyzJyg9=qL^TCVh!T-wTB(R2sOcw>kp{={%-y zVI1wkd2}|P7dtIn&ZAuxKA*?ik1hW7%>RCiem3)e)WD(7VxByHW8jcS>V3)L-@^Rg zH0YscdG7Fj0{l}0N4+<5y#aoZCH*M;2QV)E{urI7Tw~y%7ddaYaQVXcF2gAdNHBOnxoUmEm~r-1o9Y0=Ad@HqpAo|m(pUo>#=zlqP6w+tNge`or4 z3>@^&alik=z(K!|*EgRTIOyM|e}tqoeH8r+R%o|V=Y{+3rAVFtRIfE@a?RhrHspbQp$L(MK9N>O$Ltsn#cWhj)mXC`1uA7 z`DOfHZs6ea8q@D#T;vg(X!lt3NAPv)0gGO2r#)-nP}!yQkMO2}qaVeNnru>q7?5Wv z^H0v81O<^t==(A*^gEb-kVP++9P%ytXPLe*0ez7{kMrdKgr%^|z#*qxcgrmNM4sPI zvhYh8uVY-=HHyd81r{zACvLLviA?{Pg^R(rw=Mi!rVl`93Zl0+S)R^}i#%5`{Xhc; zbe$?q>s$keYOZDaV+4-6dqWq$aVfrEb`x2rF201&;EGG1iiVi~7A z0lt}W(Zjne=Q#=Je_+w4^Za;y0{Z(b`YBBRuthJ=d7m`s(e#}>-d;3tjJK1S&z~(m zVlD3z1BX7x(?3EGCpiVt+Y79>ECa`sQ~)9hLkt}H7daLP8spF>2^J1D=C=5mO3sy}2uE1>N34hAEnF;a zEn{5tDc`#^TDVwVI?dn%J%{=FwIu<*!{EcDO3up@(ErGwN0Y>2)2$Z0tZ(l#aP;pH z_@S`hz#*s5KVje?ZDjhV7#BT=<)?!d{e4XTK?3?u4SLkOlN%lCO$iDz&xCm1?{49< z81HN0r!qc>agkHZFiy8{u~40dQ)(Eo%7Rg%;!(=_&;dTwI*T2>4OZz@M@3*L3$f&nLiNweUQqe2p2Lva28$R^8P{S`F6y4+o0!DMbUr3;{x>N`P+x}ZQ~ahIQYo* z;vNGx`8=Bd{|5_U^Iyu15&4DxRs%Qr?@567&eEA5?b z;GmbVA_2aG*EJ#!PczO93GjCk25z>iKVOIKcFCBR^F``q z^?3KEf;-0e=cvjGGXXFYUuNO5|3Ug+=;i&|Ll%7jpI2cBPC@8Pxf51dxIC9T-@@g7 z%E@UwWj&dzqGMBoKCYEm1DV&%X{y}RLomyTdnQMtN#4SkJXRYwd}ylnMqm?bo`VHwFxmo=2tt|4P?TtZR?L$Z%n zDcK~IlT%)|etjib#>%O!YpTqdJAd&QWgmdqR>GbYtl<4eLYTNfwK8smX#q!U3%)Xr zgsvY&%yB7r)(Rav!1Dx_PpC)E8(uCuBN*plp$pOPJig!Y0FLl5@ZixD15dkrDVJ{v zd!#C2B^_LUz;m3+^?#)N13si;QokGv2#r@h%=2ceRbJXJyTmLt5d8@dp%fv8G zgO_=ZBL8+S&(jAW73}_7N2ticB#`3=MjyKq1>Tt{F2{Ko+ovxJ?(bNh$nxDCp39}4*79uv*rID zVe#r8IE^wWYtvpvIq~Yxzd{$0@~9t=!tMHRB+TZClJmL#+mn&X58^oK`a zQeN~5om!`eDv^DqIyj%}gZFF8kF+g2h{MP0A_sWd+0+pZtybiDfCU#iOwwwT-X zkIl=Q5H>vAwBnj>%G<}$ zl@F#5nngSHa-=@4qp9;pI)`~hw!Rz6`&bup6+6zz`&KJWvNCos;kYG|W42A}h)V)f;4XL~Ur_>cR5Kw9l=+9-iTv90D>Rb(LlBpx9 zxPmhR$KF73&1W8>9G{PPi1wIorK2vj08v#cJFsd5iLFbWsOB#nk4_>Ima!DLmOii= zcvnqR1w2E?*Dj>EzAp<@Bd)zW1Wx)1#j~80?7)f=sz_as183Y#ppI_#(KFR*EA=GG zD<#sdWfVD_C2oO~-Espvo}r_z@j^q|orbg*frO>K7;%>H62!A~*-O_F@34+vhO*f@ zemUZ!rK?hM18vE4>T5}_SV!e`^hzJS>SQY6D4`D{QYG|Q7W#XCq7ngDO&;nEusgs# zno{a+(H*Gd&p>f^DCCi#I8wsh1-mqu8y$C;WcD~*v6CcajfPbowL+7^1SSYl>LF7-OF8M(0cr%n!k~yj7>T2Q7$HW$Cb|= z9iE1%Mf<7F9%z;s+!^@b&y!&t@m)_qjEE$Io2xcIsFEA)x^=#?Mx_Y0#wFxo0*xMq{A)Oylf|YY5 zD`zp&IWsxp?z*4K50G#BB->r?DF%Ia7SY5g#@8EmyIk8Y+iO9b?o!5!XvA!y%6z>j z4Y<89oNcf-PD~r@6OKdKHx|@Gz8^psG;)$t5e*}X5F9yJM`+IZEa1mq3i|P6BmS5X ze=iXB${zBgpZO(SgJUNnPM_7e-QD47nW@3F?rx9H8KmjJFxuTdod6PwqahM1UF~^K z?&Sp2j!K=9T14ktr%ZBYk(!F6OUcgNyu5t6T@0ZF$WnT{K2aB+h$ao!Ey_gEu7jPT z%&}CcTc$yqmP7o(J*@brkN5b~lqPvanGn1n>xvnDz^OZV1XE?YyL6rnaPu;ccNh0w zmbzTA$V{aK&C=tYyv+Vo-C?a;Tv7nuM)f*x3proNx@ZP1$$AS6j#)X(F-!&ehoYxsB_AMfO&eJG%g zK$y$NWBDjv>uWikNZ!LJKj47-f6a+bb!~Y~b48_cM6-sR+K7vpa);_>3yQJsYCxqu zzHl}rXtETejM|8|CZH2QcMr87IK=(?efNgOTpDb;Cz!T7*f^COri>fCA($5Gk@?=H zIpc$;HZ6ZCG$axlm-*4hnI9D2A9)}%c;bh_!A-&FF)JFImj{P71y4AJmPhW_xeyYI z+J0l$B>-C(Z)mQqrB*nc+}Kc7PgWjb2Yh20`B!LYl$J-E$N+wMS#5b`jq>B64DS1` z5@Jo$i@ix@L7i-P6CEC{McM9p9NYMw1^H-nW8J#SS~6yTGK#TW?6E!!Yg3lhF;T_rik z(9$>7SJyT=W#s#0LmBz1(4rcx(#>e}ojz#8`fM*#x`g_H%CO1&s%Cnq>DMp);XCy3 zrS{DAW1ZchXMz|?8odoUvee6|)Z$|8Gi=wsP8<%3AW}QBKLShVr%3$Y0hNWUisVH5IGFV-{4=$OzLT+KOpwYMY7In5x>k zF?fbsS4;8c+J?HCnlUwXb@h#uY$DsIV>VQllPOyAY(qdv(MWuBog>jUH*d>JAw?a3><_gvnPj-(OQ%h7(vQ zyfjxL{xrDr6gTqpAeu&$_&^;T zn4(NR3R6&P=9Os~4U~~VX}NI8`V_Qs(Nas$MQIr&L<{_M`bSVpOX5)u<_Q9>KmR{$ z&G(>sP22Hu*E5)K*me)o5g}V2lpQhPkQYIYcp3n_6d;9MeQ>Zo2QESAS1~RZc2hIK zc5e`L>Hj-6<@rUVG@6bz^pEjlhb;ue!!J*O-bcZ>ML}NVQw`+s_8nGh!+nXUTEV^>cYmq zcnYFxk6GIAibEK2gJZ-|D-}BLJhDFOOd4aiJGJM}U}u;KFB|hCLkf7{VldQ2bGs@KH}mDJ^^imj@k! z3;$w+4<3mK{SpJmvjoATj0+#Z@%Row@XzTfFTxfLx5F>7aB0^b3l}~=VqA1A_1`U7QU4E;2k-F$eF~roL_=JqRG4m6M~CP!wSw9youB6Eqo*MmwcfYUmK@b z^b^r>6t?MuC+8WQ-f7`-9`3SmT$d4U(+7{wi=4j4!tY>uX}8EJHr9S`(ci-9mo0n{ z%l{V(7h5zRTex?gaQ#y6_c)zq;VzH2z81cU>m6(1d0gL77XB8eXIuCnPM2BuWz46^ z!bLwV7B03UWv`L6>o+X_l@>kLEeO|H_yG-jHgbed0k`))i(ba@V-_wph@P|X3?83v zSh(ozZx$|k`^>^cZ(<8XD9~p#YUyzVaCNqrQl-2N^EQh{~s{@ zk!U0Z!DT#6W?cBleU#YJ6TE==$h-?a=*N06rBH71!TV(du~CU6NW%1wu*IS;XZkA) z9MMt`Q~17tLuK;d{tg32G)(^p;@d*n`xW=c6BfPn`_qgIz1S#!#iB1&+-a+ZMSl|a zUC})hEC=Sva1DAe^26 z-)7;>EYGf7(-ws&iP<6YYS z)4Q_6q#vkC`jge=6mUf5O~IvqC5?>~7%Bw<@bPxOu`A{CxF_MLN7hmDyk!LAOva@h z=V#o19>5VB#{D38+U55#;guGHu$9I-7NmCjrMyM1XiaQ3mp3uQrTkt#en@#YUl*P)#g%`! zE|JRxAwO8!@;4F|ul_o&|8_1f2b=cn1my=|f}_yKDqtm@vxp|1`~@t(j8n*uuCV35 zm@x2^c2ZOYY%W2Nb&gK?Z527Lp^SLtujZSDiBgb{QcjLP=JFPq^E>lq!^o6!0^z*? zFmvuj-t%03ClW@G_6zh&ip103GS=TFCWQX5K9KUFS77$Jiy{ZO{KH5X!InRs>>yv8 zp$m!a4NOP)x9i6+i&y_AnY#QhtO~6pUJo?ol;_lq4eRi=dx|Gd95-H(e)B!W*>kik z_$^S;0^0G`+bLXHxTJ7#;i96}zb{@GY5klw^JX1Hex&tbbu4V%7uk`l5Nx;Iq2^@X z%UjfXs3h<4ynTBoQ@$>>{ZEC<3YVvE8%2$5nKCwg`_o>QF1nD*65qSg>3RE(XQsq$ zZ?;eux4sr>eK~L61E5i?x9@9xaK-YbUbHtitM&PnClszKJfZN!!l>ShT-bK{un>!| zuc-CmrsvxtCG!Z(EpDqXZ7m+wRb{p{4eQDRaIGW(IK0lFR2y@gxKTU-LJ#ch?Pt&2pBq|ex0 z=EAgfA92dtcUFme@TQR_qM7~5tRj@vu0_0J`HE2*t{`|=)F)XO5Re~q-h zvI4^7{T}-D_Sk<{{xyof8sUkmKsCR$ZzILmou}hrlztYEbq#& zaib}FWKOuMLb0hB9d3-}6SoA)IP(`57l*MW!>KQ8S{okTXp`1x<~GczYOc581t1U+ zOqDg#N>ECZOI__+cZ1RZwuY#3D2w3bs{*lk$d}@heJfpnF{RKfuBKsL8Yx8moMz1A z>Vg)0KA$pzdYgHY-qIh`+vS6LOMg&r=@05n`$4^>Kge79!8GY~uu$BR&cH;hqnrKc znLfc;KDxz6w^maz7DAV91CkuliK~#%(cOOZHdTnlGUQ2KatD!jqJJl&(8BgX+4X*k9L^HAKuS}!p(7!PYEEbpx*!yqLaA;jty;D-g*N4K z%TjXd3D&JlnQ#%PRf|)mT~Be{f|Tiab)r8=NGUjt;{7#E;n@@q>-bExc$kjQ22cH= zLdr4dt6YuG{~g8ib-Vc{gfD=B#b*dX$7gH z@q|<{N*x3Ktkl#TkSR^(cJ22v#nY=QoUZ*L4ic@gfNDUAsyHxf43TT? z1?HlWr5axZ!@ydTfu+?Huh;mBCW>#O5d!68pm0!s1riFKN3~&TN||*;6bhlGJpcsC z6yf&>&8()BQaDz(jyurB(?WHDb_W8_r0JPppuIrxDn(QXg$k(3RE$husyll+-40M( zRpO4ofO3zbwVP%)VgiwBb|d^s6qVw9j9TT<)`f=3CdVCx(pjj<%~A5Hnn0s!%5b`Y zv%14{C#jn78HBEBl3&v#za~YcYPvC|ra36B8-fhQKHcdCc6}ExB`B_@E=F*7!Rcf_ zeB^-8?<9#dbEJO@Mf^_}24ML*@J-R1F6Fp$;L56Bsub2A@(}V5CL9F9@KDYV=WwKd zFN*lg2cr`uoX8P3Z!CC=&!T=mW||>3VSl(IF_^U&%p~fDe?_NCKQSQY430}QVA^U7|=YdrJv z3U4JL;4O~|yOg;o&`8na0;e05U7)VYhf8&8P*DOl&N}FJPrE{|I^G%#UW2Yub$H3^ zDCs4jG*4bAt%_=H-`L6R8Y_xR%n5e0+H)#w$7vj^&Eurx&4xcErJmyX*UO z)f-6@savcjQpz8t$&rCDQcWerI3p2`Q0Ms~VKy4rokVJkM{{s5L_P&~Syv+JU~miJ zHyhl0Qoh09ekg{>)5&)q+-j?X*Too;aAe{Q$M$K&H{UD(&0Is2*A zsBW(X=+&46T_$jGR+B9{L(PWWoNm`sT=#ytbQn5g8Gb0ZyUwA9MWa--9J4Qi?(g#d z$KIQONmX3$!?(LYP)j>h8BrvA<0RgDo;MRDIy)VbP7kLEBusd9owp>}C=U-%>I0=a~3nv1}Gg zomiDzOGWKD$8FCttr)uj3q;uVoRi<4bMo4=M%dnUdnQVy!uG5yXpcE|y`%P+{(>#0 zzj_CKV1A`GCg`&{K8|$i#gOcKa!AH+3CW7_VZDR;#iD6z1EYy+?%Xs^U6WaCWzj6Q zayyIde`Dg>aGAj-u^rs`Ykg&|ThdOJ!!yf@iH7B%elnj7bGr`a6t)qE*Y&eg++?{+ z){sm4sN9wwBBkNvyF)QmtghdL!v{$d50i{)lB<(w5}7w)jcSgllqqj{v)2Ze%Z#|V ze4RN6Q{yld?MM)Ef#A+p!*sa8b_!kE@JWRsV1O*nu{*k#%&5b9@yA4S;D*}CaS%An znP)egFa(dV^+1kvXW4lZ{AA@pHWl_tKzI5C+0l_BkR3xOp+#e@Hl2u9=})8^mj_6H zg~?p*NiG&Nko=++#)3s8tMxjpERfxL4|Dv;PZ&vFmdD84)x3-g7LnwYos}4x;}J9| z7Az)tPiWn8k`E{ZS&R2DM-8!HxhFNuQf4ezNRqW6YvG=dQ;BBX;{FWDa#17w^3Ljt zU4F$Prcxt&!s!&(h=#D)t`Q9d4fve3JB;BS3l`7_+-D*QM3S;ZsV$5CpH}h@x|Lca zqgrQ0{FeHO0uf6=-;jmU-kIR%RqzYCm0C)Lo1=9Q4i5)ofq5LSA5xZhP*vbTpQlKl z`7Fi9!%eE>JE1)dBp(Z*#U!~Xn5ZMUN6+~X->`={u7)f-G|4aJF@_FNf_ChSl#)DL zE5?E)B&h~U7Z*{wxR}z#1zx05Hc$3IlKdo21|7*RrvVH1Fh^5_ktCIiIFfGT3wP+J zw9(WQ3sw}0=RIENxueydj?g~^`$r+mlCZiGqqH{rQ@rf6v?$B^P*DNPUM+eoWN9GD zkL|=kBo9ki6*4+V4p7JrBj18T@rxzEJ#Pif;>LEg?ynVm(P$e4+JY#9P+wa*O9A)^Z?2@?g#*_an+MMMt5} zKTCwigR7+Uy-g2a*K+o_HBC+9WI||m(uA=R#jj(_SeXGjZsIsj3m@0f-o{KJ-`Op> z_Ta!Q?dRunn2F+ee<4@95rSfg!O1kX@$vn!S%SYa@ON9{{9K|U zdG#~NVZW)H9zU^vqV5q>J6A+fV)~_{RwO6yNaQZPEpc%2l$==8Z%5rrvYjDYc~23G zi9gzMS(%@XDe$IMn62EHYuV5mzAZ6tS#%aXrjg5AC%Cn3Gp32jWcS=AnZVl=bclB* zO_02OIfIF|@|H^SsGu7&iC$#L4Dt2Cz^PWo(K1CiYo_0BYFyW{D!XCz>UMebD9mEb zdiK1XybEc$>?)aIFF`ZcHD}kaZ`>&2nl^OE%q4DFHFo~`h?0P-)h*jr)PQ902ZAG_YYP7sFH1pqAuWMW*Qlw70a9+9{O6)d$QO7rJc@yi!3#J{x zn&#X_xC45nJKLMuS~lhlJ^SL1!=$}=-D+vGx?Rk+Gr5aQ-49;`x-SaNF(=5M$S*!> zTvZj=+54tTWlXn=5;FzT1YXTb|7|eNmg(?K*(^G-L#$?`g+fmlMOkTFRw~F;`j%X- zd6nI7a%Zozqt)&`A_NCFBfVJ$KXyAg5{dRT!GHPeevVKbGwdS`Tp@>x=1rzqcBGmf z#%?O{HROGU)k0VBY4) zDcp|3HnsQRAsx~!JDvAIRG&7Z)(wmcAM<}dCPE*o&D$pOW^Cf_Z3h_B`6nr*p#X7AM5sQl)|se^YY|4Ih~ zd4b7y3r2hRR>fy}II;;FBQURIm*fyDfr*c{t`mS`fo0f!z65?(3H-hi_`@aepO(O1 zD}i?t(_#Nj+62D#Ld*!@d-WoGsnkcp10LXMy|d$s1#_N|8rXP&aiAvPZ#@1c;ZNeV3rkgaG001$?8)`>XV%td z=g*n5X!hdl;@X+@v$Ns#uek=&>n2_)@Mjgt*`ep4nACH+WDA+qwU0Bc5v4}uPY8a2Ri)!ba2>% zrwK^>_8k1K{YUA3;M+OX!Ck#IibD>rKWOJ%2Y2P4=HPCBZFJYc7QHf}%S zDGd@fuKc+U?)Go9;=bN%9NhKiCraSob#T{jKX7o@{+}t1%~A5B-#E7yIPB~#KP1LT z0PeOcrpH&`{?QKZ+H;(PyY@_19P$UtkM?979QF{O@8GUIs~q|6`0VfCLmWAqOW@sv z2T5ML=bazv58#K$?_*k@*JH$gAZ1A4K_cD>M@fRsNEnW2Gt(#~!0%qQR600huG0K8 z4?jumsq^r)s$_wO^FjOR9{!;6^Km!r=cDXqkDu#gt@H5r>;870hc8t>T;$>3SDeRZ z>K#^Y89(6hAEWL4xQFw6f2)UoQSJG%hp$wo@ zoUwAaJ`UxatoE$&_raEk@oOmDtEMp^SY|m z!+)%Po9E%*P`zh(cz4b7{6%~C7VJEa|EDVdVh^97?d|k%enW7bhs({4Njwiy@88wV z+dTd%#mzh%p~=r!E&DwFJ}UnS5C4S9;dzsCzOL=s@A2o9|1}S1Y=VPT59J)Ma*p!w z#VY4m55HICPV(?d#bEjk`f_3%M@Tx$1l+QH)-?ZmSgq%Mztm+Jkbhg)u0AKb%v zo&Au9^E&BC50@{YOk#`++QS$(Z+QIYYd)cVCI4E@Gu8re`eC5QU#WT-3xWK9P~44i zf%9@o{duA%=ON{v>){*K&SnqquJ}d|-)r4qg2RKPJq^nLF^~Vp+Ap_w`0o_|mWT7Y zZJ&oz&I=yS^&DUK@OI7jR)5e=j?cq9oO%a)IOUJ?aN57X!_N;-q$54NP4VF#eyif69o&^a!NDQ_4dtKi;Wg@{jN)KJyLdg? z;NW28mp>alIh$0@`5yie#kqbd#=HZmnt-ED_eC=uj9PZ$*{dPW1bRTh!%AfA=!}RMFKh42i`OOaQ z_R9qh4mqDwIUo0MUI%}{!}DYCUmYC%+f$GK-Frv| zdHDg~s`#NE-d!6v(7|CRkHfh=D7$-}EKY;;X^+1}`S0`i8FOc!$3IE=pY(9b`IUpa{8x&f;^Bv=ommHW?P+sxw;wNeaERb_|Fs@|v&#RL;@DuE zaMsqt9{*nD|GCG{>w%XX9OL0pHTDe;AF0Rde>k{1KD+gj%97v~w5tLcNqrq0rtmz1 zMOl!*51iLmqddG^_d9?6V$?-i=?;m|UZAvY#%YT!H-=yv3^Dgk>$Nhbl zmJ{cAe)loEyakutti0{>BYK&|n)4P^F1G%%U5!~jILhPvZw~U67T?09>}MfOs?ja? z6U~OlKj!g{1gHKQ0=iv!tR?=c*9CZI2t9f^VP_yqez@Yg8%fTlyL~`$?S8VE_i2#n zv%k~&)lwHS`5u#k_o_fXmnKg8X-AC|6sv!lwtFcn>X!Am#q}m=-~XS}`d)Rz>tcA0 zkNVgj+;oT5-{yisbH62gt`M|^7`9bZ9>g&zC-DFJ}K;YCro4TZ|pw z{s&Y)+bLO-#^dFqq_OVFS@LWvw~s02*Uuh<+VWh(Zo+@o~TsL{*#7WBX&SRWS z!NAj0W41MB-Q>*nw`PhxoBL`Yv#zqcBxqQT#D99gaK)t1{3Hjv%@3F3R&O0qHw*Rnho(+;Y5HIUs8+(V0uKc|Ek~u~S?Wv$h zd^EjQFm=qyq%1xe7k1{v5T6QC=~F@5Z-e4%K*uf5M$0bqoWN_&`H82u2w7(1GIg`@ z)yiyiurmAfw#>#?E3<*j%4~eKG8@lK>#-~kG?#R-C-n>kh2fgbu^Zl$oH@zGp8Twk zv4)@r7;!(@^9~{8jA8DPV`GO16or`RjfzoJ21EcbiwWm15uAut|3yRuMrM#F4fzWT zM-dykA0QNfv?`qYFBb$oxSDWJvzoAYu~!rc0RaGd+ZYWcSIl+$5v^gu%l>%qG5P;r zn_?&vs_aa==Ek;l=VR7|Oq8+{1dEpF6uxM_VBUPYCu6aG*Y0VM!4-=|bCfWpOJ|_{ zm(Qrdgdx`v+2+<<+xardNhY$aZERg7u@(#G8buAwn__jK=`<#iWO2ubGR!O~^CxkE zI@(&>v$Ic~zj#r@0?ZMUPRg2zcg}pZBJ$LJom*A7zG~jgvQ^UiZPHMgeiKmT19zI$1e%QmWQJmjMu)UvF{AQ1zkutvE;rzzX{niux^@_^*rpM23 z0q^&4%?6Kn_dHMtD+zlPv|HdXQb>S=enWAcx2#-ISr{Bqk@?y_?R_Xx+$8RK@ zZ=i>LNPM{B{&SaQf)`7W;ifT?fz0<>pU=Gg_P5ypOfYZ z?Y9ZVT!&|bSLkJfjPMroKO#CJ-K2vZ{>Ogh`~M8Ve3=3TA5@2Y1{o*$yz8XQ$G|>S zcj79iE=ZqujbO#>AD}PTSReM|nBm*MO)y`kKtYS@{}wV%@_8?mvSRu(s-NQ&`r%Sv z|CNG4ChZi`q~Xf=H%}q6+~T}YtUlM};Q3I+hHYj2o3uX5xov>6iX_%!(N~24mUm2) z{8Fv&w~Os({X2vx=D(Fi{DtoKPn|%9=*$)2qsr~$R7S}Ho^7HlM zn#VtO2o$7s|2Y8}C;9rLNFD8Fd5gDu=370fYQmH>(mQ|VyKzcnK#d`5vFnX`92+IQ#Y1ew=#|J>bW+cNh*mzcMEdHm_R zuDR*Du0;bfyK@J{>PEL$)K7h(@6M}H7s~5nkDt1`e)?PUcQ2mtR(bfpWW_COr%S`=e-(6WL$#g9rT9N5mH*`Q< z=dxs7=eYx3{@T^6E6LAwD(X6a)UZev6TxZ~;@`}}X6MOtP2RCTwq<5r=fA4=zTB_x z;9%agbl=?=z`N(ZHTC|BM(*yP?EJy~FAt9W;E6XgO>bs)kGU^%|8ElYyUQx)OhETKaod#o&gUG@;T=MrA-W!j3^gNB<;g-AoqKB+8cV9BYyM{H z?0EC7GgkE7xmH|Tm#C~C-5k_+H4LcReP(Q4=L_|Tj*9wGf3E91OVG2DnXZnYKGB?( zbvXvqcP<~A%ydo|YNUwdOxG*{?0^vA(&Q_|@z*Qqh zv$8PBuDzEWXUA2h^S5=0{zEf69+0uOZ)B#cEtwfTKGStUIesx4UcVwLb& z4vBKpm`f8jOKM<+38^Y<8^_2h8Bul}*2<7rNGwL)gdZ{sX>`C?Nvm5VmXHX{<~B&A zlg3qP`(#5DwU`w*pc@G`8S@Za$VxEcqfkT!6de(#QLTZBoKoA&Gy<52fiPYIu#_kl z@lh%4u;#&M2-RZ3LZPa(T|y*@fg1bBh+`X3kF&&aTOC@60!=Kpes);!L9`4hNktwo z1Af3c<(Pv<{NG=IBjGNeQJ&;V9rkIlQBt;Kqv+OEAiC`YZJ$w_Yo&_V;2#NOhGr~n z=FC}o$cYB-k-S5;hIM4@FqGTk0p^z4(uadiTKWjk_7mjTK+pp$J_u*CbkHODtZdC$ zIyMv@*p-0HuaHT5E}t5OOEu&)Ov|r6dMK9TsM3I`?#bEi6s!k z<^>0RS~36+#`RuB&<(oGC;qX8;6rNGIa4m?dz8 zWspxtC6f{v1KkMw0})|=`9L?q{y;?7A1D#_FZLwynWK?ZC}mSgDYg$`zv;sPK{s^M zkuWTF0ZxES-wgZlJLT-h3-bH%0``UNsSCh}Wc_&&r5z>5xFB{(o&%o~*2sZ_k5y&1 zzL>IYf$aEcK4pmr&cz!7&Z8G-wWF7jSWV(QC64J7V(3LCXD$a&@e=$=`jIHH#_nWO zh69i7LN>O-W-h}xi7m?O$+z+U6~+C(RRo1%4m>)>h=U6I_0p1ZL$L+p4AYnjCGCED zNd*SJO`}U2Cr2sx&>TL{^JeHB5_Ef9Xgl;iz>y_v0UjnG#cr4<`-$zKYsnDqLqC+V zYWYdqV%4(m#A?DP@d3&NPxK7R%w9E;hpCTQ$#M~+MC=AM(;lWiMjb;?Xou~`&0$%x z2D7%@$OA{{^yfr|q!H#{{>uBsLb}`LxTv?O`->r*{9!DFd(=m73ExxfcKZ^qd;W{X zWd4iA9*Fafc${{O?BrazN#t}!b^@^Svfn0i- zuN)6HuN>u6)X#linHOTce}3R{Czv}Tm78$xHdZ{c2wg(>VsGyL(a9w3#EQk)I{hU?1y?!GbsEJ8}t2W#(Y1fr-=km|AnjLZYvhx;e!sF9$%BnO%Und}k@(9b{}MKS1xW^SN(9%uZ!0s@ z4NDe=mQbz4Wu^{)%RMm`oJR6Dq0THxsu7)67u9)M5uI6I7xVOJELchsUr``QfNqj* zla>|{zueX+{Qrz>Ec4c7I_=- z$peYcsvE_8bA4P)#{>moK52G?1b!z;Pe_;Ffirf|#QMc$Ei5AIt^!$XFT1E`aN&S% z7glr|bWE(ETY3cNNynI?qV@<#aV2^ueIWO-&9XDR7xBG=3)9AOX~5Cph~?0NL8Pgu zXV7Nab6#-to>CgOXaVYz{+42~;0%(_glz3e(mYN{AAVsg8&2I)*H_8+rXLUY#s-p4 zhtLX={DRybNtt7u1v%!BWGIH>hg>SfT@;cWa!LLogqD+}8hglP?#t$u)EquYx=ITV zxm3#L$^J-^0YhTJStO~(9$lHE24S?8NBP^DB2G)~ z)c(9&w;T-|q(1*9Rn56%muQ|X^7-GVv@o&F+Lf!%eMVCAf84`@!u3#V!ep`i-$0qXlM)xy${P~1D(@UJc^!mh>rHP)8 zBsQHe>-1&untmO(|1J6R8D}i1n^9j^AD_{GM`Cr-u3*sf)nxxOPMuPy30<8Eco!5Vph~{I%n6C;pPhe`@eG@iOU34UHN;g~lW6 zV145jJcj3Yppg@uC-33&bPWbCp~g*&eY>cD|0Lg3G!My*++22Jo5VYp2kQF0V&2Dz z>zY@~H>l=s!q{Q>52&H=ZAn|p znzd$ug6O3~5WWQnecXp;~NIw4ST?RhN?k#3tn`T_)M3tkhtK49dc|z{_7N3q{F@>GQ-$>?21=Q zXScLED>A?cUEx4iD=^(AYkk^xRRI<@k(tJJ7qBDI*oKM`m-}gMC;+3I@4#rVt|+m- zqg7rQ1$OXZeUSI|8E$_)Nc(Z}*9ksI%giNy6sKOI#TUfMmk9Znn27Xe;D2R2n_4?F zwK0?0GBdR;wkq|$*v!<`v3aSLvx-KmKe<=1Q*_~b6(sYNJknPpE`R)-)Y7`tN(sp? z!T3)%w8Y4lnEOjpQzU@D7Z87TYC%J4X@d#mFZ^+d>Yquiv=wSoTWZD31u40a0-Ly8wrJfsQ#b$RvDHQ`z9H$ zq+;^sEDZ)peENzf$iSHnB_Z2{gFCR``PU^ZEBy_#`(TdTkgp%OM3A9Mf7`4dUhQP@bD8AU#a7Y#j_NDnt-z{ z7H7Xs%H40Xd0T$A;1y0?lDPFRhVLqYW8W;sf34uq%Ue{w;lkH9zJZ0cej8uw;MiA**DH?e$bJq^e**6z zKOWmx3ylOE=K{*v2v8EPN-;&8_)`ES0eAKO(x6t(AwrY?We0clzTx1m-oCmY_59R#b!CiY8U(2^=5Dbyz`{5YHvB6V!%4eKI;I7`u z4!^7SRK`=HRY9mpiy?&&NyH^D75;{ml4#D8@OJe(0_H zH*i-k<0Aog^&YAGz8_9-@F9+T##aTui{Ik#ALH=bcZ~L95BF@uGY~!k!SSa_#|O_S z#Cs`@F^@$2vo;%^Pr;_HG9{z59Q^LttJ1-t7d}OrW;dby<5gIlhjSb(@bEus{&WxD zu6e%Eq5X5zUvgb(67i2{ew~LOr~K!6IPK%t0hIG=wf}ODKcRB2^6=M`|AQXRhr%~` z_=lDM3m$%w=I`|Ip_>1ehksx5k9zo8&HvQHN2vWTd3aXwzj*jEwNp-&Cec4%RGjgZ zh@Yr@c#48VocqIQ4`+W*^KibEU+Ce#SG~(U{93Cn;G7=novM5nd;Cdl?=BCgJ-2xH zC93x}#j&Alp!zX~pZg|oJX1oVJ@oU>931=|hD+j$Iym+(`uTSb4*uUNKhGDGzd_se zrpLcR^E8_L?3bR}7~qiqr1JN5aM<%t)ypM*$zQE}M|u2g*GLD4{A)Bn*1;kFbk)oA z4&}e1d?$GP9G`O>9P$^a9~dv1?dAAv@c3^~{xcmM_FSwuA2idRmlWsuj`9yuyxoxl zd&c2_FNxD5@)o07jfxNB!$^%Ld)MCA)@{Z8V7gfpQ||i{Gi&=;qU|EeZ+?xe)Mmfoc9?tX4D;|EZwzpiBp}MPgfP=ew8NZAEOskyZ9ezNkDL&u9UHNA_xGR6N zgG0o6m9x{sI~2dh!?|9>Cmmc#kro7Bb#Pbj3yO39jjQ}u9DYE2&d^==OY(opNS6=j z93124B2{vz;`AGjU*kQT=aEw#IT)Xecf8o+=Ud4RhaY;MQN0&9IQF|L`5|>WIQWO5 zA(F0gaPY4LD2a0++1`Z~4nFSiL(Wc>=59hng-;}@=HrI{n8q)-{9f{+?=A<70Nb>QtLG3wNho(WU z_Hdrpc-;gTb{o)TkuSA zpcLRxTtf!kzHgW%R_ge}GacyB)7aa_N9Fn_DlXh;cZc~gDpS>j_&cp%Ej1u>d|1;G zNj<;tiyju!e%etZ1)zQZeMpb9tj8_uF+X1jU>Lt{x=HKvIVQ`vpE18&2wx`3p3(Zh z^9=KOabH=i|6UpiDM9epK6Z=#L)+PYJexvVD?eW*@O?OVO6u)3%;()CJU)hcPv}L} z1MWel2=8S@Fx0{J*sI`WgHH)>G5aefLyCQdh%M~zD?i`Q!L-Ss(9-iurG(`fsH& z!hikc$NC)q2MOl6$kceB)_>9DqCd}^qPBy(W{9oB<0tfCNcj43SyW8_O+#({=j|r^ z_x0!6I$E0=B^*gp<%V(Tbh=7@OqRC)jBh%=s(Sppo$LPG$)Wn7#*j4<&~88=bFF1Y z@aC2BTl&z+YlE(>3#wm#2@KVHWtwlYV6Lvr8<+X;G6`O$!f*fGt-`n}(^WQXq!5|T zokOoTHI0C}&IipF^Ne?!L!nXT&2L_CFD%2{=3g4_%&uoKxA{Aex9j(P-`8aXKcDIR z`F-%4;n}sfV{^SsCr{4m{G(RdE821w)bCy^6W$f;{6l@`i?+D)=Q5Z0zIvm`Ai^XQ zl(q2bOxKmh@Ku@PdYhK?-Gyhxne7kWDjPd%`vE&A*;IMhyvE5qyjLb*zxDF{CLZkT zp)H-ig|UvZm-kpj+H!c@PPsNy#eZp*mpe`8ecwAbGE#NnD7;jaow6E(8A4PM^h-n&wCXie+AU3H^} zOCxkgi&WD&(N<6wkn*I>d;}Rw-WZX$n@ToTXTq6b-F?ZIguR>mWajf0e8*y*i6k$0 z5Rj!Wd{M}xGWD3-K&Bq^Kw73Ar-Dw(RBFgD>U+!wX+)3gu^f-&jkq2w%-0Q;&Z31j ztZ0vwz-_?M9%lpZZFyD$udwvmvxV+&=@!t3TKb%2B7Q*7V`Psr|0$HYtm<(wrl?x- zk_g=jPXxVQmA^h>XYX$bF+wfg1}k0H_B;-TnCA4Hj4ntfr%A34YMYi_-AktUY0G+5 zZ4}tHve(3Gz-_GSHT@Q$Z3}wMxIyRv7O%Nb=s}jQy-et|rB6bOhgy0zWRA4-Dd;P^ zwpg!IpAdSA#TVdxQ;nsU;oW1#(#t_Fwe(q_*IN1 z`Rdd@m0&ZT+!mh%ZGGFCR|oMa5M(_WpN6VdaeT(v!eUz&H_8?m+FeliSN zY4OEaS<<#Te)HSUWZ#z7 z4MFNCm{wu&!MMU1VCghy+kvSepht>$_(?++B$Idwiz_O@@qqGRkY&>n*9+YbA=JvI zO+>2=9^ak#2Jn_ZC?RllCZt&?(=u#M{6rZxM+}>xP$gWLcvBfJj2JF74CZ}C;=vfk zSpthV<0F7T02n~pEbg34)(C{_!ysnjBY;90VmC5#xWBk=0CKS-pa)5_@B)&#TZj!Z z#vcKznMlTt{InP`@Q<1w$n`9PBj5xklCh(n1ova)-p7I?;7TTvvBBuufqY~;@Y5{N zdw?J~QI7ma%B*I&OTb4hL2Nj>K9-Ye#_h4;aEp>?(_q6j5}rXMksvk-6)akf;bF<+ z;Eo}do@5%Yj+||V7KBK;LY)-50jsH5&&@UiK?*fXM;?s|6NN3B(0>e|ScVdZqBqEhzpc)PfFVSKaH9Z5mP(UN&w#Ee*@sz$LCJ#xF092skncnr30LeWdC=yKT}k|-5NN|cI=4kW2(57S7unn;>kAZffW z3HF8t-XWQw7fyE=apoLR5%j?zwMVY@1eWLPw>~Iq2a(RL-x!p2oQM`DlQ>yewpEEs zm2FkTX3pulH>_wu6-__h}vxi^~!>wSQYIH*iCOyz4C$3D6|;~yXii~aYR{+oggg5Zn|Gflk-rD z1INNV9_*$u`JqK3xzfrFg7AofdWk>B8l<9Z7Gfad`pE1A7+Pj0I4J0Itk8U?81x-3 zCk~quSI0uQ;^dHw-x892vJtsDBo7)Nia59*&O;OT6g(qsRP>8NSjg$vjiYf$7-ph;#Nmvz zaj0^XL+W86M=x;Xg~pJxSQs`!u5=EMqDWvp$RiM!0{lyRong!v$hZ`4oC_!X#Zi&n zG-YrkQVx_++zYupz-75awur)Q924;(EXGhjEQZ9pXb@atT~zl&c#aVai!m|^gfWT{ zIM6f4Mj<<77ox`@drV{rvSY0P*)eSO>t-HaE%nFwQ8TLY0NE?6BY$V#zotAnubL$C2>IKHrJ+=j?D8fR zk;2*$OMw&?Rj8C=Q-OURah!688}8$0Dk3Z-{~1DyNOCs5bvJWggmWp6(sv_E0i$0Qx zyCi9V^+KVnMZV>f^;Io^m8AD6)dzONBQ8yJ8>*Bp?*N;N`8c6a} zUU3J>TjiP)$@U*}_bV!lBp(f-#U#IzSJ%pk{tN9`OgnHBh$KBnvQD8yuxZO4W?Th@ zhpIva3#s5!p@QWk*)%kC;U4Dhix^3=brN}kq-)2*J=XT0K1r%9*2DA}XA+1TN#3IR62T=~!baX18c{HyXgfcGFS7Fw(AvX7DGNwO zwN^y#uvC?DlSSfTk)^2T+4dMD3?c~xwVLi%QCrtl{f@44cV5e20;}kvt{Q>kEmF zoGg?U#zR0CW$k+{eTUW7yne%`X5%n)XPYd&v}#qGGm|k`y{>UhySL1eVU$_w2t>d) zTj(GWkv)6exmai`Xlc)`lVzNmv7VO{G`F=hu9GL&2+4r%k?E1GGJem^N+g7~whe9J zB4Di>vSCNDH`HeH)=j#~Z4_gAMRteB(@{&!5(h#);x~GZ+JHf26+s{MIJw-LSb;7N;_Z zPL9uJn?+~KhE}uN1nqE3c2#qGQ(Mc%9N;WH$^9+JZOTf}>Lv!P$Y$5et_N#pZrHF6 zzFs3?d}RX|TjS8cyx?r!(vr(=Zpp39u5Vvs_gUkjs7nwDAlK23evrrrLF85)8Q4YJ zH;Q%>NFXYXdYpD|f4(gdlv9$D|r(Y&d7Rj{dXUCS!QK#0Z|Y%^m@x(5owkRJlC zNBba8UP6Zv7s3%D4VQ7c*CJ!JOK~we@C@PMTl@>b_;@4kKI|4Syc!^>`FU z#M%ALp2Of3G6XuLNzws2TNq)#t*gbDW_bZFBas8qgq$#@=kFX^ReLDko#-5+F|1++ z71ePd1^?wSMY37!6zEck`Htg@Y^58daT>8Bmu<4+7ei5Y+cmB7A%fk1OcWVA6hbFp z)H<<5vRMt*(Jmo40(+1X+0yAv5_BCt+=6{pw%C9to0So`21k@^8#Eqh7?@Zu(V1L? zn4>h#<{~G*zuMnp<+xY;zQ{nxGb8Ls#q=&EO2`_0eMMR$R$M}@hf)6 zXQl>RnW#;rFDsLf89U17r5=y9rk;*1Og$G{B->ia$9MNkjTDyJ)Bve6GnG8KSA33? zEfSurY%{_m;_%GnTKOUMRQXpy{_e!=RQgKDzpPwBbL{B0A~of-RLxnbDYdDp_;wLK zE0q>LE4;3kFxESOm00)>75`1KG+<$|*cf=)6O-3bX)s7KZ-!-y@8EzlnYSpKDIH5g zAOEvb$S)5ti==lSOM}m?@`aUNC$L{WqvjIfv%UP{gnj9p2aYs3d5z~K`$|UN7&>L+ z4c$G8{H|q_6(8#Gf;>TS^TNt0t5v+<{!;K_u|Vbs?#9>{qOx!sS5_qS|;nOy= zFADb268yK6z`s}m|5^zg&zFkX`QsA!OC@kT-6|$0B|Bs>d~gXIca-qwUfCj!s8 zS70aC&!1UapPfHv&Z60ivx{qI*3ZrcMK8k&&b>SXn1Es$KP|dIuxB1tD!4v~E)Vsh zoL60WSMw2#tI4eA@U>tZh(>?e~A2u-w99>@T28N z{M!H}0mqwU;!gpT1bnFci2o9xB;c4wLj2DFB>^8MKjQxaC<*v*`4O*{af}3fg#3t~ z>fo+FS30;WpL6sfC+)~-RetyfeMI@^JGkq&D;?bR^Yw~D{t!pb#~s|Y|7#A8V?Fh9 z4m{+zywc@b+ri!ObG?JR zHRseEcE+{O<9e zZ~H0dUL6P1Osz;hmP0|Rvzt(Ft>zba`1_Qf$1%#kTvV|Lff_1!%tTK?DOzB%Fp*& z^v^!E^JgCaHEInt**{LAWx+dceSD*tW|r#%mQ_-3{L2OfT-=6~Vg?be*&We;a;q&GbL3gz#s z?Vx`?pn8XU_%P+4;o(bE?kOIAs`4-K@Q20;os9dmN`Qr zKaW$B6o=W`B*Qn)<3C)Fw>;iJP9MW*|CW3F99P_r$v;)=oa^!PdhSBc9&LWWIp>sv z=Osvc967M(3kH=KOP-vh;tzWK-&dS|qWo7C=lO*G;q~jQo}5Fp-{16b#zM1mukdWo z`WespkPcD5LNCtmpH?};Je;v%syv*2p620SR67=W_;x6jwA{nlziWNmvIlO=64?16 z?U=2~&vtSD`j97w_TS{-=r3O1-0a|x&vxDJ;NX8k{qq$E2mj65UdA8+8+@9UAJW4f zKd*P6aB#@y7YaX7ob9^VNRb#Q4u4<8u=$gNL(W>=nf~tKH!A*?gS&DL>TZQ{9R61M zkMQvMy1yUe;ky(cqquMX$sYeNm4AVUmudetcyhjK%?mm_JOf3NuJYuJP&ps;_)k;* zJ3M@q;!k+^LsopS-@|{RcuaS2w)Z!R5B6~0@7RTtqx~_idY5_p6BR$l!+E{2*~6Pu z?@kZDM)8k0xDEkR@&yNX$L;+Nj-ha_+Vhx)-=O%f9Nd-vx`Vs&d-bq}p*rM$Lgftb zaDKr#O>xM;ey80LobBP=wBL7lcrP7qyFK}PRqt&MKlY=!D(6cM4!!f0{~iYi{|}V^ zeg_9Xk0;-CaPUviBbDOaJ8 z5C2!_{+?DG8}M&Ye#UEn;n;aZt z;Y9f%ZFg`qiQnFR#KURN7d)KuzoIxcuydvSkQh4!IPCnVw)c?|{7*PI_~+`t{fXlA z=K}Tr^A11sUM)YQKRGz$Y*#t2dvf^2S|5D{2l-%KBtN794i1&GRd1Dt)1DJO{3!^O zRPW(GSNseQ=eTNhaCMoHv)#e9DF(mV!C_)f?Yz~)`N`-*9?qDVzxD7NR8CwksOW!w zd03-3Y{7oCN%?1$z~_4SKHVSZm%vZ=@K2f6N*sg|_}L!L^V;eX_<9fjuF5~J1ir|`0v!8A1Hx;)Wg;M;Kma8XFU8+Jq~}a1b(N7->m0_ua>~S z>EVCUaei+JoH3d>e(ur+JnHcif5O9$R(pO_0{^w{JTSvO?p>?L1LEA@xv#+<-4%>Q z6>1m9zh;9+wS7LGRt9vRcA-J0csP&e*Lyh6v+q8JT+yI$l`?a^x>7>Qxe?~%ovF>r zws~D+r41a{(z<#>pmgKeXXCRow^%+;%F8#lHMXv4Zf6bV9D(xnVl#^|fxZ$SAIe%f zL1pU(3Hl@7GL1FgbE(+owek&I&S+W$`L*JyqF z-G*c|Rj5Jg2Et+c*^c>A0@|-XP3yOWH7&t<+~U0qXm=k1=N(!f?Q@ggf9FaeWx0I3 zpZb{|H(2KLu9kvg{a-WA)_6`|n4|x3>FD?WX2E=!sClm%%J+M~kbK@NieTWI+7JIh zaGM^-Y_72WE-5Hxe|nCs!Q&6?hbw&h@m-5=6KcMo4@OuY7?RI>onXcEFDRlvCA_}= z&lZs>P;e-AOi6pqfAr_;zekFE4BSs?{qwzn<@0`Bc#GM;P3<25VUplKT>tp?KOz`p z`hJ>!lz@_|yV))Osh`^)NI|js+lJa2lUPx=tj8^$TatEJzozwF47AVtC&fHB1$Sxv zmplP%KjGgAQOtkWtN${}2>)SMVtx7*KJ|}%sPdfFe-jxe`Sv64+Ya`dhS^F}V4Nfj zXAB8nKlbTj`kx*p1(LRS3cak%2f)YsjBNMzvF)lSO{$)hMq1f(>+JeD@mM4=7R)H< zAJ{PRc>LQ`V>UG=wq5P%h>m9B)s>7?m)Z4J-<>Vup=~FQtLyw%-(B5>&g^XM;bP^^GXFJ1fK1-OT;q@e58)ND1#=T}x;FWvvSp(YC zd#LEIe$;C0nhs_|@7i12`S2Mla)+xe6Hzj&b4nCNuHJIb>U^QD>qN`7Yi}+knM~)m z1uZJ_L0@1x5;$9;3+@{CueaW+?|l8f(?y+nr1OFOhYKqHH6rW65O~H~CxoFmdtT?C z%nQfU)xY=7isYEu4+l7?--Yp$tzEkRFaOkW^sw0}4Zi;u1gl@)FU&HPeeH(z&Eqz# zAGf)EV`EeEIQ_P5Y-{u8ario$`;=jpKQEA-EpE(>993z8*rlhZhqYIx&D;yn9X7t* zs+KnU#h=WeNZVNx<^w=vW%7+eUPL?dalVJ?mvdHadew&3=1RmH>S$|)wpFw;h$gPk z!l=kl{DvrdAq5kW?6g8 z39+JV%Mo(mGgg;f@C~V|^o2N~G0I)}+!M)EJ`bd2DnAu8qTE4-(OEtpq!B%`eEGM8 zHloW{ObA7nXHBy#z7n`~X!+T|ZIrw6)xaw(&syv>Hp*Rj3uqhVuKXOlTSt_;@-y)@ z1nwk*@{1RQ+HiIE${$JB8#}sJnOh}G zPrOW6tlizG-ypQLwfl@~gtj5jy4P$J+Qzf%UVEX?XpmMYM_T-pTZFE% z^r;UCZNtcQU+{#`H5Oln?|L$pUJlwudFy@_=(QF<2PR8AJM`dhgfy*qX zBOTXrn$$Whq2)&rA0Y?M!6us1;QVM#X>yDgjxaMrGI9xcg^EE2_uWXb3EgCm8}uR9 zE|v}0Q_`+2zkQE()fL(`#99&r4N^8rtdW+*CP~92I?`Ypu`NxOm2UNQk_jtsk<2z* zIqC`sNsbaBE+nzb221R+O^$;KBw278jX7o{odz&#Kb z4TTMwRnVaE=z&X|9@GWqocrE$3Ur!(fqdOMH?Fy zxd1`8hUdlF8o}UaBctY?csQb=jf!GyA!M4&MaTo>q%b-HI96plQ)!75Me>ReT0!#5 z3fa&(%_lIjtcbNeWxDKWgB5IT|CeQ4(>;0@43(luU%}T^lt4iuJ$ZNNo5l4u}F+hbZ0^RxI2zxZiv&Y-R&VK7c5$5f{p~j-2(J#99ty$Zx3c_v+T~ z3!fj)5Rnejt?yY|8vSF^M?4rK|Nn=>3KaMGbNThIC&?m$)RV)PwXF`+%I{w zMEsc&A0NAW?DV-|SRSd=eq(aT8B+E@@RSsVad}RVqJB4ClW0#~8lTZGaX~V7TjJ0g z&+KR7@-T2ik%_P-t_K56gt1}5XJ{IcBa8`yXbvVchg7jaC^R5PSR)GZAP>@-+rl6? zg&|V%XV98(7l`o@wl2~ZN8RZ>U-gBTBIeYcjGngMM z=4!zQX_+}kOAMCxBWBB0iJ7VN?y{Mwkyn;Wl$Oi7)uyKG=zg+9e2JfydMVbBdL=er zwzUGR>}dkINYoao5{7Y^(<`14hMB@xm-?&3h}jlz5atDfEf6f;qP63n5n_=bs|@#Z zG4qV}4z-Cl{F*J;;4J@tLkyUnVrQ`!FnCA(|Hpvgvzu-Oaggn!k@A9muQEt^!8Z{T z4c;y2;nlFOx4VVkRI%88!`#ix(>Et z#c;&VfdA?D@OWY`)#TdRi3L+NHOftxI&~^S!A!x>M%x3bp2N} zI84EnCojf|#epe$`Bn6K$-7{o(2_x0LVkNi6P}Q80tz#FcFGqPUM_m)wEVZu($(R9 zBX5}UVte3QJ|y62`7x#i-hCngA0j{Ee6WDq2b{x*uNE2!IF7A6hph)F2{>Mwk^fSF zk|6(R`4N8zpd{eO$d5SQOCtGpzF^@39OE9zxBsseHufAUH03j@F6}3tlJSb<+n-k4 zw||s_yM9A#CCZU!kD=aa4(|GAu7ks$wC8lieZ8E!1$?N(-|FxWaqtdDKF)cRf02W` zdKo*w_ru2=`EEacQt@L&_Ap2OEe`*12mh*r4|ec-6o+1XPewcWjW*hgmkGolcl6?Q z0&&ja2mdGs|AV6!wvzufM~-X%-yMFO3(4ON21x@7h1!!QJuC zx$BUhcI4DK{6idkf#TTUWf%1>b8z%8_tRDfcgNucibLPS>NmzjAV1sr5s&{$&EM?d z-CQ^M`nNi~47Xhkr)p zkM(e#x2AeH_lMaY-m3B!diax?Kg+}Mof=Y$hhMAt4iC57GMCcB(^|0G!}lxx5fA@_ z=5O|J#zwo-!_6nABI{co&g0;t9*&hok^b!AAJhC_J)Gm4b6VKH%dD6nt>cdPFSY(? z59jqkt%uXTIuED(RUW=j?eFsNzoJw)=KX5_&pbJdEyLpkrD@*J>~*O?4lfAZw=G-Vfd*jFhAh&1N?mqV*l!tpZJfp>@*K&jI6U9`KXgt z{&O50dhb$vmnVlY{jMm%f2+rToi^f54}Vp0H}(wLb%^@w0gr#G;#@Kn{(=2Wj7dYk z?ExX_4bM*ET<(*8TdwjC(MK|r!`E&{Dh__krDk$t(!l-?sGMp~4qusO930nX_BoKu zsdjL<=JRU*N)M+!?HdD~? z+~*t|?L84jNP5}9(cXV)d;jX;w5K~NOJcu#$7X|LJ^Z(dPxkOv6`$qdjD2^8gR2Rq z#ySUw@0hkbIP4#*_Fv`U%M|~VgS+y-=HRaU?>ac-uT?oOd3c-RuX#AfdC%_FVz9Y- zk92TX?|27?UVck(iidN&t@Q93RFZVQ;*gE~BCY%3r5?Uc@ykod`ILi0R$6{YUvO}! zLJea zogSXe`L~yj9c=h)1pMk^Q#w`s;p1sjYI$A$uXs53({~>u!Ht4Y7!;vs1ckhy2mjxS zk-+1Ux;C>u^&Eo`~B_j=&A8@_Q0%Xz~Zs!w}tqz+I z86y;AzSsKIDsy}&(Gt8*Z1iy2PdjR)9JF8m3^l0LtIvAe;=KxJ?muMbeH-)KvL5qz z&jQSM*W;=m?Q;|NM`Gs+;mbrBpTB)kj}PScc~?t8vHl-9!q!-dlcyx~KSa@g?ElSz z`7#9xZpX<|(gd$zKJOL6<724zE4_*NxsE?zNIvf_!HU_xZHi$J?+ai*o+bH|5=aQ zpGpbokV%LHUwF7+5#B#3<_*&zsrC1I_1S*HzZ0UE|NdH}|M4D@_32mm)Iat?_Q*I58EgLt!SLS2*N=U=nEnAnq(Bm%E8AS5ukkHbdlVueU6qcK zrS1Qu2@_1gl<||tTaI@gBjIWouc^jtYh)dY{xVg+Z1Rp5y60LmJ06a0+xk|}ch~h& zoZ0cOSnf>ukLOO2|3vP1`7g^IEC1!WBjmqZt|x1BoD)(jLuyG#)rZu~keZU2`f%=q zZ6^jDmD{$)f{u~fZ=HGoa<-de>?b_SXvwH8gi=?CaUbk1m8zh&V^}y=NzJqt7 z6rmkDpXj^uTS6XxSl^vEbYx=x%IrQlmg#&oGwRzrp6{MpBiZMOa)Qui_p7$F$p^fKVfI)C+wv6gq@3DW@qgu>=gL0 zp1C3@Pi_-g-P+~P$WC0~%GMe&Q)F)FV`FX{P1aq@*|yN$8?C*Vq$mc*lQICUr5hvR(Y(ai z4QQX0wUM&SMOdtjS-nJ(0I0%xu@x^KQ0WJ&Rl#kMVx26GlCt;fnV!$T^u#SCvOZZj zFA)>mD&(9Rcjq5+UZPxBltoh%&8)<_elqNa2iSB!z*IRIfr%7myVdo>RJk6}^g?8N zM$-q8?S-+^oAdId*PWSrDW|5K+xqs3HAsz$XpS8O9K^bq(|2&*w7h=N)H*x)u75tz zDs4O@4|1O}>BXj82{e%8jjbG&x9(wPw)Ta9m+WEYUImNKgV91eMkFJ1(#&uXvWHV~ z@gC-AK(C-9NXzbUbVqRX9)g>-iYb%=l$BgqCEK4#cp z;Uih6RSh3A^CNjA7rA`QoDuPnJj>-{rYYhhxyI#VW_`p*@;sN189Gtgp~c~5uTqce zR#-^>CWMxdd_ke&J-=5=DL{Ijq+79Y&Q)Q>g{=5%l_~QMNxHHY7L0`_w8D?WiVKtq zH?JtgM{;5($-8l-AqfpEw38M4C|4|4NRky}!D&`P^v_y{Xe~@A0Ox7E>rm1P%mMN36lO~LncyS$D#;$4Y7&mcTOKa1*4q112 zTt|CbmoGCF>^)=9xN4OwA8%)I{g=;%l9tQFz}8$N7Ia^~p-m>9$!yDPwSen4O4Klk z+7)^QA-qb=e+#*@x*WQdyMAM1n=G`=*^NX?uaoy;{iMO=u*%Q{_Dl^1O8h4!RSdB;NND=hgTjwixF)UVRv3nBw5? zr8G9jDor_;YM%W^{3ONoTxjfsJs2lQv+X9t^$~JV@8O(t!TT7>=LOc89{(Nc-?bjj zakjz3`3>wQ5C4?Pxy-}q#}9fquXsP|;n%60Pk1=LLH>+~voG&Z9M!|?2%#VL_%GHx z?>*oj_bBz8!w;M{b-(xUr!@a}2SC`)e@Gj* zz{8(cyg_kn0I{9CV&{0koHwNH9zTyew<}J2_>J>D9zG*s<=pS!sKdl@M>$+a_D2rC z8RwekH&4jIevZS}J$`EX|* zoX>hV`M>Dlm0Iwn61aQ3C5VWvA>W54uzdo)bd<=ZY;2y+vHH2bR?Z~53IAD-+dH*>$e_gMw7!qC9`T2S z0Ok$z;0~=1``pC#6T4rCV*bmh|8QS}1pnb~j`i992MOly`vL`fwf^JCILWuanC)O+ zT45_K)rR371(2^F_l?E$-=VjjTdkPz-`Brs^{T9#hSoLf_XzgOgS1JOw*UMVVZ!8z z)#FX+JO38pX`Y0|iW*~yU9X`bv)k<5i!x1bnK=7hgZ`S?^=z*DD?83j#&Q*WnIFEJ z?mF%zRM+79hL)8Q_H~@vWk#zm(xAn=7s@OCL63E!=eX#Atg7%iQ>{~8jo2*m;ksW0>nZn}dgEn=cST)&ni_kl}(9rgo-t%rjxNeg4`I zPS2Xb(E0STvuc;uo)vuyVGXYSy(8loL+ikq<@W9V8na5rENR5U5Bx>wmp^O1*ogdZ z*CvtASL7Rx?QbDk_@<$qf4DC#%?;P0fF+J0+oUY0-#yH1n*KPqtL%3eHII6O<$>G) z*RIY1(V(r~t11k`)O{J*2PWSC(%_wYJ1V!o2_rT)W}1F5w`;=h>ZVQjVeW7&hEnm$ zjyWLzLw;vhMIM0);}s||h7|Qm_Pu&#-T}PgG^Myt z-2K&A&!*{*oqsmN=AUNROtd}M_p(lLX6H}DVMAPpxr4|oGh@G@s^2|UxPna6zPhf( z`($5xGWYfRrq}cPwYKv>``7%gRj&o}cKtfn=at$W>xL#{eRp1EG>1l5hd$7E7s5_< zK5a+ZBrz9crU^Z#M)P2i)fuKw}o znJ2_yaS|34WE(JGSP~KlO9V6l#0g9w1cE`9A&>+jA&JR^#U&t%I>sodZEcH!+C}?n z)wXZl5fv+H?Mv&1t!-W3iq?IvR{rPQd(QKmxib@i{(k?@?|zbb?)~2HJ?GqWmuH!0 z?#=ozrsoSi;8j7~p=N)^wxNc;88NY?j8f>0Z}M+=9eOfN@m*haI=y-)_5Rp5Vf!9c z9X;RX?^DLs?g+Jy3&lPlGgO0+bU4M&K892LE)tPYlXthM896RnOj+;#IR5;uXC|6$ z;9^CM9&p}3bSl1cXLOg&T+ptrbf`o}8C;qydBTdjHtBrQa+~aNy)6`W&rbEx6_Ijd z#|5bGSu3VILQXv@ec_HZp1#f|Robly-m479>i^BInGsXfb~ScpacJw~!EoUl8QXsf zqeb@&nDEinse-XDky_W#z-SSu=9-q)`e<CDD=UzCfTQjAi34#r{A zAV0osr=Daxb1|w)Wjjj-g0;Go-VaE}^?pD)uJ;4dalIdqj_dt^bX@NTq~m%&ARRyd zr=Y5@<o!D3fn?^Hf^XRFv$#!QKxPbwg;|_ZZ6xGUH8PoChM}c1f{@aQ26g4SvAJkilNq z?<<0|fxeUmZg>H!!!M@|Whvin+1H@@)9Tu0p;k0YCFdyMVyI+X3S9fslf^5v#dmhcQm#Y+RRix*mm}+<>#J(9PRSv~a3WL2X435^F z#wCnUIk#XA2Ce8PO7y}3Xon2;PkO_NM-P*!l$Y4e+AICX(#=L9`#8H<36za*2E)&Z z!~NQ$?;!h+(=zMCfe^^1aFS+Y3jbz931pdci3$ z3#xx}zP`3Kg3&+D#A&L7yxIsSeuc^tmRzIjMn zEUr$B=_trm!1{H8P6*ZT`GZ)&b)tfp8<#`9`77?7D5j6wn@)z}VMj*p>le%*s z;o^y%`|DqTF>V)j9hRhXkCvT#G^&9BKNVU8+{E6^gwA^RC@gs#9>?pwSx^={mD=Mu z3B9|E-50*mI_mEI6k7LxqkB7G1@_`jyZ7j%-TMUlNvy(g_3s~I$>Z=g_V4?&$*H{^ zRJ{Q{um^vr**ccV5T97^AVvYij5gj>i{?P_?r!M$NjaUbczNp2wLVEImNAa8|hTh|rec>~#s?BlHd z^-#9c>JOJg@hs{J;_lI%G&!%cv&>+u_ifiHp3IzWN#wzZs7H!hPVoTso6gN5O*@fc`%MM0OloZEra7;_l(f3>1hN} zGBMBTHpqqv*2CaY3O?S$2~Rx{gsrP_*33oU**Wg4h)LFB@A@k+^gQY@zAHTxMPR^d z5vT)g!iqo0W_4%V%QQuO^2*2du5x(4W30N_J=--%Puu6HXNX82haYxGOURK|ASz>) z{S5Tdqn{^kMD}qsJ5G}iL0PDv@Ud}?mm}v1W!_x-{8K~^{m#csQ;>Ze=HcY97|M2T zUcxM1Zcl_JNSwvp32h730)k6XPX@bQY|(?kVK2}*8ABtj=+^T2F9QrCrd-4KQY0-v)I>EDImJ&VwBAT*71FIMTWlB%bq>q-0VoR}2pQd$kzP8}T!K z9QTc5;AVg?I&J;`s9!#hp5}h(+K9gE(0V)f-LF!Rj=^_0FMZN^9bLPSI~e~{PqA^_ z*`0GO9lGHI%_g9#uV&!Ik8H&4NjMa|=G5RB_}z;MPD#d`IvIqR%roPQPt*p$6TeB5 zINIf3J{L|O>%m^Dh;#u0LjA&4&=SYJJ~QCZcp=-H*m{v3llIc$1N^$nzXZ| zcbuhJUR`mCl3{285-PhdQjQxg0r*ltR16Fjn~3`$Il}WI3LDAWppVkqppO=^x?uHk zM12*I>ss0c+a}J^F(kZ;UaKXK45ws1CQEu3^g}zwl9iMPUk9sJg5&_`ECo_YoQm<% zKv;Z@H+Y{IxAF>zm=p)_H$ynQf;7fpVE~T)ilF2R1Hfgu3PC!;(io>xH0nXuQJ&?wyv*2Ca0Ro(IwIX>l+sPwU!%%x^gX}O)WS!0=J+8iQ)<-ke` zTznU00mM`rJc0Na|$6YX(8dHhSMj5%&)$`^&OWDiFtxw4jUl+~cD1-m)L8j|c%?~sh%uB?Sz>c0s});HNI{vB~= zZsXs${?2t<8ArKzl7=}*Y^HRk!K{Sja&4ZY+Q>YwX?5(x1ZR}}njpS&f`P?RmS|f` zO+om!5eBAorZkth^Xb?bcM@^Vq$60vQ7)dOjZ2O}Lk)4c7k6e&BXL_jYdFfqllW%y zF=+UZxZUYBADF>8%FmUc>u_`kvGhRV)HJUwN7Y-n&^%C zO)Ne(P=QNaSqW1lS18S;RIr^BJV?k?(W9VDrqVTZ?5y2p6K9^Qv5cc!JjpfF;$zUj zp18}^u<$7S_kCjjms@Iq>4_hIH-&Yw!p=Owt^bs(v5cc{xllqoKSxJv!JOg^kf1C_@#QuQ&GwF@of=(lm=IE619Qdu1lpHzUiM1+$K zN7+Q^860K%^vQ-(SG#u1=O}B`M4?VanRT68Fk#rR7yG!B3RXAMgG|9kL77dZ*VD1H z&a#9!D_o6b9OdG+waheP?J;OzPdwpjSa=kTb_cN^bxS1-8{V?26AJ5Og`IhVyWHPh zjb$AD!i5rs&0)$q8Vy0}qh)Sit>EY)7h1^C^9j54B4kTIiOqY}mp z8#UQ2Rl&Mo&1rH2JbR80M?qnM=eSZ9u-pFbx-Fp+M?txq1pbWi9 zc#uthmfGYu-xbSq@webMa5zHY($&*G3Uj&=F!Yr8A}N#AU~I z#^olt!?T8?Ts%pSx%U_};LF<>hPoQ&^P9k(Oeu+_7ABTTn8A7Hx`D2)^R#mBvj=5$ zLSaj}19s*=o~5U_8p}A!#goj(Gl|WV&NP(K47%K%Nh>&7MUXx?j-w~K&;pL~vWU9coVwN} zE-|ak8XqE!_`rbUpSf1dXG!O}lIFKi)Dxa?-eBQBCqbRHWsEr2xk}48%Ego1*xX2L zrgWxZKXDJ!u`});i1R!hVRGUq7f*6~{P$zf@IG<>V<($}x?1l00^DlcL?X-V2TVP- z2JTON;P^`AP-)o^X0MWYrp=?MJj;Pb;^G%m7C;l-Z!ye*3Ovhx;@Hmh6CzKZRUVuyBrv(^f-p>j9eUd!Q_CEhe`d^|W_>!ZnHpv)x zo!Cr~+RI66GRq!22Fq;Xdb=djUA<-P=A8j|C8^ z_fonyJ@DN_$3t{<6;UKrdH%M*J6@nr)OBb=*SNwCsCT8Mw;bUQaJpY%CVwi) zok2&wV`jgZeBJ|{?@J$ylL^7*EOZwoej2mcbv-$uvFzJq@TP)GB@>oOnSbeBkzsQcCR2g zb#z=$N3I87mA_8-VLJArYhqJhU&gJlN>gdL% znifFdR8C6(gyx0B}q;5%9^HVWOZZX znn+V40Gbbb*Z@z*t6ExWnhA%OSLwn5*3Nm$vWK(`nLOKBH*4|5&c=_^e3w6%GbYV; z*5;=9oFNAw7Ky6ZqMR{^Ux2BKSr8kgV!6(!7oCbqNI4a`fadylr1{QHvp2%$qE#}d z;3ntcO)okZRyt2xm1(|Gr6+gMS!upY((DV;eEF!snOW(a5p`yws3|Xg-sh!7Pmgg1 zy$CvIJb)1DoG~k2@ImXQmjSMc0--+=Y7Q*QnF@(9wU8*@0kOv{#P@Ex12V?2QBxq} zL+d8U2w~AlND0kS46*_lpDD(4eW{-84<*O_%R%AN)OId?qh z?6drp&b@8^T;~}ZbYy~v+uHoKu*T7wVC8ddTTDfNg@TW_RW5cOvJZUf{BqNlXC8%` zJ)mpm@1?4So`|a&tfZ6Xdjv#*S9GWI?|_uc!8XY7Zy~KOwE269_Jh5ZZ09xmP3PB} z{4YM}ykhxldpq4`ZGX_|x&_qjX~V{U)y8Jq(`Iy=Ykb)Bx3^*2zhp;SA#q#V7PD=y z_ub@N(^lzxX-7lbs-1R_=(|UC-Q+{WZ8c|9>a+YxCvEFw6!Tx+gwuyb58_T zL92?^H8xm!%`?E&TJoLEjJUs)oCjMQnrmutm9z-#(bT+AZlJ{5Ey<^=)xS>M=Fqjs(#vuPPQuA#0Afsx3Xx`t}8dlha##WR0Hqc{1x;?c9PejHSg z&OKTSq$B8f<)27(&B{nsLv=*C#;Vy+7mcj1i>{8WZCMp3sCH#Tv|fpG%R<$44aqO4 z2QuS|f&Ot8FNTNGE#21cj$C>REg?azcvo9rwW>wb)um&l;}VfbS^3!u7A%U)te7)> zLCM@Xk%*fZL_-j=0PH)c5$22 zUHzPkzwZ1AmiG30D-8sFOWlIgx~tW*HY*LZND##F+3od&spYb!1u{E)(*k|3a%KdA zm!%a4vbT1b6Ug(u)Gd$=2<#*WjA^*#o7&&$AeGI;XMA4SVz=zfK;9B4I$abEb@$zG zK*immco_bJ^sG>=@dCBH8g1!trUimmp)HqnnI6d7n!Xr{g9^yf#?0*Q+iO4|F$D6O zNS=E32jpu|-qk3tBW+qB`>HO*fxOGoivyFko=_4fI=@?B5-0#gKyam>1IA^7EPnTT z5X3Q{@A%oL`c=1Af6sTb!FR1-TZwQ0_-+c6?Ln94>IbS&R@OCybq!%%omxA-vZy*` z!0P_LwAUUkA!~z0o0pTxL4AZ@X(`+)(&=n{uyP2`CY&F!O(ndDa4QG^ggNk!@{5*Z zik5NHQMj?92O5;d1Ad2K!)l%!c>RX;3TJJwgbS}_0k|XhTn>+^_X@<`oETE?6$mTs zBnggQ?=B%H^EJy8H7msgI$u1VpQ=EG_;hg5dju?1J!Z6|d4!fE^A%6+r$@E^30$)dR@WBBFUK{Hw!uiET{_f+( z6mtHH_+`|TJjdajhxYTEBfNSAe)ps5MMH^yWba*&=C1VO=2e?Kxr%Ei<7BH($@(H) zT`t3^I^lvax1ex*o<5U9bZowr8=kH{@-Q|DKMLcn6zEnX`KFO{MWL@I_(DZrs;euB zc*wnaH*T9!Uunxr==fU=c`-wmd=kQI{iHVp>bhGpy^DE?sw?mKD_0|XT%4D*2P8$@ zEI~ixnG#Q77{7Qqd_XAB2ZaS8&U<3w55_St{~MZLixjG541qZF@mc@_^RtRn(*5-* z<5LLdcjp*q`KxrX1UdDDqwPcCpY`H-00ZKu!9U~M5QKp8VaW;?{~>}9O#U8)YW}GZ zXE}Eej{GcvKS?;-KV`WF4ib)h>7Ty{T-y0M;V4JyeP8gU-p>Rdb#OcOgz=5RwC7~P zkvkOrxnAQ^@XtuWKU?6^ew-IEpkC=`-jfscO8Z*`U)q0{fpdSjPv{*2ve^E|1upI3 zJzhvHGzj42P*TA{oer(`u=hp_#a?(&R1gz^&_-FeE6V7_M|BMm*A%Z_y z;Ih8FrzB>}{xetbWqo;7P|TM8=RHChXM1XeoT0*=W`Rq4HWH2p*&i+wd}+_Ef{*sF zKYtGPXQsfV|K|%_@>>Wu{ePu_ zbG@z+a-{!%EO1$`TZA0x|GNZV*6T%qOFK`Z@9s@IhZ#8AIg)VnkMw_`z@?o*84-kO+VZ&aOsD; zg&gUJhXr5y;W@!a9Xu{@7XS>1N%>z2zU&WO=)MN|QhrauvE6Z%Qy$lS1r7^1x%gm# z4#edU;5z}f{%LH z&-WNO+w+8wBm4g!1upG5B;?3;e@pPCJ*UupCE5~%fA;4f!g-u>KRiwFrGLg4{H!7n z24RAMbN`=e;4FWZfwP>sgrl9(59bM7`k_k5k$zY!_|gv>1uo@m7II|!UM2Wa&h3Ja zw*K=h^nzvGW8mzE`wg7^|G0^hoCAcTZ0Y~!1upIXi;yGje_QaS{qGAt>R|tWX5idj zPFJj*civ~dpKz2R+pCYjrJenS9NAvkf-mhHBlxI;?U^L_(myisw>sY)^}UGk=4SFa5Jk;L^@^AxHY>2Emth?iPIMpW6gq`sX(SmwF!*a-@F_ z2)@+&2f>&A`I~{Wf8H{1_Rl*)zVy%M0+)9FTgZ|A>DCPz34*c(jy%40C^QjYD(1=2 zg5OPymk|O_CpoBwpK&A9L*OSvoL6XI4)PJtBOa`Xs{-TKqQMZbE*Nb1_o;^V050rucvgCfe$BpRvY*_ zN;evKU*dB<>)nYCfpC#Nxb@P{!!7G_1Lx zob7zyz*kZ`okVtVy3&L41|Ay^|;46O;Ka<)Mlhk#TJ-h-C%eh;j zuu*ji{uF^@yU!s0Jb|ldkg>NUILhI9W3IrF&)*YQ8uIr; z9){(Dk3QH;{%jOD$~m3-YgFKpe~G}6KcD!Q5zc=2JLF;D#eld!@cHaULr#q3@bfyB z^RX6V-7n-*RORd!IJ)e4;=e3#Y`UW5I^zw2BcJX3+`!d^E9Cd23uUw)>-*ni=c$CV zoqQdWZ}1NhpBK_#KK}-ke-p(1c@+r|<{EOoCOHcPj_tzyr2ivkd%4++KvU-aVwZRq)Zz zd|iE^z;V1kib^5yZ@{=8=1_m-RX9xhe`M&rgY@1a|X~e&gr$T?uD7 z{9ERrz)2;VY4Oq(%*Xd$Fcb;C8Y)E!w)lA<^V!a&f{!NhZ=dszmdL1@KH_?_1l{Sj&gXs-D=4B1Nr#@furA07KSGTj#NMK z|15Cnw>JfjRKCvU->RWMC7++;v7fnKeY*k?0^|G}?;zpq=O(HzKbK=a^KV@XQt+n= z9Q|_!^}m^hUjD849KlE5>><5N1&(s~Ju3bU9^20=&TbU)W&h;oZ_FP@e*U50%lY$G zfg_de{H=lWZ`bz{&VD;c_CF7dXn{emvTc!)xwN z7q}cp@XEXjtoIzM*GhrQ{;*cy*dN%=%?8eEC|p4}))(#HLH7SZ;Ie)97&!mt_I5)) zFXy}8;P)lJKWp%RO!a!x;7=z0y9S@vc<|E$V)oDHBxjg`>q#1}mkgX23|>SyxBD{E zyDSC2#o%8_{EH1fuQjnv@X^l)$%Lp^=ToT?Pq%~5`1hIH5tR_6vHe=Zid>~FILj(oOrnSt}#C$)s5ooGL=NwQAhvVAuhct5KD6^49XFZou3 zKbQD-7<^tl`Ei5aO#G(}KCjL44+HN;&P&6WHXyK{c@39=2F@!o7ZT3x^*z#iW(xj% zga0V;ml*t4slBQNAN_nc+1Vm+^z#=aXM-V!*Oa+N;3z_kB{=>_;MneeB)xYDT=tXu z1&(~S^MHX5CpjM(IQO4ZGNCX8^c&6({2u2}!rA{ps&Ape=jZS<1de_Qq>_$TlkGo$P{9VL<*x>WpKu-uh>dmD4#1{mPdLJPUXsS~njU{LhI0FN4p^ zN1sez4D)#DOT7MsbGtJ?&){==7aDwC!>CyBv0g<~uQGvSy)GoZ6^5K&lmF`lP7suW zO*sXQ?RXt!UL|ljUcN7IzDsZ&_XJr4=2F~sAKLSTT@OyHH z1dejpFRvN+Wt4u0j@&N1w$jIfulg<7X`@gG+`hkO9^s~(UV^XsA>Ee^5jaMDlpZc{ z$sZ$djLxF;Bs#KQUhAny@KH_?>76TZj9y3S1$1ONU5UR&;If~r6F9be6ZxlI;A)C2 zf=meC6FBnO&f5%pC&_t)aP~8&_ov{$Z1CTu^y>zn*S2~`@XDdocm{;f%6(%7ZA?lYY(;Kr2@yQ zlv4Ui1K&#N>*&b+fmh%DrNO_S()SvCUW)q<2LBaGzhLlr&9F}mypZhgNseWEczN-W z20oPhJd<$lKSxOJ>=gXv27eT#>kR%>l7E5VWAq@|xmn=o=PF8Xrz6{6MsjuuT=t)z z3mp4HF7Y1{xSWT7CvfDmoi7;pxipBsGH~AJVIaMP#CCGK z3LK+D;U7aj;cO?bp;svQ$_4bit3==^KZnwD1TOjK3LN>1D7~DHte4l~TP^q~Cy(^5 z7dXnfhSC=sa(J!3>jX|+8A@5!O#;UzCveICT;Rz62c?hDk^RPN44!~L{D;7LcaYwb1&(qCQo27KSf`)80G+|?EX*O&R-1&;iyDBXvS zTrXbBae&~XUjCjYNAP9;pD1u_7w#u>1TOiD1djaEsa_2NS5sIKWJ1^=aOAU{?FP!EpU`Gn9_BI99~0qo51CKa<#zG54@)A?E;tlUke=hyx+pp0+;+3 z1djY3nxt z>q20*9H(cHewM@iaF@WTi(s{^fHK0HSD8OD1-@J0QZN6$oAq*kn?%nW*iNMsKKS{Q z$=@va(m(v1kLBPTieU)dXRsW$f2+V{eeV)D%4dF0I`5hCSJAv;%IEiUn6He1j|*sC zH~G&AT>9-Mde~v|E&86ylz*GRrTy}IPbq(t_QF@z!^ZU#<82BF2_q>7gduUmd zk2;lJ+B4T(z!r?uwQcE4R536G+d`g$3L&KNl8Qt6Ni3zcD@+7Io8PIHIWPniZ|9Uru`y+iwk(=X^fe z^uE@3x~_9^j?l3dj>+1;a=j)53-l4&A1^J~er|uHaa}Z1e@@8O$L>bMn%pZ>lrJ8o z%WtLmR;LnmZHJ6x_HXzvT_PJNbqHubUb>j}{|GSCCV;H{Gx5{=J-SXMa=!-|$@K5J zTbIbAf~X%~Nip@`4p=h%pOXF}YDW^2z*vY*=-?Z>`o z+J68rw4dtYw)Z7S=kHSmLRsP+$EckSyXTWD#bR>LsiJl6d>CtXnBHHT4*0`}MH+HTYD|KVjLxtZ) zmxZ>rWm?gRa0pt_JUHZ8(GhScvZ6!bP-aE@!(q7-(G0#@2lqgLU1X zRMT7N$$dv4EM8i?qh%PEC+z9I}_=5|yMv`P#AnbCpo^oL?!h6@j6 zY(EFOL#Q33ggVMILz5R|m1S(hwNOLQEw;t5MqB@FN6X>U7abmI?^Y6fs>FUY;|ly8 z*PM>D>=OGxY2n)$S7ACFI}qCXSZ26=XgKyp$bLNI3f%c@R>$bDrJ@V$(yFdd2= z(yU&kvFA#Vbvel@wGS#;m=0?eS#&cP5^l%3wT}$N4u{YJd?RO0M<1}@ozlX0GOogO z2rTHBl^JR;&n$^OUt;gixZ)vzXLSt74%yFz3*XJS3e(~CMVaB)tKrz6L-u1CS3IL6 zrDd1ehm?LyhuZ6cq1eHa*gGXi`Lm)70A=r%q7+PrV+TVW^YX%lPiJhehDHf(-kyQk?gSdKVs91GYWhk~JD-#*3-yNSZc(cyDILjZhFU~3o z6~2_QeKAZ8p{+BrvY{SODpXjHjekV8#{KA{F|8za;jju(Kem zDC3FhVOt$Tp{<}92K0q!emkfvZ4aQ$%e7e> zzAS04TVCA0s0@4gq_-8CF#8;dW@W zD~n<L88IHTGOoZMz=tly(_31` z<@jrdlJ<1fvZtZR?V;u2$)U=OEx1=}sJ(1?xbU55QK(})8uG|x@IeNrzdN!vWAHYF zEgXW|eQKc1S{{0GS`&hy*sMzChGXx9MwL|-tHpi8vDaYs4adIFRl-iyAC(m@$y%MU z^;IaUGQzSQRFo<->ymz}5D z|KhC7P=|UhRvJ6>0Ny$51*2gu3qzmntIcUwH4U|&Ny!CSnX%v9kK9KzSL2BeIXMhX z-8aaK44kGOMG{C>$xP!|ijy$4|GVg<|I} z#|{yK*4DOQpX%5|y#l=xhIy=S^yGxrP2*-AFzAUr4Sg*-2Tg)bUXT@{ z69@v!g;~oF*Flr<{2{#Uxd#VI-@{L!UEBZEdM6qNBKu^O#@m;#Hn@LPydB> zz(fm!ehyAEzx)#2R1|98rB2(`p>YG$c|2qLxj5!7-H)euzG^6r=<9}(2f~I9KN;{T}hikwOOGfM~E&OX+dP(d{h=%QbC2#`W zzV|EiUEH}VHUqHIjs@dkviK}C;)&A27uwQ8v42A}WWOCMd?91|6~NGEGj%G9jfZrJ z*7Iq}i2Ws6&o>Ya+pm@uzLK$hA?ksX8=cu=!_%h{s9`pFkb|f@sJ-7=jb) zwo`y{crbkMe3sC}ho3>eie3|jbCMpUYU~}p-sl)+{%XvJCgZu`op9`P)sBZBGfHZ7 zuIJ8=OVDWL&VNBPY#%Iv6Y{o}FTm*YzdUjzf8XIjFu#;`gt3Yrg+@GDTKFth@hgai z>;vJ#*D|)PLG~12cjCL}Gq#S+$8i*Y*b?8Sw_ z=&DfFVMlE)`xCD()g8lpb>`asdB(QupxcEzYGF8hQWATyIQDEw45r9`sFE{c=$=sQ z?{8oC3AknR;c4b8k}&S0Q1J|Ng*39C1y{0caPE!7qy`$pTI7zlGN_vq)SzX6A_$h7v2v8 z$=ZwSM#<{y%ks+e4$lKQYS!`m0iv=)u|6>Qg<<^0UcVpDEaDOy<~6=CfD zXj{8Ly|W)zR@EB*Es4E^E(T9l%!kob8v7k+=^Kho$)Y;#S4Xg!Zp{+wlmArN-ZoW@ z(%5Ud>f7I2v@ByA?wwK!t#*Y2kx)kk*!+^ZDpMrQ)aTVip~^|G&CAEjlxv{4VyhPZ zHWd5d?R!3gR*C5WG2wK-5YP6n?Zw60v^uz9gd04#)Ycv2Bydb$(Hm%nVDHyry?%5?j)B0Q-cE6{z^;fuMqggbGB z>M6zZ_FjtqjJ=kmyO6l^4vz+T?)8`PBojc%aM|DORe5J8h!AoJdnuc46dYbLdTZ9+1*dz66q%{M3q;Qgw)7dU@xDO>g zyHMLh=A5av8w^ej4y&&o9W0w!5f(?y`w2ltqc7iGs z;!0Gov9^{4Xh3bRs5vmS;F}8gS|Czi)37SKI#|~NqN2f?3tFq{gVDyI-l}q)Rx+$9 zSl75Ns1LB~VsKcsRnidTeO8*3_;v7I25j~V+h1mn0OPa~5%{iQRb9iX2yT=I_=?tA zR5hm}9JXq!F}l9Fv0;^^O;dGnF;dR-mW>T7Bk>HVA?ya~Nm;wLswr4iUEQpz(^_AT zn<6%#{$O-2(^a0FOE*bJN5W%EUrDE5CrY!h|1Q8{!G=n%rW!P?1-vFe0kkD ztZ)14N0ac-4@Q=^q$`WFf|+jA!jp%UerOVWI)3%eL0VcD+|ANSQz^&xBg64g3hv7> z1vhb6Kpm8b6Smd?qNCd|O47RM1z%3M1F>}f9?Y?|5K-E{5bxPkY5&@5AgZ)wcAb3~ z;>v)or5L6791W-Y_XDI#b)Ab*RVusdl2uS|U254`Ua81Th^J|MIpTgDUx9cJ9j`?^ zQ^!}YfOsDrufzDsI)45K5btYs&F*?0o)FX*HeE0I7l1n2=AoOg)>ijD@NqLxdt3&Q z)5+q^XeD_m-H+4WiK;5y#-TkrIuY9?-H)5e1ol8wyQTXm%vQ#9&%s9k6wl33QAG;% z$SYw|kFj-dkEBUGCZQp^<~=4q0r5N~sK=Rjzcxw7iyr{I$m;%cD76TrD7#OvGKx+d z-M~Um%t85N=!v;VQ;PEf{c+9R%-U)zFhEsb$qWocL;aaB%~^p#C|`RyF!+~%_tl&r z#)CRO1moFS=4NNYOt3B!cgJ!jVPRbvXR!c(N=V051Vc$1Eww-VwT!0YIoo>H^z1IWPFS9BK3kw zhGkwM{zFLnWd*5wLMkZqSKd_5w(3 z)`{NsVn}S!i9U87NYlTg%jjztLE;LXGsM0KXghRbgpD2G2AvqG5_@!FluF#D6Qfn) zZk@=r(f#-7#297UKAp(7XM&#n`sark-&bwWH)9u8Qv2&h^@5>}--OkrHn>F%aA-RG zA$_{P5t>mAPc&O~b40Nz6}pho-Y_2mhyzv~ltO>z#272gEc6;Z^9+oqfuL&0J_$MM ztsdWC#GQvAeF|(UYxxFav@eSF4Sp1&{j8I)HBUMSJ?~V6(+if#9nUSkB57KJ_rUnq;aGVraT41WenmE1BG#{eGoakX~z&a+gkSdN*H*{ zg3*-j{|gw@9cMgbsU`_n0bCw%C>FJ!L(Lq1kH$l=ci~VvO+}wW^%%003D4_6#4VnNP2?>^Hekw#K11p|jmoZ%DZbd^36k^YAt9eIR9| zUE%2&X)o~kUm9u8lTf)`Fw$P+yQDKoxR`sQq?Z#U<(ZO{x#|8vP(I-L7b~y)d#V*U z4dPfO%ifOt$NoK}Pr;Vmjt#52ioG2jtD~3U}) zhX6NIP1uS!RuOxu=^P7=(`Pb_>R=DD3tFfn6zG#O{8pA1ODrg-tnnd;D2WsB3o#56 zV-Rt6e%LnQdO{}brpTmwDWZ74fP_)2fA)kQR6IhY!q)^FOV~dj0{I04pvf>4^rXo6 zbchu2!fE3_f@0dF(}^%~EJU20U$&hw3nG)};l~pAn23u88YV0}5lmPOI0ohFn|lB= z3W&3F^QOYF=Pum63kHJ&Pt6q((1{J8Pqu{A{p61|IzvcrZg($1wEat>Dp}Nk1 zqV}5cfnzgFc7z})w@WViKOv>)(f>dS3_%s_DJNtce~sL(eP-!@AjS3W8Q1*>Qi5Eg z#+Uz3NLf2L^Z5PZ)@V}Au}Mii-tGcHiQ{cV%JDXW++ke;}vxN3w$l`S?;?S zJ}d2fZ-`$Z$NP1Va7Ek%i5}2npm5sGeK2g@$q0X623Fa5pv|>CPS9_pphqCFSPOzn zGO#^u=i4AIPSHl4@85Z#Eq%R}KGe%aWjjP09~W; zM{a5^SG)zvEAx~+<=UPUQ|XSLaF_aB^U3vRAt}jxl63O@-dbeijUUzT*U@k8@CtoG*#)mB&gaJq48ioaa^I!R%t+i=?~?VWs~ z%XkUTJ+Fc=eHVonb3HDDR9`EASC#4l&YrGs;MM@3Zs4Yi8@TEEzE0ge%@8+mGt~8* zzGs`M@7ao$@>vKJ@Ed*hu4%aDUhg zU&s`c6JEee-4vX`$QX*`W4Q^-DCK$<*N`6#BA{8+l;RB}&tY+02(QvtQh`lSjAtU8 zmDC7z`vUe=OT7$_M~hy5wI&{=1E#4`qM&kt;TBg}=N&H_bebK{>9#VV@7QoHxX1@R z&z0*}m2lm47?N|fFqnJ2+2}LC(S?9n)6sByobCk}hcH7Q;O^zbQy_(RFXL3VLi}v} zfHdE~%uqLvS!{IJK{c(>}?S>_st9S+wH0YjWm>aX_{v& zdbHa$N1+5q)fQbECRH3HI8^ZT)QP%hld9X9TAk~wgaO(ee2l#SPQ9ocO_-<7kmbsd z#Bu7n2RrguUD|LDjs#a@g0HUBWei_knrOTlVbCD1C^f>=QvvK5YC6ua0@(X>|7>yl z2KJu2@dJXr>m_({r}}4$(LYAu=DP5W-WYv18Ta96yWu^PnNLJ4P&q2TRybT}d>gerW z^cQZl*KK%~3n3Rn@3AF10$=C!w%zzi>wPZe?K|0W0%vre+`R-YF`O)`d-pRTAD%E%)DMq$GXRAruy{b$ z3B7G6(7ihrvLWd|(UmX>XkAaSy}WK-9$a?Vc1dq6(PM~J(t8YWPaF;=2ZlomUJ2_h z%4I@1zqSfx_JsGhfYJ+|wg;xb;OI?ayOi|C>^@uvctk!?F;C95&+4b^b$Y*&-ofq# z{ZR2KU0ktn-2(}?=KWy)u};l}ilNri`vq0i`g;HhK@kITEt1>?Sp{ItKvx++%o{|i zz(jb^O{!D^enI5~N_rRc8vt$|0tu|B${8xvVFMNQ{lPS4_-UT4K4>)f4ujo;$zd!J z7hM|O9a_29325u-Bpg}|Y1y$Yw$;W4t7a&+BeioPuieF#kzIBJRm_P)*f^y=9vSP3`$q zQ~EUowDaNp);Iu6pA`pmZ-Blt+k<%I!x5CLU|ZM-D%`}^HP#Z2-bzrK1s6-ZIrU4A z$Wguy(?m|W->+CpNJqkfmD|<=j{evcKcAzl8O1Mf?YP||a+Eb|BBwk%<|i0H04ukx zc^uv4ieJc4X~#U*4&EHewia@fHKQH#c5}+JW1(pWpI=|144;*^+vKP(@Br)zUvy!B zw&N)8pWs;VxKZbNpNZubaJfTWHO;n`ar7?)X%}*e6#&r_tYeAd=dt+l^!U-XmU5JL z7E8BUtxK$-yO$AVI`m!)KrMi8yf93mBS0sUQM}&`Kpf?*rfsW|jXlI)gjh>!VFtqR zB^{xl2E5Ni`^(w>pSYf$&rx34#<4Egu$vPjs1hewJMU{tpEO`M16&n!X8CSTc@>+_ z(bvg7P2|)+T&w4Elq;h2bAnq(m-ecrV~G{4Q>a%ckQ3Zh zur$ZH&nO}%I;+TZa!LmslU0`UxF7kf3#?a&|1}-cRQK`GQ==ht)F|($!#m1o6yGDk za7i3@JEeHn70pd_*aa55VJP_~-HO6qmIHQk`gC_BRpwB%(1VI8T1rQ)r-f3R;?SQ` z>Yg~1JNi3r*SSDfNPKda;F$uN<%YHu)IWHGQJA+mdW+X}ZfN7gPYHzc3`f}?N?wwl zb3+^VoKLBccoL$c|_6tB7x%l91Uo?l*e#m{Grtj4zHbCj#Cq$N5!;p)j$h?a7b{fRUp z#>?C4x6yQsIPNt_c^x$bHw+f#xYtPKyjdVyjWp9(#I*Ok&!yz{B<^|EbB}2RxW`lo z5bNX40T6cvuVW_oi!I>oaly~~62=pgJTu*4;F-BB(adFuX1asLGjmy@nF&{PYyq!g zkIoFk^EwO_bc9jBCT#b{4@bGxpn|uxnRdzc`kY2HVy0!u+K^4^=bEwjc8cPUelfs= z%+dbTtjY|X>wW%~_%OGj`L2Ea3ym0 zCQb~3=e-z^$nnbvQ$$YuKoB{8izIU5Z9(Mt=aR^Y)8S<_R?YDhgeldWSS5(Mi1(T3 zg9Yq^ACgjd$jVW+QP19-de0+rlx@VvbDQw-90P0%2=$E6u|!kmu_-sZ8X_EJ<$8Q@ zigy#Vtq4b1vnF!Nvm;@GNwlM!?YPmkV<|^jGm0ex|!|F+clW&99LINkQ}qVtp9Yn z*&9Vi{AnZxe$F~X^k^raj?3xD_Ii?a?7QUiV<3L6biC#Hk&{{8ya(ZJ<@o~J zR(Kz=`mw-lBysuI=ww#ljlX+R{9xu3=?;Yjw?-4U;BBCKTkrnhLEO za#l68j#*I`ZPAqax)ozqtz4N%8PBD^LsZK~l0?dAfrH$Ya7wgVqSbYcV{=#ItgDu= zfGENnTOzH|x_X`3uy!phDbQTk07;nWpiFg5t&T@GHr2F16pC{cx^Po;b#qNsH6xIT zdK#iY1c$ZOHR=+$yadERUt>!|7tu*te?lj~0jdC$jMlBi0-!}R*ar_Xnd-4oE>cW!)RjMI4FPN&ZS{{#LDf#)CNberNU zIPv%b_dB3f)(D|Od10u7WYwaxv_$Hs6 z<~Ze15S2U2>9fPBpXC%)I{U0jr_YuJ|W2&vI(E_;0@ME?>b(ledp9DFrj;9Dt1RzF~G+nzPDxx(%s8 z{w>bWZTNV-?Ez-vP-dY=0&2|KhBR!r_njUvU<+hu_J1(dp{Tww?Ts z4}ITR?vK7Sd1}5hq;k6x@mKB*`A?ZxeC;Bq+kveuz6rgZx&DvCJ2!o{$a%u@4Y&O} z!oJCUe)R)?AK$p%{@%X4J`X$HE1eDgSx@`Jp)+^hTr$gxg3yJRbRKN!HTr3ZfuU?o3p&O3ay>eg3I10#Tc5J5j!-*F~z*E8}AM7zjDa8om{K!nQ( zG}ScMHa4#XN8$oJt~tE2kXT#BYY5n80qyXB=4u6~wT56p4=-bVv&x{^lPVF_u2V)e z)z?L9TXcJ^i?lXW*EB0BB(J^-R^$PXQZvA08>xj|AL`wfsA;Iy=K`y`u@xplebR}5 zXF(Wlz)%;B)>Nz2i!AMNn4Nho9xKvVU(F5S9-%v_vrVKPW_f6P?h?GbkM@)n8F9(F zeOj!Rn&!HydUS&7seDRkX!Ons>a=rVBkUFd#jC0dplMVmQ|m10RiRY<)>bvIscEJf zVgGO!VzT0T9NXJcQ(qgus8C|>@FzP0e&|rM(t>R(g3}8N zgX41xa`S>?^YSO;O~@+@=B%Ai03XrThMK9XY8s%@DNLpT`c7_3@L)w&uzUZWRA;IadTQOo+8 z78s|Zi;cA+Yhg_<3#tr@Y+;9jo@UL2_3OfJ^Xt``aPZ=?R^YwH^-ygrf-8Bc#l!S@ zTeY2RL#3ORo{pY`mng*1;?!-LCDeYl)~8u+(@^6B{-YEFGp4=q5uA zID*modYmxyl>uB5HAE*A;KT(kz>2ClOkEg2_m7{Vkb=vcSuHq8fq<5k&2>#tSV*hW znFfVbkAd~mu!=NdK&x7ZObs2Yw!X0nENE(kA-r~Nq@}i|VP%cg(z;eTETX%23rt3J z(a8F`=<3MYmQ|J-M^bAxSM9r)5Bh+s*OaKCN_iN#O?A*q)QLfz-c+;E$sw|`wHd6cZ(XY! zUG*w;@>yF0qX&96EJfE0=RN4Y>tIQ_Rj@5hD|DK==tkA@s`Kk!Si9Dn$y8NnrT~** z4$9XD7zdad2ZxrXx(2iylH)CyOIurNs>kBUfC^Z6qQV-glgg^9wHA!6>Xs;8PD2so zHbYtHS1Vx9wl-0J#%1#&=$wR^S*^L}jx==*t$UOeS*M-M4$(bJUl4#QShfx4e>k5S zCrUa+saca2!i#SbFiy9qa%W9_joPXQ$IZC0I9OWnY9MZ@I(UD3`t&n`*%d2V8=|dx zLd==as#5uF`4e*U3Uc$ujxc6QxCW=+A6oW><(9o6)9&Bn1pf}aV}QH?bO)&3B%T(? zyxKP{(6_^x76@LIRvgH_tjml*-q!Txfk~l2QAr?F94M;{~~W1wu0dWlI8i zPP*MKkX;-ILQxPgE#RNoy%><`aR}_K3A(N#eQIeDAYX&}u6E821Uu5E1+uR~eV3&d z2PSPjp)~NJ-4giHE)Q(>Rlso?q@CS9h|LCMTHp%bjKB_Gao`5u^uQk9Qpok4PxNv) z79;Q^L@I#2m;eXvCjyg-19?z4sG~3#?7}a*M}uE5sM}u8KH!plP?qeQ5h(J7KpI$V zNISc`uPP9#2$U^Fj}^h2_trL&I|GG7i3__0{KfD#z!i|(LwV|VfS%4|KA9CLiv%j? z1(webR6<)c1u827%j*NH7X+H-2g>Fpt=l=>eML#loZWp@pt3Tsd~u*M6ey$m!@Vtr zyYZuQTS^1V*92D23p6zcRu>1BFG#8!>zFEFwbQJRjwH*69}Ojg;dY&#Od7ckKM6~~ z;f^{>CC#|9kK7;fLd-$#UEWmA8->ZqZ@MAp{#=$4@`88=?Mkfq7^1;3oW{858{knq14 z_=|*pXyC7?bQf!ffxk}tyA1qo!g-G7?Dq+;V}OpI5DvevjSF89ZhqPFE#ZTWp`E7E z=~g!b*XeZ2eDf@W_`G)^D?f?wafY1!gqIlj5W?ph`00e#8+Z=k7aF+Mmu_8a;AofQ zo_*O$_+c6FGQFf5o0|e(k^*0u0$-B?zc>ZnkpjmbZ6&kwjuiO56!^<2@PDMh-%o*m zmIChv=d5IQ_Dg|}Oo4|};LB6s>r&vCr@(inz;6M(7tGN7iWe_jaZd{V{uDTVnTK-t zEfRID0ln)Vg!4DNI2<9MBj!PL7#!%EITh%&Em48dP1aM^zv1%9^RZy_A@4iorQf-m*nC-9kqzhB_z2)qm3TB7|S zfzK7Vl(SgiQVuVyigpeca<&M*wDS&uOFutOILbL)$az-qrJOeeKU?tMOTp(`V3a>X z@Vn8ivDuFO1uol**I`Az9PekR;Nt?V7?3a9w@KjA51UfpZ_rC(Xg~I89;fdSZrcBq z;Exh~Ki%@1{Ce^}1K! zvR=33qWBASl?3kXE_-Hm-d`YINCE-@P`Oo z+LJACY0p$4U)nQY;8O2-LJmG_WII;~Tc+=c@vrBkZy1 zK_mK8_LIH>m-QM@ye`pF;NFxc~#>ClQWy z$H4g4U3B_feQ@z?bO?lH`rzUrs#lGH_aTSX8~F3YzreuRj~5&GyCf%O;D082b{M#i z{BWy*|BU4P!obfUd+svu`$*0M27U>ppD^%S$Zvl%@JGnbzZ&>6l>X4bn@I2127V*q zCy>3|UKdckdK>uv*V>r}Syh}-{Ap<{WRVg=Au5cxL5TxsqKKjxjVVx(5iul;&J1C2 zKpBul1Vz!P85HASL81^5abvLn#RVeKAps;BQM3{lWQ#!IBr2$ofCSU$-E;KwIPafS zy6Vk){kz{i{q@(~_ubp?-kzc4ng^EsZ|RTbb;TF+eDqAyIhyBf7Z@K)d(5XINeBP5 z18Jb~rqmf}{AcWkHyOV(lgZs>yp(*7@s-RkGX5a#Uo<|P{;W2xo3=kNKAwK=Fus%V z{KELdy>v#(~H*BYNho$bc6|J9YteP;Yg+8;2k zI2_J$Y&93gf#O&objPS?);V6|}$E_?PT|HOAX8 z&eM!PLqBI5&;B1=F87r2D>+`48ZT#lrSTT@^G)MZ=+6hnTQUASjGs+EcN<^Ecpl8{ zYR7KmM;L#X{v2ccWcs7^ilnoE@jS!qwVshyw~~D+{qJk```M0H89zWjhZ!GCf5sUf z!2BJ?t61(-pR`J&d(Mb z|1s@fF+PF%n~WdC@vztUpQ+P=aZ-I(Q>TOR(uyff?D%ed^dqKx!c(T}UmzMB16 z^NO->OS}8c{yO?I%lP@s>pV_6(tpqFt2ur@Bu7?V3NGz4d-;?72h8kyO}|aR{+s1t zvfnIf08?tsc*`I8-#&2YG^al&2af9n)vGHx%y8{6GQE(x2M+%i=4o1WKIlOI0qU2U zJ$`pa8fF}2BaJg&l&9%lD&r;O4+hRA&u@7u@aX@Fz~O%xb=Df6O8#NsQGZY1QNJG z#JK9U)cB3;-*v`MBmcYc8uIN1k zElMw>dBGk!x~_XZaOl)=BJ9P$VXy0`bwNMI;XSi&&hfP)aOgMYy!~&sM6*%-YFQ%oM)UWC}z9t3xSndX zo;A$hWcCNspZfy`(*3WG1P=X6SnhIi=|9W-YO~jZgj>x19p>we?_>T8zN@}kwNStN zsN7?lC8ttq$#>b;($7-@N1SW(*6BPsaMVkS81yHXelOcM|^I zq55hS#*@jV|2p^YWcJN?oWCG&=xaXw^1$={LolV`roWf^qs)F6?I#Bg{j2gS>G~#c z=xasDC8mEO^GnUX36E=U1P*=8k8cbd`mJccmt65FVg7*GccT6Gn`aIq&d}HW)+YoG zeJz@C9=Y@QV_UCsV4wC`^GQ}q+m(W;+iX0N5Es*L}T?NMzy z8+iV3lX1=K)&?H?&!d4OBs$+)8aVn-JJxrV@l(h*81F@1Z@fSGzl>`c?)Ln#R&my1 z*%un0Pn`kA4~MfURT@8%e3Wr5F7>OxV|-==j`;M=tEcaoz#(14^N*E*N1b;Ak2>1| z$MHeWX?$i}zyIwI9OddfwjE9uQ$oMRb=d|4Fr~AN>$P5-vo|vs`2tvqkYc@4jr23Rs;@qDdV_0aM)M!`|+>jYR6%UGjCoI*Rrb3$Q6g%5Y&{8GJ8E& z(>>V3pBeP$yuf1|dIt{sS@iGc#yc`!7C3Zt92*umbe?8@MBuR3yxfGqVSg4jrgUrI zK$`EGOs@WxH%@;Z3ii-hL7h3l9wA%8I4?5(BKdOTACa#MJof)>f%A}>cWGbXD7P8U z=UdV*wQmdZ<@1g;D0mTg#F?D0(^_{ zzSQ4VfY%%UivE96fbTKhf&F1$0p6D9BM2j0Sx@~D#&?p>G_LvWF8p4F4w|r*_N9SC ze-U|&@hRk5cwGJrCD(oU;+p@A^Q+L;yk$2Yk7cj<#=*ulPgrZbgyph%^4H_Mq|9$= z&h5}=ljn&Rp>|$Gd)P*M#YtShUw453ZLv+)?={ACo${D*oww`vJ?ZQGAy+(l{P48= zQ+gjWDtoWer?d!PMR8gYaZIi_zXV+IptR0b@u(5Vz`Sd5dMG?*)3f6+FHVml552bX zy7AhY-XS%(a?sdo(h_|`MkK-f=ZZmtuy9-4oL24nR=y%Fw{=ZrDmU9hxgeO_msFHg5OVboiT30Neea8_ zzbKF4h_Cvd0(@^>oqd?g>t~#Xp&Sn5{G1RhP9o>+0zmmx?gf#vdoY(h(+17|b^oqu zUud58wPN-`zV^X?sKax8%w4d>K+lS-oGz{XPCK#X-t_@uvNR@H_<=#zjnZ z++W8vZS$~Rn>M&6Y|A(gb1)u;3CV4Tq-_ngf8B&^r}9&?ceFpINEJVvD?DUY@?U|UtwCx A1ONa4 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/check_whitespace b/splitfs_syscall_intercept/utils/check_whitespace new file mode 100755 index 0000000000..cf42067895 --- /dev/null +++ b/splitfs_syscall_intercept/utils/check_whitespace @@ -0,0 +1,229 @@ +#!/usr/bin/env perl +# +# Copyright 2015-2017, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# +# check_whitespace -- scrub source tree for whitespace errors +# + +use strict; +use warnings; + +use File::Basename; +use File::Find; +use Encode; +use v5.16; + +my $Me = $0; +$Me =~ s,.*/,,; + +$SIG{HUP} = $SIG{INT} = $SIG{TERM} = $SIG{__DIE__} = sub { + die @_ if $^S; + + my $errstr = shift; + + die "$Me: ERROR: $errstr"; +}; + +my $Errcount = 0; + +# +# err -- emit error, keep total error count +# +sub err { + warn @_, "\n"; + $Errcount++; +} + +# +# decode_file_as_string -- slurp an entire file into memory and decode +# +sub decode_file_as_string { + my ($full, $file) = @_; + my $fh; + open($fh, '<', $full) or die "$full $!\n"; + + local $/; + $_ = <$fh>; + close $fh; + + # check known encodings or die + my $decoded; + my @encodings = ("UTF-8", "UTF-16", "UTF-16LE", "UTF-16BE"); + + foreach my $enc (@encodings) { + eval { $decoded = decode( $enc, $_, Encode::FB_CROAK ) }; + + if (!$@) { + $decoded =~ s/\R/\n/g; + return $decoded; + } + } + + die "$Me: ERROR: Unknown file encoding"; +} + +# +# check_whitespace -- run the checks on the given file +# +sub check_whitespace { + my ($full, $file) = @_; + + my $line = 0; + my $eol; + my $nf = 0; + my $fstr = decode_file_as_string($full, $file); + + for (split /^/, $fstr) { + $line++; + $eol = /[\n]/s; + if (/^\.nf$/) { + err("$full:$line: ERROR: nested .nf") if $nf; + $nf = 1; + } elsif (/^\.fi$/) { + $nf = 0; + } elsif ($nf == 0) { + chomp; + err("$full:$line: ERROR: trailing whitespace") if /\s$/; + err("$full:$line: ERROR: spaces before tabs") if / \t/; + } + } + + err("$full:$line: .nf without .fi") if $nf; + err("$full:$line: noeol") unless $eol; +} + +sub check_whitespace_with_exc { + my ($full) = @_; + + $_ = $full; + + return 0 if /^[.\/]*src\/jemalloc.*/; + return 0 if /^[.\/]*src\/common\/queue\.h/; + + $_ = basename($full); + + return 0 unless /^(README.*|LICENSE.*|Makefile.*|.gitignore|TEST.*|RUNTESTS|check_whitespace|.*\.([chp13s]|sh|py|map|cpp|hpp|inc|PS1|ps1|md))$/; + return 0 if -z; + + check_whitespace($full, $_); + return 1; +} + +my $verbose = 0; +my $force = 0; +my $recursive = 0; + +sub check { + my ($file) = @_; + my $r; + + if ($force) { + $r = check_whitespace($file, basename($file)); + } else { + $r = check_whitespace_with_exc($file); + } + + if ($verbose) { + if ($r == 0) { + printf("skipped $file\n"); + } else { + printf("checked $file\n"); + } + } +} + +my @files = (); + +foreach my $arg (@ARGV) { + if ($arg eq '-v') { + $verbose = 1; + next; + } + if ($arg eq '-f') { + $force = 1; + next; + } + if ($arg eq '-r') { + $recursive = 1; + next; + } + if ($arg eq '-g') { + @files = `git ls-tree -r --name-only HEAD`; + chomp(@files); + next; + } + if ($arg eq '-h') { + printf "Options: + -g - check all files tracked by git + -r dir - recursively check all files in specified directory + -v verbose - print whether file was checked or not + -f force - disable blacklist\n"; + exit 1; + } + + if ($recursive == 1) { + find(sub { + my $full = $File::Find::name; + + if (!$force && + ($full eq './.git' || + $full eq './src/jemalloc' || + $full eq './src/debug' || + $full eq './src/nondebug' || + $full eq './rpmbuild' || + $full eq './dpkgbuild' || + basename($full) eq '__init__.py' )) { + $File::Find::prune = 1; + return; + } + + return unless -f; + + push @files, $full; + }, $arg); + + $recursive = 0; + next; + } + + push @files, $arg; +} + +if (!@files) { + printf "Empty file list!\n"; +} + +foreach (@files) { + check($_); +} + +exit $Errcount; diff --git a/splitfs_syscall_intercept/utils/cmake_uninstall.cmake.in b/splitfs_syscall_intercept/utils/cmake_uninstall.cmake.in new file mode 100644 index 0000000000..9dd59db7dd --- /dev/null +++ b/splitfs_syscall_intercept/utils/cmake_uninstall.cmake.in @@ -0,0 +1,22 @@ +# From: https://cmake.org/Wiki/CMake_FAQ + +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program("@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) diff --git a/splitfs_syscall_intercept/utils/cppstyle b/splitfs_syscall_intercept/utils/cppstyle new file mode 100755 index 0000000000..d29c58fcc1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/cppstyle @@ -0,0 +1,72 @@ +#!/usr/bin/perl -w +# +# Copyright 2017, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use strict; +use Text::Diff; + +my $clangfmt = shift or die; +my $mode = shift or die; + +sub check { + my ($file) = @_; + my $original; + my $formatted; + + $formatted = `$clangfmt -style=file "$file"`; + + if ($mode eq 'check') { + local $/=undef; + open FILE, "$file" or die "Couldn't open file: $file"; + binmode FILE; + $original = ; + close FILE; + + my $diff = diff \$original, \$formatted; + + if ($diff ne "") { + print "Style check using $clangfmt for file $file failed\n"; + print $diff; + die "Style check using $clangfmt for file $file failed\n"; + } + } elsif ($mode eq 'format') { + local $/=undef; + open FILE, '>', "$file" or die "Couldn't open file: $file"; + print FILE "$formatted"; + close FILE; + } else { + die 'unknown mode'; + } +} + +foreach(@ARGV) { + check($_) +} diff --git a/splitfs_syscall_intercept/utils/cstyle b/splitfs_syscall_intercept/utils/cstyle new file mode 100755 index 0000000000..b9a3c5aae3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/cstyle @@ -0,0 +1,1031 @@ +#!/usr/bin/env perl +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright 2008 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# Portions copyright 2017, Intel Corporation. +# +# @(#)cstyle 1.58 98/09/09 (from shannon) +#ident "%Z%%M% %I% %E% SMI" +# +# cstyle - check for some common stylistic errors. +# +# cstyle is a sort of "lint" for C coding style. +# It attempts to check for the style used in the +# kernel, sometimes known as "Bill Joy Normal Form". +# +# There's a lot this can't check for, like proper indentation +# of code blocks. There's also a lot more this could check for. +# +# A note to the non perl literate: +# +# perl regular expressions are pretty much like egrep +# regular expressions, with the following special symbols +# +# \s any space character +# \S any non-space character +# \w any "word" character [a-zA-Z0-9_] +# \W any non-word character +# \d a digit [0-9] +# \D a non-digit +# \b word boundary (between \w and \W) +# \B non-word boundary +# + +require 5.0; +use IO::File; +use Getopt::Std; +use strict; +use warnings; + +my $usage = +"usage: cstyle [-chpvCP] [-o constructs] file ... + -c check continuation indentation inside functions + -h perform heuristic checks that are sometimes wrong + -p perform some of the more picky checks + -v verbose + -C don't check anything in header block comments + -P check for use of non-POSIX types + -o constructs + allow a comma-seperated list of optional constructs: + doxygen allow doxygen-style block comments (/** /*!) + splint allow splint-style lint comments (/*@ ... @*/) +"; + +my %opts; + +if (!getopts("cho:pvCP", \%opts)) { + print $usage; + exit 2; +} + +my $check_continuation = $opts{'c'}; +my $heuristic = $opts{'h'}; +my $picky = $opts{'p'}; +my $verbose = $opts{'v'}; +my $ignore_hdr_comment = $opts{'C'}; +my $check_posix_types = $opts{'P'}; + +my $doxygen_comments = 0; +my $splint_comments = 0; + +if (defined($opts{'o'})) { + for my $x (split /,/, $opts{'o'}) { + if ($x eq "doxygen") { + $doxygen_comments = 1; + } elsif ($x eq "splint") { + $splint_comments = 1; + } else { + print "cstyle: unrecognized construct \"$x\"\n"; + print $usage; + exit 2; + } + } +} + +my ($filename, $line, $prev); # shared globals + +my $fmt; +my $hdr_comment_start; + +if ($verbose) { + $fmt = "%s:%d: %s\n%s\n"; +} else { + $fmt = "%s:%d: %s\n"; +} + +if ($doxygen_comments) { + # doxygen comments look like "/*!" or "/**"; allow them. + $hdr_comment_start = qr/^\s*\/\*[\!\*]?$/; +} else { + $hdr_comment_start = qr/^\s*\/\*$/; +} + +# Note, following must be in single quotes so that \s and \w work right. +my $typename = '(int|char|short|long|unsigned|float|double' . + '|\w+_t|struct\s+\w+|union\s+\w+|FILE|BOOL)'; + +# mapping of old types to POSIX compatible types +my %old2posix = ( + 'unchar' => 'uchar_t', + 'ushort' => 'ushort_t', + 'uint' => 'uint_t', + 'ulong' => 'ulong_t', + 'u_int' => 'uint_t', + 'u_short' => 'ushort_t', + 'u_long' => 'ulong_t', + 'u_char' => 'uchar_t', + 'quad' => 'quad_t' +); + +my $lint_re = qr/\/\*(?: + ARGSUSED[0-9]*|NOTREACHED|LINTLIBRARY|VARARGS[0-9]*| + CONSTCOND|CONSTANTCOND|CONSTANTCONDITION|EMPTY| + FALLTHRU|FALLTHROUGH|LINTED.*?|PRINTFLIKE[0-9]*| + PROTOLIB[0-9]*|SCANFLIKE[0-9]*|CSTYLED.*? + )\*\//x; + +my $splint_re = qr/\/\*@.*?@\*\//x; + +my $warlock_re = qr/\/\*\s*(?: + VARIABLES\ PROTECTED\ BY| + MEMBERS\ PROTECTED\ BY| + ALL\ MEMBERS\ PROTECTED\ BY| + READ-ONLY\ VARIABLES:| + READ-ONLY\ MEMBERS:| + VARIABLES\ READABLE\ WITHOUT\ LOCK:| + MEMBERS\ READABLE\ WITHOUT\ LOCK:| + LOCKS\ COVERED\ BY| + LOCK\ UNNEEDED\ BECAUSE| + LOCK\ NEEDED:| + LOCK\ HELD\ ON\ ENTRY:| + READ\ LOCK\ HELD\ ON\ ENTRY:| + WRITE\ LOCK\ HELD\ ON\ ENTRY:| + LOCK\ ACQUIRED\ AS\ SIDE\ EFFECT:| + READ\ LOCK\ ACQUIRED\ AS\ SIDE\ EFFECT:| + WRITE\ LOCK\ ACQUIRED\ AS\ SIDE\ EFFECT:| + LOCK\ RELEASED\ AS\ SIDE\ EFFECT:| + LOCK\ UPGRADED\ AS\ SIDE\ EFFECT:| + LOCK\ DOWNGRADED\ AS\ SIDE\ EFFECT:| + FUNCTIONS\ CALLED\ THROUGH\ POINTER| + FUNCTIONS\ CALLED\ THROUGH\ MEMBER| + LOCK\ ORDER: + )/x; + +my $err_stat = 0; # exit status + +if ($#ARGV >= 0) { + foreach my $arg (@ARGV) { + my $fh = new IO::File $arg, "r"; + if (!defined($fh)) { + printf "%s: can not open\n", $arg; + } else { + &cstyle($arg, $fh); + close $fh; + } + } +} else { + &cstyle("", *STDIN); +} +exit $err_stat; + +my $no_errs = 0; # set for CSTYLED-protected lines + +sub err($) { + my ($error) = @_; + unless ($no_errs) { + if ($verbose) { + printf $fmt, $filename, $., $error, $line; + } else { + printf $fmt, $filename, $., $error; + } + $err_stat = 1; + } +} + +sub err_prefix($$) { + my ($prevline, $error) = @_; + my $out = $prevline."\n".$line; + unless ($no_errs) { + printf $fmt, $filename, $., $error, $out; + $err_stat = 1; + } +} + +sub err_prev($) { + my ($error) = @_; + unless ($no_errs) { + printf $fmt, $filename, $. - 1, $error, $prev; + $err_stat = 1; + } +} + +sub cstyle($$) { + +my ($fn, $filehandle) = @_; +$filename = $fn; # share it globally + +my $in_cpp = 0; +my $next_in_cpp = 0; + +my $in_comment = 0; +my $in_header_comment = 0; +my $comment_done = 0; +my $in_warlock_comment = 0; +my $in_function = 0; +my $in_function_header = 0; +my $in_declaration = 0; +my $note_level = 0; +my $nextok = 0; +my $nocheck = 0; + +my $in_string = 0; + +my ($okmsg, $comment_prefix); + +$line = ''; +$prev = ''; +reset_indent(); + +line: while (<$filehandle>) { + s/\r?\n$//; # strip return and newline + + # save the original line, then remove all text from within + # double or single quotes, we do not want to check such text. + + $line = $_; + + # + # C allows strings to be continued with a backslash at the end of + # the line. We translate that into a quoted string on the previous + # line followed by an initial quote on the next line. + # + # (we assume that no-one will use backslash-continuation with character + # constants) + # + $_ = '"' . $_ if ($in_string && !$nocheck && !$in_comment); + + # + # normal strings and characters + # + s/'([^\\']|\\[^xX0]|\\0[0-9]*|\\[xX][0-9a-fA-F]*)'/''/g; + s/"([^\\"]|\\.)*"/\"\"/g; + + # + # detect string continuation + # + if ($nocheck || $in_comment) { + $in_string = 0; + } else { + # + # Now that all full strings are replaced with "", we check + # for unfinished strings continuing onto the next line. + # + $in_string = + (s/([^"](?:"")*)"([^\\"]|\\.)*\\$/$1""/ || + s/^("")*"([^\\"]|\\.)*\\$/""/); + } + + # + # figure out if we are in a cpp directive + # + $in_cpp = $next_in_cpp || /^\s*#/; # continued or started + $next_in_cpp = $in_cpp && /\\$/; # only if continued + + # strip off trailing backslashes, which appear in long macros + s/\s*\\$//; + + # an /* END CSTYLED */ comment ends a no-check block. + if ($nocheck) { + if (/\/\* *END *CSTYLED *\*\//) { + $nocheck = 0; + } else { + reset_indent(); + next line; + } + } + + # a /*CSTYLED*/ comment indicates that the next line is ok. + if ($nextok) { + if ($okmsg) { + err($okmsg); + } + $nextok = 0; + $okmsg = 0; + if (/\/\* *CSTYLED.*\*\//) { + /^.*\/\* *CSTYLED *(.*) *\*\/.*$/; + $okmsg = $1; + $nextok = 1; + } + $no_errs = 1; + } elsif ($no_errs) { + $no_errs = 0; + } + + # check length of line. + # first, a quick check to see if there is any chance of being too long. + if (($line =~ tr/\t/\t/) * 7 + length($line) > 80) { + # yes, there is a chance. + # replace tabs with spaces and check again. + my $eline = $line; + 1 while $eline =~ + s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e; + if (length($eline) > 80) { + # allow long line if it is user visible string + # find if line start from " and ends + # with " + 2 optional characters + # (these characters can be i.e. '");' '" \' or '",' etc...) + if($eline =~ /^ *".*"[^"]{0,2}$/) { + # check if entire line is one string literal + $eline =~ s/^ *"//; + $eline =~ s/"[^"]{0,2}$//; + + if($eline =~ /[^\\]"|[^\\](\\\\)+"/) { + err("line > 80 characters"); + } + } else { + err("line > 80 characters"); + } + } + } + + # ignore NOTE(...) annotations (assumes NOTE is on lines by itself). + if ($note_level || /\b_?NOTE\s*\(/) { # if in NOTE or this is NOTE + s/[^()]//g; # eliminate all non-parens + $note_level += s/\(//g - length; # update paren nest level + next; + } + + # a /* BEGIN CSTYLED */ comment starts a no-check block. + if (/\/\* *BEGIN *CSTYLED *\*\//) { + $nocheck = 1; + } + + # a /*CSTYLED*/ comment indicates that the next line is ok. + if (/\/\* *CSTYLED.*\*\//) { + /^.*\/\* *CSTYLED *(.*) *\*\/.*$/; + $okmsg = $1; + $nextok = 1; + } + if (/\/\/ *CSTYLED/) { + /^.*\/\/ *CSTYLED *(.*)$/; + $okmsg = $1; + $nextok = 1; + } + + # universal checks; apply to everything + if (/\t +\t/) { + err("spaces between tabs"); + } + if (/ \t+ /) { + err("tabs between spaces"); + } + if (/\s$/) { + err("space or tab at end of line"); + } + if (/[^ \t(]\/\*/ && !/\w\(\/\*.*\*\/\);/) { + err("comment preceded by non-blank"); + } + + # is this the beginning or ending of a function? + # (not if "struct foo\n{\n") + if (/^{$/ && $prev =~ /\)\s*(const\s*)?(\/\*.*\*\/\s*)?\\?$/) { + $in_function = 1; + $in_declaration = 1; + $in_function_header = 0; + $prev = $line; + next line; + } + if (/^}\s*(\/\*.*\*\/\s*)*$/) { + if ($prev =~ /^\s*return\s*;/) { + err_prev("unneeded return at end of function"); + } + $in_function = 0; + reset_indent(); # we don't check between functions + $prev = $line; + next line; + } + if (/^\w*\($/) { + $in_function_header = 1; + } + + if ($in_warlock_comment && /\*\//) { + $in_warlock_comment = 0; + $prev = $line; + next line; + } + + # a blank line terminates the declarations within a function. + # XXX - but still a problem in sub-blocks. + if ($in_declaration && /^$/) { + $in_declaration = 0; + } + + if ($comment_done) { + $in_comment = 0; + $in_header_comment = 0; + $comment_done = 0; + } + # does this looks like the start of a block comment? + if (/$hdr_comment_start/) { + if (!/^\t*\/\*/) { + err("block comment not indented by tabs"); + } + $in_comment = 1; + /^(\s*)\//; + $comment_prefix = $1; + if ($comment_prefix eq "") { + $in_header_comment = 1; + } + $prev = $line; + next line; + } + # are we still in the block comment? + if ($in_comment) { + if (/^$comment_prefix \*\/$/) { + $comment_done = 1; + } elsif (/\*\//) { + $comment_done = 1; + err("improper block comment close") + unless ($ignore_hdr_comment && $in_header_comment); + } elsif (!/^$comment_prefix \*[ \t]/ && + !/^$comment_prefix \*$/) { + err("improper block comment") + unless ($ignore_hdr_comment && $in_header_comment); + } + } + + if ($in_header_comment && $ignore_hdr_comment) { + $prev = $line; + next line; + } + + # check for errors that might occur in comments and in code. + + # allow spaces to be used to draw pictures in header and block comments. + if (/[^ ] / && !/".* .*"/ && !$in_header_comment && !$in_comment) { + err("spaces instead of tabs"); + } + if (/^ / && !/^ \*[ \t\/]/ && !/^ \*$/ && + (!/^ \w/ || $in_function != 0)) { + err("indent by spaces instead of tabs"); + } + if (/^\t+ [^ \t\*]/ || /^\t+ \S/ || /^\t+ \S/) { + err("continuation line not indented by 4 spaces"); + } + if (/$warlock_re/ && !/\*\//) { + $in_warlock_comment = 1; + $prev = $line; + next line; + } + if (/^\s*\/\*./ && !/^\s*\/\*.*\*\// && !/$hdr_comment_start/) { + err("improper first line of block comment"); + } + + if ($in_comment) { # still in comment, don't do further checks + $prev = $line; + next line; + } + + if ((/[^(]\/\*\S/ || /^\/\*\S/) && + !(/$lint_re/ || ($splint_comments && /$splint_re/))) { + err("missing blank after open comment"); + } + if (/\S\*\/[^)]|\S\*\/$/ && + !(/$lint_re/ || ($splint_comments && /$splint_re/))) { + err("missing blank before close comment"); + } + if (/\/\/\S/) { # C++ comments + err("missing blank after start comment"); + } + # check for unterminated single line comments, but allow them when + # they are used to comment out the argument list of a function + # declaration. + if (/\S.*\/\*/ && !/\S.*\/\*.*\*\// && !/\(\/\*/) { + err("unterminated single line comment"); + } + + if (/^(#else|#endif|#include)(.*)$/) { + $prev = $line; + if ($picky) { + my $directive = $1; + my $clause = $2; + # Enforce ANSI rules for #else and #endif: no noncomment + # identifiers are allowed after #endif or #else. Allow + # C++ comments since they seem to be a fact of life. + if ((($1 eq "#endif") || ($1 eq "#else")) && + ($clause ne "") && + (!($clause =~ /^\s+\/\*.*\*\/$/)) && + (!($clause =~ /^\s+\/\/.*$/))) { + err("non-comment text following " . + "$directive (or malformed $directive " . + "directive)"); + } + } + next line; + } + + # + # delete any comments and check everything else. Note that + # ".*?" is a non-greedy match, so that we don't get confused by + # multiple comments on the same line. + # + s/\/\*.*?\*\//\x01/g; + s/\/\/.*$/\x01/; # C++ comments + + # delete any trailing whitespace; we have already checked for that. + s/\s*$//; + + # following checks do not apply to text in comments. + + if (/[^ \t\+]\+[^\+=]/ || /[^\+]\+[^ \+=]/) { + err("missing space around + operator"); + } + if (/[^ \t]\+=/ || /\+=[^ ]/) { + err("missing space around += operator"); + } + if (/[^ \t\-]\-[^\->]/ && !/\(\w+\)\-\w/ && !/[\(\[]\-[\w \t]+[\)\],]/) { + err("missing space before - operator"); + } + if (/[^\-]\-[^ \-=>]/ && !/\(\-\w+\)/ && + !/(return|case|=|>|<|\?|:|,|^[ \t]+)[ \t]+\-[\w\(]/ && !/(\([^\)]+\)|\[|\()\-[\w\(\]]/) { + err("missing space after - operator"); + } + if (/(return|case|=|\?|:|,|\[)[ \t]+\-[ \t]/ || /[\(\[]\-[ \t]/) { + err("extra space after - operator"); + } + if (/[^ \t]\-=/ || /\-=[^ ]/) { + err("missing space around -= operator"); + } + if (/[^ \t][\%\/]/ || /[\%\/][^ =]/ || /[\%\/]=[^ ]/) { + err("missing space around one of operators: % %= / /="); + } + if (/[^ \t]\*=/ || /\*=[^ ]/) { + err("missing space around *= operator"); + } + if (/[^ \t\(\)\*\[]\*/) { + err("missing space before * operator"); + } + if (/\*[^ =\*\w\(,]/ && !/\(.+ \*+\)/ && !/\*\[\]/ && + !/\*\-\-\w/ && !/\*\+\+\w/ && !/\*\)/) { + err("missing space after * operator"); + } + if (/[^<>\s][!<>=]=/ || /[^<>][!<>=]=[^\s,]/ || + (/[^->]>[^,=>\s]/ && !/[^->]>$/) || + (/[^<]<[^,=<\s]/ && !/[^<]<$/) || + /[^<\s]<[^<]/ || /[^->\s]>[^>]/) { + err("missing space around relational operator"); + } + if (/\S>>=/ || /\S<<=/ || />>=\S/ || /<<=\S/ || /\S[-+*\/&|^%]=/ || + (/[^-+*\/&|^%!<>=\s]=[^=]/ && !/[^-+*\/&|^%!<>=\s]=$/) || + (/[^!<>=]=[^=\s]/ && !/[^!<>=]=$/)) { + # XXX - should only check this for C++ code + # XXX - there are probably other forms that should be allowed + if (!/\soperator=/) { + err("missing space around assignment operator"); + } + } + if (/[,;]\S/ && !/\bfor \(;;\)/) { + err("comma or semicolon followed by non-blank"); + } + # allow "for" statements to have empty "while" clauses + if (/\s[,;]/ && !/^[\t]+;$/ && !/^\s*for \([^;]*; ;[^;]*\)/) { + err("comma or semicolon preceded by blank"); + } + if (/^\s*(&&|\|\|)/) { + err("improper boolean continuation"); + } + if (/\S *(&&|\|\|)/ || /(&&|\|\|) *\S/) { + err("more than one space around boolean operator"); + } + if (/\b(for|if|while|switch|return|case)\(/) { + err("missing space between keyword and paren"); + } + if (/(\b(for|if|while|switch|return)\b.*){2,}/ && !/^#define/) { + # multiple "case" and "sizeof" allowed + err("more than one keyword on line"); + } + if (/\b(for|if|while|switch|return|case)\s\s+\(/ && + !/^#if\s+\(/) { + err("extra space between keyword and paren"); + } + # try to detect "func (x)" but not "if (x)" or + # "#define foo (x)" or "int (*func)();" + if (/\w\s\(/) { + my $s = $_; + # strip off all keywords on the line + s/\b(for|if|while|switch|return|case)\s\(/XXX(/g; + s/\b(sizeof|typeof|__typeof__)\s*\(/XXX(/g; + s/#elif\s\(/XXX(/g; + s/^#define\s+\w+\s+\(/XXX(/; + # do not match things like "void (*f)();" + # or "typedef void (func_t)();" + s/\w\s\(+\*/XXX(*/g; + s/\b($typename|void)\s+\(+/XXX(/og; + s/\btypedef\s($typename|void)\s+\(+/XXX(/og; + # do not match "__attribute__ ((format (...)))" + s/\b__attribute__\s*\(\(format\s*\(/__attribute__((XXX(/g; + if (/\w\s\(/) { + err("extra space between function name and left paren"); + } + $_ = $s; + } + # try to detect "int foo(x)", but not "extern int foo(x);" + # XXX - this still trips over too many legitimate things, + # like "int foo(x,\n\ty);" +# if (/^(\w+(\s|\*)+)+\w+\(/ && !/\)[;,](\s|\x01)*$/ && +# !/^(extern|static)\b/) { +# err("return type of function not on separate line"); +# } + # this is a close approximation + if (/^(\w+(\s|\*)+)+\w+\(.*\)(\s|\x01)*$/ && + !/^(extern|static)\b/) { + err("return type of function not on separate line"); + } + if (/^#define\t/ || /^#ifdef\t/ || /^#ifndef\t/) { + err("#define/ifdef/ifndef followed by tab instead of space"); + } + if (/^#define\s\s+/ || /^#ifdef\s\s+/ || /^#ifndef\s\s+/) { + err("#define/ifdef/ifndef followed by more than one space"); + } + # AON C-style doesn't require this. + #if (/^\s*return\W[^;]*;/ && !/^\s*return\s*\(.*\);/) { + # err("unparenthesized return expression"); + #} + if (/\bsizeof\b/ && !/\bsizeof\s*\(.*\)/) { + err("unparenthesized sizeof expression"); + } + if (/\b(sizeof|typeof)\b/ && /\b(sizeof|typeof)\s+\(.*\)/) { + err("spaces between sizeof/typeof expression and paren"); + } + if (/\(\s/) { + err("whitespace after left paren"); + } + # allow "for" statements to have empty "continue" clauses + if (/\s\)/ && !/^\s*for \([^;]*;[^;]*; \)/) { + err("whitespace before right paren"); + } + if (/^\s*\(void\)[^ ]/) { + err("missing space after (void) cast"); + } + if (/\S\{/ && !/\{\{/ && !/\(struct \w+\)\{/) { + err("missing space before left brace"); + } + if ($in_function && /^\s+{/ && + ($prev =~ /\)\s*$/ || $prev =~ /\bstruct\s+\w+$/)) { + err("left brace starting a line"); + } + if (/}(else|while)/) { + err("missing space after right brace"); + } + if (/}\s\s+(else|while)/) { + err("extra space after right brace"); + } + if (/\b_VOID\b|\bVOID\b|\bSTATIC\b/) { + err("obsolete use of VOID or STATIC"); + } + if (/\b($typename|void)\*/o) { + err("missing space between type name and *"); + } + if (/^\s+#/) { + err("preprocessor statement not in column 1"); + } + if (/^#\s/) { + err("blank after preprocessor #"); + } + if (/!\s*(strcmp|strncmp|bcmp)\s*\(/) { + err("don't use boolean ! with comparison functions"); + } + if (/^\S+\([\S\s]*\)\s*{/) { + err("brace of function definition not at beginning of line"); + } + if (/static\s+\S+\s*=\s*(0|NULL)\s*;/) { + err("static variable initialized with 0 or NULL"); + } + if (/typedef[\S\s]+\*\s*\w+\s*;/) { + err("typedefed pointer type"); + } + if (/unsigned\s+int/) { + err("'unsigned int' instead of just 'unsigned'"); + } + if (/long\s+long\s+int/) { + err("'long long int' instead of just 'long long'"); + } elsif (/long\s+int/) { + err("'long int' instead of just 'long'"); + } + + # + # We completely ignore, for purposes of indentation: + # * lines outside of functions + # * preprocessor lines + # + if ($check_continuation && $in_function && !$in_cpp) { + process_indent($_); + } + if ($picky) { + # try to detect spaces after casts, but allow (e.g.) + # "sizeof (int) + 1", "void (*funcptr)(int) = foo;", and + # "int foo(int) __NORETURN;" + if ((/^\($typename( \*+)?\)\s/o || + /\W\($typename( \*+)?\)\s/o) && + !/sizeof\($typename( \*)?\)\s/o && + !/\($typename( \*+)?\)\s+=[^=]/o) { + err("space after cast"); + } + if (/\b($typename|void)\s*\*\s/o && + !/\b($typename|void)\s*\*\s+const\b/o) { + err("unary * followed by space"); + } + } + if ($check_posix_types) { + # try to detect old non-POSIX types. + # POSIX requires all non-standard typedefs to end in _t, + # but historically these have been used. + if (/\b(unchar|ushort|uint|ulong|u_int|u_short|u_long|u_char|quad)\b/) { + err("non-POSIX typedef $1 used: use $old2posix{$1} instead"); + } + } + if ($heuristic) { + # cannot check this everywhere due to "struct {\n...\n} foo;" + if ($in_function && !$in_declaration && + /}./ && !/}\s+=/ && !/{.*}[;,]$/ && !/}(\s|\x01)*$/ && + !/} (else|while)/ && !/}}/) { + err("possible bad text following right brace"); + } + # cannot check this because sub-blocks in + # the middle of code are ok + if ($in_function && /^\s+{/) { + err("possible left brace starting a line"); + } + } + if (/^\s*else\W/) { + if ($prev =~ /^\s*}$/) { + err_prefix($prev, + "else and right brace should be on same line"); + } + } + $prev = $line; +} + +if ($prev eq "") { + err("last line in file is blank"); +} + +} + +# +# Continuation-line checking +# +# The rest of this file contains the code for the continuation checking +# engine. It's a pretty simple state machine which tracks the expression +# depth (unmatched '('s and '['s). +# +# Keep in mind that the argument to process_indent() has already been heavily +# processed; all comments have been replaced by control-A, and the contents of +# strings and character constants have been elided. +# + +my $cont_in; # currently inside of a continuation +my $cont_off; # skipping an initializer or definition +my $cont_noerr; # suppress cascading errors +my $cont_start; # the line being continued +my $cont_base; # the base indentation +my $cont_first; # this is the first line of a statement +my $cont_multiseg; # this continuation has multiple segments + +my $cont_special; # this is a C statement (if, for, etc.) +my $cont_macro; # this is a macro +my $cont_case; # this is a multi-line case + +my @cont_paren; # the stack of unmatched ( and [s we've seen + +sub +reset_indent() +{ + $cont_in = 0; + $cont_off = 0; +} + +sub +delabel($) +{ + # + # replace labels with tabs. Note that there may be multiple + # labels on a line. + # + local $_ = $_[0]; + + while (/^(\t*)( *(?:(?:\w+\s*)|(?:case\b[^:]*)): *)(.*)$/) { + my ($pre_tabs, $label, $rest) = ($1, $2, $3); + $_ = $pre_tabs; + while ($label =~ s/^([^\t]*)(\t+)//) { + $_ .= "\t" x (length($2) + length($1) / 8); + } + $_ .= ("\t" x (length($label) / 8)).$rest; + } + + return ($_); +} + +sub +process_indent($) +{ + require strict; + local $_ = $_[0]; # preserve the global $_ + + s/\x01//g; # No comments + s/\s+$//; # Strip trailing whitespace + + return if (/^$/); # skip empty lines + + # regexps used below; keywords taking (), macros, and continued cases + my $special = '(?:(?:\}\s*)?else\s+)?(?:if|for|while|switch)\b'; + my $macro = '[A-Z_][A-Z_0-9]*\('; + my $case = 'case\b[^:]*$'; + + # skip over enumerations, array definitions, initializers, etc. + if ($cont_off <= 0 && !/^\s*$special/ && + (/(?:(?:\b(?:enum|struct|union)\s*[^\{]*)|(?:\s+=\s*))\{/ || + (/^\s*{/ && $prev =~ /=\s*(?:\/\*.*\*\/\s*)*$/))) { + $cont_in = 0; + $cont_off = tr/{/{/ - tr/}/}/; + return; + } + if ($cont_off) { + $cont_off += tr/{/{/ - tr/}/}/; + return; + } + + if (!$cont_in) { + $cont_start = $line; + + if (/^\t* /) { + err("non-continuation indented 4 spaces"); + $cont_noerr = 1; # stop reporting + } + $_ = delabel($_); # replace labels with tabs + + # check if the statement is complete + return if (/^\s*\}?$/); + return if (/^\s*\}?\s*else\s*\{?$/); + return if (/^\s*do\s*\{?$/); + return if (/{$/); + return if (/}[,;]?$/); + + # Allow macros on their own lines + return if (/^\s*[A-Z_][A-Z_0-9]*$/); + + # cases we don't deal with, generally non-kosher + if (/{/) { + err("stuff after {"); + return; + } + + # Get the base line, and set up the state machine + /^(\t*)/; + $cont_base = $1; + $cont_in = 1; + @cont_paren = (); + $cont_first = 1; + $cont_multiseg = 0; + + # certain things need special processing + $cont_special = /^\s*$special/? 1 : 0; + $cont_macro = /^\s*$macro/? 1 : 0; + $cont_case = /^\s*$case/? 1 : 0; + } else { + $cont_first = 0; + + # Strings may be pulled back to an earlier (half-)tabstop + unless ($cont_noerr || /^$cont_base / || + (/^\t*(?: )?(?:gettext\()?\"/ && !/^$cont_base\t/)) { + err_prefix($cont_start, + "continuation should be indented 4 spaces"); + } + } + + my $rest = $_; # keeps the remainder of the line + + # + # The split matches 0 characters, so that each 'special' character + # is processed separately. Parens and brackets are pushed and + # popped off the @cont_paren stack. For normal processing, we wait + # until a ; or { terminates the statement. "special" processing + # (if/for/while/switch) is allowed to stop when the stack empties, + # as is macro processing. Case statements are terminated with a : + # and an empty paren stack. + # + foreach $_ (split /[^\(\)\[\]\{\}\;\:]*/) { + next if (length($_) == 0); + + # rest contains the remainder of the line + my $rxp = "[^\Q$_\E]*\Q$_\E"; + $rest =~ s/^$rxp//; + + if (/\(/ || /\[/) { + push @cont_paren, $_; + } elsif (/\)/ || /\]/) { + my $cur = $_; + tr/\)\]/\(\[/; + + my $old = (pop @cont_paren); + if (!defined($old)) { + err("unexpected '$cur'"); + $cont_in = 0; + last; + } elsif ($old ne $_) { + err("'$cur' mismatched with '$old'"); + $cont_in = 0; + last; + } + + # + # If the stack is now empty, do special processing + # for if/for/while/switch and macro statements. + # + next if (@cont_paren != 0); + if ($cont_special) { + if ($rest =~ /^\s*{?$/) { + $cont_in = 0; + last; + } + if ($rest =~ /^\s*;$/) { + err("empty if/for/while body ". + "not on its own line"); + $cont_in = 0; + last; + } + if (!$cont_first && $cont_multiseg == 1) { + err_prefix($cont_start, + "multiple statements continued ". + "over multiple lines"); + $cont_multiseg = 2; + } elsif ($cont_multiseg == 0) { + $cont_multiseg = 1; + } + # We've finished this section, start + # processing the next. + goto section_ended; + } + if ($cont_macro) { + if ($rest =~ /^$/) { + $cont_in = 0; + last; + } + } + } elsif (/\;/) { + if ($cont_case) { + err("unexpected ;"); + } elsif (!$cont_special) { + err("unexpected ;") if (@cont_paren != 0); + if (!$cont_first && $cont_multiseg == 1) { + err_prefix($cont_start, + "multiple statements continued ". + "over multiple lines"); + $cont_multiseg = 2; + } elsif ($cont_multiseg == 0) { + $cont_multiseg = 1; + } + if ($rest =~ /^$/) { + $cont_in = 0; + last; + } + if ($rest =~ /^\s*special/) { + err("if/for/while/switch not started ". + "on its own line"); + } + goto section_ended; + } + } elsif (/\{/) { + err("{ while in parens/brackets") if (@cont_paren != 0); + err("stuff after {") if ($rest =~ /[^\s}]/); + $cont_in = 0; + last; + } elsif (/\}/) { + err("} while in parens/brackets") if (@cont_paren != 0); + if (!$cont_special && $rest !~ /^\s*(while|else)\b/) { + if ($rest =~ /^$/) { + err("unexpected }"); + } else { + err("stuff after }"); + } + $cont_in = 0; + last; + } + } elsif (/\:/ && $cont_case && @cont_paren == 0) { + err("stuff after multi-line case") if ($rest !~ /$^/); + $cont_in = 0; + last; + } + next; +section_ended: + # End of a statement or if/while/for loop. Reset + # cont_special and cont_macro based on the rest of the + # line. + $cont_special = ($rest =~ /^\s*$special/)? 1 : 0; + $cont_macro = ($rest =~ /^\s*$macro/)? 1 : 0; + $cont_case = 0; + next; + } + $cont_noerr = 0 if (!$cont_in); +} diff --git a/splitfs_syscall_intercept/utils/include/splitfs-posix.h b/splitfs_syscall_intercept/utils/include/splitfs-posix.h new file mode 100644 index 0000000000..7c960672aa --- /dev/null +++ b/splitfs_syscall_intercept/utils/include/splitfs-posix.h @@ -0,0 +1,95 @@ +/* + * ===================================================================================== + * + * Filename: splitfs-posix.h + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:58:57 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_POSIX_H +#define SPLITFS_POSIX_H + +#include +#include +#include +#include +#include + +typedef struct splitfs_file SPLITFSfile; + +#define SPLITFS_O_RDONLY 00 +#define SPLITFS_O_WRONLY 01 +#define SPLITFS_O_RDWR 02 +#define SPLITFS_O_ACCMODE 0003 + +#define SPLITFS_O_CREAT 0100 +#define SPLITFS_O_EXCL 0200 +#define SPLITFS_O_NOCTTY 0400 +#define SPLITFS_O_TRUNC 01000 +#define SPLITFS_O_APPEND 02000 +#define SPLITFS_O_NONBLOCK 04000 +#define SPLITFS_O_NDELAY SPLITFS_O_NONBLOCK +#define SPLITFS_O_SYNC 04010000 +#define SPLITFS_O_ASYNC 020000 + +#define SPLITFS_O_LARGEFILE 0 +#define SPLITFS_O_DIRECTORY 0200000 +#define SPLITFS_O_NOFOLLOW 0400000 +#define SPLITFS_O_CLOEXEC 02000000 +#define SPLITFS_O_DIRECT 040000 +#define SPLITFS_O_NOATIME 01000000 +#define SPLITFS_O_PATH 010000000 +#define SPLITFS_O_DSYNC 010000 +#define SPLITFS_O_TMPFILE (020000000 | SPLITFS_O_DIRECTORY) + +#define SPLITFS_S_IFREG 0100000 + +#define SPLITFS_ALLPERMS 07777 + +#define SPLITFS_SEEK_SET 0 +#define SPLITFS_SEEK_CUR 1 +#define SPLITFS_SEEK_END 2 +#define SPLITFS_SEEK_DATA 3 +#define SPLITFS_SEEK_HOLE 4 + +#define PAGE_SIZE 4096 + +SPLITFSfile *splitfs_openat(const char *path, long flags, ...); +long splitfs_close(long fd, SPLITFSfile *file); +int splitfs_fallocate(long fd, SPLITFSfile *file, int mode, off_t offset, off_t length); +int splitfs_posix_fallocate(long fd, SPLITFSfile *file, int mode, off_t offset, off_t length); +int splitfs_fstatat(const char* path, struct stat *buf, int flags); +int splitfs_fstat(long fd, SPLITFSfile *file, struct stat *buf); +int splitfs_lstat(const char* path, struct stat* buf); +int splitfs_stat(const char* path, struct stat* buf); +ssize_t splitfs_readv(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt); +ssize_t splitfs_pread(long fd, SPLITFSfile *file, void *buf, size_t count, off_t offset); +ssize_t splitfs_preadv(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt, off_t offset); +ssize_t splitfs_read(long fd, SPLITFSfile *file, void* buf, size_t count); +ssize_t splitfs_write(long fd, SPLITFSfile *file, const void* buf, size_t count); +ssize_t splitfs_writev(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt); +ssize_t splitfs_pwrite(long fd, SPLITFSfile *file, const void* buf, size_t count, off_t offset); +ssize_t splitfs_pwritev(long fd, SPLITFSfile *file, struct iovec *iov, int iovcnt, off_t offset); +int splitfs_unlinkat(const char* pathname, long flags); +int splitfs_unlink(const char* pathname); +long splitfs_truncate(const char* path, off_t length); +off_t splitfs_lseek(long fd, SPLITFSfile *file, off_t offset, int whence); +long splitfs_ftruncate(long fd, SPLITFSfile *file, off_t length); +long splitfs_fsync(long fd, SPLITFSfile *file); +long splitfs_fdatasync(long fd, SPLITFSfile *file); +int splitfs_execv(void); + +const char *splitfs_errormsg(void); + +#endif + diff --git a/splitfs_syscall_intercept/utils/src/CMakeLists.txt b/splitfs_syscall_intercept/utils/src/CMakeLists.txt new file mode 100644 index 0000000000..4c3da34c9a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/CMakeLists.txt @@ -0,0 +1,114 @@ +set(SOURCES + add_delay.c + execv.c + fallocate.c + file.c + fsync.c + handle_mmaps.c + hash_map.c + inode.c + intel_intrin.c + lseek.c + mmap_pool.c + os_thread_pthread.c + os_util_linux.c + out.c + path_resolve.c + preload.c + read.c + relink.c + splitfs-posix.c + staging.c + staging_thread.c + stat.c + syscall_early_filter.c + table_mmaps.c + truncate.c + unlink.c + utils.c + vfd_table.c + write.c + ) + +set(EXPORTED_SYMBOLS + splitfs_fallocate + splitfs_file + splitfs_fsync + splitfs_lseek + splitfs_read + splitfs_stat + splitfs_truncate + splitfs_unlink + splitfs_write + splitfs_execv + ) + +if(PKG_CONFIG_FOUND) + pkg_check_modules(SYSCALL_INTERCEPT libsyscall_intercept) + pkg_check_modules(CAP libcap) +else() + find_package(SYSCALL_INTERCEPT QUIET) + find_package(CAP QUIET) +endif() + +if(NOT SYSCALL_INTERCEPT_FOUND) + message(FATAL_ERROR + "libsyscall_intercept not found - needed by libpmemfile + to skip building libpmemfile, set the BUILD_LIBPMEMFILE option to OFF") +endif() + +if(NOT CAP_FOUND) + message(FATAL_ERROR + "libcap not found - needed by libpmemfile + to skip building libpmemfile, set the BUILD_LIBPMEMFILE option to OFF") +endif() + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# XXX OBJECT library type is not supported on some old cmake versions +add_library(splitfs_o OBJECT ${SOURCES}) + +include_directories(${SYSCALL_INTERCEPT_INCLUDE_DIRS} ..) +link_directories(${SYSCALL_INTERCEPT_LIBRARY_DIRS}) + +add_library(splitfs_shared SHARED $) +add_library(splitfs_static_unscoped STATIC $) + +target_link_libraries(splitfs_shared PRIVATE ${SYSCALL_INTERCEPT_LIBRARIES}) +target_link_libraries(splitfs_shared PRIVATE ${CAP_LIBRARIES}) +target_link_libraries(splitfs_shared PRIVATE ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(splitfs_shared PRIVATE ${CMAKE_DL_LIBS}) +target_link_libraries(splitfs_shared PRIVATE rt) +target_link_libraries(splitfs_shared PRIVATE + -Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libsplitfs.map) + +set_target_properties(splitfs_static_unscoped PROPERTIES OUTPUT_NAME splitfs_unscoped) +set_target_properties(splitfs_shared PROPERTIES OUTPUT_NAME splitfs) +set_target_properties(splitfs_shared PROPERTIES VERSION ${VERSION} SOVERSION ${VERSION_MAJOR}) + +add_custom_command(OUTPUT libsplitfs.a + COMMAND objcopy --localize-hidden `sed -n + "'s/^\\s*\\([a-zA-Z0-9_]*\\);$$/-G \\1/p'" + ${CMAKE_CURRENT_SOURCE_DIR}/libsplitfs.map` libsplitfs_unscoped.a + libsplitfs.a + DEPENDS splitfs_static_unscoped) +add_custom_target(splitfs_static ALL DEPENDS libsplitfs.a) + +install(TARGETS splitfs_shared LIBRARY + CONFIGURATIONS Release None RelWithDebInfo + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +install(TARGETS splitfs_shared LIBRARY + CONFIGURATIONS Debug + DESTINATION ${CMAKE_INSTALL_LIBDIR}/splitfs_debug) + +#install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpmemfile.a +# CONFIGURATIONS Release None +# DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +#install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpmemfile.a +# CONFIGURATIONS Debug +# DESTINATION ${CMAKE_INSTALL_LIBDIR}/pmemfile_debug) + +add_cstyle(splitfs) +add_check_whitespace(splitfs) diff --git a/splitfs_syscall_intercept/utils/src/add_delay.c b/splitfs_syscall_intercept/utils/src/add_delay.c new file mode 100755 index 0000000000..617eee639a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/add_delay.c @@ -0,0 +1,97 @@ +#include "add_delay.h" + +// Set CPU frequency correctly +#define _CPUFREQ 3600LLU /* MHz */ + +#define NS2CYCLE(__ns) (((__ns) * _CPUFREQ) / 1000) + +#define BANDWIDTH_MONITOR_NS 10000 +#define SEC_TO_NS(x) (x * 1000000000UL) + +#define ENABLE_PERF_MODEL + +// performance parameters +/* SCM read extra latency than DRAM */ +uint32_t SCM_EXTRA_READ_LATENCY_NS = 220; +// We assume WBARRIER LATENCY is 0 since write back queue can hide this even in +// power failure. +// https://software.intel.com/en-us/blogs/2016/09/12/deprecate-pcommit-instruction +uint32_t SCM_WBARRIER_LATENCY_NS = 0; + +/* SCM write bandwidth */ +uint32_t SCM_BANDWIDTH_MB = 21000; +/* DRAM system peak bandwidth */ +uint32_t DRAM_BANDWIDTH_MB = 63000; + +uint64_t bandwidth_consumption; +static uint64_t monitor_start = 0, monitor_end = 0, now = 0; + +pthread_mutex_t mlfs_nvm_mutex; + +static inline void PERSISTENT_BARRIER(void) +{ + asm volatile ("sfence\n" : : ); +} + +/////////////////////////////////////////////////////// + +static inline void emulate_latency_ns(unsigned long long ns) +{ + uint64_t cycles, start, stop; + + start = asm_rdtscp(); + cycles = NS2CYCLE(ns); + + do { + /* RDTSC doesn't necessarily wait for previous instructions to complete + * so a serializing instruction is usually used to ensure previous + * instructions have completed. However, in our case this is a desirable + * property since we want to overlap the latency we emulate with the + * actual latency of the emulated instruction. + */ + stop = asm_rdtscp(); + } while (stop - start < cycles); +} + +void perfmodel_add_delay(int read, size_t size) +{ +#ifdef ENABLE_PERF_MODEL + uint32_t extra_latency; + uint32_t do_bandwidth_delay; + + now = asm_rdtscp(); + + if (now >= monitor_end) { + monitor_start = now; + monitor_end = monitor_start + NS2CYCLE(BANDWIDTH_MONITOR_NS); + bandwidth_consumption = 0; + } + + if (__sync_add_and_fetch(&bandwidth_consumption, size) >= + ((SCM_BANDWIDTH_MB << 20) / (SEC_TO_NS(1UL) / BANDWIDTH_MONITOR_NS))) + do_bandwidth_delay = 1; + else + do_bandwidth_delay = 0; + + if (read) { + extra_latency = SCM_EXTRA_READ_LATENCY_NS; + } else + extra_latency = SCM_WBARRIER_LATENCY_NS; + + // bandwidth delay for both read and write. + if (do_bandwidth_delay) { + // Due to the writeback cache, write does not have latency + // but it has bandwidth limit. + // The following is emulated delay when bandwidth is full + extra_latency += (uint32_t)size * (uint32_t) + ((1 - (float)(((float) SCM_BANDWIDTH_MB)/1000) / + (((float)DRAM_BANDWIDTH_MB)/1000)) / (((float)SCM_BANDWIDTH_MB)/1000)); + pthread_mutex_lock(&mlfs_nvm_mutex); + emulate_latency_ns(extra_latency); + pthread_mutex_unlock(&mlfs_nvm_mutex); + } else + emulate_latency_ns(extra_latency); + +#endif + return; +} diff --git a/splitfs_syscall_intercept/utils/src/add_delay.h b/splitfs_syscall_intercept/utils/src/add_delay.h new file mode 100755 index 0000000000..eb96e3a2b6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/add_delay.h @@ -0,0 +1,17 @@ +#ifndef SPLITFS_ADD_DELAY_H_ +#define SPLITFS_ADD_DELAY_H_ + +// to use O_DIRECT flag +// +#include +#include +#include +#include +#include +#include + +#include "pm_util.h" + +void perfmodel_add_delay(int read, size_t size); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/compiler_utils.h b/splitfs_syscall_intercept/utils/src/compiler_utils.h new file mode 100644 index 0000000000..60ecacc539 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/compiler_utils.h @@ -0,0 +1,85 @@ +/* + * Copyright 2014-2017, Intel Corporation + * Copyright (c) 2016, Microsoft Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * util.h -- internal definitions for util module + */ + +#ifndef SPLITFS_UTIL_H +#define SPLITFS_UTIL_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Macro calculates number of elements in given table + */ +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +#if !defined(likely) +#if defined(__GNUC__) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) (!!(x)) +#define unlikely(x) (!!(x)) +#endif +#endif + +#ifndef _WIN32 +#define DIR_SEPARATOR '/' +#else +#define DIR_SEPARATOR '\\' +#endif + +#define COMPILE_ERROR_ON(cond)\ + extern int (*compile_error_dummy_symbol(void))\ + [!!sizeof(struct { int dummy: (1 + (1 / (!(cond)))); })] + +#define splitfs_always_inline __attribute__((always_inline)) inline +#define splitfs_printf_like(fmt_arg_num, arg_num) \ + __attribute__((format(printf, fmt_arg_num, arg_num))) +#define splitfs_noreturn __attribute__((noreturn)) +#define splitfs_constructor static __attribute__((constructor)) +#define splitfs_destructor static __attribute__((destructor)) +#define splitfs_used_var __attribute__((used)) +#define splitfs_warn_unused_result __attribute__((warn_unused_result)) + +#ifdef __cplusplus +} +#endif + +#endif /* util.h */ diff --git a/splitfs_syscall_intercept/utils/src/constants.h b/splitfs_syscall_intercept/utils/src/constants.h new file mode 100644 index 0000000000..7d3095398d --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/constants.h @@ -0,0 +1,2 @@ +#define OPEN_MAX 1024 // Original 0x8000 +#define BUF_SIZE 40 \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/src/execv.c b/splitfs_syscall_intercept/utils/src/execv.c new file mode 100644 index 0000000000..c03d6bac2e --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/execv.c @@ -0,0 +1,216 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "splitfs-posix.h" +#include "constants.h" +#include "vfd_table.h" +#include "file.h" +#include "inode.h" +#include "os_util.h" +#include "sys_util.h" +#include "hash_map.h" +#include "execv.h" +#include "mmap_pool.h" +#include "table_mmaps.h" + +struct vfile_description_flat { + int valid; + struct splitfs_file sfs_file; + struct splitfs_vinode vinode; +}; + +int restore_fds(void); + + +void get_shm_filename(char *filename) { + int ret; + + ret = sprintf(filename, "exec-ledger-%d", os_getpid()); + filename[ret] = '\0'; +} + +/** + * This will do the following: + * 1. FSYNC all the files + * 2. [TODO] Cleanup the staging files. + * 3. [TODO] Close the files that have close_on_exec flag set. + * 4. Create vfile_description_flat to store all the splitfs file data structures with index corresponding to fd + * 5. Loop through the vfd table to see which fds are open and populate open files' data structures + * 6. Open shared memory file, mmap and write the data + */ +int splitfs_execv(void) { + struct vfile_description_flat vfs[OPEN_MAX]; + struct splitfs_file *fp; + char exec_splitfs_filename[BUF_SIZE], buf[512]; + int exec_ledger_fd = -1; + + // Fsync all the files. + for(int i=0; ivinode); + } + + get_shm_filename(exec_splitfs_filename); + exec_ledger_fd = shm_open(exec_splitfs_filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (exec_ledger_fd == -1) { + buf[sprintf(buf, "Failed to open shared memory: %s", strerror(errno))] = '\0'; + FATAL(buf); + } + + long res = syscall_no_intercept(SYS_ftruncate, exec_ledger_fd, (10*1024*1024)); + if (res == -1) { + buf[sprintf(buf, "%s: ftruncate failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + char *shm_area = mmap(NULL, 10*1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, exec_ledger_fd, 0); + if (shm_area == NULL) { + buf[sprintf(buf, "%s: mmap failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + if (memcpy(shm_area, vfs, OPEN_MAX * sizeof(struct vfile_description_flat)) == NULL) { + buf[sprintf(buf, "%s: memcpy of vfile_description_flat failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + return 0; +} + + +/** + * This will do the following: + * 1. Load the data structure vfile_description_flat from the shared memory file + * 2. For all valid == 1 indices, do the following + * 2a. Assign splitfs file using 'splitfs_file_assign' + * 2b. Set the struct with corresponding values (flags, offset, serial no) + * 2c. Get the vinode for the serial number using 'splitfs_vinode_assign' + * 2d. Initialise the inode values like - serialno, file_mmaps, sync_length, length is_large_file etc - using functions wherever applicable. + * 2e. Associate the splitfs_file structure with the vinode using spltifs_vfd_assign + * 2f. Assign the splitfs_file structure to the appropriate index in vfd table using 'splitfs_vfd_assign' + */ +int restore_fds(void) { + struct splitfs_file *fp; + struct splitfs_vinode *vi; + struct vfile_description_flat vfs[OPEN_MAX]; + char exec_splitfs_filename[BUF_SIZE], buf[512]; + char *shm_area; + int exec_ledger_fd = -1; + long ret; + + get_shm_filename(exec_splitfs_filename); + exec_ledger_fd = shm_open(exec_splitfs_filename, O_RDONLY, 0666); + if (exec_ledger_fd == -1) { + buf[sprintf(buf, "Failed to open shared memory: %s", strerror(errno))] = '\0'; + FATAL(buf); + } + + shm_area = mmap(NULL, 10*1024*1024, PROT_READ, MAP_SHARED, exec_ledger_fd, 0); + if (shm_area == NULL) { + buf[sprintf(buf, "%s: mmap failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + if (memcpy(vfs, shm_area, OPEN_MAX * sizeof(struct vfile_description_flat)) == NULL) { + buf[sprintf(buf, "%s: memcpy of fd lookup failed. Err = %s\n", __func__, strerror(errno))] = '\0'; + FATAL(buf); + } + + for(int i=0; iflags = vfs[i].sfs_file.flags; + fp->offset = vfs[i].sfs_file.offset; + fp->serialno = vfs[i].sfs_file.serialno; + + + // Initialise the corresponding vinode + vi = splitfs_vinode_assign(fp->serialno); + if (vi == NULL) { + FATAL("Ran out of inodes\n"); + } + inode_set_ino(vi, inode_get_ino(&vfs[i].vinode)); + inode_set_uncommitted_size(vi, inode_get_uncommitted_size(&vfs[i].vinode)); + inode_set_sync_size(vi, inode_get_sync_size(&vfs[i].vinode)); + inode_set_large_file_status(vi, inode_get_large_file_status(&vfs[i].vinode)); + + void *mmaps = splitfs_mmap_assign(); + if (mmaps == NULL) { + vi->file_mmaps = calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + } + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, vi->serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, vi->serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + vi->tbl_mmap = (struct table_mmap *)tbl_mmaps; + + if (vi->tbl_mmap == NULL) { + vi->tbl_mmap = splitfs_alloc_tbl(); + } + + // Associate the inode with the file + ASSERT(vi->tbl_mmap); + fp->vinode = vi; + + // Assign the splitfs_file structure to the appropriate index in vfd table + ret = splitfs_vfd_assign(i, fp); + if(ret < 0) { + buf[sprintf(buf, "%s: Failed to assign vfd %d to the vfd_table\n", __func__, i)] = '\0'; + FATAL(buf); + } + } + + ret = munmap(shm_area, 10*1024*1024); + ASSERT(ret==0); + ret = shm_unlink(exec_splitfs_filename); + ASSERT(ret==0); + + return 0; +} + +int splitfs_restore_fd_if_exec(void) { + int ret = 0; + char execv_full_path[BUF_SIZE]; + char filename[BUF_SIZE]; + + get_shm_filename(filename); + + execv_full_path[sprintf(execv_full_path, "/dev/shm/%s", filename)] = '\0'; + + if (access(execv_full_path, F_OK ) != -1) { + ret = restore_fds(); + } + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/execv.h b/splitfs_syscall_intercept/utils/src/execv.h new file mode 100644 index 0000000000..104e03829a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/execv.h @@ -0,0 +1,9 @@ +#ifndef SPLITFS_EXECV +#define SPLITFS_EXECV + +void get_shm_filename(char *filename); + +// returns 0 on success, else failed. +int splitfs_restore_fd_if_exec(void); + +#endif \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/src/fallocate.c b/splitfs_syscall_intercept/utils/src/fallocate.c new file mode 100644 index 0000000000..4a81f8ba53 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/fallocate.c @@ -0,0 +1,182 @@ +/* + * ===================================================================================== + * + * Filename: fallocate.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:33:35 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "out.h" + +static int +_splitfs_inode_fallocate(struct splitfs_vinode *inode, long mode, + off_t offset, off_t length) { + + bool remove_mmaps = false; + inode_set_uncommitted_size(inode, (size_t)(offset + length)); + inode_set_sync_size(inode, (size_t)(offset + length)); + inode_set_large_file_status(inode, false); + clear_mmaps_from_ino(inode->serialno, remove_mmaps); + return 0; +} + + +/* + * fallocate_check_arguments - part of pmemfile_fallocate implementation + * Perform some checks that are independent of the file being operated on. + */ +static int +fallocate_check_arguments(int mode, off_t offset, + off_t length) +{ + /* + * from man 2 fallocate: + * + * "EINVAL - offset was less than 0, or len was less + * than or equal to 0." + */ + if (length <= 0 || offset < 0) + return EINVAL; + + /* + * from man 2 fallocate: + * + * "EFBIG - offset+len exceeds the maximum file size." + */ + if ((size_t)offset + (size_t)length > (size_t)SSIZE_MAX) + return EFBIG; + + /* + * from man 2 fallocate: + * + * "EOPNOTSUPP - The filesystem containing the file referred to by + * fd does not support this operation; or the mode is not supported by + * the filesystem containing the file referred to by fd." + * + * As of now, pmemfile_fallocate supports allocating disk space, and + * punching holes. + */ + if (mode & FALLOC_FL_COLLAPSE_RANGE) { + ERR("FL_COLLAPSE_RANGE is not supported"); + return EOPNOTSUPP; + } + + if (mode & FALLOC_FL_ZERO_RANGE) { + ERR("FL_ZERO_RANGE is not supported"); + return EOPNOTSUPP; + } + + if (mode & FALLOC_FL_PUNCH_HOLE) { + /* + * from man 2 fallocate: + * + * "The FALLOC_FL_PUNCH_HOLE flag must be ORed + * with FALLOC_FL_KEEP_SIZE in mode; in other words, + * even when punching off the end of the file, the file size + * (as reported by stat(2)) does not change." + */ + if (mode != (FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_KEEP_SIZE)) + return EOPNOTSUPP; + } else { /* Allocating disk space */ + /* + * Note: According to 'man 2 fallocate' FALLOC_FL_UNSHARE + * is another possible flag to accept here. No equivalent of + * that flag is supported by pmemfile as of now. Also that man + * page is wrong anyways, the header files only refer to + * FALLOC_FL_UNSHARE_RANGE, so it is suspected that noone is + * using it anyways. + */ + if ((mode & ~FALLOC_FL_KEEP_SIZE) != 0) + return EINVAL; + } + + return 0; +} + +int +splitfs_fallocate(long fd, struct splitfs_file *file, int mode, + off_t offset, off_t length) { + + LOG(0, "Called splitfs_fallocate()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + int error; + + error = fallocate_check_arguments(mode, offset, length); + if (error) + goto end; + + ASSERT(offset >= 0); + ASSERT(length > 0); + + pthread_mutex_lock(&file->mutex); + uint64_t flags = file->flags; + struct splitfs_vinode *inode = file->vinode; + pthread_mutex_unlock(&file->mutex); + + /* + * from man 2 fallocate: + * + * "EBADF fd is not a valid file descriptor, or is not opened for + * writing." + */ + if ((flags & PFILE_WRITE) == 0) { + error = EBADF; + goto end; + } + + if (inode) { + os_rwlock_wrlock(&inode->rwlock); + + error = _splitfs_inode_fallocate(inode, mode, (off_t)offset, + (off_t)length); + + syscall_no_intercept(SYS_fallocate, fd, mode, offset, length); + os_rwlock_unlock(&inode->rwlock); + } else + syscall_no_intercept(SYS_fallocate, fd, mode, offset, length); + +end: + if (error != 0) { + errno = error; + return -1; + } + + return 0; +} + +int splitfs_posix_fallocate(long fd, struct splitfs_file *file, + int mode, off_t offset, off_t length) { + + return splitfs_fallocate(fd, file, mode, offset, length); +} diff --git a/splitfs_syscall_intercept/utils/src/file.c b/splitfs_syscall_intercept/utils/src/file.c new file mode 100644 index 0000000000..dbc7af8cc9 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/file.c @@ -0,0 +1,345 @@ +/* + * ===================================================================================== + * + * Filename: file.c + * + * Description: + * + * Version: 1.0 + * Created: 07/31/2019 04:38:40 AM + * Revision: none + * Compiler: gcc + * + * Author: Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include + +#include "constants.h" +#include "file.h" +#include "splitfs-posix.h" +#include "mmap_pool.h" +#include "truncate.h" +#include "sys_util.h" +#include "utils.h" +#include "hash_map.h" +#include "table_mmaps.h" +#include "out.h" + +static struct splitfs_file *free_file_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_file_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static struct splitfs_file *fetch_free_file_slot(void) { + + struct splitfs_file *entry; + + util_mutex_lock(&free_file_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_file_slots[--free_slot_count]; + + util_mutex_unlock(&free_file_slot_mutex); + + return entry; +} + +struct splitfs_file * +splitfs_file_assign() { + + struct splitfs_file *entry = fetch_free_file_slot(); + return entry; +} + +static void splitfs_file_add(struct splitfs_file *entry) { + + util_mutex_lock(&free_file_slot_mutex); + + free_file_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_file_slot_mutex); +} + +void splitfs_file_table_init() { + + static struct splitfs_file store[ARRAY_SIZE(free_file_slots) - 1]; + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) { + pthread_mutex_init(&store[i].mutex, NULL); + splitfs_file_add(store + i); + } +} + + +/* + * check_flags -- open(2) flags tester + */ + +static int +check_flags(long flags) +{ + if (flags & SPLITFS_O_APPEND) { + flags &= ~SPLITFS_O_APPEND; + } + + if (flags & SPLITFS_O_ASYNC) { + ERR("O_ASYNC is not supported"); + errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_CREAT) { + LOG(LTRC, "O_CREAT"); + flags &= ~SPLITFS_O_CREAT; + } + + /* XXX: move to interposing layer */ + if (flags & SPLITFS_O_CLOEXEC) { + LOG(LINF, "O_CLOEXEC is always enabled"); + flags &= ~SPLITFS_O_CLOEXEC; + } + + if (flags & SPLITFS_O_DIRECT) { + LOG(LINF, "O_DIRECT is always enabled"); + flags &= ~SPLITFS_O_DIRECT; + } + + /* O_TMPFILE contains O_DIRECTORY */ + if ((flags & SPLITFS_O_TMPFILE) == SPLITFS_O_TMPFILE) { + ERR("O_TMPFILE is not supported"); + errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_DIRECTORY) { + LOG(0, "O_DIRECTORY is not supported"); + //errno = EINVAL; + return -1; + } + + if (flags & SPLITFS_O_DSYNC) { + LOG(LINF, "O_DSYNC is always enabled"); + flags &= ~SPLITFS_O_DSYNC; + } + + if (flags & SPLITFS_O_EXCL) { + LOG(LTRC, "O_EXCL"); + flags &= ~SPLITFS_O_EXCL; + } + + if (flags & SPLITFS_O_NOCTTY) { + LOG(LINF, "O_NOCTTY is always enabled"); + flags &= ~SPLITFS_O_NOCTTY; + } + + flags &= ~SPLITFS_O_NOATIME; + + if (flags & SPLITFS_O_NOFOLLOW) { + LOG(LTRC, "O_NOFOLLOW"); + flags &= ~SPLITFS_O_NOFOLLOW; + } + + if (flags & SPLITFS_O_NONBLOCK) { + LOG(LINF, "O_NONBLOCK is ignored"); + flags &= ~SPLITFS_O_NONBLOCK; + } + + if (flags & SPLITFS_O_PATH) { + LOG(LTRC, "O_PATH"); + flags &= ~SPLITFS_O_PATH; + } + + if (flags & SPLITFS_O_SYNC) { + LOG(LINF, "O_SYNC is always enabled"); + flags &= ~SPLITFS_O_SYNC; + } + + if (flags & SPLITFS_O_TRUNC) { + LOG(LTRC, "O_TRUNC"); + flags &= ~SPLITFS_O_TRUNC; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_RDONLY) { + LOG(LTRC, "O_RDONLY"); + flags -= SPLITFS_O_RDONLY; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_WRONLY) { + LOG(LTRC, "O_WRONLY"); + flags -= SPLITFS_O_WRONLY; + } + + if ((flags & SPLITFS_O_ACCMODE) == SPLITFS_O_RDWR) { + LOG(LTRC, "O_RDWR"); + flags -= SPLITFS_O_RDWR; + } + + if (flags) { + LOG(0, "unknown flag 0x%lx\n", flags); + errno = EINVAL; + return -1; + } + + return 0; +} + +static SPLITFSfile * +_splitfs_openat(const char *path, long flags, ...) { + + LOG(0, "path = %s", path); + if (check_flags(flags)) + return NULL; + + va_list ap; + va_start(ap, flags); + long mode = 0; + + if (flags & SPLITFS_O_CREAT) { + mode = va_arg(ap, long); + LOG(LDBG, "mode %lo", mode); + mode &= SPLITFS_ALLPERMS; + } + va_end(ap); + + struct splitfs_file *file = NULL; + struct splitfs_vinode *inode = NULL; + struct stat sbuf; + + if (syscall_no_intercept(SYS_stat, path, &sbuf) != 0) { + FATAL("stat failed\n"); + } + + LOG(0, "sbuf st_mode = %u, IFREG = %d. sbuf.st_mode & SPLITFS_S_IFREG = %d", + sbuf.st_mode, SPLITFS_S_IFREG, sbuf.st_mode & SPLITFS_S_IFREG); + if ((sbuf.st_mode & SPLITFS_S_IFREG) == 0) + return NULL; + + int accmode = flags & SPLITFS_O_ACCMODE; + + file = splitfs_file_assign(); + if (file == NULL) { + FATAL("Ran out of files\n"); + } + + pthread_mutex_lock(&file->mutex); + + file->offset = 0; + file->serialno = (uint32_t) sbuf.st_ino; + + LOG(0, "flags passed = %ld", flags); + if (flags & SPLITFS_O_PATH) + file->flags = PFILE_PATH; + else if (accmode == SPLITFS_O_RDONLY) + file->flags = PFILE_READ; + else if (accmode == SPLITFS_O_WRONLY) + file->flags = PFILE_WRITE; + else if (accmode == SPLITFS_O_RDWR) + file->flags = PFILE_READ | PFILE_WRITE; + LOG(0, "flags set = %ld\n", file->flags); + + inode = splitfs_vinode_assign(file->serialno); + if (inode == NULL) { + FATAL("Ran out of inodes\n"); + } + + os_rwlock_wrlock(&inode->rwlock); + + inode_set_ino(inode, (uint32_t) sbuf.st_ino); + LOG(0, "path = %s, inode no = %u", path, inode_get_ino(inode)); + + if (inode_get_ref(inode) == 1) { + + if (flags & SPLITFS_O_TRUNC) { + splitfs_truncate_vinode(inode, 0); + } else { + inode_set_uncommitted_size(inode, (size_t) sbuf.st_size); + inode_set_sync_size(inode, (size_t) sbuf.st_size); + inode_set_large_file_status(inode, false); + } + + util_mutex_lock(&mmap_cache_mutex); + void *mmaps = hash_map_get(global_mmap_cache, inode->serialno); + + if (mmaps != NULL) { + if (inode->file_mmaps != NULL) + splitfs_mmap_add(inode->file_mmaps); + inode->file_mmaps = mmaps; + hash_map_remove(global_mmap_cache, inode->serialno, mmaps); + } else { + if (inode->file_mmaps == NULL) { + mmaps = splitfs_mmap_assign(); + if (mmaps == NULL) { + inode->file_mmaps = calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + } + } + } + util_mutex_unlock(&mmap_cache_mutex); + + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, inode->serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, inode->serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + inode->tbl_mmap = (struct table_mmap *)tbl_mmaps; + + if (inode->tbl_mmap == NULL) { + inode->tbl_mmap = splitfs_alloc_tbl(); + } + } + + ASSERT(inode->tbl_mmap); + file->vinode = inode; + + os_rwlock_unlock(&inode->rwlock); + pthread_mutex_unlock(&file->mutex); + + return file; +} + +long splitfs_close(long fd, SPLITFSfile *file) { + + LOG(0, "In splitfs_close. fd = %ld", fd); + + long ret = 0; + struct splitfs_vinode *inode = file->vinode; + file->vinode = NULL; + + ret = splitfs_vinode_unref(fd, inode); + if (ret == 0) + splitfs_file_add(file); + + LOG(0, "file closed"); + return 0; +} + +SPLITFSfile * +splitfs_openat(const char *path, long flags, ...) { + + if (!path) { + LOG(LUSR, "NULL pathname"); + errno = ENOENT; + return NULL; + } + + va_list ap; + va_start(ap, flags); + long mode = 0; + if (flags & SPLITFS_O_CREAT) + mode = va_arg(ap, long); + va_end(ap); + + SPLITFSfile *ret = _splitfs_openat(path, flags, mode); + + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/file.h b/splitfs_syscall_intercept/utils/src/file.h new file mode 100644 index 0000000000..593bd183d9 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/file.h @@ -0,0 +1,71 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SPLITFS_FILE_H +#define SPLITFS_FILE_H + +/* + * Runtime state structures. + */ + +#include +#include "inode.h" +#include "os_thread.h" + +#define PFILE_READ (1ULL << 0) +#define PFILE_WRITE (1ULL << 1) +#define PFILE_PATH (1ULL << 4) + +/* file handle */ +struct splitfs_file { + /* volatile inode */ + struct splitfs_vinode *vinode; + + /* + * Protects against changes to offset / position cache from multiple + * threads. + */ + pthread_mutex_t mutex; + + /* flags */ + uint64_t flags; + + /* requested/current position */ + volatile size_t offset; + + /* inode number of the file. Do we need this? */ + uint32_t serialno; // duplicated so that iterating doesn't require following every node* +}; + +void splitfs_file_table_init(void); +struct splitfs_file *splitfs_file_assign(void); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/fsync.c b/splitfs_syscall_intercept/utils/src/fsync.c new file mode 100644 index 0000000000..d597e54d48 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/fsync.c @@ -0,0 +1,72 @@ +/* + * ===================================================================================== + * + * Filename: fsync.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 10:11:22 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include "file.h" +#include "sys_util.h" +#include "staging.h" +#include "relink.h" +#include "out.h" +#include +#include + + +static ssize_t +splitfs_fsync_args_check(struct splitfs_file *file) +{ + if (!(file->flags & PFILE_WRITE)) { + errno = EBADF; + return -1; + } + + return 0; +} + +long splitfs_fsync(long fd, struct splitfs_file *file) { + + LOG(0, "In splitfs_fsync(). fd = %ld\n", fd); + long ret = 0; + + ret = splitfs_fsync_args_check(file); + + pthread_mutex_lock(&file->mutex); + struct splitfs_vinode *inode = file->vinode; + pthread_mutex_unlock(&file->mutex); + + os_rwlock_wrlock(&inode->rwlock); + + ASSERT(inode_get_uncommitted_size(inode) >= inode_get_sync_size(inode)); + + if (inode_get_uncommitted_size(inode) > inode_get_sync_size(inode)) { + + ASSERT(inode->staging); + + perform_relink(fd, (off_t) (inode_get_sync_size(inode)), inode, + inode_get_uncommitted_size(inode) - inode_get_sync_size(inode)); + + inode_set_sync_size(inode, inode_get_uncommitted_size(inode)); + inode->staging = NULL; + } + + os_rwlock_unlock(&inode->rwlock); + + return ret; +} + +long splitfs_fdatasync(long fd, struct splitfs_file *file) { + return splitfs_fsync(fd, file); +} diff --git a/splitfs_syscall_intercept/utils/src/handle_mmaps.c b/splitfs_syscall_intercept/utils/src/handle_mmaps.c new file mode 100644 index 0000000000..300e29b578 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/handle_mmaps.c @@ -0,0 +1,139 @@ +/* + * ===================================================================================== + * + * Filename: handle_mmaps.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 04:33:49 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "handle_mmaps.h" + +static void create_file_mmap(long fd, struct splitfs_file *file, unsigned mmap_index, off_t file_offset) { + + ASSERT(file->vinode->file_mmaps[mmap_index] == 0); + off_t mmap_start_off = file_offset & ~(SIZE_OF_MMAP - 1); + long mmap_flags = 0; + if (file->flags & PFILE_READ) + mmap_flags |= PROT_READ; + if (file->flags & PFILE_WRITE) + mmap_flags |= PROT_WRITE; + + char *addr = (char *)syscall_no_intercept(SYS_mmap, NULL, + SIZE_OF_MMAP, + mmap_flags, + MAP_SHARED | MAP_POPULATE, + (int) fd, + mmap_start_off); + + if (addr == MAP_FAILED) { + FATAL("mmap creation failed\n"); + } + + file->vinode->file_mmaps[mmap_index] = (unsigned long)addr; +} + +void *get_mmap_address(long fd, struct splitfs_file *file, off_t file_offset, size_t *extent_length) { + + unsigned mmap_index = (unsigned) (file_offset / SIZE_OF_MMAP); + unsigned largest_valid_mmap = (unsigned) (file->vinode->sync_length / SIZE_OF_MMAP) - 1; + if (mmap_index > largest_valid_mmap) { + *extent_length = 0; + return NULL; + } + + if (file->vinode->file_mmaps[mmap_index] == 0) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + create_file_mmap(fd, file, mmap_index, file_offset); + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + } + + ASSERT(file->vinode->file_mmaps[mmap_index] != 0); + uint64_t start_addr = file->vinode->file_mmaps[mmap_index]; + off_t offset_in_mmap = file_offset % SIZE_OF_MMAP; + + *extent_length = (size_t) (SIZE_OF_MMAP - offset_in_mmap); + return (void *) (start_addr + (unsigned long) offset_in_mmap); +} + +void *get_staging_mmap_address(struct splitfs_file *file, size_t count, + off_t file_offset, size_t *extent_length, bool write) { + + struct sfile_description *staging = NULL; + + if (!file) + FATAL("file is NULL"); + if (!file->vinode) + FATAL("vinode is NULL"); + if (file_offset < 0 || file->offset > file->vinode->length) + FATAL("file_offset is wrong"); + if (!extent_length) + FATAL("extent_length is NULL"); + if (count < 0 || count > (64*1024*1024)) + FATAL("count is wrong"); + + if (write && file->vinode->staging == NULL) { + get_staging_file(file); + } + + if (!file->vinode->staging) + FATAL("staging is NULL"); + + staging = file->vinode->staging; + void *start_addr = (void *)(staging->start_addr); + off_t offset_in_mmap = file_offset + staging->valid_offset; + + if (offset_in_mmap >= (off_t)STAGING_FILE_SIZE) { + *extent_length = 0; + if (staging->valid_offset > STAGING_FILE_SIZE) + staging->valid_offset = (off_t)STAGING_FILE_SIZE; + } + else + *extent_length = (size_t)STAGING_FILE_SIZE - (size_t)offset_in_mmap; + + //if ((void *)(start_addr) == NULL) + // FATAL("start addr is NULL"); + + return (void *) ((uint64_t)start_addr + (uint64_t) offset_in_mmap); +} + +long clear_mmaps_from_ino(uint32_t serialno, bool remove_mmap) { + + long ret = 0; + + util_mutex_lock(&mmap_cache_mutex); + + char **file_mmaps = (char **)hash_map_get(global_mmap_cache, serialno); + hash_map_remove(global_mmap_cache, serialno, file_mmaps); + + util_mutex_unlock(&mmap_cache_mutex); + + if (file_mmaps) { + for (unsigned i = 0; i < PER_NODE_MMAPS; i++) { + if (file_mmaps[i] != 0) { + ret = munmap((char *)file_mmaps[i], SIZE_OF_MMAP); + if (ret != 0) { + errno = EFAULT; + return ret; + } + } + } + } + + if (remove_mmap) + splitfs_mmap_add(file_mmaps); + + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/handle_mmaps.h b/splitfs_syscall_intercept/utils/src/handle_mmaps.h new file mode 100644 index 0000000000..ee4b64cfb5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/handle_mmaps.h @@ -0,0 +1,40 @@ +/* + * ===================================================================================== + * + * Filename: handle_mmaps.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:19:25 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_HANDLE_MMAPS_H +#define SPLITFS_HANDLE_MMAPS_H + +#include +#include + +#include "file.h" +#include "inode.h" +#include "staging.h" +#include "sys_util.h" +#include "hash_map.h" +#include "mmap_pool.h" +#include "out.h" + +#define SIZE_OF_MMAP (2*1024*1024) + +void *get_mmap_address(long fd, struct splitfs_file *file, off_t file_offset, size_t *extent_length); +void *get_staging_mmap_address(struct splitfs_file *file, size_t count, + off_t file_offset, size_t *extent_length, bool write); +long clear_mmaps_from_ino(uint32_t serialno, bool remove_mmap); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/hash_map.c b/splitfs_syscall_intercept/utils/src/hash_map.c new file mode 100644 index 0000000000..79268fd7af --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/hash_map.c @@ -0,0 +1,226 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "constants.h" +#include "hash_map.h" +#include "os_thread.h" +#include "out.h" + +#define INITIAL_NBUCKETS OPEN_MAX + +/* hash map bucket */ +struct hash_map_bucket { + uint32_t key; + void *value; +}; + +/* hash map */ +struct hash_map { + + /* number of elements in "buckets" */ + size_t nbuckets; + + /* buckets */ + struct hash_map_bucket *buckets; + + /* number of used slots */ + size_t entries; +}; + +/* + * hash_map_alloc -- allocates hash map + */ +struct hash_map * +hash_map_alloc(void) +{ + struct hash_map *map = calloc(1, sizeof(*map)); + if (!map) + return NULL; + + map->nbuckets = INITIAL_NBUCKETS; + map->buckets = calloc(map->nbuckets, sizeof(map->buckets)); + if (!map->buckets) { + free(map); + return NULL; + } + + return map; +} + +/* + * hash_map_traverse -- returns number of live entries + */ +int +hash_map_traverse(struct hash_map *map) +{ + int num = 0; + + for (unsigned i = 0; i < map->nbuckets; ++i) { + struct hash_map_bucket *bucket = &map->buckets[i]; + + void *value = bucket->value; + if (value) { + num++; + } + } + + return num; +} + +/* + * hash_map_free -- destroys inode hash map + */ +void +hash_map_free(struct hash_map *map) +{ + free(map->buckets); + free(map); +} + +/* + * pf_hash -- returns hash value of the key + */ +static inline uint32_t +hash(struct hash_map *map, uint32_t key) +{ + return (key); +} + +/* + * hash_map_rebuild -- rebuilds the whole inode hash map + * + * Returns 0 on success, negative value (-errno) on failure, 1 on hash map + * conflict. + */ +static int +hash_map_rebuild(struct hash_map *c, size_t new_sz) +{ + struct hash_map_bucket *new_buckets = + calloc(new_sz, sizeof(new_buckets)); + size_t idx; + + if (!new_buckets) + return -errno; + + for (size_t i = 0; i < c->nbuckets; ++i) { + struct hash_map_bucket *b = &c->buckets[i]; + + idx = hash(c, b->key) % new_sz; + struct hash_map_bucket *newbucket = &new_buckets[idx]; + if (newbucket->key == 0) + newbucket->value = b->value; + } + + free(c->buckets); + c->nbuckets = new_sz; + c->buckets = new_buckets; + + return 0; +} + +/* + * hash_map_remove -- removes key/value from the hash map + */ +int +hash_map_remove(struct hash_map *map, uint32_t key, + void *value) +{ + size_t idx = hash(map, key) % map->nbuckets; + struct hash_map_bucket *b = &map->buckets[idx]; + if (b->value == value) + memset(b, 0, sizeof(struct hash_map_bucket)); + + map->entries--; + + return 0; +} + +/* + * hash_map_get -- returns value associated with specified key + */ +void * +hash_map_get(struct hash_map *map, uint32_t key) +{ + size_t idx = hash(map, key) % map->nbuckets; + + struct hash_map_bucket *b = &map->buckets[idx]; + if (b->key == key) + return b->value; + + return NULL; +} + +/* + * hash_map_put -- inserts key/value into hash map + * + * Returns existing value if key already existed or inserted value. + */ +void * +hash_map_put(struct hash_map *map, uint32_t key, void *value) +{ + uint32_t idx = (uint32_t) (hash(map, key) % map->nbuckets); + + struct hash_map_bucket *b = &map->buckets[idx]; + uint32_t empty_slot = UINT32_MAX; + if (b->key == key) + return b->value; + + if (empty_slot == UINT32_MAX && b->key == 0) + empty_slot = idx; + + while (empty_slot == UINT32_MAX) { + size_t new_sz = map->nbuckets*2; + int res; + res = hash_map_rebuild(map, new_sz); + + if (res < 0) { + errno = -res; + return NULL; + } + + idx = (uint32_t) (hash(map, key) % map->nbuckets); + b = &map->buckets[idx]; + if (b->key == 0) + empty_slot = idx; + } + + b->key = key; + b->value = value; + map->entries++; + + return value; +} diff --git a/splitfs_syscall_intercept/utils/src/hash_map.h b/splitfs_syscall_intercept/utils/src/hash_map.h new file mode 100644 index 0000000000..c5405954e8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/hash_map.h @@ -0,0 +1,58 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef SPLITFS_HASHMAP_H +#define SPLITFS_HASHMAP_H + +#include +#include "sys_util.h" + +struct hash_map; + +struct hash_map *hash_map_alloc(void); +void hash_map_free(struct hash_map *map); + +int hash_map_traverse(struct hash_map *c); + +int hash_map_remove(struct hash_map *map, uint32_t key, void *value); + +void *hash_map_get(struct hash_map *map, uint32_t key); + +void *hash_map_put(struct hash_map *map, + uint32_t key, void *value); + +extern struct hash_map *file_inode_map; +extern struct hash_map *global_mmap_cache; +extern struct hash_map *tbl_mmap_cache; +extern pthread_mutex_t mmap_cache_mutex; +extern pthread_mutex_t tbl_mmap_mutex; + +#endif diff --git a/splitfs_syscall_intercept/utils/src/inode.c b/splitfs_syscall_intercept/utils/src/inode.c new file mode 100644 index 0000000000..dfc61befc2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/inode.c @@ -0,0 +1,169 @@ +/* + * ===================================================================================== + * + * Filename: inode.c + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 11:51:07 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include + +#include "constants.h" +#include "inode.h" +#include "sys_util.h" +#include "utils.h" +#include "hash_map.h" +#include "relink.h" +#include "table_mmaps.h" +#include "out.h" + +static struct splitfs_vinode *free_vinode_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_vinode_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + + +static struct splitfs_vinode *fetch_free_inode_slot(void) { + + struct splitfs_vinode *entry; + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_vinode_slots[--free_slot_count]; + + return entry; +} + +struct splitfs_vinode * +splitfs_vinode_assign(uint32_t serialno) { + + struct splitfs_vinode *entry = NULL; + + util_mutex_lock(&free_vinode_slot_mutex); + + entry = hash_map_get(file_inode_map, (uint32_t) serialno); + + if (entry == NULL) { + entry = fetch_free_inode_slot(); + hash_map_put(file_inode_map, serialno, (void*)entry); + } + + if (entry == NULL) + goto out; + + os_rwlock_wrlock(&entry->rwlock); + + __sync_fetch_and_add(&entry->ref, 1); + + os_rwlock_unlock(&entry->rwlock); + +out: + util_mutex_unlock(&free_vinode_slot_mutex); + + return entry; +} + +struct splitfs_vinode * +splitfs_map_vinode_check(uint32_t serialno) { + + + util_mutex_lock(&free_vinode_slot_mutex); + + struct splitfs_vinode *entry = hash_map_get(file_inode_map, serialno); + + util_mutex_unlock(&free_vinode_slot_mutex); + + return entry; +} + +void splitfs_vinode_add(struct splitfs_vinode *entry) { + + util_mutex_lock(&free_vinode_slot_mutex); + + free_vinode_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_vinode_slot_mutex); +} + +void splitfs_inode_free_list_init(void) { + + static struct splitfs_vinode store[ARRAY_SIZE(free_vinode_slots) - 1]; + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) { + os_rwlock_init(&store[i].rwlock); + + store[i].file_mmaps = (uint64_t *) calloc(1, PER_NODE_MMAPS * sizeof(uint64_t)); + //store[i].dirty_file_mmap_cache = (uint32_t *) calloc(1, DIRTY_MMAP_CACHE_SIZE * sizeof(uint32_t)); + + splitfs_vinode_add(store + i); + } +} + +long splitfs_vinode_unref(long fd, struct splitfs_vinode *inode) { + + long ret = 0; + + if (!inode) { + ret = -1; + goto end; + } + + ret = 0; + uint32_t serialno = 0; + os_rwlock_wrlock(&inode->rwlock); + + if (__sync_sub_and_fetch(&inode->ref, 1) == 0) { + LOG(0, "ref = 0"); + if (inode->staging && + inode_get_uncommitted_size(inode) > inode_get_sync_size(inode)) { + LOG(0, "doing relink"); + perform_relink(fd, (off_t)inode_get_sync_size(inode), + inode, + inode_get_uncommitted_size(inode) - inode_get_sync_size(inode)); + } + + util_mutex_lock(&mmap_cache_mutex); + hash_map_put(global_mmap_cache, inode->serialno, inode->file_mmaps); + util_mutex_unlock(&mmap_cache_mutex); + + util_mutex_lock(&tbl_mmap_mutex); + hash_map_put(tbl_mmap_cache, inode->serialno, inode->tbl_mmap); + util_mutex_unlock(&tbl_mmap_mutex); + + inode->file_mmaps = NULL; + + serialno = inode_get_ino(inode); + inode_set_ino(inode, 0); + inode_set_uncommitted_size(inode, 0); + inode_set_sync_size(inode, 0); + inode_set_large_file_status(inode, false); + inode->staging = NULL; + } + + os_rwlock_unlock(&inode->rwlock); + + util_mutex_lock(&free_vinode_slot_mutex); + os_rwlock_rdlock(&inode->rwlock); + + if (inode_get_ref(inode) == 0) { + LOG(0, "removing entry from map"); + hash_map_remove(file_inode_map, serialno, (void *)inode); + LOG(0, "adding inode to free list"); + free_vinode_slots[free_slot_count++] = inode; + } + + os_rwlock_unlock(&inode->rwlock); + util_mutex_unlock(&free_vinode_slot_mutex); + +end: + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/inode.h b/splitfs_syscall_intercept/utils/src/inode.h new file mode 100644 index 0000000000..e6ec97b57a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/inode.h @@ -0,0 +1,169 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_INODE_H +#define SPLITFS_INODE_H + +#include +#include +#include + +#include "splitfs-posix.h" +#include "os_thread.h" +#include "staging.h" + +#define PER_NODE_MMAPS 1024 +#define DIRTY_MMAP_CACHE_SIZE 20 + +/* +#define SPLITFS_S_LONGSYMLINK 0x10000 +COMPILE_ERROR_ON((SPLITFS_S_IFMT | SPLITFS_ALLPERMS) & + SPLITFS_S_LONGSYMLINK); +*/ + +/* volatile inode */ +struct splitfs_vinode { + /* reference counter */ + uint32_t ref; + + /* read-write lock, also protects inode read/writes */ + os_rwlock_t rwlock; + + /* list of mmaps of the file */ + uint64_t *file_mmaps; + + /* inode number of the file */ + uint32_t serialno; + + /* length matching with file system */ + size_t sync_length; + + /* uncommitted length due to appends */ + volatile size_t length; + + //int free_list_idx; + + /* cache of dirty file mmaps for use during close */ + //uint32_t *dirty_file_mmap_cache; + + //int root_dirty_num; + + /* total dirty mmaps */ + //int total_dirty_file_mmaps; + + /* large files are handled differently */ + bool is_large_file; + + // Staging file + struct sfile_description *staging; + + // Table mmap + struct table_mmap *tbl_mmap; +}; + +static inline size_t inode_get_sync_size(struct splitfs_vinode *i) { + return (i->sync_length); +} + +static inline size_t inode_get_uncommitted_size(struct splitfs_vinode *i) { + return (i->length); +} + +static inline uint32_t inode_get_ino(struct splitfs_vinode *i) { + return (i->serialno); +} + +static inline uint32_t inode_get_ref(struct splitfs_vinode *i) { + return (i->ref); +} + +/* +static inline int inode_get_dirty_mmaps(struct splitfs_vinode *i) { + return (i->total_dirty_file_mmaps); +} +*/ + +static inline bool inode_get_large_file_status(struct splitfs_vinode *i) { + return (i->is_large_file); +} + +static inline void inode_set_sync_size(struct splitfs_vinode *i, uint64_t size) { + i->sync_length = size; +} + +static inline void inode_set_uncommitted_size(struct splitfs_vinode *i, uint64_t size) { + i->length = size; +} + +static inline void inode_set_ino(struct splitfs_vinode *i, uint32_t ino) { + i->serialno = ino; +} + +static inline void inode_set_ref(struct splitfs_vinode *i, uint32_t ref_val) { + i->ref = ref_val; +} + +/* +static inline void inode_set_dirty_mmaps(struct splitfs_vinode *i, int dirty_mmaps) { + i->total_dirty_file_mmaps = dirty_mmaps; +} +*/ + +static inline void inode_set_large_file_status(struct splitfs_vinode *i, bool status) { + i->is_large_file = status; +} + +static inline void inode_inc_ref_val(struct splitfs_vinode *i, uint32_t inc_val) { + i->ref += inc_val; +} + +static inline void inode_inc_sync_size(struct splitfs_vinode *i, uint64_t inc_size) { + i->sync_length += inc_size; +} + +static inline void inode_inc_uncommitted_size(struct splitfs_vinode *i, uint64_t inc_size) { + i->length += inc_size; +} + +/* +static inline void inode_inc_dirty_mmaps(struct splitfs_vinode *i, int inc_dirty) { + i->total_dirty_file_mmaps += inc_dirty; +} +*/ + +void splitfs_inode_free_list_init(void); +struct splitfs_vinode *splitfs_vinode_assign(uint32_t serialno); +void splitfs_vinode_add(struct splitfs_vinode *entry); +long splitfs_vinode_unref(long fd, struct splitfs_vinode *inode); +struct splitfs_vinode *splitfs_map_vinode_check(uint32_t serialno); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/intel_intrin.c b/splitfs_syscall_intercept/utils/src/intel_intrin.c new file mode 100644 index 0000000000..68b7ada1c1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/intel_intrin.c @@ -0,0 +1,273 @@ +/* + * ===================================================================================== + * + * Filename: intel_intrin.c + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 08:07:41 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include + +#include "intel_intrin.h" + +static void (*_mm_flush_fn_ptr)(void const* p); + +static void +flush_dcache_invalidate_opt(const void *addr, size_t len) +{ + uintptr_t uptr; + + /* + * Loop through cache-line-size (typically 64B) aligned chunks + * covering the given range. + */ + for (uptr = (uintptr_t)addr & ~(FLUSH_ALIGN - 1); + uptr < (uintptr_t)addr + len; uptr += FLUSH_ALIGN) { + _mm_flush((char *)uptr); + } +} + + +/* + * pmem_flush -- flush processor cache for the given range + */ +static void +pmem_flush(const void *addr, size_t len) +{ + flush_dcache_invalidate_opt(addr, len); +} + + +void *memmove_nodrain_movnt_granularity(void *pmemdest, const void *src, size_t len) +{ + __m128i xmm0, xmm1, xmm2, xmm3; + size_t i; + __m128i *d; + __m128i *s; + void *dest1 = pmemdest; + size_t cnt; + + if (len == 0 || src == pmemdest) + return pmemdest; + + if (len < MOVNT_THRESHOLD_GRANULARITY) { + memmove(pmemdest, src, len); + pmem_flush(pmemdest, len); + return pmemdest; + } + + if ((uintptr_t)dest1 - (uintptr_t)src >= len) { + /* + * Copy the range in the forward direction. + * + * This is the most common, most optimized case, used unless + * the overlap specifically prevents it. + */ + /* copy up to FLUSH_ALIGN boundary */ + cnt = (uint64_t)dest1 & ALIGN_MASK; + if (cnt > 0) { + cnt = FLUSH_ALIGN - cnt; + + /* never try to copy more the len bytes */ + if (cnt > len) + cnt = len; + + uint8_t *d8 = (uint8_t *)dest1; + const uint8_t *s8 = (uint8_t *)src; + for (i = 0; i < cnt; i++) { + *d8 = *s8; + d8++; + s8++; + } + pmem_flush(dest1, cnt); + dest1 = (char *)dest1 + cnt; + src = (char *)src + cnt; + len -= cnt; + } + + d = (__m128i *)dest1; + s = (__m128i *)src; + + cnt = len >> CHUNK_SHIFT_GRANULARITY; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s); + xmm1 = _mm_loadu_si128(s + 1); + xmm2 = _mm_loadu_si128(s + 2); + xmm3 = _mm_loadu_si128(s + 3); + s += 4; + _mm_stream_si128(d, xmm0); + _mm_stream_si128(d + 1, xmm1); + _mm_stream_si128(d + 2, xmm2); + _mm_stream_si128(d + 3, xmm3); + d += 4; + } + + /* copy the tail (<128 bytes) in 16 bytes chunks */ + len &= CHUNK_MASK_GRANULARITY; + if (len != 0) { + cnt = len >> MOVNT_SHIFT; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s); + _mm_stream_si128(d, xmm0); + s++; + d++; + } + } + len &= MOVNT_MASK; + if (len != 0) { + cnt = len >> DWORD_SHIFT; + int32_t *d32 = (int32_t *)d; + int32_t *s32 = (int32_t *)s; + for (i = 0; i < cnt; i++) { + _mm_stream_si32(d32, *s32); + d32++; + s32++; + } + cnt = len & DWORD_MASK; + uint8_t *d8 = (uint8_t *)d32; + const uint8_t *s8 = (uint8_t *)s32; + + for (i = 0; i < cnt; i++) { + *d8 = *s8; + d8++; + s8++; + } + pmem_flush(d32, cnt); + + /* copy the last bytes (<16), first dwords then bytes */ + } + } else { + /* + * Copy the range in the backward direction. + * + * This prevents overwriting source data due to an + * overlapped destination range. + */ + + dest1 = (char *)dest1 + len; + src = (char *)src + len; + + cnt = (uint64_t)dest1 & ALIGN_MASK; + if (cnt > 0) { + /* never try to copy more the len bytes */ + if (cnt > len) + cnt = len; + + uint8_t *d8 = (uint8_t *)dest1; + const uint8_t *s8 = (uint8_t *)src; + for (i = 0; i < cnt; i++) { + d8--; + s8--; + *d8 = *s8; + } + pmem_flush(d8, cnt); + dest1 = (char *)dest1 - cnt; + src = (char *)src - cnt; + len -= cnt; + } + + d = (__m128i *)dest1; + s = (__m128i *)src; + + cnt = len >> CHUNK_SHIFT_GRANULARITY; + for (i = 0; i < cnt; i++) { + xmm0 = _mm_loadu_si128(s - 1); + xmm1 = _mm_loadu_si128(s - 2); + xmm2 = _mm_loadu_si128(s - 3); + _mm_stream_si128(d - 4, xmm3); + d -= 4; + } + + /* copy the tail (<128 bytes) in 16 bytes chunks */ + len &= CHUNK_MASK_GRANULARITY; + if (len != 0) { + cnt = len >> MOVNT_SHIFT; + for (i = 0; i < cnt; i++) { + d--; + s--; + xmm0 = _mm_loadu_si128(s); + _mm_stream_si128(d, xmm0); + } + } + + /* copy the last bytes (<16), first dwords then bytes */ + len &= MOVNT_MASK; + if (len != 0) { + cnt = len >> DWORD_SHIFT; + int32_t *d32 = (int32_t *)d; + int32_t *s32 = (int32_t *)s; + for (i = 0; i < cnt; i++) { + d32--; + s32--; + _mm_stream_si32(d32, *s32); + } + + cnt = len & DWORD_MASK; + uint8_t *d8 = (uint8_t *)d32; + const uint8_t *s8 = (uint8_t *)s32; + + for (i = 0; i < cnt; i++) { + d8--; + s8--; + *d8 = *s8; + } + pmem_flush(d8, cnt); + } + } + + /* + * The call to pmem_*_nodrain() should be followed by pmem_drain() + * to serialize non-temporal store instructions. (It could be only + * one drain after a sequence of pmem_*_nodrain calls). + * However, on platforms that only support strongly-ordered CLFLUSH + * for flushing the CPU cache (or that are forced to not use + * CLWB/CLFLUSHOPT) there is no need to put any memory barrier after + * the flush, so the pmem_drain() is a no-op function. In such case, + * we need to put a memory barrier here. + */ + + return pmemdest; +} + +void _mm_cache_flush(void const* p) { + _mm_clflush(p); +} + +void _mm_cache_flush_optimised(void const* p) { + _mm_clflushopt(p); +} + +// Figure out if CLFLUSHOPT is supported +static int is_clflushopt_supported() { + unsigned int eax, ebx, ecx, edx; + __cpuid_count(7, 0, eax, ebx, ecx, edx); + return ebx & bit_CLFLUSHOPT; +} + +void _mm_flush(void const* p) +{ + _mm_flush_fn_ptr(p); +} + +/* + Based on availability of CLFLUSHOPT instruction, point _mm_flush to the + appropriate function +*/ +void splitfs_init_mm_flush(void) { + if(is_clflushopt_supported()) { + _mm_flush_fn_ptr = _mm_cache_flush_optimised; + } else { + _mm_flush_fn_ptr = _mm_cache_flush; + } +} diff --git a/splitfs_syscall_intercept/utils/src/intel_intrin.h b/splitfs_syscall_intercept/utils/src/intel_intrin.h new file mode 100644 index 0000000000..68971dc67e --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/intel_intrin.h @@ -0,0 +1,80 @@ +/* + * ===================================================================================== + * + * Filename: intel_intrin.h + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 08:00:43 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#ifndef SPLITFS_INTRIN_H +#define SPLITFS_INTRIN_H + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CHUNK_SIZE_GRANULARITY 64 +#define CHUNK_SIZE 128 /* 16*8 */ +#define CHUNK_SHIFT 7 +#define CHUNK_SHIFT_GRANULARITY 6 +#define CHUNK_MASK (CHUNK_SIZE - 1) +#define CHUNK_MASK_GRANULARITY (CHUNK_SIZE_GRANULARITY - 1) + +#define DWORD_SIZE 4 +#define DWORD_SHIFT 2 +#define DWORD_MASK (DWORD_SIZE - 1) + +#define MOVNT_SIZE 16 +#define MOVNT_MASK (MOVNT_SIZE - 1) +#define MOVNT_SHIFT 4 +#define FLUSH_ALIGN ((uintptr_t)64) +#define ALIGN_MASK (FLUSH_ALIGN - 1) + +#define MOVNT_THRESHOLD 256 +#define MOVNT_THRESHOLD_GRANULARITY 64 + +#define CLFLUSH_SIZE 64 +#define _mm_clflushopt(addr)\ + asm volatile("clflushopt %0" : "+m" (*(volatile char *)(addr))) +#define _mm_clflush(addr)\ + asm volatile("clflush %0" : "+m" (*(volatile char *)(addr))) + +void *memmove_nodrain_movnt_granularity(void *pmemdest, const void *src, size_t len); +/* This will point to the right function during startup of + splitfs */ +void splitfs_init_mm_flush(void); +void _mm_flush(void const* p); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/libsplitfs.map b/splitfs_syscall_intercept/utils/src/libsplitfs.map new file mode 100644 index 0000000000..c92a355dcb --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/libsplitfs.map @@ -0,0 +1,45 @@ +# +# Copyright 2016, Intel Corporation +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# +# src/libsplitfs.map +# +# linker map file for the preloadable splitfs library +# intentionally not exposing any symbols +# +{ + global: + __xpg_strerror_r; + strerror_r; + strerror; + local: + *; +}; diff --git a/splitfs_syscall_intercept/utils/src/lseek.c b/splitfs_syscall_intercept/utils/src/lseek.c new file mode 100644 index 0000000000..acc32a5373 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/lseek.c @@ -0,0 +1,165 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * lseek.c -- pmemfile_lseek implementation + */ + +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "sys_util.h" +#include "utils.h" +#include "out.h" + +static inline off_t +add_off(size_t cur, off_t off) +{ + COMPILE_ERROR_ON(sizeof(cur) != sizeof(int64_t)); + ASSERT(cur <= INT64_MAX); + + cur += (size_t)off; + + if (cur > INT64_MAX) + return -1; + + return (off_t)cur; +} + +static off_t +splitfs_lseek_locked(SPLITFSfile *file, off_t offset, + int whence) +{ + LOG(LDBG, "file %p offset %ld whence %d", file, offset, whence); + + if (file->flags & PFILE_PATH) { + errno = EBADF; + return -1; + } + + struct splitfs_vinode *inode = file->vinode; + ASSERT(inode); + + off_t ret = 0; + int new_errno = EINVAL; + + switch (whence) { + case SPLITFS_SEEK_SET: + ret = offset; + if (ret < 0) { + /* + * From POSIX: EINVAL if + * "...the resulting file offset would be + * negative for a regular file..." + * + * POSIX manpage also mentions EOVERFLOW + * "The resulting file offset would be a value + * which cannot be represented correctly in an + * object of type off_t." + * However in existing implementations it looks + * like it is only used to represent user-type + * overflow - user calls lseek, when off_t is + * 32-bit, but internal kernel type is 64-bit, + * and returned value cannot be represented + * EOVERFLOW is returned. + * With 64-bit off_t type EINVAL is returned in + * case of overflow. + */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_CUR: + ret = add_off(file->offset, offset); + if (ret < 0) { + /* Error as in SEEK_SET */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_END: + os_rwlock_rdlock(&inode->rwlock); + ret = add_off(inode_get_uncommitted_size(inode), offset); + os_rwlock_unlock(&inode->rwlock); + + if (ret < 0) { + /* Error as in SEEK_SET */ + new_errno = EINVAL; + } + break; + case SPLITFS_SEEK_DATA: + case SPLITFS_SEEK_HOLE: + new_errno = EOPNOTSUPP; + break; + default: + ret = -1; + break; + } + + if (ret < 0) { + ret = -1; + errno = new_errno; + } else { + if (file->offset != (size_t)ret) + LOG(LDBG, "off diff: old %lu != new %lu", file->offset, + (size_t)ret); + file->offset = (size_t)ret; + } + + return ret; +} + +/* + * splitfs_lseek -- changes file current offset + */ +off_t +splitfs_lseek(long fd, struct splitfs_file *file, off_t offset, int whence) +{ + LOG(0, "Called splitfs_lseek()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + COMPILE_ERROR_ON(sizeof(offset) != 8); + off_t ret; + + pthread_mutex_lock(&file->mutex); + ret = splitfs_lseek_locked(file, offset, whence); + pthread_mutex_unlock(&file->mutex); + + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/mmap_pool.c b/splitfs_syscall_intercept/utils/src/mmap_pool.c new file mode 100644 index 0000000000..c6b6f72668 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/mmap_pool.c @@ -0,0 +1,60 @@ +/* + * ===================================================================================== + * + * Filename: mmap_pool.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:21:23 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include + +#include "constants.h" +#include "mmap_pool.h" +#include "sys_util.h" + +static void *free_mmap_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_mmap_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static void * +fetch_free_mmap_slot(void) { + + void *entry; + + util_mutex_lock(&free_mmap_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_mmap_slots[--free_slot_count]; + + util_mutex_unlock(&free_mmap_slot_mutex); + + return entry; +} + +void * +splitfs_mmap_assign() { + + void *entry = fetch_free_mmap_slot(); + return entry; +} + +void +splitfs_mmap_add(void *entry) { + + util_mutex_lock(&free_mmap_slot_mutex); + + free_mmap_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_mmap_slot_mutex); +} diff --git a/splitfs_syscall_intercept/utils/src/mmap_pool.h b/splitfs_syscall_intercept/utils/src/mmap_pool.h new file mode 100644 index 0000000000..82bb40513b --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/mmap_pool.h @@ -0,0 +1,25 @@ +/* + * ===================================================================================== + * + * Filename: mmap_pool.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 05:22:53 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_MMAP_POOL_H +#define SPLITFS_MMAP_POOL_H + +void *splitfs_mmap_assign(void); +void splitfs_mmap_add(void *entry); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/os_thread.h b/splitfs_syscall_intercept/utils/src/os_thread.h new file mode 100644 index 0000000000..c88028b83f --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/os_thread.h @@ -0,0 +1,122 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * os_locks.h -- wrappers around system locking functions + */ + +#ifndef PMEMFILE_OS_LOCKS_H +#define PMEMFILE_OS_LOCKS_H 1 + +typedef struct { + long long data[8]; +} os_mutex_t; + +typedef struct { + long long data[8]; +} os_rwlock_t; + +/* + * os_mutex_init -- system mutex init wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_init(os_mutex_t *m); + +/* + * os_mutex_destroy -- system mutex destroy wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_destroy(os_mutex_t *m); + +/* + * os_mutex_lock -- system mutex lock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_lock(os_mutex_t *m); + +/* + * os_mutex_unlock -- system mutex unlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_mutex_unlock(os_mutex_t *m); + +/* + * os_rwlock_init -- system rwlock init wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_init(os_rwlock_t *m); + +/* + * os_rwlock_rdlock -- system rwlock rdlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_rdlock(os_rwlock_t *m); + +/* + * os_rwlock_wrlock -- system rwlock wrlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_wrlock(os_rwlock_t *m); + +/* + * os_rwlock_unlock -- system rwlock unlock wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_unlock(os_rwlock_t *m); + +/* + * os_rwlock_destroy -- system rwlock destroy wrapper that never fails from + * caller perspective. If underlying function failed, this function aborts + * the program. + */ +void os_rwlock_destroy(os_rwlock_t *m); + +typedef unsigned os_tls_key_t; + +int os_tls_key_create(os_tls_key_t *key, void (*destr_function)(void *)); + +void *os_tls_get(os_tls_key_t key); +int os_tls_set(os_tls_key_t key, const void *ptr); + +typedef int os_once_t; + +void os_once(os_once_t *once, void (*init_routine)(void)); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/os_thread_pthread.c b/splitfs_syscall_intercept/utils/src/os_thread_pthread.c new file mode 100644 index 0000000000..3d77b1bf7a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/os_thread_pthread.c @@ -0,0 +1,164 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * os_locks_pthread.c -- wrappers around system locking functions + */ + +#include +#include +#include + +#include "os_thread.h" +#include "out.h" + +void +os_mutex_init(os_mutex_t *m) +{ + COMPILE_ERROR_ON(sizeof(os_mutex_t) < sizeof(pthread_mutex_t)); + int tmp = pthread_mutex_init((pthread_mutex_t *)m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_init"); + } +} + +void +os_mutex_destroy(os_mutex_t *m) +{ + int tmp = pthread_mutex_destroy((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_destroy"); + } +} + +void +os_mutex_lock(os_mutex_t *m) +{ + int tmp = pthread_mutex_lock((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_lock"); + } +} + +void +os_mutex_unlock(os_mutex_t *m) +{ + int tmp = pthread_mutex_unlock((pthread_mutex_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_unlock"); + } +} + +void +os_rwlock_init(os_rwlock_t *m) +{ + COMPILE_ERROR_ON(sizeof(os_rwlock_t) < sizeof(pthread_rwlock_t)); + int tmp = pthread_rwlock_init((pthread_rwlock_t *)m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_init"); + } +} + +void +os_rwlock_rdlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_rdlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_rdlock"); + } +} + +void +os_rwlock_wrlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_wrlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_wrlock"); + } +} + +void +os_rwlock_unlock(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_unlock((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_unlock"); + } +} + +void +os_rwlock_destroy(os_rwlock_t *m) +{ + int tmp = pthread_rwlock_destroy((pthread_rwlock_t *)m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_destroy"); + } +} + +int +os_tls_key_create(os_tls_key_t *key, void (*destr_function)(void *)) +{ + COMPILE_ERROR_ON(sizeof(os_tls_key_t) < sizeof(pthread_key_t)); + + return pthread_key_create((pthread_key_t *)key, destr_function); +} + +void * +os_tls_get(os_tls_key_t key) +{ + return pthread_getspecific((pthread_key_t)key); +} + +int +os_tls_set(os_tls_key_t key, const void *ptr) +{ + return pthread_setspecific((pthread_key_t)key, ptr); +} + +void +os_once(os_once_t *once, void (*init_routine)(void)) +{ + int tmp = pthread_once(once, init_routine); + if (tmp) { + errno = tmp; + FATAL("!pthread_once"); + } +} diff --git a/splitfs_syscall_intercept/utils/src/os_util.h b/splitfs_syscall_intercept/utils/src/os_util.h new file mode 100644 index 0000000000..c0440ccf49 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/os_util.h @@ -0,0 +1,52 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef OS_UTIL_H +#define OS_UTIL_H + +int os_getpid(void); +void os_describe_errno(int errnum, char *buf, size_t buflen); + +#ifdef DEBUG + +/* + * os_getexecname -- return name of current executable + * + * This function is only used when logging is enabled, to make + * it more clear in the log which program was running. + */ +const char *os_getexecname(void); + +#endif /* DEBUG */ + +int os_usleep(unsigned usec); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/os_util_linux.c b/splitfs_syscall_intercept/utils/src/os_util_linux.c new file mode 100644 index 0000000000..18a45afa9c --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/os_util_linux.c @@ -0,0 +1,84 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +#include "os_util.h" + +int +os_getpid(void) +{ + return getpid(); +} + +void +os_describe_errno(int errnum, char *buf, size_t buflen) +{ + /* + * There are 2 versions of strerror_r - returning int and char * - + * defined depending on feature macros. We want int variant, so to + * catch accidental change in the definition we use temporary int + * variable. + */ + int r = strerror_r(errnum, buf, buflen); + if (r) + snprintf(buf, buflen, "Unknown errno %d", errnum); +} + +#ifdef DEBUG +const char * +os_getexecname(void) +{ + static char namepath[PATH_MAX + 1]; + char procpath[PATH_MAX]; + ssize_t cc; + + snprintf(procpath, PATH_MAX, "/proc/%d/exe", os_getpid()); + + if ((cc = readlink(procpath, namepath, PATH_MAX)) < 0) + strcpy(namepath, "unknown"); + else + namepath[cc] = '\0'; + + return namepath; +} +#endif /* DEBUG */ + +int +os_usleep(unsigned usec) +{ + return usleep(usec); +} diff --git a/splitfs_syscall_intercept/utils/src/out.c b/splitfs_syscall_intercept/utils/src/out.c new file mode 100644 index 0000000000..e432cd3260 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/out.c @@ -0,0 +1,349 @@ +/* + * ===================================================================================== + * + * Filename: out.c + * + * Description: + * + * Version: 1.0 + * Created: 08/02/2019 06:45:54 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include + +#include "compiler_utils.h" +#include "os_thread.h" +#include "os_util.h" +#include "out.h" + +#define UTIL_MAX_ERR_MSG 128 + +static const char *Log_prefix; +static int Log_level; +static FILE *Out_fp; +static unsigned Log_alignment; + +#define MAXPRINT 8192 /* maximum expected log line */ + +/* + * out_init -- initialize the log + * + * This is called from the library initialization code. + */ +void +out_init(const char *log_prefix, const char *log_level_var, + const char *log_file_var) +{ + static int once; + + /* only need to initialize the out module once */ + if (once) + return; + once++; + + Log_prefix = log_prefix; + +#ifdef DEBUG + char *log_level; + char *log_file; + + if ((log_level = getenv(log_level_var)) != NULL) { + Log_level = atoi(log_level); + // if (Log_level < 0) { + // Log_level = 0; + // } + } + + if ((log_file = getenv(log_file_var)) != NULL && log_file[0] != '\0') { + size_t cc = strlen(log_file); + + /* reserve more than enough space for a PID + '\0' */ + char *log_file_pid = alloca(cc + 30); + fprintf(stderr, "Here in debug\n"); + if (cc > 0 && log_file[cc - 1] == '-') { + snprintf(log_file_pid, cc + 30, "%s%d", + log_file, os_getpid()); + log_file = log_file_pid; + } + if ((Out_fp = fopen(log_file, "w")) == NULL) { + char buff[UTIL_MAX_ERR_MSG]; + os_describe_errno(errno, buff, UTIL_MAX_ERR_MSG); + fprintf(stderr, "Error (%s): %s=%s: %s\n", + log_prefix, log_file_var, + log_file, buff); + abort(); + } + } +#endif /* DEBUG */ + + if (Out_fp == NULL) + Out_fp = stderr; + else + setvbuf(Out_fp, NULL, _IOLBF, 0); + +#ifdef DEBUG + LOG(LDBG, "pid %d: program: %s", os_getpid(), os_getexecname()); +#endif + +} + +/* + * out_fini -- close the log file + * + * This is called to close log file before process stop. + */ +void +out_fini(void) +{ + if (Out_fp != NULL && Out_fp != stderr) { + fclose(Out_fp); + Out_fp = stderr; + } +} + +/* + * out_print_func -- default print_func, goes to stderr or Out_fp + */ +static void +out_print_func(const char *s) +{ + syscall_no_intercept(SYS_write, fileno(Out_fp), s, strlen(s)); + //fputs(s, Out_fp); +} + +/* + * calling Print(s) calls the current print_func... + */ +typedef void (*Print_func)(const char *s); +typedef int (*Vsnprintf_func)(char *str, size_t size, const char *format, + va_list ap); +static Print_func Print = out_print_func; +static Vsnprintf_func Vsnprintf = vsnprintf; + +/* + * out_set_print_func -- allow override of print_func used by out module + */ +void +out_set_print_func(void (*print_func)(const char *s)) +{ + LOG(3, "print %p", print_func); + + Print = (print_func == NULL) ? out_print_func : print_func; +} + +/* + * out_set_vsnprintf_func -- allow override of vsnprintf_func used by out module + */ +void +out_set_vsnprintf_func(int (*vsnprintf_func)(char *str, size_t size, + const char *format, va_list ap)) +{ + LOG(3, "vsnprintf %p", vsnprintf_func); + + Vsnprintf = (vsnprintf_func == NULL) ? vsnprintf : vsnprintf_func; +} + +/* + * out_snprintf -- (internal) custom snprintf implementation + */ +static splitfs_printf_like(3, 4) int +out_snprintf(char *str, size_t size, const char *format, ...) +{ + int ret; + va_list ap; + + va_start(ap, format); + ret = Vsnprintf(str, size, format, ap); + va_end(ap); + + return (ret); +} + +/* + * out_common -- common output code, all output goes through here + */ +static void +out_common(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *suffix, const char *fmt, va_list ap) +{ + int oerrno = errno; + char buf[MAXPRINT]; + unsigned cc = 0; + int ret; + const char *sep = ""; + char errstr[UTIL_MAX_ERR_MSG] = ""; + + if (file) { + char *f = strrchr(file, DIR_SEPARATOR); + if (f) + file = f + 1; + ret = out_snprintf(&buf[cc], MAXPRINT - cc, + "<%s>: <%d> <%d: %lu> [%s:%d %s] ", + Log_prefix, level, pid, tid, file, line, func); + if (ret < 0) { + Print("out_snprintf failed"); + goto end; + } + cc += (unsigned)ret; + if (cc < Log_alignment) { + memset(buf + cc, ' ', Log_alignment - cc); + cc = Log_alignment; + } + } + + if (fmt) { + if (*fmt == '!') { + fmt++; + sep = ": "; + os_describe_errno(errno, errstr, UTIL_MAX_ERR_MSG); + } + ret = Vsnprintf(&buf[cc], MAXPRINT - cc, fmt, ap); + if (ret < 0) { + Print("Vsnprintf failed"); + goto end; + } + cc += (unsigned)ret; + } + + out_snprintf(&buf[cc], MAXPRINT - cc, "%s%s%s", sep, errstr, suffix); + + Print(buf); + +end: + errno = oerrno; +} + +/* + * out_error -- common error output code, all error messages go through here + */ +static void +out_error(const char *file, int line, const char *func, + const char *suffix, const char *fmt, va_list ap) +{ + int oerrno = errno; + unsigned cc = 0; + int ret; + const char *sep = ""; + char errstr[UTIL_MAX_ERR_MSG] = ""; + + char *errormsg = (char *)out_get_errormsg(); + + if (fmt) { + if (*fmt == '!') { + fmt++; + sep = ": "; + os_describe_errno(errno, errstr, UTIL_MAX_ERR_MSG); + } + ret = Vsnprintf(&errormsg[cc], MAXPRINT, fmt, ap); + if (ret < 0) { + strcpy(errormsg, "Vsnprintf failed"); + goto end; + } + cc += (unsigned)ret; + out_snprintf(&errormsg[cc], MAXPRINT - cc, "%s%s", + sep, errstr); + } + +#ifdef DEBUG + if (Log_level >= 1) { + char buf[MAXPRINT]; + cc = 0; + + if (file) { + char *f = strrchr(file, DIR_SEPARATOR); + if (f) + file = f + 1; + ret = out_snprintf(&buf[cc], MAXPRINT, + "<%s>: <1> [%s:%d %s] ", + Log_prefix, file, line, func); + if (ret < 0) { + Print("out_snprintf failed"); + goto end; + } + cc += (unsigned)ret; + if (cc < Log_alignment) { + memset(buf + cc, ' ', Log_alignment - cc); + cc = Log_alignment; + } + } + + out_snprintf(&buf[cc], MAXPRINT - cc, "%s%s", errormsg, + suffix); + + Print(buf); + } +#endif + +end: + errno = oerrno; +} + +/* + * out_log -- output a log line if Log_level >= level + */ +void +out_log(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) +{ + va_list ap; + + if (Log_level < level) + return; + + va_start(ap, fmt); + out_common(file, line, func, level, pid, tid, "\n", fmt, ap); + + va_end(ap); +} + +/* + * out_fatal -- output a fatal error & die (i.e. assertion failure) + */ +void +out_fatal(const char *file, int line, const char *func, + const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + out_common(file, line, func, 1, 1, 1, "\n", fmt, ap); + + va_end(ap); + + abort(); +} + +/* + * out_err -- output an error message + */ +void +out_err(const char *file, int line, const char *func, + const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + out_error(file, line, func, "\n", fmt, ap); + + va_end(ap); +} + +/* + * out_get_errormsg -- get the last error message + */ +const char * +out_get_errormsg(void) +{ + return "Last message"; +} diff --git a/splitfs_syscall_intercept/utils/src/out.h b/splitfs_syscall_intercept/utils/src/out.h new file mode 100644 index 0000000000..c7c65c985a --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/out.h @@ -0,0 +1,242 @@ +/* + * Copyright 2014-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * out.h -- definitions for "out" module + */ + +#ifndef SPLITFS_OUT_H +#define SPLITFS_OUT_H 1 + +#include +#include +#include +#include +#include + +#include "compiler_utils.h" +#include "libsyscall_intercept_hook_point.h" + +#define LUSR 2 /* user error */ +#define LINF 3 /* information */ +#define LDBG 4 /* debug info */ +#define LTRC 10 /* traces, very verbose */ + +/* + * Suppress errors which are after appropriate ASSERT* macro for nondebug + * builds. + */ + +#if !defined(DEBUG) && (defined(__clang_analyzer__) || defined(__COVERITY__)) +#define OUT_FATAL_DISCARD_NORETURN void +#else +#define OUT_FATAL_DISCARD_NORETURN +#endif + +#ifndef OUT_ENABLED +#ifdef DEBUG +#define OUT_ENABLED 1 +#else +#define OUT_ENABLED 0 +#endif +#endif + +#if OUT_ENABLED == 1 + +#define DEBUG_ENABLED 1 +#define OUT_LOG out_log +#define OUT_NONL out_nonl +#define OUT_FATAL out_fatal +#define OUT_FATAL_ABORT out_fatal + +#else + +static inline splitfs_printf_like(7, 8) void +out_log_discard(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) level; + (void) pid; + (void) tid; + (void) fmt; +} + +static inline splitfs_printf_like(2, 3) void +out_nonl_discard(int level, const char *fmt, ...) +{ + (void) level; + (void) fmt; +} + +static inline splitfs_printf_like(4, 5) OUT_FATAL_DISCARD_NORETURN void +out_fatal_discard(const char *file, int line, const char *func, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) fmt; +} + +static inline splitfs_printf_like(4, 5) splitfs_noreturn void +out_fatal_abort(const char *file, int line, const char *func, + const char *fmt, ...) +{ + (void) file; + (void) line; + (void) func; + (void) fmt; + + abort(); +} + +#define DEBUG_ENABLED 0 +#define OUT_LOG out_log_discard +#define OUT_NONL out_nonl_discard +#define OUT_FATAL out_fatal_discard +#define OUT_FATAL_ABORT out_fatal_abort + +#endif + +/* + * Trigger compile time error with non-zero builtin constants. + * Pro: this macro can be used non compile time constants. + * Con: this macro can only be used in function scope. + */ +#define ASSERT_COMPILE_ERROR_ON(cond) ((void)sizeof(char[(cond) ? -1 : 1])); + +/* produce debug/trace output */ +#define LOG(level, ...) do { \ + if (!DEBUG_ENABLED) break;\ + OUT_LOG(__FILE__, __LINE__, __func__, level, getpid(), pthread_self(), __VA_ARGS__);\ +} while (0) + +/* produce debug/trace output without prefix and new line */ +#define LOG_NONL(level, ...) do { \ + if (!DEBUG_ENABLED) break; \ + OUT_NONL(level, __VA_ARGS__); \ +} while (0) + +/* produce output and exit +#define FATAL(...)\ + OUT_FATAL_ABORT(__FILE__, __LINE__, __func__, __VA_ARGS__) +*/ + +/* assert a condition is true at runtime */ +#define ASSERT_rt(cnd) do { \ + if (!DEBUG_ENABLED || (cnd)) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__, "assertion failure: %s", #cnd);\ +} while (0) + +/* assertion with extra info printed if assertion fails at runtime */ +#define ASSERTinfo_rt(cnd, info) do { \ + if (!DEBUG_ENABLED || (cnd)) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__, \ + "assertion failure: %s (%s = %s)", #cnd, #info, info);\ +} while (0) + +/* assert two integer values are equal at runtime */ +#define ASSERTeq_rt(lhs, rhs) do { \ + if (!DEBUG_ENABLED || ((lhs) == (rhs))) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__,\ + "assertion failure: %s (0x%llx) == %s (0x%llx)", #lhs,\ + (unsigned long long)(lhs), #rhs, (unsigned long long)(rhs)); \ +} while (0) + +/* assert two integer values are not equal at runtime */ +#define ASSERTne_rt(lhs, rhs) do { \ + if (!DEBUG_ENABLED || ((lhs) != (rhs))) break; \ + OUT_FATAL(__FILE__, __LINE__, __func__,\ + "assertion failure: %s (0x%llx) != %s (0x%llx)", #lhs,\ + (unsigned long long)(lhs), #rhs, (unsigned long long)(rhs)); \ +} while (0) + +/* assert a condition is true */ +#define ASSERT(cnd)\ + do {\ + /*\ + * Detect useless asserts on always true expression. Please use\ + * COMPILE_ERROR_ON(!cnd) or ASSERT_rt(cnd) in such cases.\ + */\ + if (__builtin_constant_p(cnd))\ + ASSERT_COMPILE_ERROR_ON(cnd);\ + ASSERT_rt(cnd);\ + } while (0) + +/* assertion with extra info printed if assertion fails */ +#define ASSERTinfo(cnd, info)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(cnd))\ + ASSERT_COMPILE_ERROR_ON(cnd);\ + ASSERTinfo_rt(cnd);\ + } while (0) + +/* assert two integer values are equal */ +#define ASSERTeq(lhs, rhs)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(lhs) && __builtin_constant_p(rhs))\ + ASSERT_COMPILE_ERROR_ON((lhs) == (rhs));\ + ASSERTeq_rt(lhs, rhs);\ + } while (0) + +/* assert two integer values are not equal */ +#define ASSERTne(lhs, rhs)\ + do {\ + /* See comment in ASSERT. */\ + if (__builtin_constant_p(lhs) && __builtin_constant_p(rhs))\ + ASSERT_COMPILE_ERROR_ON((lhs) != (rhs));\ + ASSERTne_rt(lhs, rhs);\ + } while (0) + +#define ERR(...)\ + out_err(__FILE__, __LINE__, __func__, __VA_ARGS__) + +void out_init(const char *log_prefix, const char *log_level_var, + const char *log_file_var); +void out_fini(void); +void out_log(const char *file, int line, const char *func, int level, int pid, pthread_t tid, + const char *fmt, ...) splitfs_printf_like(7, 8); +void out_err(const char *file, int line, const char *func, + const char *fmt, ...) splitfs_printf_like(4, 5); +void out_fatal(const char *file, int line, const char *func, + const char *fmt, ...) splitfs_printf_like(4, 5) splitfs_noreturn; +void out_set_print_func(void (*print_func)(const char *s)); +void out_set_vsnprintf_func(int (*vsnprintf_func)(char *str, size_t size, + const char *format, va_list ap)); +const char *out_get_errormsg(void); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/path_resolve.c b/splitfs_syscall_intercept/utils/src/path_resolve.c new file mode 100644 index 0000000000..e857ead299 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/path_resolve.c @@ -0,0 +1,142 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Gosh, this path resolving was pain to write. + * XXX: clean up this whole file, and add some more explanations. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "libsyscall_intercept_hook_point.h" +#include "splitfs-posix.h" + +#include "preload.h" +#include "out.h" + +static void +_resolve_path(long fd_at, + const char *path, + struct resolved_path *result) +{ + if (path == NULL) { + result->error_code = -EFAULT; + return; + } + + size_t size; /* The length of the whole path to be resolved. */ + size_t result_path_size = 0; + result->error_code = 0; + + if (path[0] != '/') { + if (fd_at == AT_FDCWD) { + char cwd_path[PATH_MAX]; + if (getcwd(cwd_path, sizeof(cwd_path)) == NULL) { + result->error_code = -ENOTDIR; + return; + } + for (size = 0; cwd_path[size] != '\0'; size++) { + result->path[size] = cwd_path[size]; + } + result_path_size = size; + } else { + /* Get the stat buf of the directory fd_at */ + char at_path[PATH_MAX]; + char proc_fd_path[PATH_MAX]; + long readlink_ret; + + sprintf(proc_fd_path, "/proc/self/fd/%ld", fd_at); + readlink_ret = syscall_no_intercept(SYS_readlink, proc_fd_path, at_path, sizeof(at_path)); + if (readlink_ret == -1) { + result->error_code = -ENOTDIR; + return; + } + at_path[readlink_ret] = '\0'; + + for (size = 0; at_path[size] != '\0'; ++size) { + result->path[result_path_size] = at_path[size]; + result_path_size++; + } + } + } + + // Suppose we open 'file.txt' in cwd '/root/wspace' then the path should be + // '/root/wspace/file.txt' not '/root/wspacefile.txt' hence adding a '/' + if (path[0] != '\0' && result_path_size > 0 && result->path[result_path_size-1] != '/') { + result->path[result_path_size] = '/'; + result_path_size++; + } + + /* Copy input path to result */ + for (size = 0; path[size] != '\0'; ++size) { + result->path[result_path_size] = path[size]; + result_path_size++; + if (result_path_size == (sizeof(result->path) - 1)) { + result->error_code = -ENAMETOOLONG; + return; + } + } + result->path[result_path_size] = '\0'; + + result->path_len = result_path_size; + + if (size == 0) { /* empty string */ + result->error_code = -ENOTDIR; + return; + } +} + +/* + * resolve_path - the main logic for resolving paths containing arbitrary + * combinations of path components in the kernel's vfs and pmemfile pools. + * + * The at argument describes the starting directory of the path resolution, + * It can refer to either a directory in pmemfile pool, or a directory accessed + * via the kernel. + */ +void +resolve_path(long fd_at, + const char *path, + struct resolved_path *result) +{ + _resolve_path(fd_at, path, result); +} diff --git a/splitfs_syscall_intercept/utils/src/pm_util.h b/splitfs_syscall_intercept/utils/src/pm_util.h new file mode 100755 index 0000000000..9649ab27b8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/pm_util.h @@ -0,0 +1,44 @@ +#ifndef _UTIL_H_ +#define _UTIL_H_ + +#ifdef __GNUC__ +#define TYPEOF(x) (__typeof__(x)) +#else +#define TYPEOF(x) +#endif + +#if defined(__i386__) + +static inline unsigned long long asm_rdtsc(void) +{ + unsigned long long int x; + __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); + return x; +} + +static inline unsigned long long asm_rdtscp(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi)::"ecx"); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); + +} +#elif defined(__x86_64__) + +static inline unsigned long long asm_rdtsc(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); +} + +static inline unsigned long long asm_rdtscp(void) +{ + unsigned hi, lo; + __asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi)::"rcx"); + return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); +} +#else +#error "Only support for X86 architecture" +#endif +#endif diff --git a/splitfs_syscall_intercept/utils/src/preload.c b/splitfs_syscall_intercept/utils/src/preload.c new file mode 100644 index 0000000000..ad6dfe8b59 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/preload.c @@ -0,0 +1,809 @@ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "compiler_utils.h" +#include "libsyscall_intercept_hook_point.h" +#include "sys_util.h" +#include "preload.h" +#include "syscall_early_filter.h" +#include "out.h" + +static pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER; + +static int exit_on_ENOTSUP; +static long check_errno(long e, long syscall_no) +{ + if (e == -ENOTSUP && exit_on_ENOTSUP) { + char buf[100]; + sprintf(buf, "syscall %ld not supported by pmemfile, exiting", + syscall_no); + + exit_with_msg(SPLITFS_PRELOAD_EXIT_NOT_SUPPORTED, buf); + } + + return e; +} + +void +exit_with_msg(int ret, const char *msg) +{ + if (msg && msg[0] == '!') { + char buf[100]; + char *errstr = strerror_r(errno, buf, sizeof(buf)); + fprintf(stderr, "%s: %d %s\n", msg + 1, errno, + errstr ? errstr : "unknown"); + + log_write("%s: %d %s\n", msg + 1, errno, + errstr ? errstr : "unknown"); + } else if (msg) { + fprintf(stderr, "%s\n", msg); + + log_write("%s\n", msg); + } + + exit(ret); + __builtin_unreachable(); +} + +static size_t page_size; + +static inline bool +is_accessible(const void *ptr, size_t len) +{ + if (len == 0) + return true; + if (!ptr) + return false; + return true; +} + +static inline bool +is_str_accessible(const char *str) +{ + if (!str) + return false; + return true; +} + +static inline bool +is_valid_ptr(const char *str) +{ + long result; + result = syscall_no_intercept(SYS_access, str, F_OK); + /** + * We need to check if 'str' is a valid pointer, but not crash it + * (segfault) if it's invalid. + * + * Since it is not possible to validate a pointer in the user-space, + * we are making an access system call which validates + * the pointer. + */ + if(result == -EFAULT) { + return false; + } + return true; +} + +static inline int +verify_iovec(long lvec, long cnt) +{ + return 0; +} + +static long +hook_linkat(int fd0, const char *arg0, int fd1, const char * arg1, long flags) +{ + //exit_with_msg(-1, "hook_linkat() not supported. Exiting"); + return syscall_no_intercept(SYS_linkat, fd0, arg0, fd1, arg1, flags); +} + +static long +hook_unlinkat(int fd, const char *path, long flags) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + if (flags & AT_REMOVEDIR) { + return syscall_no_intercept(SYS_unlinkat, fd, path, flags); + } + + long ret = 0; + struct resolved_path where; + + resolve_path(fd, path, &where); + + if (where.error_code != 0) { + ret = where.error_code; + } else if (strstr(where.path, PMEM_ROOT_PATH) != (const char *)where.path) { + ret = syscall_no_intercept(SYS_unlinkat, fd, path, flags); + } else { + ret = splitfs_unlinkat(where.path, flags); + } + + return ret; +} + +static long +hook_newfstatat(int fd, const char *path, struct stat *st, long arg2) +{ + //exit_with_msg(-1, "hook_newfstatat() not supported. Exiting"); + return syscall_no_intercept(SYS_newfstatat, fd, path, st, arg2); +} + +static long +openat_helper(struct resolved_path *where, long flags, long mode) +{ + /* + long temp_flags; + + if (flags & O_DIRECTORY || flags & O_ASYNC || flags & O_TMPFILE) { + temp_flags = flags; + } + else { + temp_flags = flags; + temp_flags = temp_flags & ~O_RDONLY; + temp_flags = temp_flags & ~O_WRONLY; + temp_flags = temp_flags | O_RDWR; + } + */ + + long fd = syscall_no_intercept(SYS_open, where->path, flags, mode); + if (fd < 0) + return fd; + + SPLITFSfile *file = splitfs_openat(where->path, + ((int)flags) & ~O_NONBLOCK, + (mode_t)mode); + + long r = fd; + if (file != NULL) { + r = splitfs_vfd_assign(fd, file); + if (r < 0) { + splitfs_close(fd, file); + syscall_no_intercept(SYS_close, fd); + } + } + + return r; +} + +static long +hook_openat(int fd_at, const char *path, long flags, long mode) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + long ret = 0; + struct resolved_path where; + + resolve_path(fd_at, path, &where); + + if (where.error_code != 0) { + /* path resolution failed */ + ret = where.error_code; + } else if (strstr(where.path, PMEM_ROOT_PATH) != (char*) (where.path)) { + /* Not pmemfile resident path */ + ret = syscall_no_intercept(SYS_openat, + fd_at, where.path, flags, mode); + } else { + ret = openat_helper(&where, flags, mode); + } + + return ret; +} + +static long +hook_fcntl(long fd, int cmd, long arg) +{ + //exit_with_msg(-1, "hook_fcntl() not supported. Exiting"); + return syscall_no_intercept(SYS_fcntl, fd, cmd, arg); +} + +static long +hook_renameat2(int fd_old, const char *path_old, int fd_new, + const char *path_new, unsigned flags) +{ + long ret = 0; + struct resolved_path where_old, where_new; + + if (!is_valid_ptr(path_old) || !is_valid_ptr(path_new)) { + return -EFAULT; + } + + resolve_path(fd_old, path_old, &where_old); + resolve_path(fd_new, path_new, &where_new); + + ret = syscall_no_intercept(SYS_renameat2, fd_old, path_old, fd_new, path_new, flags); + return ret; +} + +static long +hook_truncate(const char *path, off_t length) +{ + if (!is_str_accessible(path) || !is_valid_ptr(path)) + return -EFAULT; + + long result; + + if (strstr(path, PMEM_ROOT_PATH) != path) { + result = syscall_no_intercept(SYS_truncate, path, length); + } else { + result = splitfs_truncate(path, length); + } + + return result; +} + +static long +hook_symlinkat(const char *target, int fd, const char *linkpath) +{ + //exit_with_msg(-1, "hook_symlinkat() not supported. Exiting"); + return syscall_no_intercept(SYS_symlinkat, target, fd, linkpath); +} + +static long +hook_execveat(int fd, const char *path, char *const argv[], + char *const envp[], int flags) +{ + //exit_with_msg(-1, "hook_execveat() not supported. Exiting"); + long result = splitfs_execv(); + if (result != 0) { + FATAL("Failed to execv"); + } + return syscall_no_intercept(SYS_execveat, fd, path, argv, envp, flags); +} + +static long +hook_mmap(long arg0, long arg1, long arg2, + long arg3, int fd, long arg5) +{ + return syscall_no_intercept(SYS_mmap, + arg0, arg1, arg2, arg3, fd, arg5); +} + +static long +hook_mknodat(int fd, const char *path, mode_t mode, dev_t dev) +{ + //exit_with_msg(-1, "hook_mknodat() not supported. Exiting"); + return syscall_no_intercept(SYS_mknodat, fd, path, mode, dev); +} + +static long +hook_statfs(const char *path, struct statfs *buf) +{ + //exit_with_msg(-1, "hook_statfs() not supported. Exiting"); + return syscall_no_intercept(SYS_statfs, path, buf); +} + +static long +dispatch_syscall(long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5) +{ + + switch (syscall_number) { + + /* Use pmemfile_openat to implement open, create, openat */ + case SYS_open: + return hook_openat(AT_FDCWD, (const char *)arg0, arg1, arg2); + + case SYS_creat: + return hook_openat(AT_FDCWD, (const char *)arg0, + O_WRONLY | O_CREAT | O_TRUNC, arg1); + + case SYS_openat: + return hook_openat((int)arg0, (const char *)arg1, arg2, arg3); + + case SYS_rename: + return hook_renameat2(AT_FDCWD, (const char *)arg0, + AT_FDCWD, (const char *)arg1, 0); + + case SYS_renameat: + return hook_renameat2((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, 0); + + case SYS_renameat2: + return hook_renameat2((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, (unsigned)arg4); + + case SYS_link: + /* Use pmemfile_linkat to implement link */ + return hook_linkat(AT_FDCWD, (const char *)arg0, + AT_FDCWD, (const char *)arg1, 0); + + case SYS_linkat: + return hook_linkat((int)arg0, (const char *)arg1, (int)arg2, + (const char *)arg3, arg4); + + case SYS_unlink: + /* Use pmemfile_unlinkat to implement unlink */ + return hook_unlinkat(AT_FDCWD, (const char *)arg0, 0); + + case SYS_unlinkat: + return hook_unlinkat((int)arg0, (const char *)arg1, arg2); + + case SYS_rmdir: + /* Use pmemfile_unlinkat to implement rmdir */ + return hook_unlinkat(AT_FDCWD, (const char *)arg0, + AT_REMOVEDIR); + + /* + * The newfstatat syscall implements both stat and lstat. + * Linux calls it: newfstatat ( I guess there was an old one ) + * POSIX / libc interfaces call it: fstatat + * pmemfile calls it: pmemfile_fstatat + * + * fstat is unique. + */ + case SYS_stat: + return hook_newfstatat(AT_FDCWD, (const char *)arg0, + (struct stat*)arg1, 0); + + case SYS_lstat: + return hook_newfstatat(AT_FDCWD, (const char *)arg0, + (struct stat*)arg1, AT_SYMLINK_NOFOLLOW); + + case SYS_newfstatat: + return hook_newfstatat((int)arg0, (const char *)arg1, + (struct stat*)arg2, arg3); + + case SYS_close: + return splitfs_vfd_close((int)arg0); + + case SYS_mmap: + return hook_mmap(arg0, arg1, arg2, arg3, (int)arg4, arg5); + + case SYS_truncate: + return hook_truncate((const char *)arg0, arg1); + + case SYS_symlink: + return hook_symlinkat((const char *)arg0, + AT_FDCWD, (const char *)arg1); + + case SYS_symlinkat: + return hook_symlinkat((const char *)arg0, (int)arg1, + (const char *)arg2); + + case SYS_mknod: + return hook_mknodat(AT_FDCWD, (const char *)arg0, + (mode_t)arg1, (dev_t)arg2); + + case SYS_mknodat: + return hook_mknodat((int)arg0, (const char *)arg1, + (mode_t)arg2, (dev_t)arg3); + + case SYS_execve: + return hook_execveat(AT_FDCWD, (const char *)arg0, + (char *const *)arg1, (char *const *)arg2, 0); + + case SYS_execveat: + return hook_execveat((int)arg0, (const char *)arg1, + (char *const *)arg2, (char *const *)arg3, (int)arg4); + + case SYS_dup: + return splitfs_vfd_dup((int)arg0); + + case SYS_dup2: + return splitfs_vfd_dup2((int)arg0, (int)arg1); + + case SYS_dup3: + return splitfs_vfd_dup3((int)arg0, (int)arg1, (int)arg2); + + case SYS_statfs: + return hook_statfs((const char *)arg0, (struct statfs *)arg1); + + default: + /* Did we miss something? */ + // assert(false); + return syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + } +} + +static long +dispatch_syscall_fd_first(long syscall_number, + struct splitfs_file *file, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5) +{ + switch (syscall_number) { + + case SYS_write: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_write(arg0, file, (void*)arg1, (size_t)arg2); + } + + case SYS_writev: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_writev(arg0, file, (struct iovec*)arg1, (int)arg2); + } + + case SYS_read: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_read(arg0, file, (void*)arg1, (size_t)arg2); + } + + case SYS_readv: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_readv(arg0, file, (struct iovec*)arg1, (int)arg2); + } + + case SYS_lseek: + return splitfs_lseek(arg0, file, arg1, (int)arg2); + + case SYS_pread64: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_pread(arg0, file, (void*)arg1, (size_t)arg2, arg3); + } + + case SYS_pwrite64: { + if (!is_accessible((void *)arg1, (size_t)arg2)) + return -EFAULT; + + return splitfs_pwrite(arg0, file, (void*)arg1, (size_t)arg2, arg3); + } + + case SYS_preadv: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_preadv(arg0, file, (struct iovec*)arg1, (int)arg2, arg3); + } + + case SYS_pwritev: { + int ret; + if ((ret = verify_iovec(arg1, arg2))) + return ret; + + return splitfs_pwritev(arg0, file, (struct iovec*)arg1, (int)arg2, arg3); + } + + case SYS_fcntl: + return hook_fcntl(arg0, (int)arg1, arg2); + + case SYS_ftruncate: + return splitfs_ftruncate(arg0, file, arg1); + + case SYS_fallocate: + return splitfs_fallocate(arg0, file, (int)arg1, arg2, arg3); + + case SYS_fstat: { + if (!is_accessible((void *)arg1, sizeof(struct stat))) + return -EFAULT; + + return splitfs_fstat(arg0, file, (void*)arg1); + } + + case SYS_fsync: { + return splitfs_fsync(arg0, file); + } + + default: + /* Did we miss something? */ + assert(false); + return syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + + } +} + + +/* + * Return values expected by libsyscall_intercept: + * A non-zero return value if it should execute the syscall, + * zero return value if it should not execute the syscall, and + * use *result value as the syscall's result. + */ +#define NOT_HOOKED 1 +#define HOOKED 0 + +static int +hook(const struct syscall_early_filter_entry *filter_entry, long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5, + long *syscall_return_value) +{ + if (syscall_number != SYS_execve) { + // We do not lock for execve since we do shm_open + util_mutex_lock(&global_mutex); // TODO: Why is this required? + } + + //char data[1000]; + //for (int i = 0; i < 1000; i++) + //data[i] = '\0'; + //sprintf(data, "<%s, %d>: syscall number = %ld\n", __func__, __LINE__, syscall_number); + //syscall_no_intercept(SYS_write, fileno(stderr), data, strlen(data)); + if (syscall_number == SYS_fcntl && + ((int)arg1 == F_DUPFD || (int)arg1 == F_DUPFD_CLOEXEC)) { + /* + * Other fcntl commands on pmemfile resident files are handled + * via dispatch_syscall_fd_first. + * + * XXX: close-on-exec flag is not handled correctly yet. + */ + *syscall_return_value = + splitfs_vfd_fcntl_dup((int)arg0, (int)arg2); + + //syscall_no_intercept(SYS_write, fileno(stderr), "END\n", 5); + if (syscall_number != SYS_execve) { + util_mutex_unlock(&global_mutex); + } + return HOOKED; + } + + int is_hooked; + + is_hooked = HOOKED; + + if (filter_entry->fd_first_arg) { + + struct splitfs_file *file = splitfs_vfd_ref((int)arg0); + if (!file) { + *syscall_return_value = syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + goto end; + } + + *syscall_return_value = + dispatch_syscall_fd_first(syscall_number, + file, arg0, arg1, arg2, arg3, arg4, arg5); + + *syscall_return_value = + check_errno(*syscall_return_value, syscall_number); + + splitfs_vfd_unref((int)arg0); + + } else { + *syscall_return_value = dispatch_syscall(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + } + + /* + *syscall_return_value = syscall_no_intercept(syscall_number, + arg0, arg1, arg2, arg3, arg4, arg5); + */ +end: + //syscall_no_intercept(SYS_write, fileno(stderr), "END\n", 5); + if (syscall_number != SYS_execve) { + util_mutex_unlock(&global_mutex); + } + return is_hooked; +} + +static __thread bool guard_flag; +/* + * hook_reentrance_guard_wrapper -- a wrapper which can notice reentrance. + * + * The guard_flag flag allows pmemfile to prevent the hooking of its own + * syscalls. E.g. while handling an open syscall, libpmemfile might + * call pmemfile_pool_open, which in turn uses an open syscall internally. + * This internally used open syscall is once again forwarded to libpmemfile, + * but using this flag libpmemfile can notice this case of reentering itself. + * + * XXX This approach still contains a very significant bug, as libpmemfile being + * called inside a signal handler might easily forward a mock fd to the kernel. + */ +static int +hook_reentrance_guard_wrapper(long syscall_number, + long arg0, long arg1, + long arg2, long arg3, + long arg4, long arg5, + long *syscall_return_value) +{ + struct syscall_early_filter_entry filter_entry; + filter_entry = get_early_filter_entry(syscall_number); + + if (!filter_entry.must_handle) + return NOT_HOOKED; + + int is_hooked; + + guard_flag = true; + int oerrno = errno; + is_hooked = hook(&filter_entry, syscall_number, arg0, arg1, arg2, arg3, + arg4, arg5, syscall_return_value); + errno = oerrno; + guard_flag = false; + + return is_hooked; +} + +static void +init_hooking(void) +{ + /* + * Install the callback to be called by the syscall intercepting library + */ + intercept_hook_point = &hook_reentrance_guard_wrapper; +} + +static int (*libc__xpg_strerror_r)(int __errnum, char *__buf, size_t __buflen); +static char *(*libc_strerror_r)(int __errnum, char *__buf, size_t __buflen); +static char *(*libc_strerror)(int __errnum); + +int __xpg_strerror_r(int __errnum, char *__buf, size_t __buflen); + +/* + * XSI-compliant version of strerror_r. We have to override it to handle + * possible deadlock/infinite recursion when pmemfile is called from inside of + * strerror_r implementation and we call back into libc because of some failure + * (notably: pool opening failed when process switching is enabled). + */ +int +__xpg_strerror_r(int __errnum, char *__buf, size_t __buflen) +{ + if (!guard_flag && libc__xpg_strerror_r) + return libc__xpg_strerror_r(__errnum, __buf, __buflen); + + if (__errnum == EAGAIN) { + const char *str = + "Resource temporary unavailable (pmemfile wrapper)"; + if (__buflen < strlen(str) + 1) + return ERANGE; + strcpy(__buf, str); + return 0; + } + + const char *str = "Error code %d (pmemfile wrapper)"; + if (__buflen < strlen(str) + 10) + return ERANGE; + sprintf(__buf, str, __errnum); + + return 0; +} + +/* + * GNU-compliant version of strerror_r. See __xpg_strerror_r description. + */ +char * +strerror_r(int __errnum, char *__buf, size_t __buflen) +{ + if (!guard_flag && libc_strerror_r) + return libc_strerror_r(__errnum, __buf, __buflen); + + const char *str = "Error code %d (pmemfile wrapper)"; + if (__buflen < strlen(str) + 10) + return NULL; + + sprintf(__buf, str, __errnum); + return __buf; +} + +/* + * See __xpg_strerror_r description. + */ +char * +strerror(int __errnum) +{ + static char buf[100]; + if (!guard_flag && libc_strerror) + return libc_strerror(__errnum); + + sprintf(buf, "Error code %d (pmemfile wrapper)", __errnum); + return buf; +} + +static volatile int pause_at_start; + +splitfs_constructor void +splitfs_preload_constructor(void) +{ + long ps_sys = sysconf(_SC_PAGE_SIZE); + if (ps_sys < 0) { + FATAL("!sysconf PAGE_SIZE"); + } + page_size = (size_t)ps_sys; + + splitfs_vfd_table_init(); + + /* + const char *env_str = getenv("PMEMFILE_EXIT_ON_NOT_SUPPORTED"); + if (env_str) + exit_on_ENOTSUP = env_str[0] == '1'; + + log_init(getenv("PMEMFILE_PRELOAD_LOG"), + getenv("PMEMFILE_PRELOAD_LOG_TRUNC")); + + env_str = getenv("PMEMFILE_PRELOAD_PROCESS_SWITCHING"); + if (env_str) + process_switching = env_str[0] == '1'; + + initialize_validate_pointers(); + + env_str = getenv("PMEMFILE_PRELOAD_PAUSE_AT_START"); + if (env_str && env_str[0] == '1') { + pause_at_start = 1; + while (pause_at_start) + ; + } + + assert(pool_count == 0); + struct stat kernel_cwd_stat; + stat_cwd(&kernel_cwd_stat); + + detect_mount_points(&kernel_cwd_stat); + establish_mount_points(getenv("PMEMFILE_POOLS"), &kernel_cwd_stat); + */ + + libc__xpg_strerror_r = dlsym(RTLD_NEXT, "__xpg_strerror_r"); + if (!libc__xpg_strerror_r) + FATAL("!can't find __xpg_strerror_r"); + + libc_strerror_r = dlsym(RTLD_NEXT, "strerror_r"); + if (!libc_strerror_r) + FATAL("!can't find strerror_r"); + + libc_strerror = dlsym(RTLD_NEXT, "strerror"); + if (!libc_strerror) + FATAL("!can't find strerror"); + + /* + * Must be the last step, the callback can be called anytime + * after the call to init_hooking() + */ + init_hooking(); + + /* + char *cd = getenv("PMEMFILE_CD"); + if (cd && chdir(cd)) { + perror("chdir"); + exit(1); + } + */ +} + +splitfs_destructor void +splitfs_preload_destructor(void) +{ + /* + * Flush all streams, before library state is destructed. + * Fixes an issue when application forgets to flush or close a file + * it written to and libc destructor calls fflush when pmemfile + * and pmemobj state doesn't exist anymore. + */ + fflush(NULL); +} diff --git a/splitfs_syscall_intercept/utils/src/preload.h b/splitfs_syscall_intercept/utils/src/preload.h new file mode 100644 index 0000000000..a5bb1ad0d6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/preload.h @@ -0,0 +1,63 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_PRELOAD_H +#define SPLITFS_PRELOAD_H + +#include +#include +#include +#include +#include + +#include "splitfs-posix.h" +#include "compiler_utils.h" + +#include "vfd_table.h" + +#define PMEM_ROOT_PATH "/mnt/pmem_emul" + +struct splitfs_file; + +struct resolved_path { + long error_code; + char path[PATH_MAX]; + size_t path_len; +}; + +void resolve_path(long at, + const char *path, + struct resolved_path *result); + +splitfs_printf_like(1, 2) void log_write(const char *fmt, ...); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/read.c b/splitfs_syscall_intercept/utils/src/read.c new file mode 100644 index 0000000000..2157452722 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/read.c @@ -0,0 +1,316 @@ +/* + * ===================================================================================== + * + * Filename: read.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:39:08 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "intel_intrin.h" +#include "add_delay.h" +#include "table_mmaps.h" +#include "out.h" + +#define MEMCPY memcpy + +static size_t +read_staging_file(struct splitfs_file *file, off_t offset, + char *buf, size_t count) { + + LOG(0, "in read_staging_file"); + char *mmap_addr = NULL; + size_t extent_length = 0; + + mmap_addr = (char *)get_staging_mmap_address(file, count, + (off_t) (offset - (off_t) inode_get_sync_size(file->vinode)), &extent_length, false); + + ASSERT(mmap_addr != NULL); + + ASSERT(extent_length >= count); + + if (extent_length > count) + extent_length = count; + + MEMCPY((char *)buf, (char *)mmap_addr, extent_length); + perfmodel_add_delay(1, extent_length); + + return extent_length; +} + +/* + * vinode_read -- reads file + */ +static size_t +vinode_read(long fd, struct splitfs_file *file, off_t offset, + char *buf, size_t count) +{ + uint64_t size = inode_get_uncommitted_size(file->vinode); + void *mmap_addr = 0; + size_t extent_length = 0; + size_t len_read = 0; + size_t len_to_read = count; + // char buf2[count]; + LOG(0, "in vinode_read. fd = %ld, offset = %ld, count = %lu", fd, offset, count); + +//goto syscall; + /* + * Start reading at offset, stop reading + * when end of file is reached, or count bytes were read. + * The following two branches compute how many bytes are + * going to be read. + */ + if ((size_t)offset >= size) + return 0; /* EOF already */ + + if (size - (size_t)offset < count) + count = size - (size_t)offset; + + while (len_read < count) { + size_t len_read_iter = 0; + if ((size_t)offset >= inode_get_sync_size(file->vinode)) { + extent_length = read_staging_file(file, offset, + (char *) (buf + len_read), len_to_read); + goto loop_end; + } + + mmap_addr = (void *)splitfs_get_tbl_entry(file->vinode->tbl_mmap, offset, &extent_length); + if (mmap_addr == NULL) + mmap_addr = (void *)get_mmap_address(fd, file, offset, &extent_length); + + if ((size_t)offset + len_to_read >= inode_get_sync_size(file->vinode)) { + len_read_iter = inode_get_sync_size(file->vinode) - (size_t)offset; + } else { + len_read_iter = len_to_read; + } + + if (extent_length > len_read_iter) { + extent_length = len_read_iter; + } + + if (mmap_addr == NULL && extent_length == 0) { + extent_length = (size_t) syscall_no_intercept( + SYS_pread64, fd, (char *) (buf + len_read), + len_read_iter, offset); + } else { + LOG(0, "reading mmap_addr = %p, length = %lu, inode = %u", (char*)mmap_addr, extent_length, file->vinode->serialno); + MEMCPY((char *)buf, (char *)mmap_addr, extent_length); + perfmodel_add_delay(1, extent_length); + /* + syscall_no_intercept(SYS_pread64, fd, buf2, extent_length, offset); + if (strncmp((char*)(buf + len_read), buf2, extent_length) != 0) { + LOG(0, "%s", buf2); + LOG(0, "%s", (char*)(buf)); + LOG(0, "Reading wrong data: offset = %ld, length = %lu, addr = %p, fd = %ld, len_read = %lu", + offset, extent_length, (char*)mmap_addr, fd, len_read); + ASSERT(false); + } + */ + } + +loop_end: + len_read += extent_length; + len_to_read -= extent_length; + offset += (off_t)extent_length; + buf += extent_length; + } + + LOG(0, "read returns %lu", count); + +//syscall: + //count = syscall_no_intercept(SYS_pread64, fd, buf, count, offset); + return count; +} + + +/* + * pmemfile_preadv_args_check - checks some read arguments + * The arguments here can be examined while holding the mutex for the + * PMEMfile instance, while there is no need to hold the lock for the + * corresponding vinode instance. + */ +static ssize_t +splitfs_preadv_args_check(struct splitfs_file *file, + const struct iovec *iov, + int iovcnt) +{ + LOG(LDBG, "vinode %p iov %p iovcnt %d", file->vinode, iov, iovcnt); + + if (!(file->flags & PFILE_READ)) { + errno = EBADF; + return -1; + } + + if (iovcnt > 0 && iov == NULL) { + errno = EFAULT; + return -1; + } + + for (int i = 0; i < iovcnt; ++i) { + if (iov[i].iov_base == NULL) { + errno = EFAULT; + return -1; + } + } + + return 0; +} + +static ssize_t +splitfs_preadv_internal(long fd, + struct splitfs_file *file, + size_t offset, + const struct iovec *iov, + int iovcnt) +{ + LOG(0, "in splitfs_preadv_internal"); + ssize_t ret = 0; + + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + if ((ssize_t)((size_t)ret + len) < 0) + len = (size_t)(SSIZE_MAX - ret); + + ASSERT((ssize_t)((size_t)ret + len) >= 0); + + size_t bytes_read = vinode_read(fd, file, (off_t)offset, + iov[i].iov_base, len); + + ret += (ssize_t)bytes_read; + offset += bytes_read; + if (bytes_read != len) + break; + } + + return ret; +} + +/* + * pmemfile_readv_under_filelock - read from a file + * This function expects the PMEMfile instance to be locked while being called. + * Since the offset field is used to determine where to read from, and is also + * updated after a successful read operation, the PMEMfile instance can not be + * accessed by others while this is happening. + * + */ +static ssize_t +splitfs_readv_under_filelock(long fd, struct splitfs_file *file, + const struct iovec *iov, int iovcnt) +{ + ssize_t ret; + + ret = splitfs_preadv_args_check(file, iov, iovcnt); + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_preadv_internal(fd, + file, + file->offset, iov, iovcnt); + + + os_rwlock_unlock(&file->vinode->rwlock); + + if (ret > 0) { + file->offset += (size_t)ret; + } + + return ret; +} + + +ssize_t +splitfs_readv(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt) { + + LOG(0, "Called splitfs_readv()"); + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + pthread_mutex_lock(&file->mutex); + + ssize_t ret = + splitfs_readv_under_filelock(fd, file, iov, iovcnt); + + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_pread(long fd, struct splitfs_file *file, void *buf, size_t count, off_t offset) { + + struct iovec element = { .iov_base = buf, .iov_len = count }; + return splitfs_preadv(fd, file, &element, 1, offset); +} + +ssize_t +splitfs_preadv(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt, off_t offset) { + + LOG(0, "Called splitfs_preadv()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + if (offset < 0) { + errno = EINVAL; + return -1; + } + + ssize_t ret; + + pthread_mutex_lock(&file->mutex); + + ret = splitfs_preadv_args_check(file, iov, iovcnt); + + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&(file->vinode->rwlock)); + + ret = splitfs_preadv_internal(fd, file, (size_t)offset, iov, iovcnt); + + os_rwlock_unlock(&(file->vinode->rwlock)); + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_read(long fd, struct splitfs_file *file, void* buf, size_t count) { + + struct iovec element = { .iov_base = buf, .iov_len = count }; + return splitfs_readv(fd, file, &element, 1); +} diff --git a/splitfs_syscall_intercept/utils/src/relink.c b/splitfs_syscall_intercept/utils/src/relink.c new file mode 100644 index 0000000000..8a2722af96 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/relink.c @@ -0,0 +1,68 @@ +/* + * ===================================================================================== + * + * Filename: relink.c + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 07:34:28 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "splitfs-posix.h" +#include "utils.h" +#include "relink.h" +#include "table_mmaps.h" +#include "out.h" + +void +perform_relink(long fd2, off_t offset2, + struct splitfs_vinode *inode, + size_t count) { + + if (!inode) + FATAL("inode is NULL"); + if (!inode->staging) + FATAL("staging is NULL"); + + struct sfile_description *staging = inode->staging; + + long fd1 = staging->fd; + off_t offset1 = staging->valid_offset; + const char *start_addr = (const char *)staging->start_addr; + + if (!start_addr) + FATAL("start_addr is NULL"); + + /* perform the relink */ + long ret = (long) syscall_no_intercept(335, fd2, + fd1, offset2, offset1, + start_addr, count); + + //long ret = syscall_no_intercept(SYS_pwrite64, fd2, (char *) (start_addr + offset1), count, offset2); + + if (ret < 0) + FATAL("ret is less than 0"); + if (!inode->tbl_mmap) + FATAL("tbl_mmap is null"); + + LOG(0, "will insert into table mmap"); + /* Add entry to tbl_mmap */ + splitfs_insert_tbl_entry(inode->tbl_mmap, offset2, + offset1, count, (unsigned long)staging->start_addr + (unsigned long)offset1); + + /* page align the valid_offset of the staging file */ + staging->valid_offset = offset1 + (off_t)count; + align_valid_offset(staging, PAGE_SIZE); + + /* give away the staging file from file2 to global pool */ + splitfs_add_to_staging_pool(staging); +} diff --git a/splitfs_syscall_intercept/utils/src/relink.h b/splitfs_syscall_intercept/utils/src/relink.h new file mode 100644 index 0000000000..08b262cb95 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/relink.h @@ -0,0 +1,32 @@ +/* + * ===================================================================================== + * + * Filename: relink.h + * + * Description: + * + * Version: 1.0 + * Created: 08/05/2019 10:07:20 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_RELINK_H +#define SPLITFS_RELINK_H + +#include "file.h" +#include "sys_util.h" +#include "inode.h" +#include "staging.h" +#include + +void perform_relink(long fd2, off_t offset2, + struct splitfs_vinode *inode, + size_t count); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/splitfs-posix.c b/splitfs_syscall_intercept/utils/src/splitfs-posix.c new file mode 100644 index 0000000000..b7152153de --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/splitfs-posix.c @@ -0,0 +1,132 @@ + +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * pmemfile-posix.c -- library constructor / destructor + */ + +#define _GNU_SOURCE + +#include +#include + +#include "compiler_utils.h" +#include "file.h" +#include "hash_map.h" +#include "staging.h" +#include "staging_thread.h" +#include "splitfs-posix.h" +#include "sys_util.h" +#include "out.h" +#include "intel_intrin.h" +#include "execv.h" + +#define SPLITFS_POSIX_LOG_PREFIX "splitfs-posix" +#define SPLITFS_POSIX_LOG_LEVEL_VAR "SPLITFS_POSIX_LOG_LEVEL" +#define SPLITFS_POSIX_LOG_FILE_VAR "SPLITFS_POSIX_LOG_FILE" + +struct hash_map *file_inode_map = NULL; +struct hash_map *global_mmap_cache = NULL; +struct hash_map *tbl_mmap_cache = NULL; +pthread_mutex_t mmap_cache_mutex; +pthread_mutex_t tbl_mmap_mutex; +bool exit_staging_thread = false; + +/* + * splitfs_posix_init -- load-time initialization for splitfs-posix + * + * Called automatically by the run-time loader. + */ +splitfs_constructor void +splitfs_posix_init(void) +{ + + out_init(SPLITFS_POSIX_LOG_PREFIX, SPLITFS_POSIX_LOG_LEVEL_VAR, + SPLITFS_POSIX_LOG_FILE_VAR); + LOG(LDBG, NULL); + LOG(0, "constructor invoked"); + + /* Write splitfs init stuff here */ + + /* Point _mm_flush to the right instruction based on availability of + clflushopt cpu instruction */ + splitfs_init_mm_flush(); + + /* Create splitfs_file table */ + splitfs_file_table_init(); + + /* Create splitfs_vinode table */ + splitfs_inode_free_list_init(); + + /* Create file to inode mapping */ + file_inode_map = hash_map_alloc(); + + /* Create global mmap cache */ + global_mmap_cache = hash_map_alloc(); + pthread_mutex_init(&mmap_cache_mutex, NULL); + + /* Create table_mmaps for appends */ + tbl_mmap_cache = hash_map_alloc(); + pthread_mutex_init(&tbl_mmap_mutex, NULL); + + /* Create files for appends */ + splitfs_spool_init(); + + /* Start staging thread */ + splitfs_start_thread(); + + /* Restore FDs after exec */ + splitfs_restore_fd_if_exec(); +} + +/* + * libpmemfile_posix_fini -- libpmemfile-posix cleanup routine + * + * Called automatically when the process terminates. + */ +splitfs_destructor void +splitfs_posix_fini(void) +{ + LOG(LDBG, NULL); + exit_staging_thread = true; + out_fini(); +} + +/* + * pmemfile_errormsg -- return last error message + */ +const char * +splitfs_errormsg(void) +{ + return out_get_errormsg(); +} diff --git a/splitfs_syscall_intercept/utils/src/staging.c b/splitfs_syscall_intercept/utils/src/staging.c new file mode 100644 index 0000000000..f00d795e8d --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/staging.c @@ -0,0 +1,244 @@ +/* + * ===================================================================================== + * + * Filename: staging.c + * + * Description: + * + * Version: 1.0 + * Created: 08/04/2019 10:29:30 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "constants.h" +#include "sys_util.h" +#include "file.h" +#include "staging.h" +#include "add_delay.h" +#include "out.h" + +#define STAGING_FILE_TEMPLATE "/mnt/pmem_emul/Staging-XXXXXX" + +static struct sfile_description *free_spool_slots[OPEN_MAX]; +static unsigned free_slot_count; +static pthread_mutex_t free_spool_slot_mutex = PTHREAD_MUTEX_INITIALIZER; +// static int staging_counter; + +static void get_staging_filename(char *filename) { + filename[sprintf(filename, "%s", STAGING_FILE_TEMPLATE)] = '\0'; + mktemp(filename); + filename[strlen(filename)] = '\0'; +} + +static void +create_staging_file(struct sfile_description *entry) { + + long fd = 0; + struct stat sbuf; + long ret = 0; + char filename[256]; + + if (!entry) + FATAL("entry is false"); + + // staging_counter++; + + get_staging_filename(filename); + + fd = syscall_no_intercept(SYS_open, filename, O_RDWR | O_CREAT, 0666); + if (fd < 0) { + FATAL("creating of staging file failed\n"); + } + + ret = syscall_no_intercept(SYS_fallocate, (int)fd, 0, 0, STAGING_FILE_SIZE); + if (ret < 0) { + FATAL("posix_fallocate failed\n"); + } + + ret = syscall_no_intercept(SYS_stat, filename, &sbuf); + if (ret != 0) { + FATAL("stat failed\n"); + } + + entry->fd = fd; + entry->ino = (uint32_t)sbuf.st_ino; +} + +static void +map_staging_file(struct sfile_description *entry) { + + if (!entry) + FATAL("entry is null"); + + char *prefault_buf; + + prefault_buf = calloc(1, (2*1024*1024)); + + entry->start_addr = mmap(NULL, + STAGING_FILE_SIZE, + PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_POPULATE, + (int)entry->fd, + 0); + + if (entry->start_addr == NULL) { + FATAL("mmap failed\n"); + } + + for (unsigned i = 0; i < (STAGING_FILE_SIZE) / (2*1024*1024); i++) { + memcpy((char*)entry->start_addr + (i*2*1024*1024), + prefault_buf, + (2*1024*1024)); + perfmodel_add_delay(0, (2*1024*1024)); + } + + entry->valid_offset = 0; + entry->start_offset = 0; + entry->end_offset = 0; + + free(prefault_buf); +} + +static struct sfile_description * +fetch_free_spool_slot(void) { + + struct sfile_description *entry; + + util_mutex_lock(&free_spool_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_spool_slots[--free_slot_count]; + + util_mutex_unlock(&free_spool_slot_mutex); + + return entry; +} + + +static void +mark_as_free_file_slot(struct sfile_description *entry) { + + util_mutex_lock(&free_spool_slot_mutex); + + free_spool_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_spool_slot_mutex); +} + +static void +setup_free_slots(void) { + + static struct sfile_description store[NUM_STAGING_FILES]; + for (unsigned i = 0; i < NUM_STAGING_FILES; i++) { + create_staging_file(&store[i]); + map_staging_file(&store[i]); + mark_as_free_file_slot(store + i); + } +} + +void +splitfs_add_to_staging_pool(struct sfile_description *staging) { + + if (staging) { + mark_as_free_file_slot(staging); + } +} + +long +splitfs_staging_file_assign(struct splitfs_file *file) { + + if (!file) + FATAL("file is null"); + + struct sfile_description *entry = fetch_free_spool_slot(); + if (entry == NULL) + return -1; + + file->vinode->staging = entry; + + return 0; +} + +void +align_valid_offset(struct sfile_description *staging, off_t alignment) { + + //ASSERT(staging); + if (!staging) + FATAL("staging is null"); + + off_t staging_alignment = staging->valid_offset % PAGE_SIZE; + off_t desired_alignment = alignment % PAGE_SIZE; + off_t diff_align = 0; + + LOG(0, "desired_alignment = %lu, staging alignment = %lu", desired_alignment, staging_alignment); + + if (staging_alignment < desired_alignment) { + diff_align = desired_alignment - staging_alignment; + staging->valid_offset += diff_align; + } else { + diff_align = PAGE_SIZE - staging_alignment; + diff_align += desired_alignment; + staging->valid_offset += diff_align; + } + + staging_alignment = staging->valid_offset % PAGE_SIZE; + //ASSERT(staging_alignment == desired_alignment); + if (staging_alignment != desired_alignment) + FATAL("Alignment is not correct"); +} + +void +get_staging_file(struct splitfs_file *file) { + + if (file->vinode->length != file->vinode->sync_length) + FATAL("Length mismatch"); + + long ret = splitfs_staging_file_assign(file); + off_t alignment = (off_t)file->vinode->sync_length; + + if (ret != 0) { + file->vinode->staging = (struct sfile_description *) malloc(sizeof(struct sfile_description)); + create_staging_file(file->vinode->staging); + map_staging_file(file->vinode->staging); + } + align_valid_offset(file->vinode->staging, alignment); +} + +void +create_and_add_staging_files(int num_files) { + + struct sfile_description *new_store[num_files]; + + for (int i = 0; i < num_files; i++) { + new_store[i] = malloc(sizeof(struct sfile_description)); + create_staging_file(new_store[i]); + map_staging_file(new_store[i]); + mark_as_free_file_slot(new_store[i]); + } +} + +void +splitfs_spool_init(void) { + + setup_free_slots(); +} diff --git a/splitfs_syscall_intercept/utils/src/staging.h b/splitfs_syscall_intercept/utils/src/staging.h new file mode 100644 index 0000000000..cb73e19dae --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/staging.h @@ -0,0 +1,43 @@ +/* + * ===================================================================================== + * + * Filename: staging.h + * + * Description: + * + * Version: 1.0 + * Created: 08/04/2019 11:52:12 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_STAGING_H +#define SPLITFS_STAGING_H + +#include "file.h" + +#define NUM_STAGING_FILES 10 +#define STAGING_FILE_SIZE (160*1024*1024) + +struct sfile_description { + long fd; + void *start_addr; + uint32_t ino; + off_t valid_offset; + off_t start_offset; + off_t end_offset; +}; + +long splitfs_staging_file_assign(struct splitfs_file *file); +void splitfs_add_to_staging_pool(struct sfile_description *staging); +void align_valid_offset(struct sfile_description *staging, off_t alignment); +void get_staging_file(struct splitfs_file *file); +void splitfs_spool_init(void); +void create_and_add_staging_files(int num_files); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/staging_thread.c b/splitfs_syscall_intercept/utils/src/staging_thread.c new file mode 100644 index 0000000000..fced90d007 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/staging_thread.c @@ -0,0 +1,90 @@ +/* + * ===================================================================================== + * + * Filename: staging_thread.c + * + * Description: + * + * Version: 1.0 + * Created: 08/07/2019 11:19:23 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#include "staging_thread.h" + +static pthread_t cleaning_thread; +static pthread_cond_t cleaning_signal; +static pthread_mutex_t thread_mutex; + +static bool thread_running; +static bool thread_started; +static bool wait_for_signal; + +static void add_staging_files() { + int num_staging_files = 1; + create_and_add_staging_files(num_staging_files); + thread_running = false; +} + +static void *thread_wrapper() { + start: + pthread_mutex_lock(&thread_mutex); + wait_for_signal = true; + while(!thread_running) { + pthread_cond_wait(&cleaning_signal, &thread_mutex); + } + wait_for_signal = false; + pthread_mutex_unlock(&thread_mutex); + add_staging_files(); + if(!exit_staging_thread) + goto start; + thread_started = false; + return NULL; +} + +static void activate_thread() { + pthread_mutex_lock(&thread_mutex); + thread_running = true; + pthread_cond_signal(&cleaning_signal); + pthread_mutex_unlock(&thread_mutex); +} + +static void thread_init() { + pthread_cond_init(&cleaning_signal, NULL); + pthread_mutex_init(&thread_mutex, NULL); +} + +void splitfs_start_thread() { + if (!thread_started) { + thread_started = true; + thread_init(); + pthread_create(&cleaning_thread, NULL, &thread_wrapper, NULL); + } +} + +void splitfs_thread_wait() { + if(thread_started) { + pthread_join(cleaning_thread, NULL); + } +} + +void splitfs_exit_thread() { + if(thread_started) { + pthread_cancel(cleaning_thread); + pthread_testcancel(); + } +} + + +void splitfs_call_thread() { + if(thread_running) + return; + + activate_thread(); +} diff --git a/splitfs_syscall_intercept/utils/src/staging_thread.h b/splitfs_syscall_intercept/utils/src/staging_thread.h new file mode 100644 index 0000000000..f922d29b65 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/staging_thread.h @@ -0,0 +1,18 @@ +#ifndef SPLITFS_BG_STAGING_H +#define SPLITFS_BG_STAGING_H + +#include +#include +#include +#include +#include +#include "staging.h" + +extern bool exit_staging_thread; + +void splitfs_start_thread(void); +void splitfs_thread_wait(void); +void splitfs_exit_thread(void); +void splitfs_call_thread(void); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/stat.c b/splitfs_syscall_intercept/utils/src/stat.c new file mode 100644 index 0000000000..51af7ec620 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/stat.c @@ -0,0 +1,110 @@ +/* + * ===================================================================================== + * + * Filename: stat.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:51:54 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "file.h" +#include "inode.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "out.h" + +static void +_splitfs_vinode_stat(struct splitfs_vinode *inode, struct stat *buf) { + + LOG(0, "inode->size = %lu, buf size = %lu, serialno = %u\n", + inode_get_uncommitted_size(inode), buf->st_size, inode->serialno); + buf->st_size = (off_t) inode_get_uncommitted_size(inode); +} + +static int +_splitfs_fstatat(const char *path, struct stat *buf, int flags) { + + LOG(LDBG, "path %s", path); + + int ret = (int) syscall_no_intercept(SYS_stat, path, buf); + if (ret != 0) + return ret; + + struct splitfs_vinode *inode = splitfs_map_vinode_check((uint32_t) buf->st_ino); + + if (inode) + _splitfs_vinode_stat(inode, buf); + + return ret; +} + +int +splitfs_fstatat(const char* path, struct stat *buf, int flags) { + + LOG(0, "Called splitfs_fstatat()"); + + if (!path) { + errno = EFAULT; + return -1; + } + + if (path[0] != '/') { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + int ret = _splitfs_fstatat(path, buf, flags); + + return ret; +} + +int +splitfs_fstat(long fd, struct splitfs_file *file, struct stat *buf) { + + + if (!file) { + errno = EFAULT; + return -1; + } + + int ret = (int) syscall_no_intercept(SYS_stat, fd, buf); + LOG(0, "Called splitfs_fstat(). fd = %ld, sbuf size = %lu", fd, buf->st_size); + + if (file->vinode) + _splitfs_vinode_stat(file->vinode, buf); + + if (ret) { + errno = ret; + return -1; + } + + return 0; +} + +int +splitfs_lstat(const char* path, struct stat* buf) { + + LOG(0, "Called splitfs_lstat()"); + return splitfs_fstatat(path, buf, 0); +} + +int +splitfs_stat(const char *path, struct stat *buf) { + + LOG(LDBG, "Called splitfs_stat()"); + return splitfs_fstatat(path, buf, 0); +} diff --git a/splitfs_syscall_intercept/utils/src/sys_util.h b/splitfs_syscall_intercept/utils/src/sys_util.h new file mode 100644 index 0000000000..bcaf942c75 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/sys_util.h @@ -0,0 +1,199 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * sys_util.h -- internal utility wrappers around system functions + */ + +#ifndef SPLITFS_SYS_UTIL_H +#define SPLITFS_SYS_UTIL_H 1 + +#include +#include +#include + +#include "libsyscall_intercept_hook_point.h" +#include "compiler_utils.h" + +#define SPLITFS_PRELOAD_EXIT_NOT_SUPPORTED 95 +#define SPLITFS_PRELOAD_EXIT_TOO_MANY_FDS 96 +#define SPLITFS_PRELOAD_EXIT_GETCWD_FAILED 97 +#define SPLITFS_PRELOAD_EXIT_CWD_STAT_FAILED 98 +#define SPLITFS_PRELOAD_EXIT_POOL_OPEN_FAILED 99 +#define SPLITFS_PRELOAD_EXIT_CONFIG_ERROR 100 +#define SPLITFS_PRELOAD_EXIT_FATAL_CONDITION 128 + 6 + +void +exit_with_msg(int ret, const char *msg); + +static inline void +FATAL(const char *str) +{ + exit_with_msg(SPLITFS_PRELOAD_EXIT_FATAL_CONDITION, str); +} + +/* + * util_mutex_init -- pthread_mutex_init variant that never fails from + * caller perspective. If pthread_mutex_init failed, this function aborts + * the program. + */ +static inline void +util_mutex_init(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_init(m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_init"); + } +} + +/* + * util_mutex_destroy -- pthread_mutex_destroy variant that never fails from + * caller perspective. If pthread_mutex_destroy failed, this function aborts + * the program. + */ +static inline void +util_mutex_destroy(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_destroy(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_destroy"); + } +} + +/* + * util_mutex_lock -- pthread_mutex_lock variant that never fails from + * caller perspective. If pthread_mutex_lock failed, this function aborts + * the program. + */ +static inline void +util_mutex_lock(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_lock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_lock"); + } +} + +/* + * util_mutex_unlock -- pthread_mutex_unlock variant that never fails from + * caller perspective. If pthread_mutex_unlock failed, this function aborts + * the program. + */ +static inline void +util_mutex_unlock(pthread_mutex_t *m) +{ + int tmp = pthread_mutex_unlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_mutex_unlock"); + } +} + +/* + * util_rwlock_init -- pthread_rwlock_init variant that never fails from + * caller perspective. If pthread_rwlock_init failed, this function aborts + * the program. + */ +static inline void +util_rwlock_init(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_init(m, NULL); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_init"); + } +} + +/* + * util_rwlock_rdlock -- pthread_rwlock_rdlock variant that never fails from + * caller perspective. If pthread_rwlock_rdlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_rdlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_rdlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_rdlock"); + } +} + +/* + * util_rwlock_wrlock -- pthread_rwlock_wrlock variant that never fails from + * caller perspective. If pthread_rwlock_wrlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_wrlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_wrlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_wrlock"); + } +} + +/* + * util_rwlock_unlock -- pthread_rwlock_unlock variant that never fails from + * caller perspective. If pthread_rwlock_unlock failed, this function aborts + * the program. + */ +static inline void +util_rwlock_unlock(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_unlock(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_unlock"); + } +} + +/* + * util_rwlock_destroy -- pthread_rwlock_destroy variant that never fails from + * caller perspective. If pthread_rwlock_destroy failed, this function aborts + * the program. + */ +static inline void +util_rwlock_destroy(pthread_rwlock_t *m) +{ + int tmp = pthread_rwlock_destroy(m); + if (tmp) { + errno = tmp; + FATAL("!pthread_rwlock_destroy"); + } +} + +#endif diff --git a/splitfs_syscall_intercept/utils/src/syscall_early_filter.c b/splitfs_syscall_intercept/utils/src/syscall_early_filter.c new file mode 100644 index 0000000000..3f1f98a5f3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/syscall_early_filter.c @@ -0,0 +1,217 @@ +/* + * Copyright 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * syscall_early_filter.c -- the table of early filter flags, and + * function(s) to access the table. + * + * For explanations, see syscall_early_filter.h + */ + +#include "syscall_early_filter.h" + +#include +#include "sys_util.h" + +static struct syscall_early_filter_entry filter_table[] = { + [SYS_close] = { + .must_handle = true, + }, + [SYS_creat] = { + .must_handle = true, + }, + [SYS_fallocate] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fcntl] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fdatasync] = { + .must_handle = true, + .fd_first_arg = true, + .returns_zero = true, + }, + [SYS_fstat] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fstatfs] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_fsync] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_ftruncate] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_linkat] = { + .must_handle = true, + }, + [SYS_link] = { + .must_handle = true, + }, + [SYS_lseek] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_lstat] = { + .must_handle = true, + }, + [SYS_mkdirat] = { + .must_handle = false, + }, + [SYS_mkdir] = { + .must_handle = false, + }, + [SYS_mknod] = { + .must_handle = true, + }, + [SYS_mknodat] = { + .must_handle = true, + }, + [SYS_newfstatat] = { + .must_handle = true, + }, + [SYS_openat] = { + .must_handle = true, + }, + [SYS_open] = { + .must_handle = true, + }, + [SYS_pread64] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_preadv] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_pwrite64] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_pwritev] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_read] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_readv] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_renameat2] = { + .must_handle = true, + }, + [SYS_renameat] = { + .must_handle = true, + }, + [SYS_rename] = { + .must_handle = true, + }, + [SYS_stat] = { + .must_handle = true, + }, + [SYS_statfs] = { + .must_handle = true, + }, + [SYS_symlinkat] = { + .must_handle = true, + }, + [SYS_symlink] = { + .must_handle = true, + }, + [SYS_syncfs] = { + .must_handle = true, + .fd_first_arg = true, + .returns_zero = true, + }, + [SYS_truncate] = { + .must_handle = true, + }, + [SYS_unlinkat] = { + .must_handle = true, + }, + [SYS_unlink] = { + .must_handle = true, + }, + [SYS_write] = { + .must_handle = true, + .fd_first_arg = true, + }, + [SYS_writev] = { + .must_handle = true, + .fd_first_arg = true, + }, + + /* Syscalls not handled yet */ + [SYS_dup2] = { + .must_handle = true, + }, + [SYS_dup3] = { + .must_handle = true, + }, + [SYS_dup] = { + .must_handle = true, + }, + [SYS_execveat] = { + .must_handle = true, + }, + [SYS_execve] = { + .must_handle = true, + }, + [SYS_mmap] = { + .must_handle = true, + }, + [SYS_readahead] = { + .must_handle = true, + .fd_first_arg = true, + .returns_ENOTSUP = true, + }, +}; + +struct syscall_early_filter_entry +get_early_filter_entry(long syscall_number) +{ + if (syscall_number < 0 || + (size_t)syscall_number >= ARRAY_SIZE(filter_table)) + return (struct syscall_early_filter_entry) {false, }; + + return filter_table[syscall_number]; +} diff --git a/splitfs_syscall_intercept/utils/src/syscall_early_filter.h b/splitfs_syscall_intercept/utils/src/syscall_early_filter.h new file mode 100644 index 0000000000..f584b75dcb --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/syscall_early_filter.h @@ -0,0 +1,122 @@ +/* + * Copyright 2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_SRC_SYSCALL_EARLY_FILTER_H +#define SPLITFS_SRC_SYSCALL_EARLY_FILTER_H + +#include +#include + +/* + * Some flags controlling syscall handling at a high level. + * These flags are contained in a table, provide information that + * depend on the syscall number of syscall to be handled, and can be used before + * parsing any arguments of a syscall (thus called "early"). + * The most important aspect to remember is: "before parsing any arguments of + * a syscall". Which really just means "syscall specific parsing...", i.e. + * parsing that is specific to a single syscall. + * In practice, some of these flags are applicable to any syscall, and some + * are only applicable to some of them. + * These flags should not be used for anything that is specific to a single + * syscall. + * + * As of this writing, this is only used in the preload.c source file. + * Please see the function called hook in preload.c + */ +struct syscall_early_filter_entry { + /* Might this be pmemfile related, or can this syscall be ignored? */ + bool must_handle; + + /* + * The fd_first_arg flag marks syscalls, which accept a file descriptor + * as their first argument. This allows libpmemfile to easily isolate + * the process of checking the first argument, and making a decision + * based on that fd being associated with pmemfile-posix or not. + * This is used to fetch pmemfile pointer and pass it to syscall + * instead of fd. One exception is close which must get fd so flag + * is not set for that syscall. + * Some obvious examples: read, write, fstat, etc... + * + * But: + * Only those which operate on the file specified by this fd. The *_at + * syscalls usually also accept an fd as a first argument, but those + * directory references must be processed in a different way. + * For example the first argument of openat is an fd, but it does not + * refer to a file that is potentially handled using libpmemfile-posix. + * Instead, the decision (to forward to libpmemfile-posix or to the + * kernel) is made after fully resolving the path. + */ + bool fd_first_arg; + + /* + * The returns_zero flag marks syscalls which operate on a file + * descriptor, and just return zero whenever that fd is associated + * with a pmemfile-posix handled file. This allows an easy + * implementation of some effectively NOP syscalls, e.g.: + * The syncfs syscall can always be considered successful when + * called with an fd referring to a pmemfile resident file -- thus + * libpmemfile can return zero (indicating success), without parsing + * any of the syscall arguments. + * + * Important: this only has meaning once it is known, that the syscall + * attempts to operate on a pmemfile handled file (kernel handled file + * descriptors of course should be forwarded to the kernel). Thus, + * it is not strictly true, that it allows libpmemfile to make a + * decision before parsing any of the arguments. + * Still, this logic can be shared between multiple syscalls, thus + * it can still be considered "early" filtering -- filtering before + * parsing the other arguments specific to the syscall. + * + * This implies, that returns_zero can only be set when the + * fd_first_arg flag is also set (this covers common cases, where + * the first argument is an fd, and zero can be returned). + */ + bool returns_zero; + + /* + * The idea behind the returns_ENOTSUP flag is the exactly the same + * as in the case of the returns_zero flag (except for the return + * value). E.g. as long as writev is not implemented for pmemfile + * handled files, the libpmemfile library can return ENOTSUP for a + * writev syscalls. + */ + bool returns_ENOTSUP; +}; + +/* + * get_early_filter_entry -- returns a filter entry with flags corresponding + * to the syscall number. When called with an invalid syscall number (e.g. -1), + * all returned flags are set to false. + */ +struct syscall_early_filter_entry get_early_filter_entry(long syscall_number); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/table_mmaps.c b/splitfs_syscall_intercept/utils/src/table_mmaps.c new file mode 100644 index 0000000000..0c31b969d6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/table_mmaps.c @@ -0,0 +1,162 @@ +/* + * ===================================================================================== + * + * Filename: table_mmaps.c + * + * Description: + * + * Version: 1.0 + * Created: 08/09/2019 01:18:44 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include "table_mmaps.h" +#include + +struct table_entry { + long fd_start_offset; + long fd_end_offset; + long st_start_offset; + long st_end_offset; + unsigned long buf_start; +}; + +struct table_mmap { + struct table_entry *mmaps; + int tbl_mmap_idx; +}; + +static int find_idx_to_read(off_t start_offset, + struct table_mmap *tbl) +{ + int idx_bin = 0; + int left = 0, right = tbl->tbl_mmap_idx - 1; + int mid = (right + left) / 2; + + if (right < left) { + return -1; + } + + if (mid < 0) + ASSERT(false); + if (left < 0) + ASSERT(false); + if (right < 0) + ASSERT(false); + + while (left <= right) { + mid = (right + left) / 2; + + if (tbl->mmaps[mid].fd_end_offset < start_offset) { + left = mid + 1; + continue; + } + + if (tbl->mmaps[mid].fd_end_offset >= start_offset && + tbl->mmaps[mid].fd_start_offset <= start_offset) { + idx_bin = mid; + goto out; + } + + if (tbl->mmaps[mid].fd_end_offset >= start_offset && + tbl->mmaps[mid].fd_start_offset > start_offset) { + right = mid - 1; + continue; + } + } + + idx_bin = -1; + + out: + return idx_bin; +} + +void splitfs_insert_tbl_entry(struct table_mmap *tbl, off_t fd_start_offset, + off_t st_start_offset, size_t length, unsigned long buf_start) { + + off_t st_prev_start = 0, st_prev_end = 0, fd_prev_end = 0, fd_end_offset = 0, st_end_offset = 0; + size_t prev_size; + unsigned long prev_buf_start = 0, prev_buf_end = 0; + int max_idx = 0; + + fd_end_offset = fd_start_offset + (off_t)length - 1; + st_end_offset = st_start_offset + (off_t)length - 1; + + LOG(0, "Doing insert entry. tbl_mmap_idx = %d", tbl->tbl_mmap_idx); + max_idx = tbl->tbl_mmap_idx; + if (max_idx == 0) + goto add_entry; + + st_prev_start = tbl->mmaps[max_idx-1].st_start_offset; + st_prev_end = tbl->mmaps[max_idx-1].st_end_offset; + fd_prev_end = tbl->mmaps[max_idx-1].fd_end_offset; + prev_buf_start = tbl->mmaps[max_idx-1].buf_start; + prev_size = (size_t)st_prev_end - (size_t)st_prev_start + 1; + prev_buf_end = (unsigned long) (prev_buf_start + prev_size - 1); + + if ((buf_start == prev_buf_end + 1) && + (fd_start_offset == fd_prev_end + 1)) { + tbl->mmaps[max_idx-1].fd_end_offset = fd_end_offset; + tbl->mmaps[max_idx-1].st_end_offset = st_end_offset; + return; + } + +add_entry: + tbl->mmaps[max_idx].fd_start_offset = fd_start_offset; + tbl->mmaps[max_idx].st_start_offset = st_start_offset; + tbl->mmaps[max_idx].fd_end_offset = fd_end_offset; + tbl->mmaps[max_idx].st_end_offset = st_end_offset; + tbl->mmaps[max_idx].buf_start = buf_start; + LOG(0, "inserted at idx = %d, buf_start = %p, fd_start = %ld, st_start = %ld, count = %lu", + max_idx, (void*)buf_start, fd_start_offset, st_start_offset, length); + tbl->tbl_mmap_idx++; +} + +void *splitfs_get_tbl_entry(struct table_mmap *tbl, off_t start_offset, size_t *extent_length) { + + void *mmap_addr = NULL; + *extent_length = 0; + int idx = 0; + + idx = find_idx_to_read(start_offset, tbl); + + LOG(0, "find_idx_to_read returned id = %d", idx); + if (idx != -1) { + off_t start_off_diff = start_offset - tbl->mmaps[idx].fd_start_offset; + off_t tbl_entry_start_off = tbl->mmaps[idx].st_start_offset + start_off_diff; + size_t tbl_entry_len = (size_t)tbl->mmaps[idx].st_end_offset - (size_t)tbl_entry_start_off + 1; + *extent_length = tbl_entry_len; + mmap_addr = (void *) ((unsigned long)tbl->mmaps[idx].buf_start + (unsigned long)start_off_diff); + LOG(0, "tbl_entry_len = %lu, st_end_offset = %ld, tbl_entry_start_offset = %ld, tbl entry file start off = %ld, tbl entry file end off = %ld", tbl_entry_len, + tbl->mmaps[idx].st_end_offset, tbl_entry_start_off, tbl->mmaps[idx].fd_start_offset, tbl->mmaps[idx].fd_end_offset); + } + + LOG(0, "returning mmap_addr = %p, extent_length = %lu", mmap_addr, *extent_length); + + return mmap_addr; +} + +struct table_mmap *splitfs_alloc_tbl() { + + struct table_mmap *entry = NULL; + entry = (struct table_mmap *) calloc(1, sizeof(struct table_mmap)); + entry->mmaps = (struct table_entry *) calloc(PER_NODE_MMAPS, sizeof(struct table_entry)); + entry->tbl_mmap_idx = 0; + return entry; +} + +void splitfs_clear_tbl_mmaps(struct table_mmap *tbl) { + + for (long idx = 0; idx < tbl->tbl_mmap_idx; idx++) { + size_t count = (size_t) (tbl->mmaps[idx].fd_end_offset - tbl->mmaps[idx].fd_start_offset + 1); + munmap((char *)(tbl->mmaps[idx].buf_start), count); + } + tbl->tbl_mmap_idx = 0; +} diff --git a/splitfs_syscall_intercept/utils/src/table_mmaps.h b/splitfs_syscall_intercept/utils/src/table_mmaps.h new file mode 100644 index 0000000000..2ae964f062 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/table_mmaps.h @@ -0,0 +1,32 @@ +/* + * ===================================================================================== + * + * Filename: table_mmaps.h + * + * Description: + * + * Version: 1.0 + * Created: 08/09/2019 03:01:44 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_TBL_MMAPS_H +#define SPLITFS_TBL_MMAPS_H + +#include "handle_mmaps.h" + +struct table_mmap; + +void *splitfs_get_tbl_entry(struct table_mmap *tbl, off_t start_offset, size_t *extent_length); +void splitfs_insert_tbl_entry(struct table_mmap *tbl, off_t fd_start_offset, + off_t st_start_offset, size_t length, unsigned long buf_start); +struct table_mmap *splitfs_alloc_tbl(void); +void splitfs_clear_tbl_mmaps(struct table_mmap *tbl); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/truncate.c b/splitfs_syscall_intercept/utils/src/truncate.c new file mode 100644 index 0000000000..bac4b1f059 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/truncate.c @@ -0,0 +1,116 @@ +/* + * ===================================================================================== + * + * Filename: truncate.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 07:20:46 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "truncate.h" + +long +splitfs_truncate_vinode(struct splitfs_vinode *inode, off_t length) { + + bool remove_mmap = false; + inode_set_uncommitted_size(inode, (size_t)length); + inode_set_sync_size(inode, (size_t)length); + inode_set_large_file_status(inode, false); + clear_mmaps_from_ino(inode->serialno, remove_mmap); + + return 0; +} + +static long +_splitfs_truncate(const char *path, off_t length) { + + struct stat sbuf; + long ret = 0; + + ret = stat(path, &sbuf); + if (ret != 0) { + errno = EINVAL; + return -1; + } + + uint32_t serialno = (uint32_t) sbuf.st_ino; + + struct splitfs_vinode *inode = splitfs_map_vinode_check(serialno); + + if (inode == NULL) { + bool remove_mmap = false; + clear_mmaps_from_ino(serialno, remove_mmap); + ret = syscall_no_intercept(SYS_truncate, path, length); + return ret; + } + + os_rwlock_wrlock(&inode->rwlock); + splitfs_truncate_vinode(inode, length); + ret = syscall_no_intercept(SYS_truncate, path, length); + os_rwlock_unlock(&inode->rwlock); + + return ret; +} + +long +splitfs_truncate(const char* path, off_t length) { + + LOG(0, "Called splitfs_truncate()"); + long error = 0; + + if (!path) { + LOG(LUSR, "NULL path"); + errno = EFAULT; + return -1; + } + + if (length < 0) { + errno = EINVAL; + return -1; + } + + if (error != 0) + return error; + + error = _splitfs_truncate(path, length); + + return error; +} + +long +splitfs_ftruncate(long fd, struct splitfs_file *file, off_t length) { + + LOG(0, "Called splitfs_ftruncate()"); + + long ret = 0; + + util_mutex_lock(&file->mutex); + struct splitfs_vinode *inode = file->vinode; + util_mutex_unlock(&file->mutex); + + if (!inode) { + ret = syscall_no_intercept(SYS_ftruncate, fd, length); + return ret; + } + + + os_rwlock_wrlock(&inode->rwlock); + ret = splitfs_truncate_vinode(inode, length); + ret = syscall_no_intercept(SYS_ftruncate, fd, length); + os_rwlock_unlock(&inode->rwlock); + + return ret; +} diff --git a/splitfs_syscall_intercept/utils/src/truncate.h b/splitfs_syscall_intercept/utils/src/truncate.h new file mode 100644 index 0000000000..0595efa258 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/truncate.h @@ -0,0 +1,30 @@ +/* + * ===================================================================================== + * + * Filename: truncate.h + * + * Description: + * + * Version: 1.0 + * Created: 08/06/2019 04:19:30 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ + +#ifndef SPLITFS_TRUNCATE_H +#define SPLITFS_TRUNCATE_H + +#include "utils.h" +#include "handle_mmaps.h" +#include "inode.h" +#include "splitfs-posix.h" +#include "out.h" + +long splitfs_truncate_vinode(struct splitfs_vinode *inode, off_t length); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/unlink.c b/splitfs_syscall_intercept/utils/src/unlink.c new file mode 100644 index 0000000000..a8920c0ee3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/unlink.c @@ -0,0 +1,90 @@ +/* + * ===================================================================================== + * + * Filename: unlink.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:41:17 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include + +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "hash_map.h" +#include "out.h" + +static int +_splitfs_unlinkat(const char *pathname) { + + struct stat sbuf; + int ret = 0; + + ret = (int)syscall_no_intercept(SYS_lstat, pathname, &sbuf); + if (ret != 0) { + return ret; + } + + uint32_t serialno = (uint32_t) sbuf.st_ino; + bool remove_mmap = true; + LOG(0, "Called splitfs_unlinkat(). path = %s. inode = %u", pathname, serialno); + + LOG(0, "clearing mmaps"); + ret = (int) clear_mmaps_from_ino(serialno, remove_mmap); + + LOG(0, "clearing tbl mmaps"); + util_mutex_lock(&tbl_mmap_mutex); + void *tbl_mmaps = hash_map_get(tbl_mmap_cache, serialno); + if (tbl_mmaps) { + hash_map_remove(tbl_mmap_cache, serialno, tbl_mmaps); + } + util_mutex_unlock(&tbl_mmap_mutex); + + return ret; +} + +int splitfs_unlinkat(const char *pathname, long flags) { + + + int ret = 0; + + if (!pathname) { + errno = ENOENT; + return -1; + } + + if (pathname[0] != '/') { + LOG(LUSR, "NULL dir"); + errno = EFAULT; + return -1; + } + + if (flags != 0) { + errno = EINVAL; + ret = -1; + } else { + ret = _splitfs_unlinkat(pathname); + } + + if (ret == 0) { + ret = (int) syscall_no_intercept(SYS_unlink, pathname); + } + + LOG(0, "unlink done. return = %d", ret); + return ret; +} + +int splitfs_unlink(const char* pathname) { + return splitfs_unlinkat(pathname, 0); +} diff --git a/splitfs_syscall_intercept/utils/src/utils.c b/splitfs_syscall_intercept/utils/src/utils.c new file mode 100644 index 0000000000..4a84b7aa65 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/utils.c @@ -0,0 +1,118 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +#include "utils.h" +#include "splitfs-posix.h" + +/* + * is_zeroed -- check if given memory range is all zero + */ +bool +is_zeroed(const void *addr, size_t len) +{ + /* XXX optimize */ + const char *a = (const char *)addr; + while (len-- > 0) + if (*a++) + return false; + return true; +} + +/* + * str_compare -- compares 2 strings + * + * s1 is NUL-terminated, + * s2 is not - its length is s2n + */ +int +str_compare(const char *s1, const char *s2, size_t s2n) +{ + int ret = strncmp(s1, s2, s2n); + if (ret) + return ret; + if (s1[s2n] != 0) + return 1; + return 0; +} + +/* + * str_contains -- returns true if string contains specified character in first + * len bytes + */ +bool +str_contains(const char *str, size_t len, char c) +{ + for (size_t i = 0; i < len; ++i) + if (str[i] == c) + return true; + + return false; +} + +/* + * more_than_1_component -- returns true if path contains more than one + * component + * + * Deals with slashes at the end of path. + */ +bool +more_than_1_component(const char *path) +{ + path = strchr(path, '/'); + if (!path) + return false; + + while (*path == '/') + path++; + + if (*path == 0) + return false; + + return true; +} + +/* + * component_length -- returns number of characters till the end of path + * component + */ +size_t +component_length(const char *path) +{ + const char *slash = strchr(path, '/'); + if (!slash) + return strlen(path); + return (uintptr_t)slash - (uintptr_t)path; +} diff --git a/splitfs_syscall_intercept/utils/src/utils.h b/splitfs_syscall_intercept/utils/src/utils.h new file mode 100644 index 0000000000..a96abaeab7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/utils.h @@ -0,0 +1,46 @@ +/* + * Copyright 2016-2017, Intel Corporation + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPLITFS_UTILS_H +#define SPLITFS_UTILS_H + +#include "inode.h" +#include "splitfs-posix.h" + +bool is_zeroed(const void *addr, size_t len); + +int str_compare(const char *s1, const char *s2, size_t s2n); +bool str_contains(const char *str, size_t len, char c); +bool more_than_1_component(const char *path); +size_t component_length(const char *path); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/vfd_table.c b/splitfs_syscall_intercept/utils/src/vfd_table.c new file mode 100644 index 0000000000..3306c0ced7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/vfd_table.c @@ -0,0 +1,350 @@ +/* + * ===================================================================================== + * + * Filename: vfd_table.c + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 06:03:17 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include +#include + +#include +#include + +#include "constants.h" +#include "sys_util.h" +#include "preload.h" +#include "out.h" + +struct vfile_description { + SPLITFSfile *file; + int ref_count; +}; + +static void +vf_ref_count_inc(struct vfile_description *entry) { + + __atomic_add_fetch(&entry->ref_count, 1, __ATOMIC_ACQ_REL); +} + +static void +ref_vfd_entry(struct vfile_description *entry) { + + if (entry != NULL) + vf_ref_count_inc(entry); +} + +static int +vf_ref_count_dec_and_fetch(struct vfile_description *entry) { + + return __atomic_sub_fetch(&entry->ref_count, 1, __ATOMIC_ACQ_REL); +} + +static struct vfile_description *vfd_table[OPEN_MAX]; + +static pthread_mutex_t vfd_table_mutex = PTHREAD_MUTEX_INITIALIZER; + +static struct vfile_description *free_vfile_slots[ARRAY_SIZE(vfd_table)]; +static unsigned free_slot_count; +static pthread_mutex_t free_vfile_slot_mutex = PTHREAD_MUTEX_INITIALIZER; + +static bool +is_in_vfd_table_range(int number) { + + return (number >= 0) && (number < (int)ARRAY_SIZE(vfd_table)); +} + +static bool +can_be_in_vfd_table(int vfd) { + + if (!is_in_vfd_table_range(vfd)) + return false; + + return __atomic_load_n(vfd_table + vfd, __ATOMIC_CONSUME) != NULL; +} + +static void +mark_as_free_file_slot(struct vfile_description *entry) { + + util_mutex_lock(&free_vfile_slot_mutex); + + free_vfile_slots[free_slot_count++] = entry; + + util_mutex_unlock(&free_vfile_slot_mutex); +} + + +static void +unref_vfd_entry(long fd, struct vfile_description *entry) { + + if (entry == NULL) + return; + + if (vf_ref_count_dec_and_fetch(entry) == 0) { + splitfs_close(fd, entry->file); + mark_as_free_file_slot(entry); + } +} + +void splitfs_vfd_unref(int vfd) { + return unref_vfd_entry(vfd, vfd_table[vfd]); +} + +SPLITFSfile * +splitfs_vfd_ref(int vfd) { + + struct vfile_description *entry; + + util_mutex_lock(&vfd_table_mutex); + + ref_vfd_entry(vfd_table[vfd]); + entry = vfd_table[vfd]; + + util_mutex_unlock(&vfd_table_mutex); + + if (entry) + return entry->file; + else + return NULL; +} + +SPLITFSfile* +splitfs_execv_vfd_get(int vfd) { + struct vfile_description *entry; + entry = vfd_table[vfd]; + if (entry) + return entry->file; + else + return NULL; +} + +static struct vfile_description * +fetch_free_file_slot(void) { + + struct vfile_description *entry; + + util_mutex_lock(&free_vfile_slot_mutex); + + if (free_slot_count == 0) + entry = NULL; + else + entry = free_vfile_slots[--free_slot_count]; + + util_mutex_unlock(&free_vfile_slot_mutex); + + return entry; +} + +static void +setup_free_slots(void) { + + static struct vfile_description store[ARRAY_SIZE(free_vfile_slots) - 1]; + + for (unsigned i = 0; i < ARRAY_SIZE(store); ++i) + mark_as_free_file_slot(store + i); +} + +long +splitfs_vfd_assign(long vfd, + struct splitfs_file *file) { + + struct vfile_description *entry = fetch_free_file_slot(); + if (entry == NULL) + return -ENOMEM; + + *entry = (struct vfile_description) { + .ref_count = 1, .file = file}; + + util_mutex_lock(&vfd_table_mutex); + + vfd_table[vfd] = entry; + + util_mutex_unlock(&vfd_table_mutex); + + return vfd; +} + +/* + * vfd_dup2_under_mutex -- perform dup2 + * If the old_vfd refers to entry, increase the corresponding ref_count. + * If the new_vfd refers to entry, decrease the corresponding ref_count -- this should be done by caller i.e., before the actual dup2 system call. + * Overwrite the entry pointer in the vfd_table. + * The order of the three operations does not matter, as long as the entries + * as different, and all three happen while holding the vfd_table_mutex. + * + * Important: dup2 must be atomic from the user's point of view. + */ +static int +vfd_dup2_under_mutex(int old_vfd, int new_vfd) +{ + if (new_vfd < 0) + return new_vfd; + + /* + * "If oldfd is a valid file descriptor, and newfd has the same value + * as oldfd, then dup2() does nothing, and returns newfd." + * + * It is easily verified if the old vfd is valid or not, by asking + * the kernel to dup2 the underlying (possible) memfd -- see the + * function calling this function. + */ + if (old_vfd == new_vfd) + return new_vfd; + + if (!is_in_vfd_table_range(new_vfd)) { + /* new_vfd can't be used to index the vfd_table */ + syscall_no_intercept(SYS_close, new_vfd); + exit(1); + return -ENOMEM; + } + + if (vfd_table[old_vfd] == vfd_table[new_vfd]) + return new_vfd; + + ref_vfd_entry(vfd_table[old_vfd]); + // the below commented call should be done by the caller i.e., before the actual system call for dup2 is done + // unref_vfd_entry(new_vfd, vfd_table[new_vfd]); + __atomic_store_n(vfd_table + new_vfd, vfd_table[old_vfd], + __ATOMIC_RELEASE); + + return new_vfd; +} + +/* + * pmemfile_vfd_dup -- creates a new reference to a vfile_description entry, + * if the vfd refers to one. + */ +int +splitfs_vfd_dup(int vfd) +{ + if (!can_be_in_vfd_table(vfd)) + return (int)syscall_no_intercept(SYS_dup, vfd); + + int new_vfd; + util_mutex_lock(&vfd_table_mutex); + + new_vfd = (int)syscall_no_intercept(SYS_dup, vfd); + + new_vfd = vfd_dup2_under_mutex(vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return new_vfd; +} + +int +splitfs_vfd_fcntl_dup(int vfd, int min_new_vfd) +{ + if (!can_be_in_vfd_table(vfd)) + return (int)syscall_no_intercept(SYS_fcntl, + vfd, F_DUPFD, min_new_vfd); + + int new_vfd; + util_mutex_lock(&vfd_table_mutex); + + new_vfd = (int)syscall_no_intercept(SYS_fcntl, + vfd, F_DUPFD, min_new_vfd); + + new_vfd = vfd_dup2_under_mutex(vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return new_vfd; +} + +/* + * pmemfile_vfd_dup2 -- create a new reference to a vfile_description entry, + * potentially replacing a reference to another one. + */ +int +splitfs_vfd_dup2(int old_vfd, int new_vfd) +{ + if ((!can_be_in_vfd_table(old_vfd)) && (!can_be_in_vfd_table(new_vfd))) + return (int)syscall_no_intercept(SYS_dup2, old_vfd, new_vfd); + + int result; + + util_mutex_lock(&vfd_table_mutex); + + unref_vfd_entry(new_vfd, vfd_table[new_vfd]); + + result = (int)syscall_no_intercept(SYS_dup2, old_vfd, new_vfd); + + assert(result == new_vfd); + vfd_dup2_under_mutex(old_vfd, new_vfd); + + util_mutex_unlock(&vfd_table_mutex); + + return result; +} + +/* + * pmemfile_vfd_dup3 -- Almost the same as dup2, with two differences: + * It accepts an additional flag argument. + * If the old and new fd arguments are the same, both do nothing, but + * dup2 returns the specified fd, while dup3 indicates EINVAL error. + */ +int +splitfs_vfd_dup3(int old_vfd, int new_vfd, int flags) +{ + if (old_vfd == new_vfd) + return -EINVAL; + + /* + * The only flag allowed in dup3 is O_CLOEXEC, and that is ignored + * by pmemfile as of now. + * Note: once O_CLOEXEC is handled, it can be stored in the + * vfd_table -- not in the corresponding vfile_description struct, + * as the flag is specific to fd numbers. + */ + if ((flags & ~O_CLOEXEC) != 0) + return -EINVAL; + + return splitfs_vfd_dup2(old_vfd, new_vfd); +} + + /* pmemfile_vfd_close -- remove a reference from the vfd_table array (if + * there was one at vfd_table[vfd]). + * This does not necessarily close an underlying pmemfile file, as some + * vfd_reference structs given to the user might still reference that entry. + */ +long +splitfs_vfd_close(int vfd) +{ + struct vfile_description *entry = NULL; + long result = 0; + + util_mutex_lock(&vfd_table_mutex); + + entry = vfd_table[vfd]; + vfd_table[vfd] = NULL; + + util_mutex_unlock(&vfd_table_mutex); + + if (entry != NULL) { + unref_vfd_entry(vfd, entry); + result = 0; + } + + result = syscall_no_intercept(SYS_close, vfd); + return result; +} + +void +splitfs_vfd_table_init(void) { + + setup_free_slots(); +} diff --git a/splitfs_syscall_intercept/utils/src/vfd_table.h b/splitfs_syscall_intercept/utils/src/vfd_table.h new file mode 100644 index 0000000000..361f307521 --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/vfd_table.h @@ -0,0 +1,38 @@ +/* + * ===================================================================================== + * + * Filename: vfd_table.h + * + * Description: + * + * Version: 1.0 + * Created: 08/03/2019 07:39:24 AM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#ifndef SPLITFS_VFD_TABLE_H +#define SPLITFS_VFD_TABLE_H + +struct vfile_description; +struct splitfs_file; + +long splitfs_vfd_assign(long vfd, struct splitfs_file *file); +int splitfs_vfd_dup(int vfd); +int splitfs_vfd_fcntl_dup(int vfd, int min_new_vfd); +int splitfs_vfd_dup2(int old_vfd, int new_vfd); +int splitfs_vfd_dup3(int old_vfd, int new_vfd, int flags); +SPLITFSfile *splitfs_vfd_ref(int vfd); +void splitfs_vfd_unref(int vfd); + +long splitfs_vfd_close(int vfd); + +void splitfs_vfd_table_init(void); + +SPLITFSfile *splitfs_execv_vfd_get(int vfd); + +#endif diff --git a/splitfs_syscall_intercept/utils/src/write.c b/splitfs_syscall_intercept/utils/src/write.c new file mode 100644 index 0000000000..ba534b9aba --- /dev/null +++ b/splitfs_syscall_intercept/utils/src/write.c @@ -0,0 +1,417 @@ +/* + * ===================================================================================== + * + * Filename: write.c + * + * Description: + * + * Version: 1.0 + * Created: 08/01/2019 08:44:24 PM + * Revision: none + * Compiler: gcc + * + * Author: YOUR NAME (), Rohan Kadekodi + * Organization: University of Texas at Austin + * + * ===================================================================================== + */ +#include +#include +#include +#include + +#include "file.h" +#include "splitfs-posix.h" +#include "utils.h" +#include "handle_mmaps.h" +#include "intel_intrin.h" +#include "relink.h" +#include "staging_thread.h" +#include "add_delay.h" +#include "table_mmaps.h" +#include "out.h" + +#define MEMCPY_NON_TEMPORAL memmove_nodrain_movnt_granularity + +static size_t +write_staging_file(long fd, struct splitfs_file *file, off_t offset, + char *buf, size_t count) { + void *mmap_addr = NULL; + size_t extent_length = 0; + LOG(0, "in write_staging_file()"); + + /* + if (count == 7) { + char print_str[50]; + sprintf(print_str, "count: %d, fd: %ld, offset: %ld\n", count, fd, offset); + syscall_no_intercept(SYS_write, fileno(stderr), print_str, 24 + sizeof(int) + sizeof(long) + sizeof(long)); + //FATAL("count is 7"); + } + */ + + + if (file == NULL) + FATAL("file is NULL"); + if (buf == NULL) + FATAL("buf is NULL"); + if (fd < 0) + FATAL("fd is wrong"); + if (count > (64*1024*1024) || count < 0) + FATAL("count size is wrong"); + if (!file->vinode) + FATAL("vinode is NULL"); + if (file->vinode->length < file->vinode->sync_length) + FATAL("sync_size is wrong"); + if (offset != file->vinode->length) + FATAL("offset is wrong"); + +start: + mmap_addr = get_staging_mmap_address(file, count, + (off_t) (offset - (off_t)inode_get_sync_size(file->vinode)), &extent_length, true); + + if (mmap_addr == NULL) + FATAL("mmap addr is null"); + + if (extent_length >= count) + extent_length = count; + else { + LOG(0, "changing the staging file"); + + size_t relink_size = STAGING_FILE_SIZE - + (size_t)file->vinode->staging->valid_offset - extent_length; + + if (relink_size > (100*1024*1024UL) || relink_size < 0) { + char extent_str[50]; + sprintf(extent_str, "extent_length = %lu\n", relink_size); + syscall_no_intercept(SYS_write, fileno(stderr), extent_str, 50); + FATAL("relink size is very large"); + } + + if (relink_size > 0) + perform_relink(fd, (off_t)inode_get_sync_size(file->vinode), + file->vinode, relink_size); + + file->vinode->staging = NULL; + inode_set_sync_size(file->vinode, inode_get_uncommitted_size(file->vinode)); + splitfs_call_thread(); + goto start; + } + + if (offset + (off_t)extent_length > (off_t)inode_get_uncommitted_size(file->vinode)) + inode_set_uncommitted_size(file->vinode, (size_t)offset + extent_length); + + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + + if (extent_length != count) + FATAL("extent_length is not equal to count"); + if (mmap_addr == NULL) + FATAL("mmap address is null"); + if (buf == NULL) + FATAL("buf is null"); + + MEMCPY_NON_TEMPORAL((char *)mmap_addr, (char *)buf, extent_length); + perfmodel_add_delay(0, extent_length); + + //LOG(0, "Addr = %p, data written = %lu, inode size = %lu, sync_size = %lu", mmap_addr, extent_length, file->vinode->length, file->vinode->sync_length); + + off_t offset_in_staging = (unsigned long) mmap_addr - (unsigned long) file->vinode->staging->start_addr; + long staging_fd = file->vinode->staging->fd; + + /* + if (count == 7) { + char print_str[6]; + sprintf(print_str, "%s\n", "Done"); + syscall_no_intercept(SYS_write, fileno(stderr), print_str, 6); + } + */ + + return extent_length; +} + +static size_t +vinode_write(long fd, struct splitfs_file *file, + off_t offset, const char *buf, size_t count) { + + void *mmap_addr = NULL; + size_t extent_length = 0; + size_t len_written = 0; + size_t len_to_write = count; + LOG(0, "inode no = %u, size = %lu, write off = %ld, write count = %lu", + file->vinode->serialno, file->vinode->length, offset, count); + + /* Check for holes */ + if (offset > (off_t)inode_get_uncommitted_size(file->vinode)) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + + inode_set_uncommitted_size(file->vinode, (size_t)offset + count); + inode_set_sync_size(file->vinode, (size_t)offset + count); + + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_rdlock(&file->vinode->rwlock); + + len_written = (size_t) syscall_no_intercept( + SYS_pwrite64, fd, (char *)buf, + count, offset); + syscall_no_intercept(SYS_fsync, fd); + + return len_written; + } + + while (len_written < count) { + size_t len_write_iter = 0; + if (offset >= (off_t)inode_get_sync_size(file->vinode)) { + os_rwlock_unlock(&file->vinode->rwlock); + os_rwlock_wrlock(&file->vinode->rwlock); + extent_length = write_staging_file(fd, file, offset, + (char *) ((unsigned long)buf + len_written), len_to_write); + goto loop_end; + } + + mmap_addr = (void *)splitfs_get_tbl_entry(file->vinode->tbl_mmap, offset, &extent_length); + if (mmap_addr == NULL) + mmap_addr = get_mmap_address(fd, file, offset, &extent_length); + + if ((size_t)offset + len_to_write >= file->vinode->sync_length) { + len_write_iter = file->vinode->sync_length - (size_t)offset; + } else { + len_write_iter = len_to_write; + } + + if (extent_length > len_write_iter) { + extent_length = len_write_iter; + } + + if (mmap_addr == NULL && extent_length == 0) { + extent_length = (size_t) syscall_no_intercept( + SYS_pwrite64, fd, (char *) (buf + len_written), + len_write_iter, offset); + } else { + MEMCPY_NON_TEMPORAL((char *)mmap_addr, + (char *)((unsigned long)buf + len_written), extent_length); + perfmodel_add_delay(0, extent_length); + } + +loop_end: + len_written += extent_length; + len_to_write -= extent_length; + offset += (off_t)extent_length; + } + return len_written; +} + +/* + * splitfs_pwritev_args_check - checks some write arguments + * The arguments here can be examined while holding the mutex for the + * SPLITFSfile instance, while there is no need to hold the lock for the + * corresponding vinode instance. + */ +static ssize_t +splitfs_pwritev_args_check(struct splitfs_file *file, + const struct iovec *iov, + int iovcnt) +{ + LOG(LDBG, "vinode %p iov %p iovcnt %d", file->vinode, iov, iovcnt); + + LOG(0, "file->flags = %ld, PFILE_WRITE = %llu\n", file->flags, PFILE_WRITE); + if (!(file->flags & PFILE_WRITE)) { + errno = EBADF; + return -1; + } + + if (iovcnt > 0 && iov == NULL) { + errno = EFAULT; + return -1; + } + + for (int i = 0; i < iovcnt; ++i) { + if (iov[i].iov_base == NULL) { + errno = EFAULT; + return -1; + } + } + + return 0; +} + +static ssize_t +splitfs_pwritev_internal(long fd, struct splitfs_file *file, + off_t offset, struct iovec *iov, int iovcnt) { + + int error = 0; + size_t sum_len = 0; + size_t ret = 0; + + LOG(LDBG, "In splitfs_pwritev_internal()"); + + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + + if ((size_t) len < 0) + len = SSIZE_MAX; + + if ((ssize_t) (sum_len + len) < 0) + len = SSIZE_MAX - sum_len; + + /* overflow check */ + if (offset + (off_t)sum_len + (off_t)len < offset) + len = SSIZE_MAX - (size_t)offset - sum_len; + + sum_len += len; + + if (len != iov[i].iov_len) + break; + } + + if (sum_len == 0) + return 0; + + /* Now write the data. + */ + for (int i = 0; i < iovcnt; ++i) { + size_t len = iov[i].iov_len; + + if ((ssize_t)len < 0) + len = SSIZE_MAX; + + if ((ssize_t) (ret + len) < 0) + len = SSIZE_MAX - ret; + + /* overflow check */ + if (offset + (off_t)len < offset) + len = SSIZE_MAX - (size_t)offset; + + if (len > 0) + vinode_write(fd, file, offset, iov[i].iov_base, len); + + ret += len; + offset += (off_t)len; + + if (len != iov[i].iov_len) + break; + } + ASSERT(ret > 0); + + if (error) { + errno = error; + return -1; + } + + _mm_sfence(); + return (ssize_t) ret; +} + + +ssize_t +splitfs_write(long fd, struct splitfs_file *file, const void* buf, size_t count) { + + struct iovec element = {.iov_base = (void *)buf, .iov_len = count}; + return splitfs_writev(fd, file, &element, 1); +} + + +/* + * pmemfile_writev_under_filelock - write to a file + * This function expects the PMEMfile instance to be locked while being called. + * Since the offset field is used to determine where to read from, and is also + * updated after a successful read operation, the PMEMfile instance can not be + * accessed by others while this is happening. + * + */ +static ssize_t +splitfs_writev_under_filelock(long fd, struct splitfs_file *file, + struct iovec *iov, int iovcnt) +{ + ssize_t ret; + + ret = splitfs_pwritev_args_check(file, iov, iovcnt); + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_pwritev_internal(fd, + file, + (off_t)file->offset, iov, iovcnt); + + + os_rwlock_unlock(&file->vinode->rwlock); + + if (ret > 0) { + file->offset += (size_t)ret; + } + + return ret; +} + +ssize_t +splitfs_writev(long fd, struct splitfs_file *file, struct iovec *iov, int iovcnt) { + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + pthread_mutex_lock(&file->mutex); + + ssize_t ret = + splitfs_writev_under_filelock(fd, file, iov, iovcnt); + + pthread_mutex_unlock(&file->mutex); + + return ret; +} + +ssize_t +splitfs_pwrite(long fd, struct splitfs_file *file, const void* buf, size_t count, off_t offset) { + + LOG(0, "Called splitfs_pwrite()"); + struct iovec element = {.iov_base = (void *)buf, .iov_len = count}; + return splitfs_pwritev(fd, file, &element, 1, offset); +} + +ssize_t +splitfs_pwritev(long fd, struct splitfs_file *file, struct iovec *iov, + int iovcnt, off_t offset) { + + LOG(0, "Called splitfs_pwritev()"); + + if (!file) { + LOG(LUSR, "NULL file"); + errno = EFAULT; + return -1; + } + + if (offset < 0) { + errno = EINVAL; + return -1; + } + + ssize_t ret; + + pthread_mutex_lock(&file->mutex); + + LOG(0, "checking args"); + ret = splitfs_pwritev_args_check(file, iov, iovcnt); + LOG(0, "checking args ret = %lu", ret); + + if (ret != 0) + return ret; + + if (iovcnt == 0) + return 0; + + os_rwlock_rdlock(&file->vinode->rwlock); + + ret = splitfs_pwritev_internal(fd, file, offset, iov, iovcnt); + + os_rwlock_unlock(&file->vinode->rwlock); + pthread_mutex_unlock(&file->mutex); + + return ret; +} diff --git a/splitfs_syscall_intercept/utils/tests/Makefile b/splitfs_syscall_intercept/utils/tests/Makefile new file mode 100644 index 0000000000..a0c5b8bfda --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/Makefile @@ -0,0 +1,19 @@ +# Run tests for splitfs + +# The current working directory +CWD=$(shell pwd) +# Root of the repo +ROOT=$(CWD)/.. +# SplitFS mount path +SFS_MNT_PATH=/mnt/pmem_emul/ +# PJD Dir +PJD_DIR=$(CWD)/pjd-fstest-20080816 +# SplitFS library file path. Either set via env variable or defaults to assigned path +SPLITFS_LIB_PATH ?= ${ROOT}/build/src/libsplitfs.so + +pjd: + export LD_PRELOAD=${SPLITFS_LIB_PATH}; \ + cd ${SFS_MNT_PATH} && prove -r ${PJD_DIR}/tests + +compile_fstest: + make -C ${PJD_DIR} all \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/tests/README.md b/splitfs_syscall_intercept/utils/tests/README.md new file mode 100644 index 0000000000..70317860cb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/README.md @@ -0,0 +1,5 @@ +###To run the pjd test, do the following: +1. Compile SplitFS. +2. Set the environment variable `SPLITFS_LIB_PATH` to point to the compiled SplitFS library artifact. +3. Move to tests directory: `cd /tests` +4. Run: `make pjd` diff --git a/splitfs_syscall_intercept/utils/tests/a.out b/splitfs_syscall_intercept/utils/tests/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0a72f469041aefeb89d4b3da8d129054d3005ed7 GIT binary patch literal 13800 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 +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/Makefile b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/Makefile new file mode 100644 index 0000000000..475516b00c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/Makefile @@ -0,0 +1,15 @@ +# $FreeBSD: src/tools/regression/fstest/Makefile,v 1.1 2007/01/17 01:42:07 pjd Exp $ + +#CFLAGS+=-DHAS_LCHMOD +#CFLAGS+=-DHAS_CHFLAGS +#CFLAGS+=-DHAS_LCHFLAGS +#CFLAGS+=-DHAS_TRUNCATE64 +#CFLAGS+=-DHAS_STAT64 + +all: fstest + +fstest: fstest.c + gcc -Wall ${CFLAGS} fstest.c -o fstest + +clean: + rm -f fstest diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/README b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/README new file mode 100644 index 0000000000..d549e34dc2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/README @@ -0,0 +1,28 @@ +$FreeBSD: src/tools/regression/fstest/README,v 1.1 2007/01/28 00:10:28 pjd Exp $ + +Few notes on how to use fstest in short steps: + + # cd fstest + # vi tests/conf + Change 'fs' to file system type you want to test. These can be: + UFS, ZFS, ext3, ntfs-3g and xfs. + # vi Makefile + You may need to manually tweak few things by editing CFLAGS lines + at the top of the file. + # make + It will compile fstest utility which is used by regression tests. + # cd /path/to/file/system/you/want/to/test/ + The test must be run as root user. + # prove -r /path/to/fstest/ + +That's all. Enjoy. + +Currently supported operating systems: FreeBSD, Solaris, Linux. +Currently supported file system types: UFS, ZFS, ext3, ntfs-3g, xfs. + +Author: +Pawel Jakub Dawidek + +Linux port: +Jean-Pierre Andre +Szabolcs Szakacsits diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest new file mode 100755 index 0000000000000000000000000000000000000000..326a70305394c3a75b1f45ae8b7e20b49c0e10fd GIT binary patch literal 24528 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 literal 0 HcmV?d00001 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest.c b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest.c new file mode 100644 index 0000000000..07a95711a1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/fstest.c @@ -0,0 +1,1002 @@ +/*- + * Copyright (c) 2006-2007 Pawel Jakub Dawidek + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD: src/tools/regression/fstest/fstest.c,v 1.1 2007/01/17 01:42:07 pjd Exp $ + */ + +#ifdef linux +#define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAS_TRUNCATE64 +#define truncate64 truncate +#endif +#ifndef HAS_STAT64 +#define stat64 stat +#define lstat64 lstat +#endif + +#ifndef ALLPERMS +#define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) +#endif + +enum action { + ACTION_OPEN, + ACTION_CREATE, + ACTION_UNLINK, + ACTION_MKDIR, + ACTION_RMDIR, + ACTION_LINK, + ACTION_SYMLINK, + ACTION_RENAME, + ACTION_MKFIFO, + ACTION_CHMOD, +#ifdef HAS_LCHMOD + ACTION_LCHMOD, +#endif + ACTION_CHOWN, + ACTION_LCHOWN, +#ifdef HAS_CHFLAGS + ACTION_CHFLAGS, +#endif +#ifdef HAS_LCHFLAGS + ACTION_LCHFLAGS, +#endif + ACTION_TRUNCATE, + ACTION_STAT, + ACTION_LSTAT, +}; + +#define TYPE_NONE 0x0000 +#define TYPE_STRING 0x0001 +#define TYPE_NUMBER 0x0002 + +#define TYPE_OPTIONAL 0x0100 + +#define MAX_ARGS 8 + +struct syscall_desc { + char *sd_name; + enum action sd_action; + int sd_args[MAX_ARGS]; +}; + +static struct syscall_desc syscalls[] = { + { "open", ACTION_OPEN, { TYPE_STRING, TYPE_STRING, TYPE_NUMBER | TYPE_OPTIONAL, TYPE_NONE } }, + { "create", ACTION_CREATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "unlink", ACTION_UNLINK, { TYPE_STRING, TYPE_NONE } }, + { "mkdir", ACTION_MKDIR, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "rmdir", ACTION_RMDIR, { TYPE_STRING, TYPE_NONE } }, + { "link", ACTION_LINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "symlink", ACTION_SYMLINK, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "rename", ACTION_RENAME, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "mkfifo", ACTION_MKFIFO, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "chmod", ACTION_CHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAS_LCHMOD + { "lchmod", ACTION_LCHMOD, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, +#endif + { "chown", ACTION_CHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, + { "lchown", ACTION_LCHOWN, { TYPE_STRING, TYPE_NUMBER, TYPE_NUMBER, TYPE_NONE } }, +#ifdef HAS_CHFLAGS + { "chflags", ACTION_CHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif +#ifdef HAS_LCHFLAGS + { "lchflags", ACTION_LCHFLAGS, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, +#endif + { "truncate", ACTION_TRUNCATE, { TYPE_STRING, TYPE_NUMBER, TYPE_NONE } }, + { "stat", ACTION_STAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { "lstat", ACTION_LSTAT, { TYPE_STRING, TYPE_STRING, TYPE_NONE } }, + { NULL, -1, { TYPE_NONE } } +}; + +struct flag { + long long f_flag; + char *f_str; +}; + +static struct flag open_flags[] = { +#ifdef O_RDONLY + { O_RDONLY, "O_RDONLY" }, +#endif +#ifdef O_WRONLY + { O_WRONLY, "O_WRONLY" }, +#endif +#ifdef O_RDWR + { O_RDWR, "O_RDWR" }, +#endif +#ifdef O_NONBLOCK + { O_NONBLOCK, "O_NONBLOCK" }, +#endif +#ifdef O_APPEND + { O_APPEND, "O_APPEND" }, +#endif +#ifdef O_CREAT + { O_CREAT, "O_CREAT" }, +#endif +#ifdef O_TRUNC + { O_TRUNC, "O_TRUNC" }, +#endif +#ifdef O_EXCL + { O_EXCL, "O_EXCL" }, +#endif +#ifdef O_SHLOCK + { O_SHLOCK, "O_SHLOCK" }, +#endif +#ifdef O_EXLOCK + { O_EXLOCK, "O_EXLOCK" }, +#endif +#ifdef O_DIRECT + { O_DIRECT, "O_DIRECT" }, +#endif +#ifdef O_FSYNC + { O_FSYNC, "O_FSYNC" }, +#endif +#ifdef O_SYNC + { O_SYNC, "O_SYNC" }, +#endif +#ifdef O_NOFOLLOW + { O_NOFOLLOW, "O_NOFOLLOW" }, +#endif +#ifdef O_NOCTTY + { O_NOCTTY, "O_NOCTTY" }, +#endif + { 0, NULL } +}; + +#ifdef HAS_CHFLAGS +static struct flag chflags_flags[] = { +#ifdef UF_NODUMP + { UF_NODUMP, "UF_NODUMP" }, +#endif +#ifdef UF_IMMUTABLE + { UF_IMMUTABLE, "UF_IMMUTABLE" }, +#endif +#ifdef UF_APPEND + { UF_APPEND, "UF_APPEND" }, +#endif +#ifdef UF_NOUNLINK + { UF_NOUNLINK, "UF_NOUNLINK" }, +#endif +#ifdef UF_OPAQUE + { UF_OPAQUE, "UF_OPAQUE" }, +#endif +#ifdef SF_ARCHIVED + { SF_ARCHIVED, "SF_ARCHIVED" }, +#endif +#ifdef SF_IMMUTABLE + { SF_IMMUTABLE, "SF_IMMUTABLE" }, +#endif +#ifdef SF_APPEND + { SF_APPEND, "SF_APPEND" }, +#endif +#ifdef SF_NOUNLINK + { SF_NOUNLINK, "SF_NOUNLINK" }, +#endif +#ifdef SF_SNAPSHOT + { SF_SNAPSHOT, "SF_SNAPSHOT" }, +#endif + { 0, NULL } +}; +#endif + +static const char *err2str(int error); + +static void +usage(void) +{ + + fprintf(stderr, "usage: fstest [-u uid] [-g gid1[,gid2[...]]] syscall args ...\n"); + exit(1); +} + +static long long +str2flags(struct flag *tflags, char *sflags) +{ + long long flags = 0; + unsigned int i; + char *f; + + for (f = strtok(sflags, ","); f != NULL; f = strtok(NULL, ",")) { + /* Support magic 'none' flag which just reset all flags. */ + if (strcmp(f, "none") == 0) + return (0); + for (i = 0; tflags[i].f_str != NULL; i++) { + if (strcmp(tflags[i].f_str, f) == 0) + break; + } + if (tflags[i].f_str == NULL) { + fprintf(stderr, "unknown flag '%s'\n", f); + exit(1); + } + flags |= tflags[i].f_flag; + } + return (flags); +} + +#ifdef HAS_CHFLAGS +static char * +flags2str(struct flag *tflags, long long flags) +{ + static char sflags[1024]; + unsigned int i; + + sflags[0] = '\0'; + for (i = 0; tflags[i].f_str != NULL; i++) { + if (flags & tflags[i].f_flag) { + if (sflags[0] != '\0') + strlcat(sflags, ",", sizeof(sflags)); + strlcat(sflags, tflags[i].f_str, sizeof(sflags)); + } + } + if (sflags[0] == '\0') + strlcpy(sflags, "none", sizeof(sflags)); + return (sflags); +} +#endif + +static struct syscall_desc * +find_syscall(const char *name) +{ + int i; + + for (i = 0; syscalls[i].sd_name != NULL; i++) { + if (strcmp(syscalls[i].sd_name, name) == 0) + return (&syscalls[i]); + } + return (NULL); +} + +static void +show_stat(struct stat64 *sp, const char *what) +{ + + if (strcmp(what, "mode") == 0) + printf("0%o", (unsigned int)(sp->st_mode & ALLPERMS)); + else if (strcmp(what, "inode") == 0) + printf("%lld", (long long)sp->st_ino); + else if (strcmp(what, "nlink") == 0) + printf("%lld", (long long)sp->st_nlink); + else if (strcmp(what, "uid") == 0) + printf("%d", (int)sp->st_uid); + else if (strcmp(what, "gid") == 0) + printf("%d", (int)sp->st_gid); + else if (strcmp(what, "size") == 0) + printf("%lld", (long long)sp->st_size); + else if (strcmp(what, "blocks") == 0) + printf("%lld", (long long)sp->st_blocks); + else if (strcmp(what, "atime") == 0) + printf("%lld", (long long)sp->st_atime); + else if (strcmp(what, "mtime") == 0) + printf("%lld", (long long)sp->st_mtime); + else if (strcmp(what, "ctime") == 0) + printf("%lld", (long long)sp->st_ctime); +#ifdef HAS_CHFLAGS + else if (strcmp(what, "flags") == 0) + printf("%s", flags2str(chflags_flags, sp->st_flags)); +#endif + else if (strcmp(what, "type") == 0) { + switch (sp->st_mode & S_IFMT) { + case S_IFIFO: + printf("fifo"); + break; + case S_IFCHR: + printf("char"); + break; + case S_IFDIR: + printf("dir"); + break; + case S_IFBLK: + printf("block"); + break; + case S_IFREG: + printf("regular"); + break; + case S_IFLNK: + printf("symlink"); + break; + case S_IFSOCK: + printf("socket"); + break; + default: + printf("unknown"); + break; + } + } else { + printf("unknown"); + } +} + +static void +show_stats(struct stat64 *sp, char *what) +{ + const char *s = ""; + char *w; + + for (w = strtok(what, ","); w != NULL; w = strtok(NULL, ",")) { + printf("%s", s); + show_stat(sp, w); + s = ","; + } + printf("\n"); +} + +static unsigned int +call_syscall(struct syscall_desc *scall, char *argv[]) +{ + struct stat64 sb; + long long flags; + unsigned int i; + char *endp; + int rval; + union { + char *str; + long long num; + } args[MAX_ARGS]; + + /* + * Verify correctness of the arguments. + */ + for (i = 0; i < sizeof(args)/sizeof(args[0]); i++) { + if (scall->sd_args[i] == TYPE_NONE) { + if (argv[i] == NULL || strcmp(argv[i], ":") == 0) + break; + fprintf(stderr, "too many arguments [%s]\n", argv[i]); + exit(1); + } else { + if (argv[i] == NULL || strcmp(argv[i], ":") == 0) { + if (scall->sd_args[i] & TYPE_OPTIONAL) + break; + fprintf(stderr, "too few arguments\n"); + exit(1); + } + if (scall->sd_args[i] & TYPE_STRING) { + if (strcmp(argv[i], "NULL") == 0) + args[i].str = NULL; + else if (strcmp(argv[i], "DEADCODE") == 0) + args[i].str = (void *)0xdeadc0de; + else + args[i].str = argv[i]; + } else if (scall->sd_args[i] & TYPE_NUMBER) { + args[i].num = strtoll(argv[i], &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid argument %u, number expected [%s]\n", i, endp); + exit(1); + } + } + } + } + /* + * Call the given syscall. + */ +#define NUM(n) (args[(n)].num) +#define STR(n) (args[(n)].str) + switch (scall->sd_action) { + case ACTION_OPEN: + flags = str2flags(open_flags, STR(1)); + if (flags & O_CREAT) { + if (i == 2) { + fprintf(stderr, "too few arguments\n"); + exit(1); + } + rval = open(STR(0), flags, (mode_t)NUM(2)); + } else { + if (i == 3) { + fprintf(stderr, "too many arguments\n"); + exit(1); + } + rval = open(STR(0), flags); + } + break; + case ACTION_CREATE: + rval = open(STR(0), O_CREAT | O_EXCL, NUM(1)); + if (rval >= 0) + close(rval); + break; + case ACTION_UNLINK: + rval = unlink(STR(0)); + break; + case ACTION_MKDIR: + rval = mkdir(STR(0), NUM(1)); + break; + case ACTION_RMDIR: + rval = rmdir(STR(0)); + break; + case ACTION_LINK: + rval = link(STR(0), STR(1)); + break; + case ACTION_SYMLINK: + rval = symlink(STR(0), STR(1)); + break; + case ACTION_RENAME: + rval = rename(STR(0), STR(1)); + break; + case ACTION_MKFIFO: + rval = mkfifo(STR(0), NUM(1)); + break; + case ACTION_CHMOD: + rval = chmod(STR(0), NUM(1)); + break; +#ifdef HAS_LCHMOD + case ACTION_LCHMOD: + rval = lchmod(STR(0), NUM(1)); + break; +#endif + case ACTION_CHOWN: + rval = chown(STR(0), NUM(1), NUM(2)); + break; + case ACTION_LCHOWN: + rval = lchown(STR(0), NUM(1), NUM(2)); + break; +#ifdef HAS_CHFLAGS + case ACTION_CHFLAGS: + rval = chflags(STR(0), str2flags(chflags_flags, STR(1))); + break; +#endif +#ifdef HAS_LCHFLAGS + case ACTION_LCHFLAGS: + rval = lchflags(STR(0), str2flags(chflags_flags, STR(1))); + break; +#endif + case ACTION_TRUNCATE: + rval = truncate64(STR(0), NUM(1)); + break; + case ACTION_STAT: + rval = stat64(STR(0), &sb); + if (rval == 0) { + show_stats(&sb, STR(1)); + return (i); + } + break; + case ACTION_LSTAT: + rval = lstat64(STR(0), &sb); + if (rval == 0) { + show_stats(&sb, STR(1)); + return (i); + } + break; + default: + fprintf(stderr, "unsupported syscall\n"); + exit(1); + } +#undef STR +#undef NUM + if (rval < 0) { + const char *serrno; + + serrno = err2str(errno); + fprintf(stderr, "%s returned %d\n", scall->sd_name, rval); + printf("%s\n", serrno); + exit(1); + } + printf("0\n"); + return (i); +} + +static void +set_gids(char *gids) +{ + gid_t *gidset; + long ngroups; + char *g, *endp; + unsigned i; + + ngroups = sysconf(_SC_NGROUPS_MAX); + assert(ngroups > 0); + gidset = malloc(sizeof(*gidset) * ngroups); + assert(gidset != NULL); + for (i = 0, g = strtok(gids, ","); g != NULL; g = strtok(NULL, ","), i++) { + if (i >= ngroups) { + fprintf(stderr, "too many gids\n"); + exit(1); + } + gidset[i] = strtol(g, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid gid '%s' - number expected\n", + g); + exit(1); + } + } + if (setgroups(i, gidset) < 0) { + fprintf(stderr, "cannot change groups: %s\n", strerror(errno)); + exit(1); + } + if (setegid(gidset[0]) < 0) { + fprintf(stderr, "cannot change effective gid: %s\n", strerror(errno)); + exit(1); + } + free(gidset); +} + +int +main(int argc, char *argv[]) +{ + struct syscall_desc *scall; + unsigned int n; + char *gids, *endp; + int uid, umsk, ch; + + uid = -1; + gids = NULL; + umsk = 0; + + while ((ch = getopt(argc, argv, "g:u:U:")) != -1) { + switch(ch) { + case 'g': + gids = optarg; + break; + case 'u': + uid = (int)strtol(optarg, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid uid '%s' - number " + "expected\n", optarg); + exit(1); + } + break; + case 'U': + umsk = (int)strtol(optarg, &endp, 0); + if (*endp != '\0' && !isspace((unsigned char)*endp)) { + fprintf(stderr, "invalid umask '%s' - number " + "expected\n", optarg); + exit(1); + } + break; + default: + usage(); + } + } + argc -= optind; + argv += optind; + + if (argc < 1) { + fprintf(stderr, "too few arguments\n"); + usage(); + } + + if (gids != NULL) { + fprintf(stderr, "changing groups to %s\n", gids); + set_gids(gids); + } + if (uid != -1) { + fprintf(stderr, "changing uid to %d\n", uid); + if (setuid(uid) < 0) { + fprintf(stderr, "cannot change uid: %s\n", + strerror(errno)); + exit(1); + } + } + + /* Change umask to requested value or to 0, if not requested. */ + umask(umsk); + + for (;;) { + scall = find_syscall(argv[0]); + if (scall == NULL) { + fprintf(stderr, "syscall '%s' not supported\n", argv[0]); + exit(1); + } + argc++; + argv++; + n = call_syscall(scall, argv); + argc += n; + argv += n; + if (argv[0] == NULL) + break; + argc++; + argv++; + } + + exit(0); +} + +static const char * +err2str(int error) +{ + static char errnum[8]; + + switch (error) { +#ifdef EPERM + case EPERM: + return ("EPERM"); +#endif +#ifdef ENOENT + case ENOENT: + return ("ENOENT"); +#endif +#ifdef ESRCH + case ESRCH: + return ("ESRCH"); +#endif +#ifdef EINTR + case EINTR: + return ("EINTR"); +#endif +#ifdef EIO + case EIO: + return ("EIO"); +#endif +#ifdef ENXIO + case ENXIO: + return ("ENXIO"); +#endif +#ifdef E2BIG + case E2BIG: + return ("E2BIG"); +#endif +#ifdef ENOEXEC + case ENOEXEC: + return ("ENOEXEC"); +#endif +#ifdef EBADF + case EBADF: + return ("EBADF"); +#endif +#ifdef ECHILD + case ECHILD: + return ("ECHILD"); +#endif +#ifdef EDEADLK + case EDEADLK: + return ("EDEADLK"); +#endif +#ifdef ENOMEM + case ENOMEM: + return ("ENOMEM"); +#endif +#ifdef EACCES + case EACCES: + return ("EACCES"); +#endif +#ifdef EFAULT + case EFAULT: + return ("EFAULT"); +#endif +#ifdef ENOTBLK + case ENOTBLK: + return ("ENOTBLK"); +#endif +#ifdef EBUSY + case EBUSY: + return ("EBUSY"); +#endif +#ifdef EEXIST + case EEXIST: + return ("EEXIST"); +#endif +#ifdef EXDEV + case EXDEV: + return ("EXDEV"); +#endif +#ifdef ENODEV + case ENODEV: + return ("ENODEV"); +#endif +#ifdef ENOTDIR + case ENOTDIR: + return ("ENOTDIR"); +#endif +#ifdef EISDIR + case EISDIR: + return ("EISDIR"); +#endif +#ifdef EINVAL + case EINVAL: + return ("EINVAL"); +#endif +#ifdef ENFILE + case ENFILE: + return ("ENFILE"); +#endif +#ifdef EMFILE + case EMFILE: + return ("EMFILE"); +#endif +#ifdef ENOTTY + case ENOTTY: + return ("ENOTTY"); +#endif +#ifdef ETXTBSY + case ETXTBSY: + return ("ETXTBSY"); +#endif +#ifdef EFBIG + case EFBIG: + return ("EFBIG"); +#endif +#ifdef ENOSPC + case ENOSPC: + return ("ENOSPC"); +#endif +#ifdef ESPIPE + case ESPIPE: + return ("ESPIPE"); +#endif +#ifdef EROFS + case EROFS: + return ("EROFS"); +#endif +#ifdef EMLINK + case EMLINK: + return ("EMLINK"); +#endif +#ifdef EPIPE + case EPIPE: + return ("EPIPE"); +#endif +#ifdef EDOM + case EDOM: + return ("EDOM"); +#endif +#ifdef ERANGE + case ERANGE: + return ("ERANGE"); +#endif +#ifdef EAGAIN + case EAGAIN: + return ("EAGAIN"); +#endif +#ifdef EINPROGRESS + case EINPROGRESS: + return ("EINPROGRESS"); +#endif +#ifdef EALREADY + case EALREADY: + return ("EALREADY"); +#endif +#ifdef ENOTSOCK + case ENOTSOCK: + return ("ENOTSOCK"); +#endif +#ifdef EDESTADDRREQ + case EDESTADDRREQ: + return ("EDESTADDRREQ"); +#endif +#ifdef EMSGSIZE + case EMSGSIZE: + return ("EMSGSIZE"); +#endif +#ifdef EPROTOTYPE + case EPROTOTYPE: + return ("EPROTOTYPE"); +#endif +#ifdef ENOPROTOOPT + case ENOPROTOOPT: + return ("ENOPROTOOPT"); +#endif +#ifdef EPROTONOSUPPORT + case EPROTONOSUPPORT: + return ("EPROTONOSUPPORT"); +#endif +#ifdef ESOCKTNOSUPPORT + case ESOCKTNOSUPPORT: + return ("ESOCKTNOSUPPORT"); +#endif +#ifdef EOPNOTSUPP + case EOPNOTSUPP: + return ("EOPNOTSUPP"); +#endif +#ifdef EPFNOSUPPORT + case EPFNOSUPPORT: + return ("EPFNOSUPPORT"); +#endif +#ifdef EAFNOSUPPORT + case EAFNOSUPPORT: + return ("EAFNOSUPPORT"); +#endif +#ifdef EADDRINUSE + case EADDRINUSE: + return ("EADDRINUSE"); +#endif +#ifdef EADDRNOTAVAIL + case EADDRNOTAVAIL: + return ("EADDRNOTAVAIL"); +#endif +#ifdef ENETDOWN + case ENETDOWN: + return ("ENETDOWN"); +#endif +#ifdef ENETUNREACH + case ENETUNREACH: + return ("ENETUNREACH"); +#endif +#ifdef ENETRESET + case ENETRESET: + return ("ENETRESET"); +#endif +#ifdef ECONNABORTED + case ECONNABORTED: + return ("ECONNABORTED"); +#endif +#ifdef ECONNRESET + case ECONNRESET: + return ("ECONNRESET"); +#endif +#ifdef ENOBUFS + case ENOBUFS: + return ("ENOBUFS"); +#endif +#ifdef EISCONN + case EISCONN: + return ("EISCONN"); +#endif +#ifdef ENOTCONN + case ENOTCONN: + return ("ENOTCONN"); +#endif +#ifdef ESHUTDOWN + case ESHUTDOWN: + return ("ESHUTDOWN"); +#endif +#ifdef ETOOMANYREFS + case ETOOMANYREFS: + return ("ETOOMANYREFS"); +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: + return ("ETIMEDOUT"); +#endif +#ifdef ECONNREFUSED + case ECONNREFUSED: + return ("ECONNREFUSED"); +#endif +#ifdef ELOOP + case ELOOP: + return ("ELOOP"); +#endif +#ifdef ENAMETOOLONG + case ENAMETOOLONG: + return ("ENAMETOOLONG"); +#endif +#ifdef EHOSTDOWN + case EHOSTDOWN: + return ("EHOSTDOWN"); +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: + return ("EHOSTUNREACH"); +#endif +#ifdef ENOTEMPTY + case ENOTEMPTY: + return ("ENOTEMPTY"); +#endif +#ifdef EPROCLIM + case EPROCLIM: + return ("EPROCLIM"); +#endif +#ifdef EUSERS + case EUSERS: + return ("EUSERS"); +#endif +#ifdef EDQUOT + case EDQUOT: + return ("EDQUOT"); +#endif +#ifdef ESTALE + case ESTALE: + return ("ESTALE"); +#endif +#ifdef EREMOTE + case EREMOTE: + return ("EREMOTE"); +#endif +#ifdef EBADRPC + case EBADRPC: + return ("EBADRPC"); +#endif +#ifdef ERPCMISMATCH + case ERPCMISMATCH: + return ("ERPCMISMATCH"); +#endif +#ifdef EPROGUNAVAIL + case EPROGUNAVAIL: + return ("EPROGUNAVAIL"); +#endif +#ifdef EPROGMISMATCH + case EPROGMISMATCH: + return ("EPROGMISMATCH"); +#endif +#ifdef EPROCUNAVAIL + case EPROCUNAVAIL: + return ("EPROCUNAVAIL"); +#endif +#ifdef ENOLCK + case ENOLCK: + return ("ENOLCK"); +#endif +#ifdef ENOSYS + case ENOSYS: + return ("ENOSYS"); +#endif +#ifdef EFTYPE + case EFTYPE: + return ("EFTYPE"); +#endif +#ifdef EAUTH + case EAUTH: + return ("EAUTH"); +#endif +#ifdef ENEEDAUTH + case ENEEDAUTH: + return ("ENEEDAUTH"); +#endif +#ifdef EIDRM + case EIDRM: + return ("EIDRM"); +#endif +#ifdef ENOMSG + case ENOMSG: + return ("ENOMSG"); +#endif +#ifdef EOVERFLOW + case EOVERFLOW: + return ("EOVERFLOW"); +#endif +#ifdef ECANCELED + case ECANCELED: + return ("ECANCELED"); +#endif +#ifdef EILSEQ + case EILSEQ: + return ("EILSEQ"); +#endif +#ifdef ENOATTR + case ENOATTR: + return ("ENOATTR"); +#endif +#ifdef EDOOFUS + case EDOOFUS: + return ("EDOOFUS"); +#endif +#ifdef EBADMSG + case EBADMSG: + return ("EBADMSG"); +#endif +#ifdef EMULTIHOP + case EMULTIHOP: + return ("EMULTIHOP"); +#endif +#ifdef ENOLINK + case ENOLINK: + return ("ENOLINK"); +#endif +#ifdef EPROTO + case EPROTO: + return ("EPROTO"); +#endif + default: + snprintf(errnum, sizeof(errnum), "%d", error); + return (errnum); + } +} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/00.t new file mode 100755 index 0000000000..96050ad4f8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/00.t @@ -0,0 +1,178 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/00.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags changes flags" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..191" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect none stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n0} flags +expect 0 chflags ${n0} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n0} flags +expect 0 chflags ${n0} none +expect none stat ${n0} flags +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK stat ${n1} flags +expect none lstat ${n1} flags +expect 0 chflags ${n1} none +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 unlink ${n1} +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect none stat ${n1} flags +expect none lstat ${n1} flags +expect 0 lchflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE,SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE +expect UF_NODUMP,UF_IMMUTABLE,UF_APPEND,UF_NOUNLINK,UF_OPAQUE lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK +expect SF_ARCHIVED,SF_IMMUTABLE,SF_APPEND,SF_NOUNLINK lstat ${n1} flags +expect none stat ${n1} flags +expect 0 lchflags ${n1} none +expect none lstat ${n1} flags +expect none stat ${n1} flags +expect 0 unlink ${n1} +expect 0 unlink ${n0} + +# successful chflags(2) updates ctime. +expect 0 create ${n0} 0644 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect 0 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in UF_NODUMP UF_IMMUTABLE UF_APPEND UF_NOUNLINK UF_OPAQUE SF_ARCHIVED SF_IMMUTABLE SF_APPEND SF_NOUNLINK none; do + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect 0 lchflags ${n0} ${flag} + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -lt $ctime2 +done +expect 0 unlink ${n0} + +# unsuccessful chflags(2) does not update ctime. +expect 0 create ${n0} 0644 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} stat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 chflags ${n0} ${flag} + ctime2=`${fstest} stat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in UF_IMMUTABLE SF_IMMUTABLE none; do + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 lchflags ${n0} ${flag} + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -eq $ctime2 +done +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/01.t new file mode 100755 index 0000000000..8be8a098e0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/01.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chflags ${n0}/${n1}/test UF_IMMUTABLE +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/02.t new file mode 100755 index 0000000000..00bc09a5a5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/02.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..6" + +expect 0 create ${name255} 0644 +expect 0 chflags ${name255} UF_IMMUTABLE +expect UF_IMMUTABLE stat ${name255} flags +expect 0 chflags ${name255} none +expect 0 unlink ${name255} +expect ENAMETOOLONG chflags ${name256} UF_IMMUTABLE diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/03.t new file mode 100755 index 0000000000..2130dae5dd --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/03.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..13" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chflags ${path1023} UF_IMMUTABLE +expect 0 chflags ${path1023} none +expect 0 unlink ${path1023} +expect ENAMETOOLONG chflags ${path1024} UF_IMMUTABLE +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/04.t new file mode 100755 index 0000000000..4581d5a8ed --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/04.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chflags ${n0}/${n1}/test UF_IMMUTABLE +expect ENOENT chflags ${n0}/${n1} UF_IMMUTABLE +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/05.t new file mode 100755 index 0000000000..00710735e1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/05.t @@ -0,0 +1,35 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..16" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect UF_IMMUTABLE -u 65534 -g 65534 stat ${n1}/${n2} flags +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} none +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} UF_IMMUTABLE +expect UF_IMMUTABLE -u 65534 -g 65534 stat ${n1}/${n2} flags +expect 0 -u 65534 -g 65534 chflags ${n1}/${n2} none +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/06.t new file mode 100755 index 0000000000..80c089c5af --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/06.t @@ -0,0 +1,21 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chflags ${n0}/test UF_IMMUTABLE +expect ELOOP chflags ${n1}/test UF_IMMUTABLE +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/07.t new file mode 100755 index 0000000000..240e65bc9a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/07.t @@ -0,0 +1,54 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when the effective user ID does not match the owner of the file and the effective user ID is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE +expect none lstat ${n1} flags +expect 0 lchown ${n1} 65534 65534 +expect EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE +expect none lstat ${n1} flags +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/08.t new file mode 100755 index 0000000000..e076980faf --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/08.t @@ -0,0 +1,70 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK is set and the user is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..78" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 lchflags ${n1} ${flag} + expect EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + expect EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags +done +expect 0 lchflags ${n1} none +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/09.t new file mode 100755 index 0000000000..58a2f61386 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/09.t @@ -0,0 +1,82 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM when one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK is set and securelevel is greater than 0" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..102" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +old=`sysctl -n security.jail.chflags_allowed` +sysctl security.jail.chflags_allowed=1 >/dev/null + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 chflags ${n1} ${flag} + jexpect 1 `pwd` EPERM chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 chflags ${n1} UF_IMMUTABLE + expect ${flag} stat ${n1} flags +done +expect 0 chflags ${n1} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect 0 lchflags ${n1} ${flag} + jexpect 1 `pwd` EPERM lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + jexpect 1 `pwd` EPERM -u 65533 -g 65533 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags + jexpect 1 `pwd` EPERM -u 65534 -g 65534 lchflags ${n1} UF_IMMUTABLE + expect ${flag} lstat ${n1} flags +done +expect 0 lchflags ${n1} none +expect 0 unlink ${n1} + +sysctl security.jail.chflags_allowed=${old} >/dev/null +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/10.t new file mode 100755 index 0000000000..1f62a3e7bc --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/10.t @@ -0,0 +1,62 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM if non-super-user tries to set one of SF_IMMUTABLE, SF_APPEND, or SF_NOUNLINK" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..62" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 chflags ${n1} ${flag} + expect none stat ${n1} flags + expect EPERM -u 65534 -g 65534 chflags ${n1} ${flag} + expect none stat ${n1} flags +done +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect 0 lchown ${n1} 65534 65534 +for flag in SF_IMMUTABLE SF_APPEND SF_NOUNLINK; do + expect EPERM -u 65533 -g 65533 lchflags ${n1} ${flag} + expect none lstat ${n1} flags + expect EPERM -u 65534 -g 65534 lchflags ${n1} ${flag} + expect none lstat ${n1} flags +done +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/11.t new file mode 100755 index 0000000000..a4823d4f8c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/11.t @@ -0,0 +1,70 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/11.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EPERM if a user tries to set or remove the SF_SNAPSHOT flag" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..46" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 create ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 chown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect EPERM chflags ${n1} SF_SNAPSHOT +expect none stat ${n1} flags +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +expect EPERM -u 65534 -g 65534 lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect EPERM lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect 0 lchown ${n1} 65534 65534 +expect EPERM -u 65534 -g 65534 lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect EPERM lchflags ${n1} SF_SNAPSHOT +expect none lstat ${n1} flags +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/12.t new file mode 100755 index 0000000000..e4671d1dbb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/12.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/12.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..14" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chflags ${n0}/${n1} UF_IMMUTABLE + expect UF_IMMUTABLE stat ${n0}/${n1} flags + expect 0 chflags ${n0}/${n1} none + expect none stat ${n0}/${n1} flags + mount -ur /dev/md${n} + expect EROFS chflags ${n0}/${n1} UF_IMMUTABLE + expect none stat ${n0}/${n1} flags + mount -uw /dev/md${n} + expect 0 chflags ${n0}/${n1} UF_IMMUTABLE + expect UF_IMMUTABLE stat ${n0}/${n1} flags + expect 0 chflags ${n0}/${n1} none + expect none stat ${n0}/${n1} flags + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/13.t new file mode 100755 index 0000000000..6da6bf039b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chflags/13.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chflags/13.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chflags returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..2" + +expect EFAULT chflags NULL UF_IMMUTABLE +expect EFAULT chflags DEADCODE UF_IMMUTABLE diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/00.t new file mode 100755 index 0000000000..74dc5524af --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/00.t @@ -0,0 +1,161 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/00.t,v 1.2 2007/01/25 20:48:14 pjd Exp $ + +desc="chmod changes permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +if supported lchmod; then + echo "1..77" +else + echo "1..58" +fi + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect 0644 stat ${n0} mode +expect 0 chmod ${n0} 0111 +expect 0111 stat ${n0} mode +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0755 stat ${n0} mode +expect 0 chmod ${n0} 0753 +expect 0753 stat ${n0} mode +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0644 stat ${n0} mode +expect 0 chmod ${n0} 0310 +expect 0310 stat ${n0} mode +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect 0644 stat ${n1} mode +expect 0 chmod ${n1} 0321 +expect 0321 stat ${n1} mode +expect 0321 lstat ${n0} mode +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +if supported lchmod; then + expect 0 create ${n0} 0644 + expect 0 symlink ${n0} ${n1} + expect 0644 stat ${n1} mode + expect 0 lchmod ${n1} 0321 + expect 0321 lstat ${n1} mode + expect 0 lchmod ${n1} 0531 + expect 0531 lstat ${n1} mode + expect 0644 stat ${n0} mode + expect 0644 stat ${n1} mode + expect 0 unlink ${n0} + expect 0 unlink ${n1} +fi + +# successful chmod(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0111 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0753 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chmod ${n0} 0310 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect 0 lchmod ${n0} 0321 + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -lt $ctime2 + expect 0 unlink ${n0} +fi + +# unsuccessful chmod(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0111 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0753 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 chmod ${n0} 0310 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + ctime1=`${fstest} lstat ${n0} ctime` + sleep 1 + expect EPERM -u 65534 lchmod ${n0} 0321 + ctime2=`${fstest} lstat ${n0} ctime` + test_check $ctime1 -eq $ctime2 + expect 0 unlink ${n0} +fi + +# POSIX: If the calling process does not have appropriate privileges, and if +# the group ID of the file does not match the effective group ID or one of the +# supplementary group IDs and if the file is a regular file, bit S_ISGID +# (set-group-ID on execution) in the file's mode shall be cleared upon +# successful return from chmod(). + +expect 0 create ${n0} 0755 +expect 0 chown ${n0} 65535 65535 +expect 0 -u 65535 -g 65535 chmod ${n0} 02755 +expect 02755 stat ${n0} mode +expect 0 -u 65535 -g 65535 chmod ${n0} 0755 +expect 0755 stat ${n0} mode + +# Unfortunately FreeBSD doesn't clear set-gid bit, but returns EPERM instead. +case "${os}" in +FreeBSD) + expect EPERM -u 65535 -g 65534 chmod ${n0} 02755 + expect 0755 stat ${n0} mode + ;; +*) + expect 0 -u 65535 -g 65534 chmod ${n0} 02755 + expect 0755 stat ${n0} mode + ;; +esac +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/01.t new file mode 100755 index 0000000000..6f84c7c8fb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chmod ${n0}/${n1}/test 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/02.t new file mode 100755 index 0000000000..7a5b4a4bb7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 chmod ${name255} 0620 +expect 0620 stat ${name255} mode +expect 0 unlink ${name255} +expect ENAMETOOLONG chmod ${name256} 0620 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/03.t new file mode 100755 index 0000000000..eba3833d69 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chmod ${path1023} 0642 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG chmod ${too_long} 0642 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/04.t new file mode 100755 index 0000000000..2e59773d7d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chmod ${n0}/${n1}/test 0644 +expect ENOENT chmod ${n0}/${n1} 0644 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/05.t new file mode 100755 index 0000000000..1753e0915e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/05.t @@ -0,0 +1,31 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0642 +expect 0642 -u 65534 -g 65534 stat ${n1}/${n2} mode +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 chmod ${n1}/${n2} 0620 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0420 +expect 0420 -u 65534 -g 65534 stat ${n1}/${n2} mode +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/06.t new file mode 100755 index 0000000000..bb13ff523d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/06.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chmod ${n0}/test 0644 +expect ELOOP chmod ${n1}/test 0644 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/07.t new file mode 100755 index 0000000000..b3c95e8d83 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/07.t @@ -0,0 +1,31 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EPERM if the operation would change the ownership, but the effective user ID is not the super-user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 chmod ${n1}/${n2} 0642 +expect 0642 stat ${n1}/${n2} mode +expect EPERM -u 65533 -g 65533 chmod ${n1}/${n2} 0641 +expect 0642 stat ${n1}/${n2} mode +expect 0 chown ${n1}/${n2} 0 0 +expect EPERM -u 65534 -g 65534 chmod ${n1}/${n2} 0641 +expect 0642 stat ${n1}/${n2} mode +expect 0 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/08.t new file mode 100755 index 0000000000..f88239696e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/08.t @@ -0,0 +1,59 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..40" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM chmod ${n0} 0600 +expect 0644 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 chmod ${n0} 0600 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 chmod ${n0} 0600 +expect 0600 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 chmod ${n0} 0600 +expect 0600 stat ${n0} mode +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/09.t new file mode 100755 index 0000000000..68580c3009 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/09.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chmod ${n0}/${n1} 0640 + expect 0640 stat ${n0}/${n1} mode + mount -ur /dev/md${n} + expect EROFS chmod ${n0}/${n1} 0600 + expect 0640 stat ${n0}/${n1} mode + mount -uw /dev/md${n} + expect 0 chmod ${n0}/${n1} 0600 + expect 0600 stat ${n0}/${n1} mode + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/10.t new file mode 100755 index 0000000000..2a996bf783 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/10.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT chmod NULL 0644 +expect EFAULT chmod DEADCODE 0644 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/11.t new file mode 100755 index 0000000000..1cba21a52b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chmod/11.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chmod/11.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chmod returns EFTYPE if the effective user ID is not the super-user, the mode includes the sticky bit (S_ISVTX), and path does not refer to a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..20" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chmod ${n1} 01755 +expect 01755 stat ${n1} mode +expect 0 rmdir ${n1} + +expect 0 create ${n1} 0644 +expect 0 chmod ${n1} 01644 +expect 01644 stat ${n1} mode +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 chmod ${n1} 01755 +expect 01755 stat ${n1} mode +expect 0 rmdir ${n1} + +expect 0 create ${n1} 0644 +expect 0 chown ${n1} 65534 65534 +case "${os}" in +FreeBSD) + expect EFTYPE -u 65534 -g 65534 chmod ${n1} 01644 + expect 0644 stat ${n1} mode + ;; +SunOS) + expect 0 -u 65534 -g 65534 chmod ${n1} 01644 + expect 0644 stat ${n1} mode + ;; +Linux) + expect 0 -u 65534 -g 65534 chmod ${n1} 01644 + expect 01644 stat ${n1} mode + ;; +esac +expect 0 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/00.t new file mode 100755 index 0000000000..577170d095 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/00.t @@ -0,0 +1,376 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/00.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown changes ownership" + +dir=`dirname $0` +. ${dir}/../misc.sh + +if supported lchmod; then + echo "1..186" +else + echo "1..171" +fi + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +# super-user can always modify ownership +# 2 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 unlink ${n0} +# 8 +expect 0 mkfifo ${n0} 0644 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 unlink ${n0} +# 14 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 123 456 +expect 123,456 lstat ${n0} uid,gid +expect 0 chown ${n0} 0 0 +expect 0,0 lstat ${n0} uid,gid +expect 0 rmdir ${n0} +# 20 +expect 0 create ${n0} 0644 +expect 0 symlink ${n0} ${n1} +expect 0 chown ${n1} 123 456 +expect 123,456 stat ${n1} uid,gid +expect 123,456 stat ${n0} uid,gid +expect 0 lchown ${n1} 135 579 +expect 135,579 lstat ${n1} uid,gid +expect 123,456 stat ${n1} uid,gid +expect 123,456 stat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +# non-super-user can modify file group if he is owner of a file and +# gid he is setting is in his groups list. +# 31 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +expect 0 -u 65534 -g 65532,65531 -- chown ${n0} -1 65532 +expect 65534,65532 lstat ${n0} uid,gid +expect 0 -u 65534 -g 65532,65531 chown ${n0} 65534 65531 +expect 65534,65531 lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# chown(2) return 0 if user is not owner of a file, but chown(2) is called +# with both uid and gid equal to -1. +# 39 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 -u 65532 -g 65531 -- chown ${n0} -1 -1 +expect 0 unlink ${n0} + +# when super-user calls chown(2), set-uid and set-gid bits are not removed. +# 43 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 65532 65531 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac +expect 0 unlink ${n0} +# 50 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 0 0 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 65534 65533 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac + +expect 0 unlink ${n0} +# 57 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 chown ${n0} 0 0 +case "${os}" in +Linux) + expect 0555 lstat ${n0} mode + ;; +*) + expect 06555 lstat ${n0} mode + ;; +esac +expect 0 unlink ${n0} + +# when non-super-user calls chown(2) successfully, set-uid and set-gid bits are +# removed, except when both uid and gid are equal to -1. +# 64 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532 +expect 0555,65534,65532 lstat ${n0} mode,uid,gid +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533 +expect 0555,65534,65533 lstat ${n0} mode,uid,gid +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1 +case "${os}" in +Linux) + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + ;; +*) + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + ;; +esac + +expect 0 unlink ${n0} +# 79 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65533 +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 chown ${n0} 65534 65532 +case "${os}:${fs}" in +Linux:ext3|Linux:ntfs-3g) + expect 06555,65534,65532 lstat ${n0} mode,uid,gid + ;; +*) + expect 0555,65534,65532 lstat ${n0} mode,uid,gid + ;; +esac +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 65533 +case "${os}:${fs}" in +Linux:ext3|Linux:ntfs-3g) + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + ;; +*) + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + ;; +esac +expect 0 chmod ${n0} 06555 +expect 06555 lstat ${n0} mode +expect 0 -u 65534 -g 65533,65532 -- chown ${n0} -1 -1 +expect 06555,65534,65533 lstat ${n0} mode,uid,gid +expect 0 rmdir ${n0} +# 94 +if supported lchmod; then + expect 0 symlink ${n1} ${n0} + expect 0 lchown ${n0} 65534 65533 + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 lchown ${n0} 65534 65532 + expect 0555,65534,65532 lstat ${n0} mode,uid,gid + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 65533 + expect 0555,65534,65533 lstat ${n0} mode,uid,gid + expect 0 lchmod ${n0} 06555 + expect 06555 lstat ${n0} mode + expect 0 -u 65534 -g 65533,65532 -- lchown ${n0} -1 -1 + expect 06555,65534,65533 lstat ${n0} mode,uid,gid + expect 0 unlink ${n0} +fi + +# successfull chown(2) call (except uid and gid equal to -1) updates ctime. +# 109 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 114 +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} +# 119 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 124 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 lchown ${n0} 65534 65533 +expect 65534,65533 lstat ${n0} uid,gid +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 129 +expect 0 create ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 135 +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n0} +# 141 +expect 0 mkfifo ${n0} 0644 +expect 0 chown ${n0} 65534 65533 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 chown ${n0} 65534 65533 +expect 0 -u 65534 -g 65532 chown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 148 +expect 0 symlink ${n1} ${n0} +expect 0 lchown ${n0} 65534 65533 +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 -u 65534 -g 65532 lchown ${n0} 65534 65532 +expect 65534,65532 lstat ${n0} uid,gid +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} +# 154 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} +# 158 +expect 0 mkdir ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 rmdir ${n0} +# 162 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 -- chown ${n0} -1 -1 +ctime2=`${fstest} stat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} +# 166 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 -- lchown ${n0} -1 -1 +ctime2=`${fstest} lstat ${n0} ctime` +case "${os}:${fs}" in +Linux:ext3) + test_check $ctime1 -lt $ctime2 + ;; +*) + test_check $ctime1 -eq $ctime2 + ;; +esac +expect 0 unlink ${n0} + +# unsuccessful chown(2) does not update ctime. +# 170 +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -- chown ${n0} 65534 -1 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} +# 174 +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 -- chown ${n0} -1 65534 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} +# 178 +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 chown ${n0} 65534 65534 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} +# 182 +expect 0 symlink ${n1} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect EPERM -u 65534 -g 65534 lchown ${n0} 65534 65534 +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +# 186 +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/01.t new file mode 100755 index 0000000000..b1cb2f0fb4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/01.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR chown ${n0}/${n1}/test 65534 65534 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/02.t new file mode 100755 index 0000000000..e9814bd32e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/02.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 chown ${name255} 65534 65534 +expect 65534,65534 stat ${name255} uid,gid +expect 0 unlink ${name255} +expect ENAMETOOLONG chown ${name256} 65533 65533 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/03.t new file mode 100755 index 0000000000..f8569fd156 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/03.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 chown ${path1023} 65534 65534 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG chown ${too_long} 65533 65533 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/04.t new file mode 100755 index 0000000000..1395c3b68d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/04.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT chown ${n0}/${n1}/test 65534 65534 +expect ENOENT chown ${n0}/${n1} 65534 65534 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/05.t new file mode 100755 index 0000000000..373fc8678d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/05.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/05.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65533 +expect 65534,65533 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65534 +expect 0 chmod ${n1} 0755 +expect 65534,65533 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 -u 65534 -g 65533,65534 -- chown ${n1}/${n2} -1 65534 +expect 65534,65534 -u 65534 -g 65534 stat ${n1}/${n2} uid,gid +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/06.t new file mode 100755 index 0000000000..661fd864c4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/06.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/06.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP chown ${n0}/test 65534 65534 +expect ELOOP chown ${n1}/test 65534 65534 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/07.t new file mode 100755 index 0000000000..af51ec5fcd --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/07.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/07.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EPERM if the operation would change the ownership, but the effective user ID is not the super-user and the process is not an owner of the file" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect EPERM -u 65534 -g 65534 chown ${n1}/${n2} 65533 65533 +expect EPERM -u 65533 -g 65533 chown ${n1}/${n2} 65534 65534 +expect EPERM -u 65533 -g 65533 chown ${n1}/${n2} 65533 65533 +expect EPERM -u 65534 -g 65534 -- chown ${n1}/${n2} -1 65533 +expect 0 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/08.t new file mode 100755 index 0000000000..a5bbed79f6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/08.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/08.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..34" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 chown ${n0} 65534 65534 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 chown ${n0} 65534 65534 +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/09.t new file mode 100755 index 0000000000..5097d00c4a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/09.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/09.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:{fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 chown ${n0}/${n1} 65534 65534 + expect 65534,65534 stat ${n0}/${n1} uid,gid + mount -ur /dev/md${n} + expect EROFS chown ${n0}/${n1} 65533 65533 + expect 65534,65534 stat ${n0}/${n1} uid,gid + mount -uw /dev/md${n} + expect 0 chown ${n0}/${n1} 65533 65533 + expect 65533,65533 stat ${n0}/${n1} uid,gid + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/10.t new file mode 100755 index 0000000000..bb79067c23 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/chown/10.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/chown/10.t,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +desc="chown returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT chown NULL 65534 65534 +expect EFAULT chown DEADCODE 65534 65534 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/conf b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/conf new file mode 100644 index 0000000000..5e53ea4d24 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/conf @@ -0,0 +1,8 @@ +# $FreeBSD: src/tools/regression/fstest/tests/conf,v 1.1 2007/01/17 01:42:08 pjd Exp $ +# fstest configuration file + +# Known operating systems: FreeBSD, SunOS, Linux +os=`uname` + +# Known file systems: UFS, ZFS, ext3, ntfs-3g, xfs +fs="ext3" diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/00.t new file mode 100755 index 0000000000..dcd408f357 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/00.t @@ -0,0 +1,151 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/00.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link creates hardlinks" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..82" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` + +expect 0 mkdir ${n3} 0755 +cdir=`pwd` +cd ${n3} + +expect 0 create ${n0} 0644 +expect regular,0644,1 lstat ${n0} type,mode,nlink + +expect 0 link ${n0} ${n1} +expect regular,0644,2 lstat ${n0} type,mode,nlink +expect regular,0644,2 lstat ${n1} type,mode,nlink + +expect 0 link ${n1} ${n2} +expect regular,0644,3 lstat ${n0} type,mode,nlink +expect regular,0644,3 lstat ${n1} type,mode,nlink +expect regular,0644,3 lstat ${n2} type,mode,nlink + +expect 0 chmod ${n1} 0201 +expect 0 chown ${n1} 65534 65533 + +expect regular,0201,3,65534,65533 lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,3,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect regular,0201,3,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,2,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect regular,0201,2,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n2} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect regular,0201,1,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n1} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect ENOENT lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 mkfifo ${n0} 0644 +expect fifo,0644,1 lstat ${n0} type,mode,nlink + +expect 0 link ${n0} ${n1} +expect fifo,0644,2 lstat ${n0} type,mode,nlink +expect fifo,0644,2 lstat ${n1} type,mode,nlink + +expect 0 link ${n1} ${n2} +expect fifo,0644,3 lstat ${n0} type,mode,nlink +expect fifo,0644,3 lstat ${n1} type,mode,nlink +expect fifo,0644,3 lstat ${n2} type,mode,nlink + +expect 0 chmod ${n1} 0201 +expect 0 chown ${n1} 65534 65533 + +expect fifo,0201,3,65534,65533 lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,3,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect fifo,0201,3,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,2,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect fifo,0201,2,65534,65533 lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n2} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect fifo,0201,1,65534,65533 lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +expect 0 unlink ${n1} +expect ENOENT lstat ${n0} type,mode,nlink,uid,gid +expect ENOENT lstat ${n1} type,mode,nlink,uid,gid +expect ENOENT lstat ${n2} type,mode,nlink,uid,gid + +# successful link(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect 0 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -lt $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -lt $dmtime2 +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect 0 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -lt $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -lt $dmtime2 +expect 0 unlink ${n0} +expect 0 unlink ${n1} + +# unsuccessful link(2) does not update ctime. +expect 0 create ${n0} 0644 +expect 0 -- chown ${n0} 65534 -1 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect EACCES -u 65534 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -eq $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -eq $dmtime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0 -- chown ${n0} 65534 -1 +ctime1=`${fstest} stat ${n0} ctime` +dctime1=`${fstest} stat . ctime` +dmtime1=`${fstest} stat . mtime` +sleep 1 +expect EACCES -u 65534 link ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +dctime2=`${fstest} stat . ctime` +test_check $dctime1 -eq $dctime2 +dmtime2=`${fstest} stat . mtime` +test_check $dctime1 -eq $dmtime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n3} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/01.t new file mode 100755 index 0000000000..be003b92f6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/01.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOTDIR if a component of either path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR link ${n0}/${n1}/test ${n0}/${n2} +expect 0 create ${n0}/${n2} 0644 +expect ENOTDIR link ${n0}/${n2} ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/02.t new file mode 100755 index 0000000000..6c34e8ea9d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/02.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENAMETOOLONG if a component of either pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` + +expect 0 create ${name255} 0644 +expect 0 link ${name255} ${n0} +expect 0 unlink ${name255} +expect 0 link ${n0} ${name255} +expect 0 unlink ${n0} +expect 0 unlink ${name255} + +expect 0 create ${n0} 0644 +expect ENAMETOOLONG link ${n0} ${name256} +expect 0 unlink ${n0} +expect ENAMETOOLONG link ${name256} ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/03.t new file mode 100755 index 0000000000..0ad3354ac1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/03.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..16" + +n0=`namegen` + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 link ${path1023} ${n0} +expect 0 unlink ${path1023} +expect 0 link ${n0} ${path1023} +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG link ${n0} ${too_long} +unlink_too_long +expect 0 unlink ${n0} +create_too_long +expect ENAMETOOLONG link ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/04.t new file mode 100755 index 0000000000..a3b8f7f3dc --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/04.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOENT if a component of either path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT link ${n0}/${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ENOENT link ${n2} ${n0}/${n1}/test +expect 0 unlink ${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/05.t new file mode 100755 index 0000000000..a95d3d1f8b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/05.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EMLINK if the link count of the file named by name1 would exceed 32767" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs -i 1 /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + i=1 + while :; do + link ${n0}/${n1} ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + test_check $i -eq 32767 + + expect EMLINK link ${n0}/${n1} ${n0}/${n2} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/06.t new file mode 100755 index 0000000000..b0391dce80 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/06.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EACCES when a component of either path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..18" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 unlink ${n2}/${n4} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n1}/${n4} +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} + +expect 0 chmod ${n1} 0755 +expect 0 chmod ${n2} 0644 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/07.t new file mode 100755 index 0000000000..9760e35c50 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/07.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EACCES when the requested link requires writing in a directory with a mode that denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 unlink ${n2}/${n4} + +expect 0 chmod ${n2} 0555 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n2}/${n4} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 link ${n1}/${n3} ${n1}/${n4} +expect 0 chmod ${n1} 0755 + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/08.t new file mode 100755 index 0000000000..24b764b20c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/08.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ELOOP if too many symbolic links were encountered in translating one of the pathnames" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP link ${n0}/test ${n2} +expect ELOOP link ${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ELOOP link ${n2} ${n0}/test +expect ELOOP link ${n2} ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect 0 unlink ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/09.t new file mode 100755 index 0000000000..7899fcbc3b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/09.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOENT if the source file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect ENOENT link ${n0} ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/10.t new file mode 100755 index 0000000000..61612e6b65 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/10.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EEXIST if the destination file does exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 + +expect 0 create ${n1} 0644 +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +expect EEXIST link ${n0} ${n1} +expect 0 rmdir ${n1} + +expect 0 symlink test ${n1} +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EEXIST link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/11.t new file mode 100755 index 0000000000..8a7c571cf0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/11.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the source file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +case "${os}:${fs}" in +SunOS:UFS) + echo "1..10" + + expect 0 mkdir ${n0} 0755 + expect 0 link ${n0} ${n1} + expect 0 unlink ${n1} + expect 0 rmdir ${n0} + ;; +*) + echo "1..9" + + expect 0 mkdir ${n0} 0755 + expect EPERM link ${n0} ${n1} + expect 0 rmdir ${n0} + ;; +esac + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 mkdir ${n1} 0755 +expect EPERM -u 65534 -g 65534 link ${n1} ${n2} +expect 0 -u 65534 -g 65534 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/12.t new file mode 100755 index 0000000000..a9366a3449 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/12.t @@ -0,0 +1,55 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/12.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the source file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..32" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 + +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_APPEND +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_APPEND +expect EPERM link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 link ${n0} ${n1} +expect 0 unlink ${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 link ${n0} ${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/13.t new file mode 100755 index 0000000000..82dca47127 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/13.t @@ -0,0 +1,56 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/13.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EPERM if the parent directory of the destination file has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..32" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_APPEND +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_APPEND +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 link ${n0}/${n1} ${n0}/${n2} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n2} + +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/14.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/14.t new file mode 100755 index 0000000000..40a91bca41 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/14.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/14.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EXDEV if the source and the destination files are on different file systems" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..8" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect EXDEV link ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + expect 0 create ${n1} 0644 + expect EXDEV link ${n1} ${n0}/${n2} + expect 0 unlink ${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/15.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/15.t new file mode 100755 index 0000000000..943df52fa3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/15.t @@ -0,0 +1,38 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/15.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns ENOSPC if the directory in which the entry for the new link is being placed cannot be extended because there is no space left on the file system containing the directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..4" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + i=0 + while :; do + link ${n0}/${n1} ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC link ${n0}/${n1} ${n0}/${n2} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/16.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/16.t new file mode 100755 index 0000000000..fad792edbc --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/16.t @@ -0,0 +1,39 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/16.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EROFS if the requested link requires writing in a directory on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..9" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + + expect 0 link ${n0}/${n1} ${n0}/${n2} + expect 0 unlink ${n0}/${n2} + mount -ur /dev/md${n} + expect EROFS link ${n0}/${n1} ${n0}/${n2} + mount -uw /dev/md${n} + expect 0 link ${n0}/${n1} ${n0}/${n2} + expect 0 unlink ${n0}/${n2} + + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/17.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/17.t new file mode 100755 index 0000000000..278e27cf81 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/link/17.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/link/17.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="link returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EFAULT link ${n0} NULL +expect EFAULT link ${n0} DEADCODE +expect 0 unlink ${n0} +expect EFAULT link NULL ${n0} +expect EFAULT link DEADCODE ${n0} +expect EFAULT link NULL DEADCODE +expect EFAULT link DEADCODE NULL diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/misc.sh b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/misc.sh new file mode 100644 index 0000000000..0faefcb35a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/misc.sh @@ -0,0 +1,143 @@ +# $FreeBSD: src/tools/regression/fstest/tests/misc.sh,v 1.1 2007/01/17 01:42:08 pjd Exp $ + +ntest=1 + +name253="_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789_12" +name255="${name253}34" +name256="${name255}5" +path1021="${name255}/${name255}/${name255}/${name253}" +path1023="${path1021}/x" +path1024="${path1023}x" + +echo ${dir} | egrep '^/' >/dev/null 2>&1 +if [ $? -eq 0 ]; then + maindir="${dir}/../.." +else + maindir="`pwd`/${dir}/../.." +fi +fstest="${maindir}/fstest" +. ${maindir}/tests/conf + +run_getconf() +{ + if val=$(getconf "${1}" .); then + if [ "$value" = "undefined" ]; then + echo "${1} is undefined" + exit 1 + fi + else + echo "Failed to get ${1}" + exit 1 + fi + + echo $val +} + +name_max_val=$(run_getconf NAME_MAX) +path_max_val=$(run_getconf PATH_MAX) + +name_max="_" +i=1 +while test $i -lt $name_max_val ; do + name_max="${name_max}x" + i=$(($i+1)) +done + +num_of_dirs=$(( ($path_max_val + $name_max_val) / ($name_max_val + 1) - 1 )) + +long_dir="${name_max}" +i=1 +while test $i -lt $num_of_dirs ; do + long_dir="${long_dir}/${name_max}" + i=$(($i+1)) +done +long_dir="${long_dir}/x" + +too_long="${long_dir}/${name_max}" + +create_too_long() +{ + mkdir -p ${long_dir} +} + +unlink_too_long() +{ + rm -rf ${name_max} +} + +expect() +{ + e="${1}" + shift + r=`${fstest} $* 2>/dev/null | tail -1` + echo "${r}" | egrep '^'${e}'$' >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +jexpect() +{ + s="${1}" + d="${2}" + e="${3}" + shift 3 + r=`jail -s ${s} / fstest 127.0.0.1 /bin/sh -c "cd ${d} && ${fstest} $* 2>/dev/null" | tail -1` + echo "${r}" | egrep '^'${e}'$' >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +test_check() +{ + if [ $* ]; then + echo "ok ${ntest}" + else + echo "not ok ${ntest}" + fi + ntest=`expr $ntest + 1` +} + +namegen() +{ + echo "fstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | md5sum | cut -f1 -d' '`" +} + +quick_exit() +{ + echo "1..1" + echo "ok 1" + exit 0 +} + +supported() +{ + case "${1}" in + chflags) + if [ ${os} != "FreeBSD" -o ${fs} != "UFS" ]; then + return 1 + fi + ;; + lchmod) + if [ ${os} != "FreeBSD" ]; then + return 1 + fi + ;; + esac + return 0 +} + +require() +{ + if supported ${1}; then + return + fi + quick_exit +} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/00.t new file mode 100755 index 0000000000..cd39339d29 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/00.t @@ -0,0 +1,73 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="mkdir creates directories" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..36" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: The file permission bits of the new directory shall be initialized from +# mode. These file permission bits of the mode argument shall be modified by the +# process' file creation mask. +expect 0 mkdir ${n0} 0755 +expect dir,0755 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 mkdir ${n0} 0151 +expect dir,0151 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 077 mkdir ${n0} 0151 +expect dir,0100 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 070 mkdir ${n0} 0345 +expect dir,0305 lstat ${n0} type,mode +expect 0 rmdir ${n0} +expect 0 -U 0501 mkdir ${n0} 0345 +expect dir,0244 lstat ${n0} type,mode +expect 0 rmdir ${n0} + +# POSIX: The directory's user ID shall be set to the process' effective user ID. +# The directory's group ID shall be set to the group ID of the parent directory +# or to the effective group ID of the process. +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 mkdir ${n0} 0755 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 rmdir ${n0} +expect 0 -u 65535 -g 65534 mkdir ${n0} 0755 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 rmdir ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 mkdir ${n0} 0755 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 rmdir ${n0} + +# POSIX: Upon successful completion, mkdir() shall mark for update the st_atime, +# st_ctime, and st_mtime fields of the directory. Also, the st_ctime and +# st_mtime fields of the directory that contains the new entry shall be marked +# for update. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 mkdir ${n0} 0755 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/01.t new file mode 100755 index 0000000000..b8b5eb10bb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR mkdir ${n0}/${n1}/test 0755 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/02.t new file mode 100755 index 0000000000..b23f9f56c0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/02.t @@ -0,0 +1,13 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +expect 0 mkdir ${name255} 0755 +expect 0 rmdir ${name255} +expect ENAMETOOLONG mkdir ${name256} 0755 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/03.t new file mode 100755 index 0000000000..6d90e5319c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/03.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkdir ${path1023} 0755 +expect 0 rmdir ${path1023} +create_too_long +expect ENAMETOOLONG mkdir ${too_long} 0755 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/04.t new file mode 100755 index 0000000000..4de4a9dc5e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOENT if a component of the path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT mkdir ${n0}/${n1}/test 0755 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/05.t new file mode 100755 index 0000000000..3631ddeefd --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/06.t new file mode 100755 index 0000000000..27057394a7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/06.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EACCES when write permission is denied on the parent directory of the directory to be created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/07.t new file mode 100755 index 0000000000..fe311e87fe --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP mkdir ${n0}/test 0755 +expect ELOOP mkdir ${n1}/test 0755 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/08.t new file mode 100755 index 0000000000..f8d8eca64e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/08.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EPERM if the parent directory of the directory to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/09.t new file mode 100755 index 0000000000..1c5eb4d462 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/09.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkdir ${n0}/${n1} 0755 + expect 0 rmdir ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS mkdir ${n0}/${n1} 0755 + mount -uw /dev/md${n} + expect 0 mkdir ${n0}/${n1} 0755 + expect 0 rmdir ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/10.t new file mode 100755 index 0000000000..06b5c60831 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/10.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EEXIST if the named file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EEXIST mkdir ${n0} 0755 +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST mkdir ${n0} 0755 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/11.t new file mode 100755 index 0000000000..1413b5f52a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns ENOSPC if there are no free inodes on the file system on which the directory is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + mkdir ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC mkdir ${n0}/${n1} 0755 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/12.t new file mode 100755 index 0000000000..dfc868cd8f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkdir/12.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkdir/12.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkdir returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT mkdir NULL 0755 +expect EFAULT mkdir DEADCODE 0755 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/00.t new file mode 100755 index 0000000000..ba4843198d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/00.t @@ -0,0 +1,73 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="mkfifo creates fifo files" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..36" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: The file permission bits of the new FIFO shall be initialized from +# mode. The file permission bits of the mode argument shall be modified by the +# process' file creation mask. +expect 0 mkfifo ${n0} 0755 +expect fifo,0755 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 mkfifo ${n0} 0151 +expect fifo,0151 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 077 mkfifo ${n0} 0151 +expect fifo,0100 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 070 mkfifo ${n0} 0345 +expect fifo,0305 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 0501 mkfifo ${n0} 0345 +expect fifo,0244 lstat ${n0} type,mode +expect 0 unlink ${n0} + +# POSIX: The FIFO's user ID shall be set to the process' effective user ID. +# The FIFO's group ID shall be set to the group ID of the parent directory or to +# the effective group ID of the process. +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 mkfifo ${n0} 0755 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 -u 65535 -g 65534 mkfifo ${n0} 0755 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 mkfifo ${n0} 0755 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# POSIX: Upon successful completion, mkfifo() shall mark for update the +# st_atime, st_ctime, and st_mtime fields of the file. Also, the st_ctime and +# st_mtime fields of the directory that contains the new entry shall be marked +# for update. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 mkfifo ${n0} 0755 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/01.t new file mode 100755 index 0000000000..90a9307ed6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/01.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR mkfifo ${n0}/${n1}/test 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/02.t new file mode 100755 index 0000000000..f0d5cae129 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/02.t @@ -0,0 +1,13 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/02.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +expect 0 mkfifo ${name255} 0644 +expect 0 unlink ${name255} +expect ENAMETOOLONG mkfifo ${name256} 0644 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/03.t new file mode 100755 index 0000000000..4c1feeda3f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/03.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/03.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..11" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkfifo ${path1023} 0644 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG mkfifo ${too_long} 0644 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/04.t new file mode 100755 index 0000000000..9fbfcb2929 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/04.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOENT if a component of the path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT mkfifo ${n0}/${n1}/test 0644 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/05.t new file mode 100755 index 0000000000..0c98abc02c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/05.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/06.t new file mode 100755 index 0000000000..be99141098 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/06.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/06.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EACCES when write permission is denied on the parent directory of the file to be created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/07.t new file mode 100755 index 0000000000..3bb381e9be --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/07.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP mkfifo ${n0}/test 0644 +expect ELOOP mkfifo ${n1}/test 0644 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/08.t new file mode 100755 index 0000000000..9ea2e79e04 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/08.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/08.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkfifo ${n0}/${n1} 0644 + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS mkfifo ${n0}/${n1} 0644 + mount -uw /dev/md${n} + expect 0 mkfifo ${n0}/${n1} 0644 + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/09.t new file mode 100755 index 0000000000..e3931b70f6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/09.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/09.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EEXIST if the named file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EEXIST mkfifo ${n0} 0644 +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST mkfifo ${n0} 0644 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/10.t new file mode 100755 index 0000000000..d65f191e9d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/10.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/10.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns EPERM if the parent directory of the file to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 mkfifo ${n0}/${n1} 0644 +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/11.t new file mode 100755 index 0000000000..6ca965b08b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/11.t,v 1.1 2007/01/17 01:42:09 pjd Exp $ + +desc="mkfifo returns ENOSPC if there are no free inodes on the file system on which the file is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + mkfifo ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC mkfifo ${n0}/${n1} 0644 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/12.t new file mode 100755 index 0000000000..2280194d76 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/mkfifo/12.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/mkfifo/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="mkfifo returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT mkfifo NULL 0644 +expect EFAULT mkfifo DEADCODE 0644 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/00.t new file mode 100755 index 0000000000..75d99b83ba --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/00.t @@ -0,0 +1,99 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/00.t,v 1.2 2007/01/25 20:50:02 pjd Exp $ + +desc="open opens (and eventually creates) a file" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..47" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +# POSIX: (If O_CREAT is specified and the file doesn't exist) [...] the access +# permission bits of the file mode shall be set to the value of the third +# argument taken as type mode_t modified as follows: a bitwise AND is performed +# on the file-mode bits and the corresponding bits in the complement of the +# process' file mode creation mask. Thus, all bits in the file mode whose +# corresponding bit in the file mode creation mask is set are cleared. +expect 0 open ${n0} O_CREAT,O_WRONLY 0755 +expect regular,0755 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 open ${n0} O_CREAT,O_WRONLY 0151 +expect regular,0151 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 077 open ${n0} O_CREAT,O_WRONLY 0151 +expect regular,0100 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 070 open ${n0} O_CREAT,O_WRONLY 0345 +expect regular,0305 lstat ${n0} type,mode +expect 0 unlink ${n0} +expect 0 -U 0501 open ${n0} O_CREAT,O_WRONLY 0345 +expect regular,0244 lstat ${n0} type,mode +expect 0 unlink ${n0} + +# POSIX: (If O_CREAT is specified and the file doesn't exist) [...] the user ID +# of the file shall be set to the effective user ID of the process; the group ID +# of the file shall be set to the group ID of the file's parent directory or to +# the effective group ID of the process [...] +expect 0 chown . 65535 65535 +expect 0 -u 65535 -g 65535 open ${n0} O_CREAT,O_WRONLY 0644 +expect 65535,65535 lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 -u 65535 -g 65534 open ${n0} O_CREAT,O_WRONLY 0644 +expect "65535,6553[45]" lstat ${n0} uid,gid +expect 0 unlink ${n0} +expect 0 chmod . 0777 +expect 0 -u 65534 -g 65533 open ${n0} O_CREAT,O_WRONLY 0644 +expect "65534,6553[35]" lstat ${n0} uid,gid +expect 0 unlink ${n0} + +# Update parent directory ctime/mtime if file didn't exist. +expect 0 chown . 0 0 +time=`${fstest} stat . ctime` +sleep 1 +expect 0 open ${n0} O_CREAT,O_WRONLY 0644 +atime=`${fstest} stat ${n0} atime` +test_check $time -lt $atime +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +mtime=`${fstest} stat . mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat . ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +# Don't update parent directory ctime/mtime if file existed. +expect 0 create ${n0} 0644 +dmtime=`${fstest} stat . mtime` +dctime=`${fstest} stat . ctime` +sleep 1 +expect 0 open ${n0} O_CREAT,O_RDONLY 0644 +mtime=`${fstest} stat . mtime` +test_check $dmtime -eq $mtime +ctime=`${fstest} stat . ctime` +test_check $dctime -eq $ctime +expect 0 unlink ${n0} + +echo test > ${n0} +expect 5 stat ${n0} size +mtime1=`${fstest} stat ${n0} mtime` +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 open ${n0} O_WRONLY,O_TRUNC +mtime2=`${fstest} stat ${n0} mtime` +test_check $mtime1 -lt $mtime2 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 stat ${n0} size +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/01.t new file mode 100755 index 0000000000..a25ec8edd2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/01.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR open ${n0}/${n1}/test O_CREAT 0644 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/02.t new file mode 100755 index 0000000000..6ac818e5f5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/02.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 open ${name255} O_CREAT 0620 +expect 0620 stat ${name255} mode +expect 0 unlink ${name255} +expect ENAMETOOLONG open ${name256} O_CREAT 0620 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/03.t new file mode 100755 index 0000000000..88c3226af7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/03.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 open ${path1023} O_CREAT 0642 +expect 0642 stat ${path1023} mode +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG open ${too_long} O_CREAT 0642 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/04.t new file mode 100755 index 0000000000..10ac17a79e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/04.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOENT if a component of the path name that must exist does not exist or O_CREAT is not set and the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT open ${n0}/${n1}/test O_CREAT 0644 +expect ENOENT open ${n0}/${n1} O_RDONLY +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/05.t new file mode 100755 index 0000000000..60b4dc38f8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/05.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/05.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 open ${n1}/${n2} O_RDONLY +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/06.t new file mode 100755 index 0000000000..614f66fe3a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/06.t @@ -0,0 +1,102 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/06.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when the required permissions (for reading and/or writing) are denied for the given flags" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..72" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 create ${n1} 0644 + +expect 0 -u 65534 -g 65534 chmod ${n1} 0600 +expect 0 -u 65534 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65534 -g 65534 open ${n1} O_WRONLY +expect 0 -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0060 +expect 0 -u 65533 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65534 open ${n1} O_WRONLY +expect 0 -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0006 +expect 0 -u 65533 -g 65533 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65533 open ${n1} O_WRONLY +expect 0 -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0477 +expect 0 -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0747 +expect 0 -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0774 +expect 0 -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0277 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0727 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0772 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect 0 -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0177 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0717 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0771 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR + +expect 0 -u 65534 -g 65534 chmod ${n1} 0077 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65534 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0707 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65534 open ${n1} O_RDWR +expect 0 -u 65534 -g 65534 chmod ${n1} 0770 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_WRONLY +expect EACCES -u 65533 -g 65533 open ${n1} O_RDWR +# +# EACCES for opening a directory read-only with no read access +# EACCES for reading a directory with no execute access +# +cd .. +expect 0 -u 65534 -g 65534 open ${n0} O_RDONLY +expect 0 -u 65534 -g 65534 chmod ${n0} 0355 +expect EACCES -u 65534 -g 65534 open ${n0} O_RDONLY +expect 0770 -u 65534 -g 65534 stat ${n0}/${n1} mode +expect 0 -u 65534 -g 65534 chmod ${n0} 0655 +expect EACCES -u 65534 -g 65534 stat ${n0}/${n1} mode + +expect 0 -u 65534 -g 65534 chmod ${n0} 0755 +cd ${n0} +expect 0 -u 65534 -g 65534 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/07.t new file mode 100755 index 0000000000..ddf337c0ad --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/07.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/07.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when O_TRUNC is specified and write permission is denied" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..23" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +cdir=`pwd` +cd ${n0} + +expect 0 -u 65534 -g 65534 create ${n1} 0644 + +expect 0 -u 65534 -g 65534 chmod ${n1} 0477 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0747 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0774 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 chmod ${n1} 0177 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0717 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0771 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 chmod ${n1} 0077 +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0707 +expect EACCES -u 65533 -g 65534 open ${n1} O_RDONLY,O_TRUNC +expect 0 -u 65534 -g 65534 chmod ${n1} 0770 +expect EACCES -u 65533 -g 65533 open ${n1} O_RDONLY,O_TRUNC + +expect 0 -u 65534 -g 65534 unlink ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/08.t new file mode 100755 index 0000000000..1323d31022 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/08.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/08.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EACCES when O_CREAT is specified, the file does not exist, and the directory in which it is to be created does not permit writing" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect EACCES -u 65534 -g 65534 open ${n1} O_RDONLY,O_CREAT 0644 +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/09.t new file mode 100755 index 0000000000..bb5bbba2a3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/09.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/09.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="O_CREAT is specified, the file does not exist, and the directory in which it is to be created has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/10.t new file mode 100755 index 0000000000..7602904cc1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/10.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/10.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EPERM when the named file has its immutable flag set and the file is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..28" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 open ${n0} O_WRONLY +expect 0 open ${n0} O_RDWR +expect 0 open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 open ${n0} O_WRONLY +expect 0 open ${n0} O_RDWR +expect 0 open ${n0} O_RDONLY,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/11.t new file mode 100755 index 0000000000..0af364c5e0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/11.t @@ -0,0 +1,39 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/11.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EPERM when the named file has its append-only flag set, the file is to be modified, and O_TRUNC is specified or O_APPEND is not specified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..24" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect 0 open ${n0} O_WRONLY,O_APPEND +expect 0 open ${n0} O_RDWR,O_APPEND +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect EPERM open ${n0} O_RDONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_WRONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_RDWR,O_APPEND,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect 0 open ${n0} O_WRONLY,O_APPEND +expect 0 open ${n0} O_RDWR,O_APPEND +expect EPERM open ${n0} O_WRONLY +expect EPERM open ${n0} O_RDWR +expect EPERM open ${n0} O_RDONLY,O_TRUNC +expect EPERM open ${n0} O_RDONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_WRONLY,O_APPEND,O_TRUNC +expect EPERM open ${n0} O_RDWR,O_APPEND,O_TRUNC +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/12.t new file mode 100755 index 0000000000..060822028c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/12.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP open ${n0}/test O_RDONLY +expect ELOOP open ${n1}/test O_RDONLY +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/13.t new file mode 100755 index 0000000000..7f37e4455c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/13.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/13.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EISDIR when he named file is a directory, and the arguments specify it is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..8" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 open ${n0} O_RDONLY +expect EISDIR open ${n0} O_WRONLY +expect EISDIR open ${n0} O_RDWR +expect EISDIR open ${n0} O_RDONLY,O_TRUNC +expect EISDIR open ${n0} O_WRONLY,O_TRUNC +expect EISDIR open ${n0} O_RDWR,O_TRUNC + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/14.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/14.t new file mode 100755 index 0000000000..2d662838f0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/14.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/14.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EROFS if the named file resides on a read-only file system, and the file is to be modified" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 open ${n0}/${n1} O_WRONLY + expect 0 open ${n0}/${n1} O_RDWR + expect 0 open ${n0}/${n1} O_RDONLY,O_TRUNC + mount -ur /dev/md${n} + expect EROFS open ${n0}/${n1} O_WRONLY + expect EROFS open ${n0}/${n1} O_RDWR + expect EROFS open ${n0}/${n1} O_RDONLY,O_TRUNC + mount -uw /dev/md${n} + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/15.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/15.t new file mode 100755 index 0000000000..261f6f715d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/15.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/15.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EROFS when O_CREAT is specified and the named file would reside on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 open ${n0}/${n1} O_RDONLY,O_CREAT 0644 + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS open ${n0}/${n1} O_RDONLY,O_CREAT 0644 + mount -uw /dev/md${n} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/16.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/16.t new file mode 100755 index 0000000000..7667b55ab7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/16.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/16.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EMLINK/ELOOP when O_NOFOLLOW was specified and the target is a symbolic link" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +case "${os}" in +FreeBSD) + expect EMLINK open ${n1} O_RDONLY,O_CREAT,O_NOFOLLOW 0644 + expect EMLINK open ${n1} O_RDONLY,O_NOFOLLOW + expect EMLINK open ${n1} O_WRONLY,O_NOFOLLOW + expect EMLINK open ${n1} O_RDWR,O_NOFOLLOW + ;; +*) + expect ELOOP open ${n1} O_RDONLY,O_CREAT,O_NOFOLLOW 0644 + expect ELOOP open ${n1} O_RDONLY,O_NOFOLLOW + expect ELOOP open ${n1} O_WRONLY,O_NOFOLLOW + expect ELOOP open ${n1} O_RDWR,O_NOFOLLOW + ;; +esac +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/17.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/17.t new file mode 100755 index 0000000000..d662d37c67 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/17.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/17.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENXIO when O_NONBLOCK is set, the named file is a fifo, O_WRONLY is set, and no process has the file open for reading" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkfifo ${n0} 0644 +expect ENXIO open ${n0} O_WRONLY,O_NONBLOCK +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/18.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/18.t new file mode 100755 index 0000000000..9c5fe31b36 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/18.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/18.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EWOULDBLOCK when O_NONBLOCK and one of O_SHLOCK or O_EXLOCK is specified and the file is locked" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..6" + + n0=`namegen` + + expect 0 create ${n0} 0644 + expect 0 open ${n0} O_RDONLY,O_SHLOCK : open ${n0} O_RDONLY,O_SHLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_EXLOCK : open ${n0} O_RDONLY,O_EXLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_SHLOCK : open ${n0} O_RDONLY,O_EXLOCK,O_NONBLOCK + expect "EWOULDBLOCK|EAGAIN" open ${n0} O_RDONLY,O_EXLOCK : open ${n0} O_RDONLY,O_SHLOCK,O_NONBLOCK + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/19.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/19.t new file mode 100755 index 0000000000..9022d94bbb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/19.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/19.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ENOSPC when O_CREAT is specified, the file does not exist, and there are no free inodes on the file system on which the file is being created" + + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + touch ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC open ${n0}/${i} O_RDONLY,O_CREAT 0644 + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/20.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/20.t new file mode 100755 index 0000000000..db1eadaed6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/20.t @@ -0,0 +1,25 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/20.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns ETXTBSY when the file is a pure procedure (shared text) file that is being executed and the open() system call requests write access" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..4" + + n0=`namegen` + + cp -pf `which sleep` ${n0} + ./${n0} 3 & + expect ETXTBSY open ${n0} O_WRONLY + expect ETXTBSY open ${n0} O_RDWR + expect ETXTBSY open ${n0} O_RDONLY,O_TRUNC + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/21.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/21.t new file mode 100755 index 0000000000..f969c82afb --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/21.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/21.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT open NULL O_RDONLY +expect EFAULT open DEADCODE O_RDONLY diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/22.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/22.t new file mode 100755 index 0000000000..0ab17cd650 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/22.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/22.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EEXIST when O_CREAT and O_EXCL were specified and the file exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} + +expect 0 symlink test ${n0} +expect EEXIST open ${n0} O_CREAT,O_EXCL 0644 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/23.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/23.t new file mode 100755 index 0000000000..d57329482c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/open/23.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/open/23.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="open returns EINVAL when an attempt was made to open a descriptor with an illegal combination of O_RDONLY, O_WRONLY, and O_RDWR" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` + +expect 0 create ${n0} 0644 +case "${os}" in +Linux) + expect 0 open ${n0} O_WRONLY,O_RDWR + expect 0 open ${n0} O_RDONLY,O_WRONLY,O_RDWR + ;; +*) + expect EINVAL open ${n0} O_WRONLY,O_RDWR + expect EINVAL open ${n0} O_RDONLY,O_WRONLY,O_RDWR + ;; +esac +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/00.t new file mode 100755 index 0000000000..85d1014d13 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/00.t @@ -0,0 +1,141 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/00.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename changes file name" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..79" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` + +expect 0 mkdir ${n3} 0755 +cdir=`pwd` +cd ${n3} + +expect 0 create ${n0} 0644 +expect regular,0644,1 lstat ${n0} type,mode,nlink +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode,nlink +expect regular,${inode},0644,1 lstat ${n1} type,inode,mode,nlink +expect 0 link ${n1} ${n0} +expect regular,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect regular,${inode},0644,2 lstat ${n1} type,inode,mode,nlink +expect 0 rename ${n1} ${n2} +expect regular,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect ENOENT lstat ${n1} type,mode,nlink +expect regular,${inode},0644,2 lstat ${n2} type,inode,mode,nlink +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +expect 0 mkdir ${n0} 0755 +expect dir,0755 lstat ${n0} type,mode +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode +expect dir,${inode},0755 lstat ${n1} type,inode,mode +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n0} 0644 +expect fifo,0644,1 lstat ${n0} type,mode,nlink +inode=`${fstest} lstat ${n0} inode` +expect 0 rename ${n0} ${n1} +expect ENOENT lstat ${n0} type,mode,nlink +expect fifo,${inode},0644,1 lstat ${n1} type,inode,mode,nlink +expect 0 link ${n1} ${n0} +expect fifo,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect fifo,${inode},0644,2 lstat ${n1} type,inode,mode,nlink +expect 0 rename ${n1} ${n2} +expect fifo,${inode},0644,2 lstat ${n0} type,inode,mode,nlink +expect ENOENT lstat ${n1} type,mode,nlink +expect fifo,${inode},0644,2 lstat ${n2} type,inode,mode,nlink +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +expect 0 create ${n0} 0644 +rinode=`${fstest} lstat ${n0} inode` +expect regular,0644 lstat ${n0} type,mode +expect 0 symlink ${n0} ${n1} +sinode=`${fstest} lstat ${n1} inode` +expect regular,${rinode},0644 stat ${n1} type,inode,mode +expect symlink,${sinode} lstat ${n1} type,inode +expect 0 rename ${n1} ${n2} +expect regular,${rinode},0644 stat ${n0} type,inode,mode +expect ENOENT lstat ${n1} type,mode +expect symlink,${sinode} lstat ${n2} type,inode +expect 0 unlink ${n0} +expect 0 unlink ${n2} + +# successful rename(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect 0 rename ${n0} ${n1} +ctime2=`${fstest} lstat ${n1} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n1} + +# unsuccessful link(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 symlink ${n2} ${n0} +ctime1=`${fstest} lstat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 rename ${n0} ${n1} +ctime2=`${fstest} lstat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n3} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/01.t new file mode 100755 index 0000000000..ec2910156d --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/01.t @@ -0,0 +1,21 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/01.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENAMETOOLONG if a component of either pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${name255} 0644 +expect 0 rename ${name255} ${n0} +expect 0 rename ${n0} ${name255} +expect 0 unlink ${name255} + +expect 0 create ${n0} 0644 +expect ENAMETOOLONG rename ${n0} ${name256} +expect 0 unlink ${n0} +expect ENAMETOOLONG rename ${name256} ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/02.t new file mode 100755 index 0000000000..a291d6dc22 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/02.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/02.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${n0} 0644 +expect 0 rename ${n0} ${path1023} +expect 0 rename ${path1023} ${n0} +expect ENAMETOOLONG rename ${n0} ${too_long} +expect 0 unlink ${n0} +create_too_long +expect ENAMETOOLONG rename ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/03.t new file mode 100755 index 0000000000..a768393c3b --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/03.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/03.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOENT if a component of the 'from' path does not exist, or a path prefix of 'to' does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT rename ${n0}/${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ENOENT rename ${n2} ${n0}/${n1}/test +expect 0 unlink ${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/04.t new file mode 100755 index 0000000000..43406289f8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/04.t @@ -0,0 +1,43 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/04.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES when a component of either path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..18" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4} +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} + +expect 0 chmod ${n1} 0755 +expect 0 chmod ${n2} 0644 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/05.t new file mode 100755 index 0000000000..3b9e9b94fa --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/05.t @@ -0,0 +1,41 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/05.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES when the requested link requires writing in a directory with a mode that denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 mkdir ${n2} 0755 +expect 0 chown ${n2} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 + +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3} + +expect 0 chmod ${n2} 0555 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4} +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4} +expect 0 chmod ${n1} 0755 + +expect 0 unlink ${n1}/${n3} +expect 0 rmdir ${n1} +expect 0 rmdir ${n2} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/06.t new file mode 100755 index 0000000000..fd88e3106a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/06.t @@ -0,0 +1,50 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/06.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the file pointed at by the 'from' argument has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..84" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkfifo ${n0} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 lchflags ${n0} ${flag} + expect ${flag} lstat ${n0} flags + expect EPERM rename ${n0} ${n1} +done +expect 0 lchflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/07.t new file mode 100755 index 0000000000..642e0728f6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/07.t @@ -0,0 +1,95 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/07.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the parent directory of the file pointed at by the 'from' argument has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..106" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkfifo ${n0}/${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 symlink ${n2} ${n0}/${n1} +for flag in SF_IMMUTABLE UF_IMMUTABLE SF_APPEND UF_APPEND; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n0}/${n1} ${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkfifo ${n0}/${n1} 0644 +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 symlink ${n2} ${n0}/${n1} +for flag in SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n0}/${n1} ${n2} + expect 0 rename ${n2} ${n0}/${n1} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/08.t new file mode 100755 index 0000000000..70227f1114 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/08.t @@ -0,0 +1,95 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/08.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EPERM if the parent directory of the file pointed at by the 'to' argument has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..126" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +for flag in SF_IMMUTABLE UF_IMMUTABLE; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect EPERM rename ${n1} ${n0}/${n2} +done +expect 0 chflags ${n0} none +expect 0 unlink ${n1} + +expect 0 create ${n1} 0644 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 mkdir ${n1} 0755 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 rmdir ${n1} + +expect 0 mkfifo ${n1} 0644 +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 symlink ${n2} ${n1} +for flag in SF_APPEND UF_APPEND SF_NOUNLINK UF_NOUNLINK; do + expect 0 chflags ${n0} ${flag} + expect ${flag} stat ${n0} flags + expect 0 rename ${n1} ${n0}/${n2} + expect 0 chflags ${n0} none + expect 0 rename ${n0}/${n2} ${n1} +done +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/09.t new file mode 100755 index 0000000000..2586719fb9 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/09.t @@ -0,0 +1,94 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/09.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES or EPERM if the directory containing 'from' is marked sticky, and neither the containing directory nor 'from' are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..56" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n4} 0755 +cdir=`pwd` +cd ${n4} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +expect 0 mkdir ${n1} 0755 + +# User owns both: the sticky directory and the file to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the file to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the file to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the file to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +# User owns both: the sticky directory and the fifo to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the fifo to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the fifo to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the fifo to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +# User owns both: the sticky directory and the symlink to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the symlink to be renamed, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} +expect 0 -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the symlink to be renamed. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n2} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the symlink to be renamed. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect "EACCES|EPERM" -u 65533 -g 65533 rename ${n0}/${n2} ${n1}/${n3} +expect 0 unlink ${n0}/${n2} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n4} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/10.t new file mode 100755 index 0000000000..3441f2e910 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/10.t @@ -0,0 +1,243 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/10.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EACCES or EPERM if the file pointed at by the 'to' argument exists, the directory containing 'to' is marked sticky, and neither the containing directory nor 'to' are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..188" + +n0=`namegen` +n1=`namegen` +n2=`namegen` +n3=`namegen` +n4=`namegen` + +expect 0 mkdir ${n4} 0755 +cdir=`pwd` +cd ${n4} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 + +expect 0 mkdir ${n1} 0755 +expect 0 chmod ${n1} 01777 + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 create ${n1}/${n3} 0644 +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect 0 rmdir ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755 +expect 0 -u 65533 -g 65533 mkdir ${n1}/${n3} 0755 +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect 0 rmdir ${n0}/${n2} +expect 0 rmdir ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n2} 0644 +expect 0 -u 65533 -g 65533 mkfifo ${n1}/${n3} 0644 +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +# User owns both: the sticky directory and the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the sticky directory, but doesn't own the destination file. +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User owns the destination file, but doesn't own the sticky directory. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +inode=`${fstest} lstat ${n0}/${n2} inode` +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n3} +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} type +expect ${inode} lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 create ${n0}/${n2} 0644 +expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2} +expect ${inode} lstat ${n0}/${n2} inode +expect ENOENT lstat ${n1}/${n3} inode +expect 0 -u 65534 -g 65534 mkfifo ${n1}/${n3} 0644 +expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ENOENT lstat ${n0}/${n2} inode +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n1}/${n3} +# User doesn't own the sticky directory nor the destination file. +expect 0 chown ${n1} 65533 65533 +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n2} +expect 0 -u 65533 -g 65533 symlink test ${n1}/${n3} +inode=`${fstest} lstat ${n1}/${n3} inode` +expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3} +expect ${inode} lstat ${n1}/${n3} inode +expect 0 unlink ${n0}/${n2} +expect 0 unlink ${n1}/${n3} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n4} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/11.t new file mode 100755 index 0000000000..53e15538d4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/11.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/11.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ELOOP if too many symbolic links were encountered in translating one of the pathnames" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP rename ${n0}/test ${n2} +expect ELOOP rename ${n1}/test ${n2} +expect 0 create ${n2} 0644 +expect ELOOP rename ${n2} ${n0}/test +expect ELOOP rename ${n2} ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} +expect 0 unlink ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/12.t new file mode 100755 index 0000000000..c5b03a3d35 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/12.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/12.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOTDIR if a component of either path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR rename ${n0}/${n1}/test ${n0}/${n2} +expect 0 create ${n0}/${n2} 0644 +expect ENOTDIR link ${n0}/${n2} ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n2} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/13.t new file mode 100755 index 0000000000..984351bff8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/13.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/13.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns ENOTDIR when the 'from' argument is a directory, but 'to' is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect regular lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect fifo lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 symlink test ${n1} +expect ENOTDIR rename ${n0} ${n1} +expect dir lstat ${n0} type +expect symlink lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/14.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/14.t new file mode 100755 index 0000000000..0b708c2332 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/14.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/14.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EISDIR when the 'to' argument is a directory, but 'from' is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..17" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n1} 0644 +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect regular lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 mkfifo ${n1} 0644 +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect fifo lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 symlink test ${n1} +expect EISDIR rename ${n1} ${n0} +expect dir lstat ${n0} type +expect symlink lstat ${n1} type +expect 0 unlink ${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/15.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/15.t new file mode 100755 index 0000000000..64a75ccb11 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/15.t @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/15.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EXDEV if the link named by 'to' and the file named by 'from' are on different file systems" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..14" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + + expect 0 create ${n0}/${n1} 0644 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + expect 0 mkdir ${n0}/${n1} 0755 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 rmdir ${n0}/${n1} + + expect 0 mkfifo ${n0}/${n1} 0644 + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + expect 0 symlink test ${n0}/${n1} + expect EXDEV rename ${n0}/${n1} ${n2} + expect 0 unlink ${n0}/${n1} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/16.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/16.t new file mode 100755 index 0000000000..ba2a9271e0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/16.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/16.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EROFS if the requested link requires writing in a directory on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..8" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + mount -ur /dev/md${n} + + expect EROFS rename ${n0}/${n1} ${n0}/${n2} + expect EROFS rename ${n0}/${n1} ${n2} + expect 0 create ${n2} 0644 + expect EROFS rename ${n2} ${n0}/${n2} + expect 0 unlink ${n2} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/17.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/17.t new file mode 100755 index 0000000000..c949b9641f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/17.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/17.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EFAULT rename ${n0} NULL +expect EFAULT rename ${n0} DEADCODE +expect 0 unlink ${n0} +expect EFAULT rename NULL ${n0} +expect EFAULT rename DEADCODE ${n0} +expect EFAULT rename NULL DEADCODE +expect EFAULT rename DEADCODE NULL diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/18.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/18.t new file mode 100755 index 0000000000..d3fb3a4c86 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/18.t @@ -0,0 +1,22 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/18.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EINVAL when the 'from' argument is a parent directory of 'to'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 + +expect EINVAL rename ${n0} ${n0}/${n1} +expect EINVAL rename ${n0} ${n0}/${n1}/${n2} + +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/19.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/19.t new file mode 100755 index 0000000000..82e3864ec5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/19.t @@ -0,0 +1,30 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/19.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EINVAL when an attempt is made to rename '.' or '..'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 + +case "${os}" in +Linux) + expect EBUSY rename ${n0}/${n1}/. ${n2} + expect EBUSY rename ${n0}/${n1}/.. ${n2} + ;; +*) + expect EINVAL rename ${n0}/${n1}/. ${n2} + expect EINVAL rename ${n0}/${n1}/.. ${n2} + ;; +esac + +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/20.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/20.t new file mode 100755 index 0000000000..82ea13a290 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rename/20.t @@ -0,0 +1,35 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rename/20.t,v 1.1 2007/01/17 01:42:10 pjd Exp $ + +desc="rename returns EEXIST or ENOTEMPTY if the 'to' argument is a directory and is not empty" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..16" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n1} 0755 + +expect 0 create ${n1}/${n2} 0644 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 mkdir ${n1}/${n2} 0755 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 rmdir ${n1}/${n2} + +expect 0 mkfifo ${n1}/${n2} 0644 +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 symlink test ${n1}/${n2} +expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1} +expect 0 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/00.t new file mode 100755 index 0000000000..8e49f035b3 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/00.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/00.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir removes directories" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect dir lstat ${n0} type +expect 0 rmdir ${n0} +expect ENOENT lstat ${n0} type + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 rmdir ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/01.t new file mode 100755 index 0000000000..d7b8345b58 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/01.t @@ -0,0 +1,30 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/01.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENOTDIR if a component of the path is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR rmdir ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} + +expect 0 symlink ${n1} ${n0} +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect ENOTDIR rmdir ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/02.t new file mode 100755 index 0000000000..a37a7a46c5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/02.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 mkdir ${name255} 0755 +expect 0 rmdir ${name255} +expect ENOENT rmdir ${name255} +expect ENAMETOOLONG rmdir ${name256} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/03.t new file mode 100755 index 0000000000..fbbf241374 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/03.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 mkdir ${path1023} 0755 +expect 0 rmdir ${path1023} +expect ENOENT rmdir ${path1023} +create_too_long +expect ENAMETOOLONG rmdir ${too_long} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/04.t new file mode 100755 index 0000000000..1984c0a1a6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/04.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ENOENT if the named directory does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 rmdir ${n0} +expect ENOENT rmdir ${n0} +expect ENOENT rmdir ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/05.t new file mode 100755 index 0000000000..f4a39d52ec --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/05.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/05.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP rmdir ${n0}/test +expect ELOOP rmdir ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/06.t new file mode 100755 index 0000000000..e552f95bdd --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/06.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/06.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EEXIST or ENOTEMPTY the named directory contains files other than '.' and '..' in it" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..20" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 symlink test ${n0}/${n1} +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 mkfifo ${n0}/${n1} 0644 +expect "EEXIST|ENOTEMPTY" rmdir ${n0} +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/07.t new file mode 100755 index 0000000000..78af4755fe --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/07.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/07.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/08.t new file mode 100755 index 0000000000..a8994d0eea --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/08.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/08.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES when write permission is denied on the directory containing the link to be removed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 mkdir ${n1}/${n2} 0755 +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/09.t new file mode 100755 index 0000000000..0471f67077 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/09.t @@ -0,0 +1,49 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/09.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EPERM if the named file has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_NOUNLINK +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_NOUNLINK +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} SF_APPEND +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 chflags ${n0} UF_APPEND +expect EPERM rmdir ${n0} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/10.t new file mode 100755 index 0000000000..9d2ae7a86e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/10.t @@ -0,0 +1,52 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/10.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EPERM if the parent directory of the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_APPEND +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_APPEND +expect EPERM rmdir ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 rmdir ${n0}/${n1} + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 mkdir ${n0}/${n1} 0755 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 rmdir ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/11.t new file mode 100755 index 0000000000..2ed725769c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/11.t @@ -0,0 +1,40 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/11.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EACCES or EPERM if the directory containing the directory to be removed is marked sticky, and neither the containing directory nor the directory to be removed are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +# User owns both: the sticky directory and the directory to be removed. +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n0}/${n1} +# User owns the directory to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 mkdir ${n0}/${n1} 0755 +expect 0 -u 65533 -g 65533 rmdir ${n0}/${n1} +# User owns the sticky directory, but doesn't own the directory to be removed. +expect 0 -u 65533 -g 65533 mkdir ${n0}/${n1} 0755 +expect 0 -u 65534 -g 65534 rmdir ${n0}/${n1} +# User doesn't own the sticky directory nor the directory to be removed. +expect 0 -u 65534 -g 65534 mkdir ${n0}/${n1} 0755 +expect "EACCES|EPERM" -u 65533 -g 65533 rmdir ${n0}/${n1} +expect 0 rmdir ${n0}/${n1} + +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/12.t new file mode 100755 index 0000000000..55e8829c49 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/12.t @@ -0,0 +1,29 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/12.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EINVAL if the last component of the path is '.' or '..'" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 mkdir ${n0}/${n1} 0755 +expect EINVAL rmdir ${n0}/${n1}/. +case "${os}" in +FreeBSD) + expect EINVAL rmdir ${n0}/${n1}/.. + ;; +Linux) + expect 'ENOTEMPTY|EEXIST' rmdir ${n0}/${n1}/.. + ;; +*) + expect EEXIST rmdir ${n0}/${n1}/.. + ;; +esac +expect 0 rmdir ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/13.t new file mode 100755 index 0000000000..8f9d04cb4e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/13.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/13.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EBUSY if the directory to be removed is the mount point for a mounted file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..3" + + n0=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect EBUSY rmdir ${n0} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/14.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/14.t new file mode 100755 index 0000000000..a1e136d8a2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/14.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/14.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 mkdir ${n0}/${n1} 0755 + mount -ur /dev/md${n} + expect EROFS rmdir ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 rmdir ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/15.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/15.t new file mode 100755 index 0000000000..5468863309 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/rmdir/15.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/rmdir/15.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="rmdir returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT rmdir NULL +expect EFAULT rmdir DEADCODE diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/00.t new file mode 100755 index 0000000000..26c80a8808 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/00.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/00.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink creates symbolic links" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect regular,0644 lstat ${n0} type,mode +expect 0 symlink ${n0} ${n1} +expect symlink lstat ${n1} type +expect regular,0644 stat ${n1} type,mode +expect 0 unlink ${n0} +expect ENOENT stat ${n1} type,mode +expect 0 unlink ${n1} + +expect 0 mkdir ${n0} 0755 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 symlink test ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/01.t new file mode 100755 index 0000000000..bf9495b94f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/01.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOTDIR if a component of the name2 path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR symlink test ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/02.t new file mode 100755 index 0000000000..2ab046ca54 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/02.t @@ -0,0 +1,20 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/02.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENAMETOOLONG if a component of the name2 pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..7" + +n0=`namegen` + +expect 0 symlink ${name255} ${n0} +expect 0 unlink ${n0} +expect 0 symlink ${n0} ${name255} +expect 0 unlink ${name255} + +expect ENAMETOOLONG symlink ${n0} ${name256} +expect 0 symlink ${name256} ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/03.t new file mode 100755 index 0000000000..570594b886 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/03.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/03.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENAMETOOLONG if an entire length of either path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..14" + +n0=`namegen` + +expect 0 symlink ${path1023} ${n0} +expect 0 unlink ${n0} +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 symlink ${n0} ${path1023} +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG symlink ${n0} ${too_long} +expect ENAMETOOLONG symlink ${too_long} ${n0} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/04.t new file mode 100755 index 0000000000..e6b1d20ae4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/04.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/04.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOENT if a component of the name2 path prefix does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT symlink test ${n0}/${n1}/test +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/05.t new file mode 100755 index 0000000000..932eabc5b6 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/05.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/05.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EACCES when a component of the name2 path prefix denies search permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 + +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/06.t new file mode 100755 index 0000000000..0a93657ec5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/06.t @@ -0,0 +1,34 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/06.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EACCES if the parent directory of the file to be created denies write permission" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} + +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 + +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} + +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 symlink test ${n1}/${n2} +expect 0 unlink ${n1}/${n2} + +expect 0 rmdir ${n1} + +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/07.t new file mode 100755 index 0000000000..596df07d39 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/07.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ELOOP if too many symbolic links were encountered in translating the name2 path name" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP symlink test ${n0}/test +expect ELOOP symlink test ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/08.t new file mode 100755 index 0000000000..55ec809c49 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/08.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/08.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EEXIST if the name2 argument already exists" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..9" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EEXIST symlink test ${n0} +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect EEXIST symlink test ${n0} +expect 0 rmdir ${n0} + +expect 0 symlink test ${n0} +expect EEXIST symlink test ${n0} +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/09.t new file mode 100755 index 0000000000..6458925bca --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/09.t @@ -0,0 +1,53 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/09.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EPERM if the parent directory of the file named by name2 has its immutable flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 symlink test ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_APPEND +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_APPEND +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 symlink test ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/10.t new file mode 100755 index 0000000000..c7697d797c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/10.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/10.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EROFS if the file name2 would reside on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..7" + + n0=`namegen` + n1=`namegen` + n2=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + + expect 0 symlink test ${n0}/${n1} + expect 0 unlink ${n0}/${n1} + mount -ur /dev/md${n} + expect EROFS symlink test ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 symlink test ${n0}/${n1} + expect 0 unlink ${n0}/${n1} + + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/11.t new file mode 100755 index 0000000000..bdf177197f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/11.t @@ -0,0 +1,36 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/11.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns ENOSPC if there are no free inodes on the file system on which the symbolic link is being created" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..3" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 256k` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + i=0 + while :; do + ln -s test ${n0}/${i} >/dev/null 2>&1 + if [ $? -ne 0 ]; then + break + fi + i=`expr $i + 1` + done + expect ENOSPC symlink test ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/12.t new file mode 100755 index 0000000000..2893e64c55 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/symlink/12.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/symlink/12.t,v 1.1 2007/01/17 01:42:11 pjd Exp $ + +desc="symlink returns EFAULT if one of the pathnames specified is outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` + +expect EFAULT symlink NULL ${n0} +expect EFAULT symlink DEADCODE ${n0} +expect EFAULT symlink test NULL +expect EFAULT symlink test DEADCODE +expect EFAULT symlink NULL DEADCODE +expect EFAULT symlink DEADCODE NULL diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/00.t new file mode 100755 index 0000000000..ad43b5353f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/00.t @@ -0,0 +1,51 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/00.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate descrease/increase file size" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..21" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n1} 0755 +cdir=`pwd` +cd ${n1} + +expect 0 create ${n0} 0644 +expect 0 truncate ${n0} 1234567 +expect 1234567 lstat ${n0} size +expect 0 truncate ${n0} 567 +expect 567 lstat ${n0} size +expect 0 unlink ${n0} + +dd if=/dev/random of=${n0} bs=12345 count=1 >/dev/null 2>&1 +expect 0 truncate ${n0} 23456 +expect 23456 lstat ${n0} size +expect 0 truncate ${n0} 1 +expect 1 lstat ${n0} size +expect 0 unlink ${n0} + +# successful truncate(2) updates ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 truncate ${n0} 123 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +# unsuccessful truncate(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 truncate ${n0} 123 +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/01.t new file mode 100755 index 0000000000..7e477d1ab8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/01.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR truncate ${n0}/${n1}/test 123 +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/02.t new file mode 100755 index 0000000000..b104ec63c7 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/02.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/02.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +expect 0 create ${name255} 0644 +expect 0 truncate ${name255} 123 +expect 123 stat ${name255} size +expect 0 unlink ${name255} +expect ENAMETOOLONG truncate ${name256} 123 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/03.t new file mode 100755 index 0000000000..0cad07fe37 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/03.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 truncate ${path1023} 123 +expect 0 unlink ${path1023} +create_too_long +expect ENAMETOOLONG truncate ${too_long} 123 +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/04.t new file mode 100755 index 0000000000..44891ed28a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/04.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect ENOENT truncate ${n0}/${n1}/test 123 +expect ENOENT truncate ${n0}/${n1} 123 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/05.t new file mode 100755 index 0000000000..fe5a7d5428 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/05.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/05.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..15" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 -u 65534 -g 65534 truncate ${n1}/${n2} 123 +expect 123 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 truncate ${n1}/${n2} 1234 +expect 0 chmod ${n1} 0755 +expect 123 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 -u 65534 -g 65534 truncate ${n1}/${n2} 1234 +expect 1234 -u 65534 -g 65534 stat ${n1}/${n2} size +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/06.t new file mode 100755 index 0000000000..66f73ac9b0 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/06.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/06.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EACCES if the named file is not writable by the user" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..8" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 create ${n1} 0644 +expect EACCES -u 65534 -g 65534 truncate ${n1} 123 +expect 0 chown ${n1} 65534 65534 +expect 0 chmod ${n1} 0444 +expect EACCES -u 65534 -g 65534 truncate ${n1} 123 +expect 0 unlink ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/07.t new file mode 100755 index 0000000000..1954d83324 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/07.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP truncate ${n0}/test 123 +expect ELOOP truncate ${n1}/test 123 +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/08.t new file mode 100755 index 0000000000..6adfb69c40 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/08.t @@ -0,0 +1,59 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/08.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EPERM if the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..40" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM truncate ${n0} 123 +expect 0 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 truncate ${n0} 123 +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 truncate ${n0} 123 +expect 123 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 truncate ${n0} 123 +expect 123 stat ${n0} size +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/09.t new file mode 100755 index 0000000000..735cfe5448 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/09.t @@ -0,0 +1,15 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/09.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EISDIR if the named file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +expect EISDIR truncate ${n0} 123 +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/10.t new file mode 100755 index 0000000000..436cc10137 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/10.t @@ -0,0 +1,37 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/10.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..10" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + expect 0 truncate ${n0}/${n1} 123 + expect 123 stat ${n0}/${n1} size + mount -ur /dev/md${n} + expect EROFS truncate ${n0}/${n1} 1234 + expect 123 stat ${n0}/${n1} size + mount -uw /dev/md${n} + expect 0 truncate ${n0}/${n1} 1234 + expect 1234 stat ${n0}/${n1} size + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/11.t new file mode 100755 index 0000000000..418b8f5678 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/11.t @@ -0,0 +1,23 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/11.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns ETXTBSY the file is a pure procedure (shared text) file that is being executed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}" in +FreeBSD) + echo "1..2" + + n0=`namegen` + + cp -pf `which sleep` ${n0} + ./${n0} 3 & + expect ETXTBSY truncate ${n0} 123 + expect 0 unlink ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/12.t new file mode 100755 index 0000000000..4091fdc84c --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/12.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/12.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EFBIG or EINVAL if the length argument was greater than the maximum file size" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 create ${n0} 0644 +r=`${fstest} truncate ${n0} 999999999999999 2>/dev/null` +case "${r}" in +EFBIG|EINVAL) + expect 0 stat ${n0} size + ;; +0) + expect 999999999999999 stat ${n0} size + ;; +*) + echo "not ok ${ntest}" + ntest=`expr ${ntest} + 1` + ;; +esac +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/13.t new file mode 100755 index 0000000000..ac0523c937 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/13.t @@ -0,0 +1,16 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/13.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EINVAL if the length argument was less than 0" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect EINVAL -- truncate ${n0} -1 +expect EINVAL -- truncate ${n0} -999999 +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/14.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/14.t new file mode 100755 index 0000000000..67d7b4cf0f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/truncate/14.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/truncate/14.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="truncate returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT truncate NULL 123 +expect EFAULT truncate DEADCODE 123 diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/00.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/00.t new file mode 100755 index 0000000000..e0e8b618db --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/00.t @@ -0,0 +1,115 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/00.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink removes regular files, symbolic links, fifos and sockets" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..55" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 create ${n0} 0644 +expect regular lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +expect 0 symlink ${n1} ${n0} +expect symlink lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +expect 0 mkfifo ${n0} 0644 +expect fifo lstat ${n0} type +expect 0 unlink ${n0} +expect ENOENT lstat ${n0} type + +# TODO: sockets removal + +# successful unlink(2) updates ctime. +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +expect 0 link ${n0} ${n1} +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -lt $ctime2 +expect 0 unlink ${n0} + +# unsuccessful unlink(2) does not update ctime. +expect 0 create ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 unlink ${n0} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkfifo ${n0} 0644 +ctime1=`${fstest} stat ${n0} ctime` +sleep 1 +expect EACCES -u 65534 unlink ${n0} +ctime2=`${fstest} stat ${n0} ctime` +test_check $ctime1 -eq $ctime2 +expect 0 unlink ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 mkfifo ${n0}/${n1} 0644 +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 mkdir ${n0} 0755 +expect 0 symlink test ${n0}/${n1} +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n0}/${n1} +mtime=`${fstest} stat ${n0} mtime` +test_check $time -lt $mtime +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 rmdir ${n0} + +expect 0 create ${n0} 0644 +expect 0 link ${n0} ${n1} +time=`${fstest} stat ${n0} ctime` +sleep 1 +expect 0 unlink ${n1} +ctime=`${fstest} stat ${n0} ctime` +test_check $time -lt $ctime +expect 0 unlink ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/01.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/01.t new file mode 100755 index 0000000000..41ca70edab --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/01.t @@ -0,0 +1,18 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/01.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENOTDIR if a component of the path prefix is not a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..5" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 +expect 0 create ${n0}/${n1} 0644 +expect ENOTDIR unlink ${n0}/${n1}/test +expect 0 unlink ${n0}/${n1} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/02.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/02.t new file mode 100755 index 0000000000..af9a386473 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/02.t @@ -0,0 +1,14 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/02.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENAMETOOLONG if a component of a pathname exceeded 255 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +expect 0 create ${name255} 0644 +expect 0 unlink ${name255} +expect ENOENT unlink ${name255} +expect ENAMETOOLONG unlink ${name256} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/03.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/03.t new file mode 100755 index 0000000000..646e26ba88 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/03.t @@ -0,0 +1,24 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/03.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENAMETOOLONG if an entire path name exceeded 1023 characters" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..12" + +expect 0 mkdir ${name255} 0755 +expect 0 mkdir ${name255}/${name255} 0755 +expect 0 mkdir ${name255}/${name255}/${name255} 0755 +expect 0 mkdir ${path1021} 0755 +expect 0 create ${path1023} 0644 +expect 0 unlink ${path1023} +expect ENOENT unlink ${path1023} +create_too_long +expect ENAMETOOLONG unlink ${too_long} +unlink_too_long +expect 0 rmdir ${path1021} +expect 0 rmdir ${name255}/${name255}/${name255} +expect 0 rmdir ${name255}/${name255} +expect 0 rmdir ${name255} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/04.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/04.t new file mode 100755 index 0000000000..d6746d3089 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/04.t @@ -0,0 +1,17 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/04.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ENOENT if the named file does not exist" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..4" + +n0=`namegen` +n1=`namegen` + +expect 0 create ${n0} 0644 +expect 0 unlink ${n0} +expect ENOENT unlink ${n0} +expect ENOENT unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/05.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/05.t new file mode 100755 index 0000000000..7593e7f9a4 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/05.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/05.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES when search permission is denied for a component of the path prefix" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0644 +expect EACCES -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/06.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/06.t new file mode 100755 index 0000000000..e063c6a57e --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/06.t @@ -0,0 +1,27 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/06.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES when write permission is denied on the directory containing the link to be removed" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..10" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n0} 0755 +cdir=`pwd` +cd ${n0} +expect 0 mkdir ${n1} 0755 +expect 0 chown ${n1} 65534 65534 +expect 0 -u 65534 -g 65534 create ${n1}/${n2} 0644 +expect 0 chmod ${n1} 0555 +expect EACCES -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 chmod ${n1} 0755 +expect 0 -u 65534 -g 65534 unlink ${n1}/${n2} +expect 0 rmdir ${n1} +cd ${cdir} +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/07.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/07.t new file mode 100755 index 0000000000..48dfd4a975 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/07.t @@ -0,0 +1,19 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/07.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns ELOOP if too many symbolic links were encountered in translating the pathname" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..6" + +n0=`namegen` +n1=`namegen` + +expect 0 symlink ${n0} ${n1} +expect 0 symlink ${n1} ${n0} +expect ELOOP unlink ${n0}/test +expect ELOOP unlink ${n1}/test +expect 0 unlink ${n0} +expect 0 unlink ${n1} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/08.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/08.t new file mode 100755 index 0000000000..54bcf1aa0f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/08.t @@ -0,0 +1,28 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/08.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the named file is a directory" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..3" + +n0=`namegen` + +expect 0 mkdir ${n0} 0755 +case "${os}:${fs}" in +SunOS:UFS) + expect 0 unlink ${n0} + expect ENOENT rmdir ${n0} + ;; +Linux:*) + # Non-POSIX value returned by Linux since 2.1.132 + expect EISDIR unlink ${n0} + expect 0 rmdir ${n0} + ;; +*) + expect EPERM unlink ${n0} + expect 0 rmdir ${n0} + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/09.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/09.t new file mode 100755 index 0000000000..245987d086 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/09.t @@ -0,0 +1,49 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/09.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the named file has its immutable, undeletable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} + +expect 0 create ${n0} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM unlink ${n0} +expect 0 chflags ${n0} none +expect 0 unlink ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/10.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/10.t new file mode 100755 index 0000000000..ab1ee1f2a2 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/10.t @@ -0,0 +1,52 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/10.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EPERM if the parent directory of the named file has its immutable or append-only flag set" + +dir=`dirname $0` +. ${dir}/../misc.sh + +require chflags + +echo "1..30" + +n0=`namegen` +n1=`namegen` + +expect 0 mkdir ${n0} 0755 + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_IMMUTABLE +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_IMMUTABLE +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_APPEND +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_APPEND +expect EPERM unlink ${n0}/${n1} +expect 0 chflags ${n0} none +expect 0 unlink ${n0}/${n1} + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} SF_NOUNLINK +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 create ${n0}/${n1} 0644 +expect 0 chflags ${n0} UF_NOUNLINK +expect 0 unlink ${n0}/${n1} +expect 0 chflags ${n0} none + +expect 0 rmdir ${n0} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/11.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/11.t new file mode 100755 index 0000000000..bc7fa368dc --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/11.t @@ -0,0 +1,68 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/11.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EACCES or EPERM if the directory containing the file is marked sticky, and neither the containing directory nor the file to be removed are owned by the effective user ID" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..33" + +n0=`namegen` +n1=`namegen` +n2=`namegen` + +expect 0 mkdir ${n2} 0755 +cdir=`pwd` +cd ${n2} + +expect 0 mkdir ${n0} 0755 +expect 0 chown ${n0} 65534 65534 +expect 0 chmod ${n0} 01777 + +# User owns both: the sticky directory and the file to be removed. +expect 0 -u 65534 -g 65534 create ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the file to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 create ${n0}/${n1} 0644 +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the file to be removed. +expect 0 -u 65533 -g 65533 create ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the file to be removed. +expect 0 -u 65534 -g 65534 create ${n0}/${n1} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +# User owns both: the sticky directory and the fifo to be removed. +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the fifo to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the fifo to be removed. +expect 0 -u 65533 -g 65533 mkfifo ${n0}/${n1} 0644 +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the fifo to be removed. +expect 0 -u 65534 -g 65534 mkfifo ${n0}/${n1} 0644 +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +# User owns both: the sticky directory and the symlink to be removed. +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n1} +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User owns the symlink to be removed, but doesn't own the sticky directory. +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n1} +expect 0 -u 65533 -g 65533 unlink ${n0}/${n1} +# User owns the sticky directory, but doesn't own the symlink to be removed. +expect 0 -u 65533 -g 65533 symlink test ${n0}/${n1} +expect 0 -u 65534 -g 65534 unlink ${n0}/${n1} +# User doesn't own the sticky directory nor the symlink to be removed. +expect 0 -u 65534 -g 65534 symlink test ${n0}/${n1} +expect "EACCES|EPERM" -u 65533 -g 65533 unlink ${n0}/${n1} +expect 0 unlink ${n0}/${n1} + +expect 0 rmdir ${n0} + +cd ${cdir} +expect 0 rmdir ${n2} diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/12.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/12.t new file mode 100755 index 0000000000..eebef25cd1 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/12.t @@ -0,0 +1,32 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/12.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EROFS if the named file resides on a read-only file system" + +dir=`dirname $0` +. ${dir}/../misc.sh + +case "${os}:${fs}" in +FreeBSD:UFS) + echo "1..5" + + n0=`namegen` + n1=`namegen` + + expect 0 mkdir ${n0} 0755 + n=`mdconfig -a -n -t malloc -s 1m` + newfs /dev/md${n} >/dev/null + mount /dev/md${n} ${n0} + expect 0 create ${n0}/${n1} 0644 + mount -ur /dev/md${n} + expect EROFS unlink ${n0}/${n1} + mount -uw /dev/md${n} + expect 0 unlink ${n0}/${n1} + umount /dev/md${n} + mdconfig -d -u ${n} + expect 0 rmdir ${n0} + ;; +*) + quick_exit + ;; +esac diff --git a/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/13.t b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/13.t new file mode 100755 index 0000000000..984094110f --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/pjd-fstest-20080816/tests/unlink/13.t @@ -0,0 +1,12 @@ +#!/bin/sh +# $FreeBSD: src/tools/regression/fstest/tests/unlink/13.t,v 1.1 2007/01/17 01:42:12 pjd Exp $ + +desc="unlink returns EFAULT if the path argument points outside the process's allocated address space" + +dir=`dirname $0` +. ${dir}/../misc.sh + +echo "1..2" + +expect EFAULT unlink NULL +expect EFAULT unlink DEADCODE diff --git a/splitfs_syscall_intercept/utils/tests/rw_experiment.c b/splitfs_syscall_intercept/utils/tests/rw_experiment.c new file mode 100644 index 0000000000..0e1f89fff8 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/rw_experiment.c @@ -0,0 +1,176 @@ +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FSIZE (2ULL*1024*1024*1024) +#define IOSIZE (512*1024*1024) +#define BLKSIZE (4*1024) +#define CLSIZE (64) + +char *addr; +struct timeval start,end; +int precomputed_rand[FSIZE/CLSIZE]; + + +void precompute_rand(unsigned long datasize) { + + int i = 0; + int num_blocks = IOSIZE / datasize; + + for (i = 0; i < num_blocks; i++) + precomputed_rand[i] = rand() % (IOSIZE - datasize); +} + + +void performExperiment(int operation, uint32_t datasize, int seq, char *buf, int fd) { + + uint32_t num_blks; + unsigned long long offset = 0; + unsigned int r = 0; + int write_size = 0; + int i = 0, j = 0; + int num_clines = 0; + + num_blks = IOSIZE / datasize; + + printf("%s: data size = %u, num_blocks = %d\n", __func__, datasize, num_blks); + + + gettimeofday(&start, NULL); + + r = 0; + offset = 0; + i = 0; + + if(operation == 0) { + for(i = 0; i < num_blks; i++) + { + if(pread64(fd, buf, datasize, offset) != datasize) { + perror("read failed\n"); + printf("%s: offset = %llu\n", __func__, offset); + exit(-1); + } + offset += datasize; + r = precomputed_rand[i]; + + if(seq == 0) + offset = r; + } + } else if(operation == 1) { + for(i = 0; i < num_blks; i++) + { + if(write_size = (pwrite64(fd, buf, datasize, offset)) != datasize) { + perror("write failed\n"); + printf("%s: Returned value = %d. Offset = %llu\n", __func__, write_size, offset); + exit(-1); + } + + offset += datasize; + r = precomputed_rand[i]; + + if(seq == 0) + offset = r; + } + + fsync(fd); + } + + gettimeofday(&end, NULL); +} + +void parseArgs(char *argv[], int *operation, int *seq, uint32_t *datasize) { + + char datasizestr[100]; + char size_granularity; + + if ((strcmp(argv[1], "write") == 0)) { + *operation = 1; + } + + else if ((strcmp(argv[1], "read") == 0)) { + *operation = 0; + } + + if ((strcmp(argv[2], "seq") == 0)) { + *seq = 1; + } + + else if ((strcmp(argv[2], "rand") == 0)) { + *seq = 0; + } + + strcpy(datasizestr, argv[3]); + + *datasize = atoi(datasizestr); + + printf("The arguments passed are: operation = %d, seq = %d, rw_size = %u\n", *operation, *seq, *datasize); + +} + +/* Example usage: ./a.out read seq 4096 */ + +int main(int argc, char *argv[]) { + + int fd; + time_t curtime; + unsigned int i,t; + char *buf; + int seq; + uint32_t datasize; + int operation = 2; + + if(argc < 4) { + perror("Usage: ./a.out "); + exit(-1); + } + + parseArgs(argv, &operation, &seq, &datasize); + + fd = open("/mnt/pmem_emul/test.txt", O_RDWR | O_CREAT, 0666); + if(fd < 0) { + perror("file not opened!\n"); + exit(-1); + } + + buf = (char *)malloc(sizeof(char)*datasize); + + printf("################ STARTING HERE ##################\n"); + + srand(5); + precompute_rand(datasize); + + for(i = 0; i < sizeof(buf); i++) + buf[i] = 'R'; + + performExperiment(operation, datasize, seq, buf, fd); + + //pause(); + + t =(end.tv_sec-start.tv_sec)*1000000 + (end.tv_usec-start.tv_usec); + + + printf("\nTime for %dMB ops = %u\n", IOSIZE/(1024*1024), t); + + close(fd); + + return 0; +} diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_dup2.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_dup2.c new file mode 100644 index 0000000000..aea2151e74 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_dup2.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +#define ORIG_FILE "/mnt/pmem_emul/dup_orig" +#define REPLACE_FILE "/mnt/pmem_emul/dup_replace" + +int main() { + int fd, fd2, ret; + + // Create a file + fd = open(ORIG_FILE, O_CREAT | O_EXCL, 0644); + assert(fd >= 0); + + // Create another file + fd2 = open(REPLACE_FILE, O_CREAT | O_EXCL, 0644); + assert(fd2 >= 0); + + // Dup the first file into the file descriptor of the second file. + ret = dup2(fd, fd2); + assert(ret == fd2); + + // Cleanup + ret = close(fd); + assert(ret == 0); + + ret = close(fd2); + assert(ret == 0); + + ret = unlink(ORIG_FILE); + assert(ret == 0); + + ret = unlink(REPLACE_FILE); + assert(ret == 0); + + return 0; +} diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_new_process.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_new_process.c new file mode 100644 index 0000000000..9c27f7bbf5 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_new_process.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/execv" + +void cleanup() { + int ret; + + ret = unlink(FILE_PATH); + assert(ret==0); +} + +int main(int argc, char **argv) { + int ret, fd; + char buf[256]; + assert(argc>=1); + + fd = atoi(argv[0]); + + ret = read(fd, buf, 5); + assert(ret == 5); + buf[ret] = '\0'; + + ret = strncmp(buf, "hello", 5); + assert(ret==0); + + printf("The string read in the new process is: %s\n", buf); + + cleanup(); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_old_process.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_old_process.c new file mode 100644 index 0000000000..dac24792ab --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_execv_old_process.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/execv" +#define NEW_PROCESS_PATH "execv_new" + +int main() { + int fd, ret; + char fd_string[10]; + char *argv[] = {"", NULL}; + + fd = open(FILE_PATH, O_RDWR | O_CREAT | O_EXCL, 0666); + assert(fd>=0); + + ret = write(fd, "xxhello", 7); + assert(ret==7); + + ret = lseek(fd, 2, SEEK_SET); + assert(ret==2); + + ret = sprintf(fd_string, "%d", fd); + fd_string[ret] = '\0'; + + argv[0] = fd_string; + + ret = execv(NEW_PROCESS_PATH, argv); + assert(ret!=-1); +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_open.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_open.c new file mode 100644 index 0000000000..eb81716f42 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_open.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/test_open" + +int main() { + int fd, ret; + char fd_string[10]; + char *argv[] = {"", NULL}; + + fd = open(FILE_PATH, O_CREAT | O_EXCL, 0666); + assert(fd>=0); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_opendir.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_opendir.c new file mode 100644 index 0000000000..49b6430785 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_opendir.c @@ -0,0 +1,11 @@ +#include +#include +#include +#include + +int main() { + DIR *dir; + + dir = opendir("/home/om/wspace/splitfs-new/tests/pjd-fstest-20080816/tests/chflags"); + assert(dir != NULL); +} diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_redirect.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_redirect.c new file mode 100644 index 0000000000..a1483f3e7a --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_redirect.c @@ -0,0 +1,53 @@ +/** + * Context: This was developed to reproduce a bug in pjd tests that echoed something and redirected to a file. + * A simpler version of the problem is: bash -c "echo text > file" + * This program further simplifies the above command to debug the crux of the problem. + * + * + * In this test we try to replicate the dup calls w.r.t the following command: bash -c "echo text > file" + * It includes the following e.g dup calls: + * (i) fcntl(1, F_DUPFD, 10) + * (ii) dup2(3, 1) + * (iii) dup2(10, 1) +*/ + +#include +#include +#include +#include +#include +#include + +#define ORIG_FILE "/mnt/pmem_emul/redirect" + +int main() { + int fd, backup, ret; + + // Create a file + fd = open(ORIG_FILE, O_RDWR | O_CREAT | O_EXCL, 0666); + assert(fd >= 0); + + // Backup stdout + backup = dup2(1, 10); + assert(backup == 10); + + // Dup the redirect file into stdout + ret = dup2(fd, 1); + assert(ret == 1); + + // Close the original redirect fd + close(fd); + + // Write something onto stdout (which is now pointing to redirect) + ret = write(1, "hello\n", 6); + assert(ret == 6); + + // Restore stdout from backup + ret = dup2(backup, 1); + assert(ret == 1); + + ret = close(backup); + assert(ret == 0); + + return 0; +} diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_symlink.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_symlink.c new file mode 100644 index 0000000000..e756aedf11 --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_symlink.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include + +#define TARGET_FILE_PATH "/mnt/pmem_emul/target" +#define SYM_FILE_PATH "/mnt/pmem_emul/sym" + +int main() { + int fd, ret; + char buf[256]; + + // Create the target file + fd = open(TARGET_FILE_PATH, O_CREAT | O_RDWR, 0666); + assert(fd >= 0); + + // Write something into the file + ret = write(fd, "hello\n", 6); + assert(ret == 6); + + // Close the file + ret = close(fd); + assert(ret == 0); + + // Create a symlink + ret = symlink(TARGET_FILE_PATH, SYM_FILE_PATH); + assert(ret == 0); + + // Delete the actual file first + ret = unlink(TARGET_FILE_PATH); + assert(ret == 0); + + // Delete the symlink next + ret = unlink(SYM_FILE_PATH); + assert(ret == 0); + + return 0; +} \ No newline at end of file diff --git a/splitfs_syscall_intercept/utils/tests/unit_tests/test_write.c b/splitfs_syscall_intercept/utils/tests/unit_tests/test_write.c new file mode 100644 index 0000000000..3024a452bc --- /dev/null +++ b/splitfs_syscall_intercept/utils/tests/unit_tests/test_write.c @@ -0,0 +1,25 @@ +#include +#include +#include +#include +#include +#include + +#define FILE_PATH "/mnt/pmem_emul/test_write" + +int main() { + int fd, ret; + char writeBuf[] = "Hello World!\n"; + + fd = open(FILE_PATH, O_RDWR | O_CREAT, 0644); + assert(fd>=0); + + ret = write(fd, writeBuf, strlen(writeBuf)); + assert(ret == strlen(writeBuf)); + + // Cleanup + ret = unlink(FILE_PATH); + assert(ret == 0); + + return 0; +} \ No newline at end of file