diff options
-rw-r--r-- | netfs/Jamfile.jam | 1 | ||||
-rw-r--r-- | netfs/daemon.cpp | 8 | ||||
-rw-r--r-- | netfs/daemon.h | 4 | ||||
-rw-r--r-- | netfs/daemonConfig.h | 24 | ||||
-rw-r--r-- | netfs/daemonDirs.cpp | 7 | ||||
-rw-r--r-- | netfs/daemonDirs.h | 10 | ||||
-rw-r--r-- | netfs/daemonFiles.cpp | 35 | ||||
-rw-r--r-- | netfs/daemonFiles.h | 10 | ||||
-rw-r--r-- | netfs/daemonMisc.cpp | 32 | ||||
-rw-r--r-- | netfs/daemonMisc.h | 6 | ||||
-rw-r--r-- | netfs/daemonModule.cpp | 6 | ||||
-rw-r--r-- | netfs/daemonModule.h | 12 | ||||
-rw-r--r-- | netfs/daemonSystem.cpp | 5 | ||||
-rw-r--r-- | netfs/daemonSystem.h | 5 | ||||
-rw-r--r-- | netfs/fuseFiles.cpp | 25 | ||||
-rw-r--r-- | netfs/fuseMisc.cpp | 25 | ||||
-rw-r--r-- | netfs/netfsComms.ice | 2 |
17 files changed, 138 insertions, 79 deletions
diff --git a/netfs/Jamfile.jam b/netfs/Jamfile.jam index 2e688cc..33f1ecd 100644 --- a/netfs/Jamfile.jam +++ b/netfs/Jamfile.jam @@ -100,5 +100,6 @@ exe netfsd : <implicit-dependency>common <library>common <library>boost_regex + <library>boost_filesystem <library>Ice ; diff --git a/netfs/daemon.cpp b/netfs/daemon.cpp index 314479a..65388e5 100644 --- a/netfs/daemon.cpp +++ b/netfs/daemon.cpp @@ -15,10 +15,10 @@ int main(int argc, char* argv[]) try { ic = Ice::initialize(argc, argv); Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("NetFSDaemonAdapter", "default -p 10000"); - adapter->add(new FileServer(), ic->stringToIdentity("Files")); - adapter->add(new DirsServer(), ic->stringToIdentity("Dirs")); - adapter->add(new MiscServer(), ic->stringToIdentity("Misc")); - adapter->add(new SystemServer(), ic->stringToIdentity("System")); + adapter->add(new FileServer(dgs), ic->stringToIdentity("Files")); + adapter->add(new DirsServer(dgs), ic->stringToIdentity("Dirs")); + adapter->add(new MiscServer(dgs), ic->stringToIdentity("Misc")); + adapter->add(new SystemServer(dgs), ic->stringToIdentity("System")); adapter->activate(); ic->waitForShutdown(); } diff --git a/netfs/daemon.h b/netfs/daemon.h index a34c586..7dd6d63 100644 --- a/netfs/daemon.h +++ b/netfs/daemon.h @@ -3,7 +3,7 @@ #include "daemonConfig.h" -class DaemonGlobalState : public IsRefCounted { +class DaemonGlobalState : public IntrusivePtrBase { public: DaemonGlobalState(DaemonConfigPtr c) : config(c) @@ -12,7 +12,7 @@ class DaemonGlobalState : public IsRefCounted { const DaemonConfigPtr config; }; -typedef SmartPointer<DaemonGlobalState> DaemonGlobalStatePtr; +typedef boost::intrusive_ptr<DaemonGlobalState> DaemonGlobalStatePtr; #endif diff --git a/netfs/daemonConfig.h b/netfs/daemonConfig.h index 223436c..a27f686 100644 --- a/netfs/daemonConfig.h +++ b/netfs/daemonConfig.h @@ -4,12 +4,14 @@ #include <string> #include <map> #include <set> -#include "smartpointer.h" +#include <intrusivePtrBase.h> +#include <boost/intrusive_ptr.hpp> +#include <boost/filesystem/path.hpp> #include "xml.h" -class DaemonConfig : public virtual IsRefCounted { +class DaemonConfig : public virtual IntrusivePtrBase { public: - class Host : public virtual IsRefCounted { + class Host : public virtual IntrusivePtrBase { public: Host(xmlNodePtr); @@ -17,30 +19,30 @@ class DaemonConfig : public virtual IsRefCounted { std::string name; bool self; }; - typedef SmartPointer<Host> HostPtr; + typedef boost::intrusive_ptr<Host> HostPtr; typedef std::map<std::string, HostPtr> HostMap; typedef std::set<HostPtr> HostSet; - class Export : public virtual IsRefCounted { + class Export : public virtual IntrusivePtrBase { public: Export(xmlNodePtr, const HostMap &); - std::string root; - std::string name; - HostSet replicate; + boost::filesystem::path root; + std::string name; + HostSet replicate; }; - typedef SmartPointer<Export> ExportPtr; + typedef boost::intrusive_ptr<Export> ExportPtr; typedef std::map<std::string, ExportPtr> ExportMap; DaemonConfig(xmlNodePtr); - static SmartPointer<DaemonConfig> Load(const char * path); + static boost::intrusive_ptr<DaemonConfig> Load(const char * path); ExportMap exports; HostMap hosts; HostPtr self; }; -typedef SmartPointer<DaemonConfig> DaemonConfigPtr; +typedef boost::intrusive_ptr<DaemonConfig> DaemonConfigPtr; #endif diff --git a/netfs/daemonDirs.cpp b/netfs/daemonDirs.cpp index 75ce7c9..3833e8c 100644 --- a/netfs/daemonDirs.cpp +++ b/netfs/daemonDirs.cpp @@ -5,8 +5,11 @@ #include <sys/types.h> #include "daemonDirs.h" -int dirNo = 0; -std::map<Ice::Int, DIR*> dirs; +DirsServer::DirsServer(DaemonGlobalStatePtr dgs) : + DaemonModule(dgs), + dirNo(0) +{ +} Ice::Int DirsServer::opendir(const std::string & path, const Ice::Current&) diff --git a/netfs/daemonDirs.h b/netfs/daemonDirs.h index 8073583..dfd04fb 100644 --- a/netfs/daemonDirs.h +++ b/netfs/daemonDirs.h @@ -2,15 +2,23 @@ #define DAEMONDIRS_H #include "netfsComms.h" +#include "daemonModule.h" +#include <dirent.h> -class DirsServer : public NetFSComms::Dirs { +class DirsServer : public DaemonModule, public NetFSComms::Dirs { public: + DirsServer(DaemonGlobalStatePtr dgs); + virtual Ice::Int opendir(const std::string & path, const Ice::Current&); virtual void closedir(Ice::Int id, const Ice::Current&); virtual NetFSComms::NameList readdir(Ice::Int id, const Ice::Current&); virtual void mkdir(const std::string & path, Ice::Int id, const Ice::Current&); virtual void rmdir(const std::string & path, const Ice::Current&); + + private: + int dirNo; + std::map<Ice::Int, DIR*> dirs; }; #endif diff --git a/netfs/daemonFiles.cpp b/netfs/daemonFiles.cpp index 31a48cf..f447a20 100644 --- a/netfs/daemonFiles.cpp +++ b/netfs/daemonFiles.cpp @@ -1,10 +1,14 @@ #include <errno.h> #include <map> #include <fcntl.h> +#include <sys/stat.h> #include "daemonFiles.h" -int fileNo = 0; -std::map<Ice::Int, int> files; +FileServer::FileServer(DaemonGlobalStatePtr dgs) : + DaemonModule(dgs), + fileNo(0) +{ +} void FileServer::truncate(const std::string & path, Ice::Long size, const Ice::Current&) @@ -29,6 +33,33 @@ FileServer::ftruncate(Ice::Int id, Ice::Long size, const Ice::Current&) // s.replicatedRequest = true; } +NetFSComms::Attr +FileServer::fgetattr(Ice::Int id, const Ice::Current &) +{ + if (files.find(id) == files.end()) { + throw NetFSComms::SystemError(EBADF); + } + struct stat s; + if (::fstat(files[id], &s) != 0) { + throw NetFSComms::SystemError(errno); + } + NetFSComms::Attr a; + a.dev = s.st_dev; + a.inode = s.st_ino; + a.mode = s.st_mode; + a.links = s.st_nlink; + a.uid = s.st_uid; + a.gid = s.st_gid; + a.rdev = s.st_rdev; + a.size = s.st_size; + a.blockSize = s.st_blksize; + a.blocks = s.st_blocks; + a.atime = s.st_atime; + a.mtime = s.st_mtime; + a.ctime = s.st_ctime; + return a; +} + void FileServer::unlink(const std::string & path, const Ice::Current&) { diff --git a/netfs/daemonFiles.h b/netfs/daemonFiles.h index be24586..1ba844c 100644 --- a/netfs/daemonFiles.h +++ b/netfs/daemonFiles.h @@ -2,11 +2,15 @@ #define DAEMONFILES_H #include "netfsComms.h" +#include "daemonModule.h" -class FileServer : public NetFSComms::Files { +class FileServer : public DaemonModule, public NetFSComms::Files { public: + FileServer(DaemonGlobalStatePtr dgs); + virtual void truncate(const std::string & path, Ice::Long size, const Ice::Current&); virtual void ftruncate(Ice::Int id, Ice::Long size, const Ice::Current&); + virtual NetFSComms::Attr fgetattr(Ice::Int id, const Ice::Current&); virtual void unlink(const std::string & path, const Ice::Current&); @@ -15,6 +19,10 @@ class FileServer : public NetFSComms::Files { virtual void close(Ice::Int id, const Ice::Current&); virtual NetFSComms::Buffer read(Ice::Int id, Ice::Long offset, Ice::Long size, const Ice::Current&); virtual void write(Ice::Int id, Ice::Long offset, Ice::Long size, const NetFSComms::Buffer & data, const Ice::Current&); + + private: + int fileNo; + std::map<Ice::Int, int> files; }; #endif diff --git a/netfs/daemonMisc.cpp b/netfs/daemonMisc.cpp index 5a30e31..9327fad 100644 --- a/netfs/daemonMisc.cpp +++ b/netfs/daemonMisc.cpp @@ -7,6 +7,11 @@ extern std::map<Ice::Int, int> files; +MiscServer::MiscServer(DaemonGlobalStatePtr dgs) : + DaemonModule(dgs) +{ +} + Ice::Int MiscServer::access(const std::string & path, Ice::Int mode, const Ice::Current &) { @@ -37,33 +42,6 @@ MiscServer::getattr(const std::string & path, const Ice::Current &) return a; } -NetFSComms::Attr -MiscServer::fgetattr(Ice::Int id, const Ice::Current &) -{ - if (files.find(id) == files.end()) { - throw NetFSComms::SystemError(EBADF); - } - struct stat s; - if (::fstat(files[id], &s) != 0) { - throw NetFSComms::SystemError(errno); - } - NetFSComms::Attr a; - a.dev = s.st_dev; - a.inode = s.st_ino; - a.mode = s.st_mode; - a.links = s.st_nlink; - a.uid = s.st_uid; - a.gid = s.st_gid; - a.rdev = s.st_rdev; - a.size = s.st_size; - a.blockSize = s.st_blksize; - a.blocks = s.st_blocks; - a.atime = s.st_atime; - a.mtime = s.st_mtime; - a.ctime = s.st_ctime; - return a; -} - void MiscServer::symlink(const std::string & path1, const std::string & path2, const Ice::Current &) { diff --git a/netfs/daemonMisc.h b/netfs/daemonMisc.h index af36392..69223f5 100644 --- a/netfs/daemonMisc.h +++ b/netfs/daemonMisc.h @@ -2,12 +2,14 @@ #define DAEMONMISC_H #include "netfsComms.h" +#include "daemonModule.h" -class MiscServer : public NetFSComms::Misc { +class MiscServer : public DaemonModule, public NetFSComms::Misc { public: + MiscServer(DaemonGlobalStatePtr dgs); + virtual Ice::Int access(const std::string & path, Ice::Int mode, const Ice::Current&); virtual NetFSComms::Attr getattr(const std::string & path, const Ice::Current&); - virtual NetFSComms::Attr fgetattr(Ice::Int id, const Ice::Current&); virtual void symlink(const std::string & path1, const std::string & path2, const Ice::Current&); virtual void link(const std::string & path1, const std::string & path2, const Ice::Current&); virtual void rename(const std::string & path1, const std::string & path2, const Ice::Current&); diff --git a/netfs/daemonModule.cpp b/netfs/daemonModule.cpp new file mode 100644 index 0000000..e0f59bd --- /dev/null +++ b/netfs/daemonModule.cpp @@ -0,0 +1,6 @@ +#include "daemonModule.h" + +DaemonModule::DaemonModule(DaemonGlobalStatePtr dgs) +{ +} + diff --git a/netfs/daemonModule.h b/netfs/daemonModule.h new file mode 100644 index 0000000..5d2123c --- /dev/null +++ b/netfs/daemonModule.h @@ -0,0 +1,12 @@ +#ifndef DAEMONMODULE_H +#define DAEMONMODULE_H + +#include "daemon.h" + +class DaemonModule { + protected: + DaemonModule(DaemonGlobalStatePtr dgs); +}; + +#endif + diff --git a/netfs/daemonSystem.cpp b/netfs/daemonSystem.cpp index 74c9a57..9690fc4 100644 --- a/netfs/daemonSystem.cpp +++ b/netfs/daemonSystem.cpp @@ -3,6 +3,11 @@ #include <sys/vfs.h> #include "daemonSystem.h" +SystemServer::SystemServer(DaemonGlobalStatePtr dgs) : + DaemonModule(dgs) +{ +} + NetFSComms::VFS SystemServer::statfs(const std::string & path, const Ice::Current&) { diff --git a/netfs/daemonSystem.h b/netfs/daemonSystem.h index 0e2bedb..3d5f2be 100644 --- a/netfs/daemonSystem.h +++ b/netfs/daemonSystem.h @@ -2,9 +2,12 @@ #define DAEMONSYSTEM_H #include "netfsComms.h" +#include "daemonModule.h" -class SystemServer : public NetFSComms::System { +class SystemServer : public DaemonModule, public NetFSComms::System { public: + SystemServer(DaemonGlobalStatePtr dgs); + virtual NetFSComms::VFS statfs(const std::string & path, const Ice::Current&); }; diff --git a/netfs/fuseFiles.cpp b/netfs/fuseFiles.cpp index 8cb96b3..430b411 100644 --- a/netfs/fuseFiles.cpp +++ b/netfs/fuseFiles.cpp @@ -90,6 +90,31 @@ NetFS::ftruncate(const char *, off_t o, fuse_file_info * fi) } int +NetFS::fgetattr(const char *, struct stat * s, fuse_file_info * fi) +{ + try { + NetFSComms::Attr a = files->fgetattr(fi->fh); + s->st_dev = a.dev; + s->st_ino = a.inode; + s->st_mode = a.mode; + s->st_nlink = a.links; + s->st_uid = a.uid; + s->st_gid = a.gid; + s->st_rdev = a.rdev; + s->st_size = a.size; + s->st_blksize = a.blockSize; + s->st_blocks = a.blocks; + s->st_atime = a.atime; + s->st_mtime = a.mtime; + s->st_ctime = a.ctime; + return 0; + } + catch (NetFSComms::SystemError & e) { + return -e.syserrno; + } +} + +int NetFS::unlink(const char * p) { try { diff --git a/netfs/fuseMisc.cpp b/netfs/fuseMisc.cpp index 074da48..4b3a4bf 100644 --- a/netfs/fuseMisc.cpp +++ b/netfs/fuseMisc.cpp @@ -32,31 +32,6 @@ NetFS::getattr(const char * p, struct stat * s) } int -NetFS::fgetattr(const char *, struct stat * s, fuse_file_info * fi) -{ - try { - NetFSComms::Attr a = misc->fgetattr(fi->fh); - s->st_dev = a.dev; - s->st_ino = a.inode; - s->st_mode = a.mode; - s->st_nlink = a.links; - s->st_uid = a.uid; - s->st_gid = a.gid; - s->st_rdev = a.rdev; - s->st_size = a.size; - s->st_blksize = a.blockSize; - s->st_blocks = a.blocks; - s->st_atime = a.atime; - s->st_mtime = a.mtime; - s->st_ctime = a.ctime; - return 0; - } - catch (NetFSComms::SystemError & e) { - return -e.syserrno; - } -} - -int NetFS::chmod(const char * p, mode_t m) { try { diff --git a/netfs/netfsComms.ice b/netfs/netfsComms.ice index 32c96bc..1fcfaf1 100644 --- a/netfs/netfsComms.ice +++ b/netfs/netfsComms.ice @@ -38,6 +38,7 @@ module NetFSComms { interface Files { void truncate(string path, long size); void ftruncate(int id, long size); + Attr fgetattr(int id); void unlink(string path); @@ -62,7 +63,6 @@ module NetFSComms { interface Misc { int access(string path, int mode); Attr getattr(string path); - Attr fgetattr(int id); void symlink(string path1, string path2); void link(string path1, string path2); void rename(string from, string to); |