#ifndef NETFS_FUSE_H #define NETFS_FUSE_H #include #include #include #include #include "fuseAppBase.h" #include "fuseConfig.h" #include "cache.h" namespace NetFS { class FuseApp : public FuseAppBase { private: class OpenDir : public IceUtil::Shared { public: OpenDir(DirectoryPrx remote, const std::string & path); DirectoryPrx remote; const std::string path; }; typedef IceUtil::Handle OpenDirPtr; typedef std::map OpenDirs; class OpenFile : public IceUtil::Shared { public: OpenFile(FilePrx remote, const std::string & path, int flags); FilePrx remote; const std::string path; const int flags; }; typedef IceUtil::Handle OpenFilePtr; typedef std::map OpenFiles; public: FuseApp(const Ice::StringSeq &); ~FuseApp(); private: void * init (struct fuse_conn_info * info); int opt_parse(void *, const char * arg, int key, struct fuse_args *); void connectSession(); void connectToService(); void connectToVolume(); void connectHandles(); void verifyConnection(); public: // misc int access(const char * p, int a); int getattr(const char * p, struct stat * s); int fgetattr(const char *, struct stat *, struct fuse_file_info *); int chmod(const char *, mode_t); int chown(const char *, uid_t, gid_t); int link(const char *, const char *); int readlink(const char *, char *, size_t); int rename(const char *, const char *); int symlink(const char *, const char *); int unlink(const char *); int utimens(const char *, const struct timespec tv[2]); int mknod(const char *, mode_t, dev_t); // dirs int opendir(const char * p, struct fuse_file_info * fi); int releasedir(const char *, struct fuse_file_info * fi); int readdir(const char *, void * buf, fuse_fill_dir_t filler, off_t, struct fuse_file_info * fi); int mkdir(const char *, mode_t); int rmdir(const char *); // files int open(const char * p, struct fuse_file_info * fi); int create(const char *, mode_t, struct fuse_file_info *); int release(const char *, struct fuse_file_info * fi); int read(const char *, char * buf, size_t s, off_t o, struct fuse_file_info * fi); int write(const char *, const char * buf, size_t s, off_t o, struct fuse_file_info * fi); int truncate(const char *, off_t); int ftruncate(const char *, off_t, struct fuse_file_info *); // fs int statfs(const char *, struct statvfs *); // stuff int onError(const std::exception & err) throw(); virtual struct fuse_context * fuse_get_context() = 0; protected: virtual NetFS::Client::ConfigurationPtr ReadConfiguration(const std::string &) const; private: void setProxy(OpenFilePtr, uint64_t & fh); OpenFilePtr getFileProxy(uint64_t localID) const; void clearFileProxy(uint64_t localID); void setProxy(OpenDirPtr, uint64_t & fh); OpenDirPtr getDirProxy(uint64_t localID) const; void clearDirProxy(uint64_t localID); ReqEnv reqEnv(); Ice::StringSeq args; Ice::CommunicatorPtr ic; Client::ResourcePtr fcr; mutable boost::shared_mutex _lock; NetFS::VolumePrx volume; NetFS::ServicePrx service; Glacier2::SessionPrx session; bool sessionOpened; std::string mountPoint; std::string resourceName; std::string configPath; OpenDirs openDirs; int openDirID; OpenFiles openFiles; int openFileID; typedef Cache>> StatCache; StatCache statCache; }; } #endif