diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-10-25 17:40:22 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-10-25 17:40:30 +0100 |
commit | 3bd7165aba79f098d96e7fed292c12002d807d0f (patch) | |
tree | 77f4259517dc0e8e569fbfd71941242d4befe4a6 | |
parent | Exclude default untestable functions from coverage reports (diff) | |
download | netfs-3bd7165aba79f098d96e7fed292c12002d807d0f.tar.bz2 netfs-3bd7165aba79f098d96e7fed292c12002d807d0f.tar.xz netfs-3bd7165aba79f098d96e7fed292c12002d807d0f.zip |
Greatly simplify the mess of fuse_operations initialisation and remove the now redundent fuseCall wrapper
-rw-r--r-- | netfs/fuse/fuseAppBase.cpp | 2 | ||||
-rw-r--r-- | netfs/fuse/fuseAppBase.h | 143 | ||||
-rw-r--r-- | netfs/unittests/testCore.cpp | 12 |
3 files changed, 83 insertions, 74 deletions
diff --git a/netfs/fuse/fuseAppBase.cpp b/netfs/fuse/fuseAppBase.cpp index 87275c6..fc6fa14 100644 --- a/netfs/fuse/fuseAppBase.cpp +++ b/netfs/fuse/fuseAppBase.cpp @@ -224,7 +224,7 @@ FuseAppBase::runint(int argc, char ** argv) fuseApp = this; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); if (fuse_opt_parse(&args, fuseApp, fuse_opts, - fuseCall<void *, const char *, int, struct fuse_args *>::helper<&FuseAppBase::opt_parse>) == -1) { + &helper<decltype(&FuseAppBase::opt_parse), &FuseAppBase::opt_parse>) == -1) { exit(1); } return args; diff --git a/netfs/fuse/fuseAppBase.h b/netfs/fuse/fuseAppBase.h index 63763d9..4128c6b 100644 --- a/netfs/fuse/fuseAppBase.h +++ b/netfs/fuse/fuseAppBase.h @@ -65,51 +65,51 @@ class DLL_PUBLIC FuseAppBase { virtual int fuse_opt_parse(struct fuse_args *args, void *data, const struct fuse_opt opts[], fuse_opt_proc_t proc) = 0; virtual int main(int, char **, const struct fuse_operations *) = 0; -#define GetHelper(func) getHelper<&FuseAppBase::func>(typeid(&FuseAppBase::func) != typeid(&FuseApp::func)) +#define GetHelper(func) getHelper<decltype(&FuseAppBase::func), decltype(&FuseApp::func), &FuseAppBase::func>(&FuseAppBase::func) template <typename FuseApp> static int run(int argc, char ** argv, FuseApp * fa) { auto args = fa->runint(argc, argv); struct fuse_operations operations = { - fuseCall<const char *, struct stat *>::GetHelper(getattr), - fuseCall<const char *, char *, size_t>::GetHelper(readlink), + GetHelper(getattr), + GetHelper(readlink), NULL, // getdir deprecated - fuseCall<const char *, mode_t, dev_t>::GetHelper(mknod), - fuseCall<const char *, mode_t>::GetHelper(mkdir), - fuseCall<const char *>::GetHelper(unlink), - fuseCall<const char *>::GetHelper(rmdir), - fuseCall<const char *, const char *>::GetHelper(symlink), - fuseCall<const char *, const char *>::GetHelper(rename), - fuseCall<const char *, const char *>::GetHelper(link), - fuseCall<const char *, mode_t>::GetHelper(chmod), - fuseCall<const char *, uid_t, gid_t>::GetHelper(chown), - fuseCall<const char *, off_t>::GetHelper(truncate), + GetHelper(mknod), + GetHelper(mkdir), + GetHelper(unlink), + GetHelper(rmdir), + GetHelper(symlink), + GetHelper(rename), + GetHelper(link), + GetHelper(chmod), + GetHelper(chown), + GetHelper(truncate), NULL, // utime deprecated - fuseCall<const char *, struct fuse_file_info *>::GetHelper(open), - fuseCall<const char *, char *, size_t, off_t, struct fuse_file_info *>::GetHelper(read), - fuseCall<const char *, const char *, size_t, off_t, struct fuse_file_info *>::GetHelper(write), - fuseCall<const char *, struct statvfs *>::GetHelper(statfs), - fuseCall<const char *, struct fuse_file_info *>::GetHelper(flush), - fuseCall<const char *, struct fuse_file_info *>::GetHelper(release), - fuseCall<const char *, int, struct fuse_file_info *>::GetHelper(fsync), - fuseCall<const char *, const char *, const char *, size_t, int>::GetHelper(setxattr), - fuseCall<const char *, const char *, char *, size_t>::GetHelper(getxattr), - fuseCall<const char *, char *, size_t>::GetHelper(listxattr), - fuseCall<const char *, const char *>::GetHelper(removexattr), - fuseCall<const char *, struct fuse_file_info *>::GetHelper(opendir), - fuseCall<const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *>::GetHelper(readdir), - fuseCall<const char *, struct fuse_file_info *>::GetHelper(releasedir), - fuseCall<const char *, int, struct fuse_file_info *>::GetHelper(fsyncdir), + GetHelper(open), + GetHelper(read), + GetHelper(write), + GetHelper(statfs), + GetHelper(flush), + GetHelper(release), + GetHelper(fsync), + GetHelper(setxattr), + GetHelper(getxattr), + GetHelper(listxattr), + GetHelper(removexattr), + GetHelper(opendir), + GetHelper(readdir), + GetHelper(releasedir), + GetHelper(fsyncdir), fuseInit, fuseDestroy, - fuseCall<const char *, int>::GetHelper(access), - fuseCall<const char *, mode_t, struct fuse_file_info *>::GetHelper(create), - fuseCall<const char *, off_t, struct fuse_file_info *>::GetHelper(ftruncate), - fuseCall<const char *, struct stat *, struct fuse_file_info *>::GetHelper(fgetattr), + GetHelper(access), + GetHelper(create), + GetHelper(ftruncate), + GetHelper(fgetattr), #if (FUSE_MINOR_VERSION >= 6) - fuseCall<const char *, struct fuse_file_info *, int, struct flock *>::GetHelper(lock), - fuseCall<const char *, const struct timespec [2]>::GetHelper(utimens), - fuseCall<const char *, size_t, uint64_t *>::GetHelper(bmap), + GetHelper(lock), + GetHelper(utimens), + GetHelper(bmap), #if (FUSE_MINOR_VERSION >= 8) 0, // flag_nullpath_ok #if (FUSE_MINOR_VERSION >= 9) @@ -117,13 +117,13 @@ class DLL_PUBLIC FuseAppBase { 0, // flag_utime_omit_ok #endif 0, // flag_reserved - fuseCall<const char *, int, void *, struct fuse_file_info *, unsigned int, void *>::GetHelper(ioctl), - fuseCall<const char *, struct fuse_file_info *, struct fuse_pollhandle *, unsigned *>::GetHelper(poll), + GetHelper(ioctl), + GetHelper(poll), #if (FUSE_MINOR_VERSION >= 9) - fuseCall<const char *, struct fuse_bufvec *, off_t, struct fuse_file_info *>::GetHelper(write_buf), - fuseCall<const char *, struct fuse_bufvec **, size_t, off_t, struct fuse_file_info *>::GetHelper(read_buf), - fuseCall<const char *, struct fuse_file_info *, int>::GetHelper(flock), - fuseCall<const char *, int, off_t, off_t, struct fuse_file_info *>::GetHelper(fallocate), + GetHelper(write_buf), + GetHelper(read_buf), + GetHelper(flock), + GetHelper(fallocate), #endif #endif #endif @@ -136,41 +136,40 @@ class DLL_PUBLIC FuseAppBase { static void * fuseInit(struct fuse_conn_info *conn); static void fuseDestroy(void *); - template <typename... Args> - class DLL_PRIVATE fuseCall { - public: - typedef int (*WrapperFunc)(Args...); - template <int (FuseAppBase::*b)(Args...)> - static WrapperFunc getHelper(bool implemented) - { - auto func = &helper<b>; - return implemented ? func : NULL; + template <typename BFunc, typename IFunc, BFunc bfunc, typename ... Args> + static typename std::enable_if<!std::is_same<BFunc, IFunc>::value, int(*)(Args...)>::type getHelper(int(FuseAppBase::*)(Args...)) + { + return &helper<BFunc, bfunc, Args...>; + } + template <typename BFunc, typename IFunc, BFunc bfunc, typename ... Args> + static typename std::enable_if<std::is_same<BFunc, IFunc>::value, int(*)(Args...)>::type getHelper(int(FuseAppBase::*)(Args...)) + { + return nullptr; + } + template <typename Func, Func f, typename ... Args> + static int helper(Args ... a) + { + for (int t = 0; ; ++t) { + try { + return (fuseApp->*f)(a...); } - template <int (FuseAppBase::*f)(Args...)> - static int helper(Args ... a) - { - for (int t = 0; ; ++t) { - try { - return (fuseApp->*f)(a...); - } - catch (const std::exception & ex) { - if (t < 10) { - if (int rtn = fuseApp->onError(ex)) { - return rtn; - } - } - else { - fuseApp->logf(LOG_ERR, "Retries expired with %s calling %s", ex.what(), typeid(f).name()); - return -EIO; - } - } - catch (...) { - fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(f).name()); - return -EIO; + catch (const std::exception & ex) { + if (t < 10) { + if (int rtn = fuseApp->onError(ex)) { + return rtn; } } + else { + fuseApp->logf(LOG_ERR, "Retries expired with %s calling %s", ex.what(), typeid(f).name()); + return -EIO; + } } - }; + catch (...) { + fuseApp->logf(LOG_ERR, "Unknown exception calling %s", typeid(f).name()); + return -EIO; + } + } + } static FuseAppBase * fuseApp; }; diff --git a/netfs/unittests/testCore.cpp b/netfs/unittests/testCore.cpp index ff5a352..880a503 100644 --- a/netfs/unittests/testCore.cpp +++ b/netfs/unittests/testCore.cpp @@ -51,7 +51,17 @@ class Core { const fuse_operations * fuse; }; -BOOST_FIXTURE_TEST_SUITE( NetfsCore, Core ) +BOOST_FIXTURE_TEST_SUITE( NetfsCore, Core ); + +BOOST_AUTO_TEST_CASE(fuse_operations_correct) +{ + // open should be defined + BOOST_REQUIRE(fuse->open); + // getdir should not be defined (Not supported) + BOOST_REQUIRE(!fuse->getdir); + // fsync should not be defined (Not implemented) + BOOST_REQUIRE(!fuse->fsync); +} BOOST_AUTO_TEST_CASE ( daemonInitialised ) { |