diff options
| -rw-r--r-- | netfs/daemon/daemonVolume.cpp | 12 | ||||
| -rw-r--r-- | netfs/daemon/daemonVolume.h | 1 | ||||
| -rw-r--r-- | netfs/fuse/fuse.h | 1 | ||||
| -rw-r--r-- | netfs/fuse/fuseMisc.cpp | 12 | ||||
| -rw-r--r-- | netfs/ice/volume.ice | 1 | 
5 files changed, 27 insertions, 0 deletions
| diff --git a/netfs/daemon/daemonVolume.cpp b/netfs/daemon/daemonVolume.cpp index c87b1b0..e21bdd0 100644 --- a/netfs/daemon/daemonVolume.cpp +++ b/netfs/daemon/daemonVolume.cpp @@ -73,6 +73,18 @@ VolumeServer::getattr(const NetFS::ReqEnv & re, const std::string & path, const  }  void +VolumeServer::mknod(const NetFS::ReqEnv & re, const std::string & path, Ice::Int mode, Ice::Int dev, const Ice::Current&) +{ +	TempPrivs tp(re, root); +	errno = 0; +	boost::filesystem::path p(resolvePath(path)); +	tp.AssertWrite(p.parent_path()); +	if (::mknod(p.string().c_str(), mode, dev) != 0) { +		throw NetFS::SystemError(errno); +	} +} + +void  VolumeServer::symlink(const NetFS::ReqEnv & re, const std::string & path1, const std::string & path2, const Ice::Current &)  {  	TempPrivs tp(re, root); diff --git a/netfs/daemon/daemonVolume.h b/netfs/daemon/daemonVolume.h index e3ca40c..8faa5ff 100644 --- a/netfs/daemon/daemonVolume.h +++ b/netfs/daemon/daemonVolume.h @@ -26,6 +26,7 @@ class VolumeServer : public NetFS::Volume {  		virtual Ice::Int access(const NetFS::ReqEnv &, const std::string & path, Ice::Int mode, const Ice::Current&) override;  		virtual NetFS::Attr getattr(const NetFS::ReqEnv &, const std::string & path, const Ice::Current&) override; +		virtual void mknod(const NetFS::ReqEnv &, const std::string & path, Ice::Int mode, Ice::Int dev, const Ice::Current&) override;  		virtual void symlink(const NetFS::ReqEnv &, const std::string & path1, const std::string & path2, const Ice::Current&) override;  		virtual void link(const NetFS::ReqEnv &, const std::string & path1, const std::string & path2, const Ice::Current&) override;  		virtual void rename(const NetFS::ReqEnv &, const std::string & path1, const std::string & path2, const Ice::Current&) override; diff --git a/netfs/fuse/fuse.h b/netfs/fuse/fuse.h index 1f80686..3821285 100644 --- a/netfs/fuse/fuse.h +++ b/netfs/fuse/fuse.h @@ -58,6 +58,7 @@ namespace NetFS {  			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); diff --git a/netfs/fuse/fuseMisc.cpp b/netfs/fuse/fuseMisc.cpp index d5064f3..0e366be 100644 --- a/netfs/fuse/fuseMisc.cpp +++ b/netfs/fuse/fuseMisc.cpp @@ -65,6 +65,18 @@ NetFS::FuseApp::link(const char * p1, const char * p2)  }  int +NetFS::FuseApp::mknod(const char * p, mode_t mode, dev_t dev) +{ +	try { +		volume->mknod(reqEnv(), p, mode, dev); +		return 0; +	} +	catch (NetFS::SystemError & e) { +		return -e.syserrno; +	} +} + +int  NetFS::FuseApp::symlink(const char * p1, const char * p2)  {  	try { diff --git a/netfs/ice/volume.ice b/netfs/ice/volume.ice index 7b0e3e0..34f46ba 100644 --- a/netfs/ice/volume.ice +++ b/netfs/ice/volume.ice @@ -29,6 +29,7 @@ module NetFS {  		void mkdir(ReqEnv env, string path, int mode) throws AuthError, SystemError;  		void rmdir(ReqEnv env, string path) throws AuthError, SystemError; +		void mknod(ReqEnv env, string path, int mode, int dev) throws AuthError, SystemError;  		void symlink(ReqEnv env, string path1, string path2) throws AuthError, SystemError;  		void link(ReqEnv env, string path1, string path2) throws AuthError, SystemError;  		void rename(ReqEnv env, string from, string to) throws AuthError, SystemError; | 
