diff options
| author | randomdan <randomdan@localhost> | 2010-10-06 14:51:06 +0000 | 
|---|---|---|
| committer | randomdan <randomdan@localhost> | 2010-10-06 14:51:06 +0000 | 
| commit | 22d5aeea56b472d947e10a14acd0891455849e27 (patch) | |
| tree | b075948c0549c7d353ee3b6968772dd3199913a4 | |
| parent | Jam (diff) | |
| download | netfs-22d5aeea56b472d947e10a14acd0891455849e27.tar.bz2 netfs-22d5aeea56b472d947e10a14acd0891455849e27.tar.xz netfs-22d5aeea56b472d947e10a14acd0891455849e27.zip  | |
Commit work-to-date of port to using Ice for comms and Boost for paths
| -rw-r--r-- | netfs/Jamfile.jam | 77 | ||||
| -rw-r--r-- | netfs/comms.cpp | 90 | ||||
| -rw-r--r-- | netfs/comms.h | 71 | ||||
| -rw-r--r-- | netfs/daemon.cpp | 256 | ||||
| -rw-r--r-- | netfs/daemon.h | 40 | ||||
| -rw-r--r-- | netfs/daemonDirs.cpp | 111 | ||||
| -rw-r--r-- | netfs/daemonDirs.h | 17 | ||||
| -rw-r--r-- | netfs/daemonFS.cpp | 20 | ||||
| -rw-r--r-- | netfs/daemonFiles.cpp | 170 | ||||
| -rw-r--r-- | netfs/daemonFiles.h | 21 | ||||
| -rw-r--r-- | netfs/daemonMisc.cpp | 168 | ||||
| -rw-r--r-- | netfs/daemonMisc.h | 20 | ||||
| -rw-r--r-- | netfs/daemonSystem.cpp | 28 | ||||
| -rw-r--r-- | netfs/daemonSystem.h | 12 | ||||
| -rw-r--r-- | netfs/fuse.cpp | 72 | ||||
| -rw-r--r-- | netfs/fuse.h | 80 | ||||
| -rw-r--r-- | netfs/fuseDirs.cpp | 67 | ||||
| -rw-r--r-- | netfs/fuseFS.cpp | 13 | ||||
| -rw-r--r-- | netfs/fuseFiles.cpp | 112 | ||||
| -rw-r--r-- | netfs/fuseMisc.cpp | 141 | ||||
| -rw-r--r-- | netfs/fuseSystem.cpp | 25 | ||||
| -rw-r--r-- | netfs/fusecallers.h | 4 | ||||
| -rw-r--r-- | netfs/msgtypes.cpp | 200 | ||||
| -rw-r--r-- | netfs/msgtypes.h | 348 | ||||
| -rw-r--r-- | netfs/netfsComms.ice | 76 | ||||
| -rw-r--r-- | netfs/xfers.h | 56 | 
26 files changed, 788 insertions, 1507 deletions
diff --git a/netfs/Jamfile.jam b/netfs/Jamfile.jam index e00fa16..1bd8c19 100644 --- a/netfs/Jamfile.jam +++ b/netfs/Jamfile.jam @@ -1,4 +1,6 @@  using gcc ; +import type : register ; +import generators : register-standard ;  alias libxmlpp : : : :  	<cflags>"`pkg-config --cflags libxml++-2.6`" @@ -9,25 +11,94 @@ alias fuse : : : :  lib boost_regex : : <name>boost_regex ;  lib boost_filesystem : : <name>boost_filesystem ; +lib Ice : : <name>Ice ; + +import type ;  +import generators ;  +import feature ;  +import "class" : new ;  +import scanner ;  +type.register SLICE : ice ;  +class slice-scanner : scanner  +{  +    import path property-set regex scanner type virtual-target ;  +    rule __init__ ( includes * )  +    {  +        scanner.__init__ ;  +        self.includes = $(includes) ;  +    }  +    rule pattern ( )  +    {  +        return "^[ \t]*#[ \t]*include[ ]*(<(.*)>|\"(.*)\")" ;  +    }  +    rule process ( target : matches * : binding )  +    {  +        local included = [ regex.transform $(matches) : "\"(.*)\"" : 1 ] ;  +        local g = [ on $(target) return $(HDRGRIST) ] ;  +        local b = [ NORMALIZE_PATH $(binding:D) ] ;  +        local g2 = $(g)"#"$(b) ;  +        included = $(included:G=$(g2)) ;  +        #this seems to add the dependency ok to the tree, but  +        #I can't get these new dependencies to build  +        #I've seen virtual-target.register but I don't have access to properties  +        #and project names to do that here.  +        INCLUDES $(target) : $(included) ;  +        scanner.propagate $(__name__) : $(matches) : $(target) ;  +    }  +}  +scanner.register slice-scanner : include ;  +type.set-scanner SLICE : slice-scanner ;  +class slice-generator : generator  +{  +    import "class" : new ;  +    rule __init__ ( * : * )  +    {  +        generator.__init__ $(1) : $(2) : $(3) : $(4) : $(5) : $(6) : $(7) : $(8) : $(9) ;  +    }  +    rule run ( project name ? : property-set : sources * )  +    {  +        #could I register new virtual targets here? The problem is I can't seem to  +        #be able to get the list of includes that the scanner built from anywhere  +            return [ generator.run $(project) $(name) : $(property-set) : $(sources) ] ;  +    }  +    rule generated-targets ( sources + : property-set : project name ? )  +    {  +        return [ generator.generated-targets $(sources) : $(property-set) : $(project) $(name) ] ;  +    }  +}  +generators.register [ new slice-generator slice.slice2cpp : SLICE : CPP H ] ;  +actions slice.slice2cpp  +{  +  slice2cpp --checksum --output-dir $(1[1]:D) $(2)  +}  +IMPORT $(__name__) : slice.slice2cpp : : slice.slice2cpp ; + +lib common : +	netfsComms.ice : +	<link>static +	;  exe netfs :  	libxmlpp -	comms.cpp msgtypes.cpp  	[ glob fuse*.cpp ]  	../libmisc  	:  	<include>../libmisc/ +	<include>bin/gcc-4.4.4/debug/link-static/ +	<library>common  	<library>boost_regex  	<library>fuse +	<library>Ice  	;  exe netfsd :  	libxmlpp -	comms.cpp msgtypes.cpp  	[ glob daemon*.cpp ]  	../libmisc  	:  	<include>../libmisc/ +	<include>bin/gcc-4.4.4/debug/link-static/ +	<library>common  	<library>boost_regex -	<library>fuse +	<library>Ice  	; diff --git a/netfs/comms.cpp b/netfs/comms.cpp deleted file mode 100644 index 5993ac7..0000000 --- a/netfs/comms.cpp +++ /dev/null @@ -1,90 +0,0 @@ -#include <queue> -#include <stdio.h> -#include <string.h> -#include <stdint.h> -#include <sys/types.h> -#include <sys/socket.h> -#include "threads.h" -#include "comms.h" -#include "msgtypes.h" - -Semaphore outQueueSl(0); -Semaphore outQueueSu(30); -Semaphore inQueueS(0); -Mutex outQueueM; -Mutex inQueueM; -std::queue<PacketPtr> outQueue; -std::queue<PacketPtr> inQueue; - -Packet::Packet(uint8_t i, DataPayloadPtr p) : -	index(i), -	data(p) -{ -} -void -sendPacket(PacketPtr p) -{ -	outQueueSu.wait(); -	outQueueSl.post(); -	AutoMutex am(outQueueM); -	outQueue.push(p); -} - -void -packetSender(FILE * host) -{ -	while (1) { -		outQueueSl.wait(); -		AutoMutex am(outQueueM); -		// We can indicate an exit request by posting the semaphore without putting -		// anything in the queue -		if (outQueue.size() == 0) { -			break; -		} -		outQueue.front()->write(host); -		outQueueSu.post(); -	} -} - -Packet::Packet(FILE * host) -{ -	if (fread(&index, sizeof(index), 1, host) != 1) { -		throw ReadMessageFailed(); -	} -	DataPayload::TypeID t = 0; -	if (fread(&t, sizeof(t), 1, host) != 1) { -		throw ReadMessageFailed(); -	} -	data = MsgFacs()[t](); -	data->Read(host); -} -void -Packet::write(FILE * host) const -{ -	if (fwrite(&index, sizeof(index), 1, host) != 1) { -		throw WriteMessageFailed(); -	} -	DataPayload::TypeID t = data->dataTypeID(); -	if (fwrite(&t, sizeof(t), 1, host) != 1) { -		throw WriteMessageFailed(); -	} -	data->Send(host); -	if (fflush(host) != 0) { -		throw WriteMessageFailed(); -	} -} - -PacketPtr -recvPacket() -{ -	inQueueS.wait(); -	AutoMutex am(inQueueM); -	PacketPtr rtn = inQueue.front(); -	inQueue.pop(); -	return rtn; -} - -ContentBase::~ContentBase() -{ -} - diff --git a/netfs/comms.h b/netfs/comms.h deleted file mode 100644 index cd25a9e..0000000 --- a/netfs/comms.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef COMMS_H -#define COMMS_H - -#include <stdio.h> -#include <stdint.h> -#include "smartpointer.h" -#include "fuseapp.h" - -class WriteMessageFailed : std::exception { -}; -class ReadMessageFailed : std::exception { -}; -class DataPayload : public IsRefCounted { -	public: -		typedef uint16_t TypeID; - -		virtual TypeID			dataTypeID() const = 0; -		virtual void			Send(FILE *) const = 0; -		virtual void			Read(FILE *) = 0; -}; -class NetFS; -template <class Type> -class TypedPayload : public DataPayload { -	public: -		typedef SmartPointer<TypedPayload<Type> > Ptr; -		Type			data; -		TypeID			dataTypeID() const { return Type::TypeID; } -		void			Send(FILE * h) const { data.Send(h); } -		void			Read(FILE * h) { data.Read(h); } -}; -typedef SmartPointer<DataPayload> DataPayloadPtr; -typedef SmartPointer<const DataPayload> DataPayloadCPtr; - -template <class Type> -class TypedPayloadReq : public TypedPayload<Type> { -	public: -		typedef typename Type::Reply Reply; -		typedef SmartPointer<TypedPayloadReq<Type> > Ptr; -		typedef SmartPointer<TypedPayload<Reply> > ReplyPtr; -		TypedPayloadReq(fuse_context * fc) -		{ -			TypedPayload<Type>::data.uid = fc->uid; -			TypedPayload<Type>::data.gid = fc->gid; -		} -		ReplyPtr	 	exchange(NetFS * net); -		/* -		{ -			DataPayloadPtr p = net->exchange(this); -			return p.as<TypedPayload<typename Type::Reply> >(); -		} -		*/ -}; - - -class Packet : public IsRefCounted { -	public: -		Packet(FILE *); -		Packet(uint8_t i, DataPayloadPtr p); - -		void			write(FILE *) const; - -		uint8_t			index; -		DataPayloadPtr	data; -}; -typedef SmartPointer<Packet> PacketPtr; - -void -sendPacket(PacketPtr p); - -#endif - diff --git a/netfs/daemon.cpp b/netfs/daemon.cpp index 691b681..314479a 100644 --- a/netfs/daemon.cpp +++ b/netfs/daemon.cpp @@ -1,239 +1,45 @@ -#include <sys/types.h> -#include <sys/socket.h> -#include <netdb.h> -#include <signal.h> -#include <errno.h> -#include <string.h> -#include <set> -#include "daemonConfig.h" -#include "comms.h" -#include "msgtypes.h" -#include "misc.h" +#include <Ice/Ice.h>  #include "daemon.h" +#include "daemonConfig.h" +#include "daemonDirs.h" +#include "daemonFiles.h" +#include "daemonMisc.h" +#include "daemonSystem.h" -Sender::Sender(int i, FILE * f) : -	replicatedRequest(false), -	idx(i), -	host(f) -{ -} -void Sender::Send(DataPayloadPtr p) -{ -	PacketPtr r = new Packet(idx, p); -	r->write(host); -} - -class TempUserChange { -	public: -		TempUserChange(uid_t u, gid_t g) : -			ogid(getegid()), -			ouid(geteuid()) -		{ -			errno = 0; -			setegid(g); -			seteuid(u); -		} -		~TempUserChange() -		{ -			setegid(ogid); -			seteuid(ouid); -		} -	private: -		gid_t	ogid; -		uid_t	ouid; -}; - -#define TRYCLASS(cls) \ -	if (type == cls::TypeID) { \ -		TypedPayload<cls>::Ptr tp = p->data.as<TypedPayload<cls> >(); \ -		TempUserChange tuc(tp->data.uid, tp->data.gid); \ -		handle(tp, s); \ -	} - -void -runDaemonOn(FILE * f, DaemonGlobalStatePtr) +int main(int argc, char* argv[])  { -	PacketPtr p = new Packet(f); -	Sender s(p->index, f); -	uint16_t type (p->data->dataTypeID()); -	// Dirs -	TRYCLASS(OpenDirRequest); -	TRYCLASS(CloseDirRequest); -	TRYCLASS(ReadDirRequest); -	TRYCLASS(RmDirRequest); -	TRYCLASS(MkDirRequest); -	// Misc -	TRYCLASS(AccessRequest); -	TRYCLASS(GetAttrRequest); -	TRYCLASS(FgetAttrRequest); -	TRYCLASS(UnlinkRequest); -	TRYCLASS(SymlinkRequest); -	TRYCLASS(LinkRequest); -	TRYCLASS(RenameRequest); -	TRYCLASS(ReadlinkRequest); -	TRYCLASS(ChmodRequest); -	TRYCLASS(ChownRequest); -	// Files -	TRYCLASS(OpenRequest); -	TRYCLASS(CloseRequest); -	TRYCLASS(ReadRequest); -	TRYCLASS(WriteRequest); -	TRYCLASS(TruncateRequest); -	TRYCLASS(FtruncateRequest); -	TRYCLASS(CreateRequest); -	// FS -	TRYCLASS(StatfsRequest); +	DaemonConfigPtr dc = DaemonConfig::Load("daemon.xml"); +	DaemonGlobalStatePtr dgs = new DaemonGlobalState(dc); -	if (s.replicatedRequest) { +	Ice::CommunicatorPtr ic; +	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->activate(); +		ic->waitForShutdown();  	} -} -typedef void (*sa_sigaction_t)(int, siginfo_t *, void *); - -bool running = true; -void onsigint(int, siginfo_t *, void *) -{ -	running = false; -} - -void setsignal(int sig, sa_sigaction_t f) -{ -	struct sigaction act; -	memset(&act, 0, sizeof(struct sigaction)); -	act.sa_sigaction = f; -	sigaction(sig, &act, NULL); -} - -class SocketEventHandler : public IsRefCounted { -	public: -		SocketEventHandler(int sock) : socket(sock) { } -		virtual void onRead() { } -		virtual void onWrite() { } -		virtual void onError() { } - -		const int socket; -}; -typedef SmartPointer<SocketEventHandler> SockEvHdlrPtr; -typedef std::map<int, SockEvHdlrPtr> SocketSet; - -class IncomingPacketHandler : public SocketEventHandler { -	public: -		IncomingPacketHandler(int sock, DaemonGlobalStatePtr d) : SocketEventHandler(sock), dgs(d) -		{ -			f = fdopen(sock, "a+"); -		} -		void onRead() -		{ -			runDaemonOn(f, dgs); -		} -		void onError() -		{ -		} -	private: -		FILE * f; -		DaemonGlobalStatePtr dgs; -}; -class ListenAcceptHandler : public SocketEventHandler { -	public: -		ListenAcceptHandler(int sock, SocketSet & socks, DaemonGlobalStatePtr d) : -			SocketEventHandler(sock), sockets(socks), dgs(d) -		{ -		} -		void onRead() -		{ -			int fd = accept(socket, NULL, NULL); -			sockets[fd] = new IncomingPacketHandler(fd, dgs); -		} -	private: -		SocketSet & sockets; -		DaemonGlobalStatePtr dgs; -}; - - -void -createListeners(DaemonGlobalStatePtr dgs, SocketSet & lsocks) -{ -	struct addrinfo hints; -	memset(&hints, 0, sizeof(struct addrinfo)); -	hints.ai_family = AF_UNSPEC; -	hints.ai_socktype = SOCK_STREAM; -	hints.ai_flags = AI_PASSIVE; -	struct addrinfo *result, *rp; -	if (getaddrinfo(NULL, dgs->config->self->tcpPort.c_str(), &hints, &result) == 0) { -		for (rp = result; rp != NULL; rp = rp->ai_next) { -			int sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); -			if (sfd == -1) { -				close(sfd); -				continue; -			} -			if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != 0) { -				close(sfd); -				continue; -			} -			if (listen(sfd, 5)) { -				close(sfd); -				continue; -			} -			lsocks[sfd] = new ListenAcceptHandler(sfd, lsocks, dgs); -		} +	catch (const Ice::Exception& e) { +		std::cerr << e << std::endl; +		return 1;  	} -} - -void -listener(DaemonGlobalStatePtr dgs) -{ -	SocketSet socks; -	createListeners(dgs, socks); -	if (!socks.size()) { -		return; +	catch (const char* msg) { +		std::cerr << msg << std::endl; +		return 1;  	} -	while (running) { -		fd_set readSocks; -		fd_set errSocks; -		FD_ZERO(&readSocks); -		FD_ZERO(&errSocks); -		int maxfd = 0; -		foreach(SocketSet::const_iterator, socks, s) { -			FD_SET(s->first, &readSocks); -			FD_SET(s->first, &errSocks); -			maxfd = std::max(s->first, maxfd); +	if (ic) { +		try { +			ic->destroy();  		} -		struct timeval to = { 1, 0 }; -		int rsel = select(maxfd + 1, &readSocks, NULL, &errSocks, &to); -		if (rsel) { -			std::set<int> toRemove; -			foreach(SocketSet::const_iterator, socks, s) { -				if (FD_ISSET(s->first, &errSocks)) { -					s->second->onError(); -					close(s->first); -					toRemove.insert(s->second); -				} -				else { -					if (FD_ISSET(s->first, &readSocks)) { -						try { -							s->second->onRead(); -						} -						catch (...) { -						} -					} -				} -			} -			foreach(std::set<int>::const_iterator, toRemove, s) { -				socks.erase(*s); -			} +		catch (const Ice::Exception& e) { +			std::cerr << e << std::endl; +			return 1;  		}  	} -	foreach(SocketSet::const_iterator, socks, s) { -		close(s->first); -	} -} - -int main(int, char* []) -{ -	DaemonConfigPtr dc = DaemonConfig::Load("daemon.xml"); -	DaemonGlobalStatePtr dgs = new DaemonGlobalState(dc); -	setsignal(SIGINT, onsigint); -	listener(dgs);  	return 0;  } diff --git a/netfs/daemon.h b/netfs/daemon.h index 6b57976..a34c586 100644 --- a/netfs/daemon.h +++ b/netfs/daemon.h @@ -1,9 +1,7 @@  #ifndef DAEMON_H  #define DAEMON_H -#include "comms.h"  #include "daemonConfig.h" -#include "msgtypes.h"  class DaemonGlobalState : public IsRefCounted {  	public: @@ -15,44 +13,6 @@ class DaemonGlobalState : public IsRefCounted {  		const DaemonConfigPtr config;  };  typedef SmartPointer<DaemonGlobalState> DaemonGlobalStatePtr; -class Sender { -	public: -		Sender(int i, FILE * f); -		void Send(DataPayloadPtr p); -		bool replicatedRequest; -	private: -		int idx; -		FILE * host; -}; - -#define handler(type) void handle(SmartPointer<TypedPayload<type> > req, Sender & s) -// Dirs -handler(OpenDirRequest); -handler(CloseDirRequest); -handler(ReadDirRequest); -handler(RmDirRequest); -handler(MkDirRequest); -// Misc -handler(AccessRequest); -handler(GetAttrRequest); -handler(FgetAttrRequest); -handler(UnlinkRequest); -handler(SymlinkRequest); -handler(LinkRequest); -handler(RenameRequest); -handler(ReadlinkRequest); -handler(ChmodRequest); -handler(ChownRequest); -// Files -handler(OpenRequest); -handler(CloseRequest); -handler(ReadRequest); -handler(WriteRequest); -handler(TruncateRequest); -handler(FtruncateRequest); -handler(CreateRequest); -// FS -handler(StatfsRequest);  #endif diff --git a/netfs/daemonDirs.cpp b/netfs/daemonDirs.cpp index 17f9367..75ce7c9 100644 --- a/netfs/daemonDirs.cpp +++ b/netfs/daemonDirs.cpp @@ -1,80 +1,75 @@  #include <dirent.h>  #include <errno.h> -#include <set> -#include "comms.h" -#include "msgtypes.h" -#include "daemon.h" -#include "misc.h" +#include <map> +#include <sys/stat.h> +#include <sys/types.h> +#include "daemonDirs.h"  int dirNo = 0; -std::map<int, DIR*> dirs; -handler(OpenDirRequest) +std::map<Ice::Int, DIR*> dirs; + +Ice::Int +DirsServer::opendir(const std::string & path, const Ice::Current&)  { -	TypedPayload<OpenDirRequest::Reply> * r = new TypedPayload<OpenDirRequest::Reply>();  	errno = 0; -	DIR * od = opendir(req->data.path.c_str()); -	if (od) { -		dirs[++dirNo] = od; -		r->data.handle = dirNo; -		s.replicatedRequest = true; +	DIR * od = ::opendir(path.c_str()); +	if (!od) { +		throw NetFSComms::SystemError(errno);  	} -	r->data.error = errno; -	s.Send(r); +	dirs[++dirNo] = od; +	//s.replicatedRequest = true; +	return dirNo;  } -handler(CloseDirRequest) + +void +DirsServer::closedir(Ice::Int id, const Ice::Current&)  { -	TypedPayload<CloseDirRequest::Reply> * r = new TypedPayload<CloseDirRequest::Reply>(); -	if (dirs.find(req->data.handle) != dirs.end()) { -		errno = 0; -		if (closedir(dirs[req->data.handle]) != 0) { -			r->data.error = errno; -		} -		else { -			dirs.erase(req->data.handle); -		} -		s.replicatedRequest = true; +	if (dirs.find(id) == dirs.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.error = EBADF; +	errno = 0; +	if (::closedir(dirs[id]) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	dirs.erase(id); +	//s.replicatedRequest = true;  } -handler(ReadDirRequest) + +NetFSComms::NameList +DirsServer::readdir(Ice::Int id, const Ice::Current&)  { -	TypedPayload<ReadDirRequest::Reply> * r = new TypedPayload<ReadDirRequest::Reply>(); -	if (dirs.find(req->data.handle) != dirs.end()) { -		errno = 0; -		dirent * d; -		while ((d = readdir(dirs[req->data.handle])) && errno == 0) { -			r->data.entries.push_back(ReadDirReply::Entry()); -			r->data.entries.back().path = d->d_name; -			stat("/", &r->data.entries.back().val); -		} -		r->data.error = errno; -		s.Send(r); +	if (dirs.find(id) == dirs.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.error = EBADF; -		s.Send(r); +	errno = 0; +	dirent * d; +	NetFSComms::NameList list; +	while ((d = ::readdir(dirs[id]))) { +		if (errno) { +			throw NetFSComms::SystemError(errno); +		} +		list.push_back(d->d_name);  	} +	return list;  } -handler(MkDirRequest) + +void +DirsServer::mkdir(const std::string & path, Ice::Int mode, const Ice::Current&)  { -	TypedPayload<MkDirRequest::Reply> * r = new TypedPayload<MkDirRequest::Reply>();  	errno = 0; -	mkdir(req->data.path.c_str(), req->data.mode); -	r->data.value = errno; -	if (errno == 0) -		s.replicatedRequest = true; -	s.Send(r); +	if (::mkdir(path.c_str(), mode) != 0) { +		throw NetFSComms::SystemError(errno); +	} +	// s.replicatedRequest = true;  } -handler(RmDirRequest) + +void +DirsServer::rmdir(const std::string & path, const Ice::Current&)  { -	TypedPayload<MkDirRequest::Reply> * r = new TypedPayload<MkDirRequest::Reply>();  	errno = 0; -	rmdir(req->data.path.c_str()); -	r->data.value = errno; -	if (errno == 0) -		s.replicatedRequest = true; -	s.Send(r); +	if (::rmdir(path.c_str()) != 0) { +		throw NetFSComms::SystemError(errno); +	} +	// s.replicatedRequest = true;  } + diff --git a/netfs/daemonDirs.h b/netfs/daemonDirs.h new file mode 100644 index 0000000..8073583 --- /dev/null +++ b/netfs/daemonDirs.h @@ -0,0 +1,17 @@ +#ifndef DAEMONDIRS_H +#define DAEMONDIRS_H + +#include "netfsComms.h" + +class DirsServer : public NetFSComms::Dirs { +	public: +		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&); +}; + +#endif + diff --git a/netfs/daemonFS.cpp b/netfs/daemonFS.cpp deleted file mode 100644 index f8220ea..0000000 --- a/netfs/daemonFS.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include <errno.h> -#include <sys/vfs.h> -#include "comms.h" -#include "msgtypes.h" -#include "daemon.h" -#include "misc.h" - -handler(StatfsRequest) -{ -	TypedPayload<StatfsRequest::Reply> * r = new TypedPayload<StatfsRequest::Reply>(); -	errno = 0; -	if (statvfs(req->data.path.c_str(), &r->data.statfs) != 0) { -		r->data.error = errno; -	} -	else { -		r->data.error = 0; -	} -	s.Send(r); -} - diff --git a/netfs/daemonFiles.cpp b/netfs/daemonFiles.cpp index eb274f0..31a48cf 100644 --- a/netfs/daemonFiles.cpp +++ b/netfs/daemonFiles.cpp @@ -1,125 +1,113 @@  #include <errno.h> -#include <set> -#include "comms.h" -#include "msgtypes.h" -#include "daemon.h" -#include "misc.h" +#include <map> +#include <fcntl.h> +#include "daemonFiles.h" -handler(TruncateRequest) +int fileNo = 0; +std::map<Ice::Int, int> files; + +void +FileServer::truncate(const std::string & path, Ice::Long size, const Ice::Current&)  { -	TypedPayload<TruncateRequest::Reply> * r = new TypedPayload<TruncateRequest::Reply>();  	errno = 0; -	if (truncate(req->data.path.c_str(), req->data.size) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::truncate(path.c_str(), size) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(FtruncateRequest) + +void +FileServer::ftruncate(Ice::Int id, Ice::Long size, const Ice::Current&)  { -	TypedPayload<FtruncateRequest::Reply> * r = new TypedPayload<FtruncateRequest::Reply>(); -	errno = 0; -	if (ftruncate(req->data.handle, req->data.size) != 0) { -		r->data.value = errno; +	if (files.find(id) == files.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	errno = 0; +	if (::ftruncate(files[id], size) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(UnlinkRequest) + +void +FileServer::unlink(const std::string & path, const Ice::Current&)  { -	TypedPayload<UnlinkRequest::Reply> * r = new TypedPayload<UnlinkRequest::Reply>();  	errno = 0; -	unlink(req->data.path.c_str()); -	r->data.value = errno; -	if (errno == 0) -		s.replicatedRequest = true; -	s.Send(r); +	if (::unlink(path.c_str()) != 0) { +		throw NetFSComms::SystemError(errno); +	} +	// s.replicatedRequest = true;  } -int fileNo = 0; -std::map<int, int> files; -handler(OpenRequest) + +Ice::Int +FileServer::open(const std::string & path, Ice::Int flags, const Ice::Current&)  { -	TypedPayload<OpenRequest::Reply> * r = new TypedPayload<OpenRequest::Reply>();  	errno = 0; -	int fd = open(req->data.path.c_str(), 0); -	if (fd != -1) { -		files[++fileNo] = fd; -		r->data.handle = fileNo; -		s.replicatedRequest = true; +	int fd = ::open(path.c_str(), flags); +	if (fd == -1) { +		throw NetFSComms::SystemError(errno);  	} -	r->data.error = errno; -	s.Send(r); +	files[++fileNo] = fd; +	//s.replicatedRequest = true; +	return fileNo;  } -handler(CreateRequest) + +Ice::Int +FileServer::create(const std::string & path, Ice::Int flags, Ice::Int mode, const Ice::Current&)  { -	TypedPayload<OpenRequest::Reply> * r = new TypedPayload<OpenRequest::Reply>();  	errno = 0; -	int fd = open(req->data.path.c_str(), O_CREAT, req->data.mode); -	if (fd != -1) { -		files[++fileNo] = fd; -		r->data.handle = fileNo; -		s.replicatedRequest = true; +	int fd = ::open(path.c_str(), O_CREAT | flags, mode); +	if (fd == -1) { +		throw NetFSComms::SystemError(errno);  	} -	r->data.error = errno; -	s.Send(r); +	files[++fileNo] = fd; +	//s.replicatedRequest = true; +	return fileNo;  } -handler(CloseRequest) + +void +FileServer::close(Ice::Int id, const Ice::Current&)  { -	TypedPayload<CloseRequest::Reply> * r = new TypedPayload<CloseRequest::Reply>(); -	if (files.find(req->data.handle) != files.end()) { -		errno = 0; -		if (close(files[req->data.handle]) == 0) { -			files.erase(req->data.handle); -		} -		r->data.error = errno; -		s.replicatedRequest = true; +	if (files.find(id) == files.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.error = EBADF; +	errno = 0; +	if (::close(files[id]) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	files.erase(id); +	// s.replicatedRequest = true;  } -handler(ReadRequest) + +NetFSComms::Buffer +FileServer::read(Ice::Int id, Ice::Long offset, Ice::Long size, const Ice::Current&)  { -	TypedPayload<ReadRequest::Reply> * r = new TypedPayload<ReadRequest::Reply>(); -	if (files.find(req->data.handle) != files.end()) { -		char * tmpdata = new char[req->data.size](); -		errno = 0; -		int rs = pread(files[req->data.handle], tmpdata, req->data.size, req->data.offset); -		if (rs != -1) { -			r->data.data = tmpdata; -			r->data.size = rs; -		} -		else { -			r->data.size = 0; -			r->data.data = NULL; -		} -		r->data.error = errno; +	if (files.find(id) == files.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.error = EBADF; +	NetFSComms::Buffer buf; +	buf.resize(size); +	errno = 0; +	int r = pread(files[id], &buf[0], size, offset); +	if (r == -1) { +		throw NetFSComms::SystemError(errno); +	} +	else if (r != size) { +		buf.resize(r);  	} -	s.Send(r); +	return buf;  } -handler(WriteRequest) + +void +FileServer::write(Ice::Int id, Ice::Long offset, Ice::Long size, const NetFSComms::Buffer & data, const Ice::Current&)  { -	TypedPayload<WriteRequest::Reply> * r = new TypedPayload<WriteRequest::Reply>(); -	if (files.find(req->data.handle) != files.end()) { -		errno = 0; -		if (pwrite(files[req->data.handle], req->data.data, req->data.size, req->data.offset) != -1) { -			s.replicatedRequest = true; -		} -		r->data.error = errno; +	if (files.find(id) == files.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.error = EBADF; +	errno = 0; +	if (pwrite(files[id], &data[0], size, offset) != size) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } diff --git a/netfs/daemonFiles.h b/netfs/daemonFiles.h new file mode 100644 index 0000000..be24586 --- /dev/null +++ b/netfs/daemonFiles.h @@ -0,0 +1,21 @@ +#ifndef DAEMONFILES_H +#define DAEMONFILES_H + +#include "netfsComms.h" + +class FileServer : public NetFSComms::Files { +	public: +		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 void unlink(const std::string & path, const Ice::Current&); + +		virtual Ice::Int open(const std::string & path, Ice::Int flags, const Ice::Current&); +		virtual Ice::Int create(const std::string & path, Ice::Int flags, Ice::Int mode, const Ice::Current&); +		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&); +}; + +#endif + diff --git a/netfs/daemonMisc.cpp b/netfs/daemonMisc.cpp index 2341b21..5a30e31 100644 --- a/netfs/daemonMisc.cpp +++ b/netfs/daemonMisc.cpp @@ -1,120 +1,128 @@  #include <errno.h> -#include <set> +#include <map>  #include <unistd.h> +#include <sys/stat.h>  #include <limits.h> -#include "comms.h" -#include "msgtypes.h" -#include "daemon.h" -#include "misc.h" +#include "daemonMisc.h" -extern std::map<int, int> files; +extern std::map<Ice::Int, int> files; -handler(AccessRequest) +Ice::Int +MiscServer::access(const std::string & path, Ice::Int mode, const Ice::Current &)  { -	TypedPayload<AccessRequest::Reply> * r = new TypedPayload<AccessRequest::Reply>(); -	r->data.value = access(req->data.path.c_str(), req->data.access); -	s.Send(r); +	return ::access(path.c_str(), mode);  } -handler(GetAttrRequest) + +NetFSComms::Attr +MiscServer::getattr(const std::string & path, const Ice::Current &)  { -	TypedPayload<GetAttrRequest::Reply> * r = new TypedPayload<GetAttrRequest::Reply>(); -	errno = 0; -	r->data.res = stat(req->data.path.c_str(), &r->data.val); -	r->data.res = errno; -	s.Send(r); +	struct stat s; +	if (::stat(path.c_str(), &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;  } -handler(FgetAttrRequest) + +NetFSComms::Attr +MiscServer::fgetattr(Ice::Int id, const Ice::Current &)  { -	TypedPayload<FgetAttrRequest::Reply> * r = new TypedPayload<FgetAttrRequest::Reply>(); -	errno = 0; -	if (files.find(req->data.handle) != files.end()) { -		fstat(files[req->data.handle], &r->data.val); -		r->data.res = errno; +	if (files.find(id) == files.end()) { +		throw NetFSComms::SystemError(EBADF);  	} -	else { -		r->data.res = EBADF; +	struct stat s; +	if (::fstat(files[id], &s) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	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;  } -handler(SymlinkRequest) + +void +MiscServer::symlink(const std::string & path1, const std::string & path2, const Ice::Current &)  { -	TypedPayload<SymlinkRequest::Reply> * r = new TypedPayload<SymlinkRequest::Reply>();  	errno = 0; -	if (symlink(req->data.path1.c_str(), req->data.path2.c_str()) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::symlink(path1.c_str(), path2.c_str()) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(LinkRequest) + +void +MiscServer::link(const std::string & path1, const std::string & path2, const Ice::Current &)  { -	TypedPayload<LinkRequest::Reply> * r = new TypedPayload<LinkRequest::Reply>();  	errno = 0; -	if (link(req->data.path1.c_str(), req->data.path2.c_str()) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::link(path1.c_str(), path2.c_str()) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(RenameRequest) + +void +MiscServer::rename(const std::string & from, const std::string & to, const Ice::Current &)  { -	TypedPayload<RenameRequest::Reply> * r = new TypedPayload<RenameRequest::Reply>();  	errno = 0; -	if (rename(req->data.path1.c_str(), req->data.path2.c_str()) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::rename(from.c_str(), to.c_str()) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(ReadlinkRequest) + +std::string +MiscServer::readlink(const std::string & path, const Ice::Current &)  { -	TypedPayload<ReadlinkRequest::Reply> * r = new TypedPayload<ReadlinkRequest::Reply>();  	errno = 0;  	char buf[PATH_MAX]; -	ssize_t rc = readlink(req->data.path.c_str(), buf, PATH_MAX); +	ssize_t rc = ::readlink(path.c_str(), buf, PATH_MAX);  	if (rc == -1) { -		r->data.error = errno; -	} -	else { -		buf[rc] = '\0'; -		r->data.path = buf; -		r->data.error = 0; +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	return std::string(buf, rc);  } -handler(ChmodRequest) + +void +MiscServer::chmod(const std::string & path, Ice::Int mode, const Ice::Current &)  { -	TypedPayload<ChmodRequest::Reply> * r = new TypedPayload<ChmodRequest::Reply>();  	errno = 0; -	if (chmod(req->data.path.c_str(), req->data.mode) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::chmod(path.c_str(), mode) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } -handler(ChownRequest) + +void +MiscServer::chown(const std::string & path, Ice::Int uid, Ice::Int gid, const Ice::Current &)  { -	TypedPayload<ChownRequest::Reply> * r = new TypedPayload<ChownRequest::Reply>();  	errno = 0; -	if (chown(req->data.path.c_str(), req->data.user, req->data.group) != 0) { -		r->data.value = errno; -	} -	else { -		r->data.value = 0; -		s.replicatedRequest = true; +	if (::chown(path.c_str(), uid, gid) != 0) { +		throw NetFSComms::SystemError(errno);  	} -	s.Send(r); +	// s.replicatedRequest = true;  } diff --git a/netfs/daemonMisc.h b/netfs/daemonMisc.h new file mode 100644 index 0000000..af36392 --- /dev/null +++ b/netfs/daemonMisc.h @@ -0,0 +1,20 @@ +#ifndef DAEMONMISC_H +#define DAEMONMISC_H + +#include "netfsComms.h" + +class MiscServer : public NetFSComms::Misc { +	public: +		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&); +		virtual std::string readlink(const std::string & path, const Ice::Current&); +		virtual void chmod(const std::string & path, Ice::Int mode, const Ice::Current&); +		virtual void chown(const std::string & path, Ice::Int uid, Ice::Int gid, const Ice::Current&); +}; + +#endif + diff --git a/netfs/daemonSystem.cpp b/netfs/daemonSystem.cpp new file mode 100644 index 0000000..74c9a57 --- /dev/null +++ b/netfs/daemonSystem.cpp @@ -0,0 +1,28 @@ +#include <errno.h> +#include <sys/statvfs.h> +#include <sys/vfs.h> +#include "daemonSystem.h" + +NetFSComms::VFS +SystemServer::statfs(const std::string & path, const Ice::Current&) +{ +	errno = 0; +	struct statvfs s; +	if (::statvfs(path.c_str(), &s) != 0) { +		throw NetFSComms::SystemError(errno); +	} +	NetFSComms::VFS t; +	t.blockSize = s.f_bsize; +	t.fragmentSize = s.f_frsize; +	t.blocks = s.f_blocks; +	t.freeBlocks = s.f_bfree; +	t.availBlocks = s.f_bavail; +	t.files = s.f_files; +	t.freeFiles = s.f_ffree; +	t.availFiles = s.f_favail; +	t.FSID = s.f_fsid; +	t.flags = s.f_flag; +	t.maxNameLen = s.f_namemax; +	return t; +} + diff --git a/netfs/daemonSystem.h b/netfs/daemonSystem.h new file mode 100644 index 0000000..0e2bedb --- /dev/null +++ b/netfs/daemonSystem.h @@ -0,0 +1,12 @@ +#ifndef DAEMONSYSTEM_H +#define DAEMONSYSTEM_H + +#include "netfsComms.h" + +class SystemServer : public NetFSComms::System { +	public: +		virtual NetFSComms::VFS statfs(const std::string & path, const Ice::Current&); +}; + +#endif + diff --git a/netfs/fuse.cpp b/netfs/fuse.cpp index ceb5cb3..36ace17 100644 --- a/netfs/fuse.cpp +++ b/netfs/fuse.cpp @@ -69,63 +69,33 @@ static void fuseDestroy(void * x)  	delete (App*)x;  } -NetFS::NetFS() : -	f(NULL) +NetFS::NetFS(int & argc, char ** argv) : +	ic(Ice::initialize(argc, argv))  { -} -void -NetFS::connect() -{ -	while (!f) { -		struct addrinfo hints; -		memset(&hints, 0, sizeof(struct addrinfo)); -		hints.ai_family = AF_UNSPEC; -		hints.ai_socktype = SOCK_STREAM; -		hints.ai_flags = AI_PASSIVE; -		struct addrinfo *result, *rp; -		if (getaddrinfo("localhost", "4000", &hints, &result) == 0) { -			for (rp = result; rp != NULL; rp = rp->ai_next) { -				int sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); -				if (sfd == -1) -					// Error -					continue; -				if (::connect(sfd, rp->ai_addr, rp->ai_addrlen)) { -					// Error -					continue; -				} -				f = fdopen(sfd, "a+"); -				break; -			} -		} -		sleep(5); +	files = NetFSComms::FilesPrx::checkedCast(ic->stringToProxy("Files:default -p 10000")); +	if (!files) { +		throw "Invalid files proxy"; +	} +	dirs = NetFSComms::DirsPrx::checkedCast(ic->stringToProxy("Dirs:default -p 10000")); +	if (!dirs) { +		throw "Invalid directories proxy"; +	} +	misc = NetFSComms::MiscPrx::checkedCast(ic->stringToProxy("Misc:default -p 10000")); +	if (!misc) { +		throw "Invalid misc proxy"; +	} +	system = NetFSComms::SystemPrx::checkedCast(ic->stringToProxy("System:default -p 10000")); +	if (!files) { +		throw "Invalid system proxy";  	}  } +  NetFS::~NetFS()  { -	if (f) { -		fclose(f); +	if (ic) { +		ic->destroy();  	}  } -DataPayloadPtr -NetFS::exchange(DataPayloadPtr dp) -{ -	AutoMutex a(comms); -	PacketPtr recvd; -	PacketPtr sendme = new Packet(0, dp); -	connect(); -	while (true) { -		try { -			sendme->write(f); -			recvd = new Packet(f); -			return recvd->data; -		} -		catch (...) { -			f = NULL; -			connect(); -		} -	} -	return NULL; -}  template <class FuseApp>  int runFuseApp(int argc, char* argv[]) @@ -134,7 +104,7 @@ int runFuseApp(int argc, char* argv[])  		{ NULL, 0, 0 }  	}; -	fuseApp = new FuseApp(); +	fuseApp = new FuseApp(argc, argv);  	struct fuse_operations operations = {  		fuseCall<const char *, struct stat *, &FuseAppBase::getattr>,  		fuseCall<const char *, char *, size_t, &FuseAppBase::readlink>, diff --git a/netfs/fuse.h b/netfs/fuse.h index f587da4..74374d5 100644 --- a/netfs/fuse.h +++ b/netfs/fuse.h @@ -1,55 +1,51 @@  #ifndef FUSE_H  #define FUSE_H +#include <Ice/Ice.h> +#include "netfsComms.h"  #include "fuseapp.h" -#include "comms.h" -#include "threads.h"  class NetFS : public FuseAppBase   { -	// 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 *); -	// 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  	public: -		NetFS(); +		NetFS(int & argc, char ** argv);  		~NetFS(); -		DataPayloadPtr exchange(DataPayloadPtr dp);  	private: -		FILE *		f; -		void		connect(); -		Mutex		comms; +		// 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 *); +		// 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 + +		Ice::CommunicatorPtr ic; + +		NetFSComms::FilesPrx files; +		NetFSComms::DirsPrx dirs; +		NetFSComms::MiscPrx misc; +		NetFSComms::SystemPrx system;  }; -// this needs to go here to avoid circular includes regarding the net->exchange call -template<class X> -SmartPointer<TypedPayload<typename X::Reply> > TypedPayloadReq<X>::exchange(NetFS * net) -{ -	DataPayloadPtr p = net->exchange(this); -	return p.as<TypedPayload<typename X::Reply> >(); -}  #endif diff --git a/netfs/fuseDirs.cpp b/netfs/fuseDirs.cpp index f756393..846f1de 100644 --- a/netfs/fuseDirs.cpp +++ b/netfs/fuseDirs.cpp @@ -1,47 +1,64 @@  #include "fuse.h" -#include "msgtypes.h"  #include "misc.h"  int  NetFS::opendir(const char * p, struct fuse_file_info * fi)  { -	TypedPayloadReq<OpenDirRequest>::Ptr msg = new TypedPayloadReq<OpenDirRequest>(fuse_get_context()); -	msg->data.path = p; -	TypedPayload<OpenDirReply>::Ptr rep = msg->exchange(this); -	fi->fh = rep->data.handle; -	return -rep->data.error; +	try { +		fi->fh = dirs->opendir(p); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::releasedir(const char *, struct fuse_file_info * fi)  { -	TypedPayloadReq<CloseDirRequest>::Ptr msg = new TypedPayloadReq<CloseDirRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	TypedPayload<CloseDirReply>::Ptr rep = msg->exchange(this); -	return -rep->data.error; +	try { +		dirs->closedir(fi->fh); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::readdir(const char *, void * buf, fuse_fill_dir_t filler, off_t, struct fuse_file_info * fi)  { -	TypedPayloadReq<ReadDirRequest>::Ptr msg = new TypedPayloadReq<ReadDirRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	TypedPayload<ReadDirReply>::Ptr rep = msg->exchange(this); -	foreach (std::vector<ReadDirReply::Entry>::const_iterator, rep->data.entries, e) { -		filler(buf, e->path.c_str(), &e->val, 0); +	try { +		NetFSComms::NameList ds = dirs->readdir(fi->fh); +		for (NetFSComms::NameList::const_iterator e = ds.begin(); e != ds.end(); e++) { +			filler(buf, e->c_str(), NULL, 0); +		} +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno;  	} -	return -rep->data.error;  } +  int -NetFS::mkdir(const char * d, mode_t m) +NetFS::mkdir(const char * p, mode_t m)  { -	TypedPayloadReq<MkDirRequest>::Ptr msg = new TypedPayloadReq<MkDirRequest>(fuse_get_context()); -	msg->data.path = d; -	msg->data.mode = m; -	return -msg->exchange(this)->data.value; +	try { +		dirs->mkdir(p, m); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  }  int -NetFS::rmdir(const char * d) +NetFS::rmdir(const char * p)  { -	TypedPayloadReq<RmDirRequest>::Ptr msg = new TypedPayloadReq<RmDirRequest>(fuse_get_context()); -	msg->data.path = d; -	return -msg->exchange(this)->data.value; +	try { +		dirs->rmdir(p); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } diff --git a/netfs/fuseFS.cpp b/netfs/fuseFS.cpp deleted file mode 100644 index ab27044..0000000 --- a/netfs/fuseFS.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "fuse.h" -#include "msgtypes.h" - -int -NetFS::statfs(const char * p, struct statvfs * vfs) -{ -	TypedPayloadReq<StatfsRequest>::Ptr msg = new TypedPayloadReq<StatfsRequest>(fuse_get_context()); -	msg->data.path = p; -	TypedPayload<StatfsReply>::Ptr rep = msg->exchange(this); -	*vfs = rep->data.statfs; -	return -rep->data.error; -} - diff --git a/netfs/fuseFiles.cpp b/netfs/fuseFiles.cpp index 9343bcf..8cb96b3 100644 --- a/netfs/fuseFiles.cpp +++ b/netfs/fuseFiles.cpp @@ -1,75 +1,103 @@  #include <string.h>  #include "fuse.h" -#include "msgtypes.h"  int  NetFS::open(const char * p, struct fuse_file_info * fi)  { -	TypedPayloadReq<OpenRequest>::Ptr msg = new TypedPayloadReq<OpenRequest>(fuse_get_context()); -	msg->data.path = p; -	TypedPayload<OpenReply>::Ptr rep = msg->exchange(this); -	fi->fh = rep->data.handle; -	return -rep->data.error; +	try { +		fi->fh = files->open(p, fi->flags); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::create(const char * p, mode_t m, struct fuse_file_info * fi)  { -	TypedPayloadReq<CreateRequest>::Ptr msg = new TypedPayloadReq<CreateRequest>(fuse_get_context()); -	msg->data.path = p; -	msg->data.mode = m; -	TypedPayload<OpenReply>::Ptr rep = msg->exchange(this); -	fi->fh = rep->data.handle; -	return -rep->data.error; +	try { +		fi->fh = files->create(p, 0, m); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::release(const char *, struct fuse_file_info * fi)  { -	TypedPayloadReq<CloseRequest>::Ptr msg = new TypedPayloadReq<CloseRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	TypedPayload<CloseReply>::Ptr rep = msg->exchange(this); -	return -rep->data.error; +	try { +		files->close(fi->fh); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::read(const char *, char * buf, size_t s, off_t o, struct fuse_file_info * fi)  { -	TypedPayloadReq<ReadRequest>::Ptr msg = new TypedPayloadReq<ReadRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	msg->data.offset = o; -	msg->data.size = s; -	TypedPayload<ReadReply>::Ptr rep = msg->exchange(this); -	if (rep->data.size) { -		memcpy(buf, rep->data.data, std::min(s, rep->data.size)); -		return s; +	try { +		NetFSComms::Buffer data = files->read(fi->fh, o, s); +		for (NetFSComms::Buffer::const_iterator i = data.begin(); i != data.end(); i++, buf++) { +			*buf = *i; +		} +		return data.size();  	} -	else { -		return -rep->data.error; +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno;  	}  } +  int  NetFS::write(const char *, const char * buf, size_t s, off_t o, struct fuse_file_info * fi)  { -	TypedPayloadReq<WriteRequest>::Ptr msg = new TypedPayloadReq<WriteRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	msg->data.offset = o; -	msg->data.size = s; -	msg->data.data = new char[s](); -	memcpy(msg->data.data, buf, s); -	TypedPayload<WriteReply>::Ptr rep = msg->exchange(this); -	return -rep->data.error; +	try { +		NetFSComms::Buffer data(buf, buf + s); +		files->write(fi->fh, o, s, data); +		return s; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::truncate(const char * p, off_t o)  { -	TypedPayloadReq<TruncateRequest>::Ptr msg = new TypedPayloadReq<TruncateRequest>(fuse_get_context()); -	msg->data.path = p; -	msg->data.size = o; -	return -msg->exchange(this)->data.value; +	try { +		files->truncate(p, o); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::ftruncate(const char *, off_t o, fuse_file_info * fi)  { -	TypedPayloadReq<FtruncateRequest>::Ptr msg = new TypedPayloadReq<FtruncateRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	msg->data.size = o; -	return -msg->exchange(this)->data.value; +	try { +		files->ftruncate(fi->fh, o); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } + +int +NetFS::unlink(const char * p) +{ +	try { +		files->unlink(p); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	} +} + diff --git a/netfs/fuseMisc.cpp b/netfs/fuseMisc.cpp index 2746916..074da48 100644 --- a/netfs/fuseMisc.cpp +++ b/netfs/fuseMisc.cpp @@ -1,87 +1,132 @@  #include "fuse.h" -#include "msgtypes.h"  #include <string.h>  int  NetFS::access(const char * p, int a)  { -	TypedPayloadReq<AccessRequest>::Ptr msg = new TypedPayloadReq<AccessRequest>(fuse_get_context()); -	msg->data.access = a; -	msg->data.path = p; -	return -msg->exchange(this)->data.value; +	return -misc->access(p, a);  }  int  NetFS::getattr(const char * p, struct stat * s)  { -	TypedPayloadReq<GetAttrRequest>::Ptr msg = new TypedPayloadReq<GetAttrRequest>(fuse_get_context()); -	msg->data.path = p; -	TypedPayload<GetAttrReply>::Ptr rep = msg->exchange(this); -	*s = rep->data.val; -	return -rep->data.res; +	try { +		NetFSComms::Attr a = misc->getattr(p); +		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::fgetattr(const char *, struct stat * s, fuse_file_info * fi)  { -	TypedPayloadReq<FgetAttrRequest>::Ptr msg = new TypedPayloadReq<FgetAttrRequest>(fuse_get_context()); -	msg->data.handle = fi->fh; -	TypedPayload<GetAttrReply>::Ptr rep = msg->exchange(this); -	*s = rep->data.val; -	return -rep->data.res; +	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)  { -	TypedPayloadReq<ChmodRequest>::Ptr msg = new TypedPayloadReq<ChmodRequest>(fuse_get_context()); -	msg->data.path = p; -	msg->data.mode = m; -	return msg->exchange(this)->data.value; +	try { +		misc->chmod(p, m); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::chown(const char * p, uid_t u, gid_t g)  { -	TypedPayloadReq<ChownRequest>::Ptr msg = new TypedPayloadReq<ChownRequest>(fuse_get_context()); -	msg->data.path = p; -	msg->data.user = u; -	msg->data.group = g; -	return msg->exchange(this)->data.value; +	try { +		misc->chown(p, u, g); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::link(const char * p1, const char * p2)  { -	TypedPayloadReq<LinkRequest>::Ptr msg = new TypedPayloadReq<LinkRequest>(fuse_get_context()); -	msg->data.path1 = p1; -	msg->data.path2 = p2; -	return msg->exchange(this)->data.value; +	try { +		misc->link(p1, p2); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::symlink(const char * p1, const char * p2)  { -	TypedPayloadReq<SymlinkRequest>::Ptr msg = new TypedPayloadReq<SymlinkRequest>(fuse_get_context()); -	msg->data.path1 = p1; -	msg->data.path2 = p2; -	return msg->exchange(this)->data.value; +	try { +		misc->symlink(p1, p2); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::readlink(const char * p, char * p2, size_t s)  { -	TypedPayloadReq<ReadlinkRequest>::Ptr msg = new TypedPayloadReq<ReadlinkRequest>(fuse_get_context()); -	msg->data.path = p; -	TypedPayload<ReadlinkReply>::Ptr rep = msg->exchange(this); -	strncpy(p2, rep->data.path.c_str(), std::min(rep->data.path.length(), s)); -	return -rep->data.error; +	try { +		std::string l = misc->readlink(p); +		l.copy(p2, s); +		p2[s] = '\0'; +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } +  int  NetFS::rename(const char * p1, const char * p2)  { -	TypedPayloadReq<RenameRequest>::Ptr msg = new TypedPayloadReq<RenameRequest>(fuse_get_context()); -	msg->data.path1 = p1; -	msg->data.path2 = p2; -	return msg->exchange(this)->data.value; -} -int -NetFS::unlink(const char * p) -{ -	TypedPayloadReq<UnlinkRequest>::Ptr msg = new TypedPayloadReq<UnlinkRequest>(fuse_get_context()); -	msg->data.path = p; -	return msg->exchange(this)->data.value; +	try { +		misc->rename(p1, p2); +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	}  } + diff --git a/netfs/fuseSystem.cpp b/netfs/fuseSystem.cpp new file mode 100644 index 0000000..050eaa4 --- /dev/null +++ b/netfs/fuseSystem.cpp @@ -0,0 +1,25 @@ +#include "fuse.h" + +int +NetFS::statfs(const char * p, struct statvfs * vfs) +{ +	try { +		NetFSComms::VFS v = system->statfs(p); +		vfs->f_bsize = v.blockSize; +		vfs->f_frsize = v.fragmentSize; +		vfs->f_blocks = v.blocks; +		vfs->f_bfree = v.freeBlocks; +		vfs->f_bavail = v.availBlocks; +		vfs->f_files = v.files; +		vfs->f_ffree = v.freeFiles; +		vfs->f_favail = v.availFiles; +		vfs->f_fsid = v.FSID; +		vfs->f_flag = v.flags; +		vfs->f_namemax = v.maxNameLen; +		return 0; +	} +	catch (NetFSComms::SystemError & e) { +		return -e.syserrno; +	} +} + diff --git a/netfs/fusecallers.h b/netfs/fusecallers.h deleted file mode 100644 index cb521df..0000000 --- a/netfs/fusecallers.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef FUSECALLERS_H -#define FUSECALLERS_H -#endif - diff --git a/netfs/msgtypes.cpp b/netfs/msgtypes.cpp deleted file mode 100644 index 6ea3c80..0000000 --- a/netfs/msgtypes.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include "msgtypes.h" -#include "xfers.h" -#include "misc.h" - -MessageFactories & MsgFacs() -{ -	static MessageFactories m; -	return m; -} - -template<class Type> void operator<<(FILE &, const Type & t); -template<class Type> void operator>>(FILE &, Type & t); - -template<> void operator<<(FILE & f, const std::string & t) -{ -	std::string::size_type len = t.length(); -	f << len; -	if (fwrite(t.data(), len, 1, &f) != 1) { -		throw WriteMessageFailed(); -	} -} -template<> void operator>>(FILE & f, std::string & t) -{ -	std::string::size_type len; -	f >> len; -	t.clear(); -	t.reserve(len); -	while (len --) { -		int c = fgetc(&f); -		if (c == EOF) { -			throw ReadMessageFailed(); -		} -		t.push_back(c); -	} -} -template<class Type> void operator<<(FILE & f, const Type & t) -{ -	if (fwrite(&t, sizeof(t), 1, &f) != 1) { -		throw WriteMessageFailed(); -	} -} -template<class Type> void operator>>(FILE & f, Type & t) -{ -	if (fread(&t, sizeof(t), 1, &f) != 1) { -		throw ReadMessageFailed(); -	} -} - -void -ContentBase::Send(FILE*) const -{ -} -void -ContentBase::Read(FILE*) -{ -} -void -RequestBase::Send(FILE*f) const -{ -	ContentBase::Send(f); -	*f << uid; -	*f << gid; -} -void -RequestBase::Read(FILE*f) -{ -	ContentBase::Read(f); -	*f >> uid; -	*f >> gid; -} -Xfer1(3, OpenDirRequest, RequestBase, path) -Xfer2(4, OpenDirReply, ContentBase, error, handle) -Xfer1(6, ReadDirRequest, RequestBase, handle) -Xfer2(7, AccessRequest, RequestBase, path, access) -Xfer1(8, SimpleInt, ContentBase, value) -Xfer1(9, GetAttrRequest, RequestBase, path) -Xfer2(10, GetAttrReply, ContentBase, res, val) -Xfer1(11, CloseDirRequest, RequestBase, handle) -Xfer1(12, CloseDirReply, ContentBase, error) -Xfer1(14, OpenRequest, RequestBase, path) -Xfer2(15, OpenReply, ContentBase, error, handle) -Xfer1(16, CloseRequest, RequestBase, handle) -Xfer1(17, CloseReply, ContentBase, error) -Xfer3(18, ReadRequest, RequestBase, handle, offset, size) -Xfer1(19, WriteReply, ContentBase, error) -Xfer1(20, MkDirRequest, RequestBase, path) -Xfer1(21, UnlinkRequest, RequestBase, path) -Xfer2(22, SymlinkRequest, RequestBase, path1, path2) -Xfer2(23, LinkRequest, RequestBase, path1, path2) -Xfer2(24, RenameRequest, RequestBase, path1, path2) -Xfer1(25, ReadlinkRequest, RequestBase, path) -Xfer1(26, ReadlinkReply, ContentBase, path) -Xfer2(27, ChmodRequest, RequestBase, path, mode) -Xfer3(28, ChownRequest, RequestBase, path, user, group) -Xfer2(29, TruncateRequest, RequestBase, path, size) -Xfer2(30, FtruncateRequest, RequestBase, handle, size) -Xfer1(31, StatfsRequest, RequestBase, path) -Xfer2(32, StatfsReply, ContentBase, statfs, error) -Xfer1(33, FgetAttrRequest, RequestBase, handle) -Xfer2(34, CreateRequest, RequestBase, path, mode) -Xfer1(35, RmDirRequest, RequestBase, path) - -MSGTYPE(5, ReadDirReply) -void -ReadDirReply::Send(FILE*f) const -{ -	ContentBase::Send(f); -	*f << error; -	*f << entries.size(); -	foreach (Entries::const_iterator, entries, e) { -		*f << e->path; -		*f << e->val; -	} -} -void -ReadDirReply::Read(FILE*f) -{ -	ContentBase::Read(f); -	*f >> error; -	size_t count; -	*f >> count; -	entries.resize(count); -	while (count) { -		count -= 1; -		*f >> entries[count].path; -		*f >> entries[count].val; -	} -} - -MSGTYPE(2, ReadReply) -ReadReply::~ReadReply() -{ -	if (data) { -		delete[] data; -	} -} -void -ReadReply::Send(FILE*f) const -{ -	ContentBase::Send(f); -	*f << error; -	*f << size; -	if (size) { -		if (fwrite(data, size, 1, f) != 1) { -			throw WriteMessageFailed(); -		} -	} -} -void -ReadReply::Read(FILE*f) -{ -	ContentBase::Read(f); -	*f >> error; -	*f >> size; -	if (size) { -		data = new char[size](); -		if (fread(data, size, 1, f) != 1) { -			throw ReadMessageFailed(); -		} -	} -	else { -		data = NULL; -	} -} - -MSGTYPE(1, WriteRequest) -WriteRequest::~WriteRequest() -{ -	if (data) { -		delete[] data; -	} -} -void -WriteRequest::Send(FILE*f) const -{ -	RequestBase::Send(f); -	*f << handle; -	*f << size; -	*f << offset; -	if (fwrite(data, size, 1, f) != 1) { -		throw WriteMessageFailed(); -	} -} -void -WriteRequest::Read(FILE*f) -{ -	RequestBase::Read(f); -	*f >> handle; -	*f >> size; -	*f >> offset; -	if (size) { -		data = new char[size](); -		if (fread(data, size, 1, f) != 1) { -			throw ReadMessageFailed(); -		} -	} -	else { -		data = NULL; -	} -} diff --git a/netfs/msgtypes.h b/netfs/msgtypes.h deleted file mode 100644 index 0f7b3f0..0000000 --- a/netfs/msgtypes.h +++ /dev/null @@ -1,348 +0,0 @@ -#ifndef MSGTYPES_H -#define MSGTYPES_H - -#include "smartpointer.h" -#include "comms.h" -#include <map> -#include <string> -#include <vector> -#include <sys/stat.h> -#include <stdint.h> - -typedef DataPayloadPtr (*MessageFactory)(); -typedef std::map<uint16_t, MessageFactory> MessageFactories; -MessageFactories & MsgFacs(); - -template <class Cls> -class Factory { -	public: -		Factory() { MsgFacs()[Cls::TypeID] = &create; } -		static DataPayloadPtr create() { -			return new TypedPayload<Cls>(); -		} -}; - -class ContentBase : public IsRefCounted { -	public: -		~ContentBase() = 0; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class RequestBase : public ContentBase { -	public: -		uid_t	uid; -		gid_t	gid; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class SimpleInt : public ContentBase { -	public: -		int value; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class AccessRequest : public RequestBase { -	public: -		std::string path; -		int access; -		const static uint16_t TypeID; -		typedef SimpleInt Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class GetAttrReply : public ContentBase { -	public: -		int res; -		struct stat val; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class GetAttrRequest : public RequestBase { -	public: -		std::string path; -		const static uint16_t TypeID; -		typedef GetAttrReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class FgetAttrRequest : public RequestBase { -	public: -		int handle; -		const static uint16_t TypeID; -		typedef GetAttrReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class OpenDirReply : public ContentBase { -	public: -		int handle; -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class OpenDirRequest : public RequestBase { -	public: -		std::string path; -		const static uint16_t TypeID; -		typedef OpenDirReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class CloseDirReply : public ContentBase { -	public: -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class CloseDirRequest : public RequestBase { -	public: -		int handle; -		const static uint16_t TypeID; -		typedef CloseDirReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class ReadDirReply : public ContentBase { -	public: -		class Entry { -			public: -				std::string path; -				struct stat val; -		}; -		typedef std::vector<Entry> Entries; -		int error; -		Entries entries; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class ReadDirRequest : public RequestBase { -	public: -		int handle; -		const static uint16_t TypeID; -		typedef ReadDirReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -class OpenReply : public ContentBase { -	public: -		int error; -		int handle; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class OpenRequest : public RequestBase { -	public: -		std::string path; -		const static uint16_t TypeID; -		typedef OpenReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class CreateRequest : public RequestBase { -	public: -		std::string path; -		mode_t mode; -		const static uint16_t TypeID; -		typedef OpenReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class CloseReply : public ContentBase { -	public: -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class CloseRequest : public RequestBase { -	public: -		int handle; -		const static uint16_t TypeID; -		typedef CloseReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ReadReply : public ContentBase { -	public: -		~ReadReply(); -		int error; -		char * data; -		size_t size; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ReadRequest : public RequestBase { -	public: -		int handle; -		size_t size; -		off_t offset; -		const static uint16_t TypeID; -		typedef ReadReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class WriteReply : public ContentBase { -	public: -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class WriteRequest : public RequestBase { -	public: -		~WriteRequest(); -		int handle; -		size_t size; -		char * data; -		off_t offset; -		const static uint16_t TypeID; -		typedef WriteReply Reply; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class MkDirRequest : public RequestBase { -	public: -		std::string path; -		mode_t mode; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class RmDirRequest : public RequestBase { -	public: -		std::string path; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class UnlinkRequest : public RequestBase { -	public: -		std::string path; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class SymlinkRequest : public RequestBase { -	public: -		std::string path1; -		std::string path2; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class LinkRequest : public RequestBase { -	public: -		std::string path1; -		std::string path2; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class RenameRequest : public RequestBase { -	public: -		std::string path1; -		std::string path2; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ReadlinkReply : public ContentBase { -	public: -		std::string path; -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ReadlinkRequest : public RequestBase { -	public: -		std::string path; -		typedef ReadlinkReply Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ChmodRequest : public RequestBase { -	public: -		std::string path; -		mode_t mode; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class ChownRequest : public RequestBase { -	public: -		std::string path; -		uid_t user; -		gid_t group; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class TruncateRequest : public RequestBase { -	public: -		std::string path; -		off_t size; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class FtruncateRequest : public RequestBase { -	public: -		int handle; -		off_t size; -		typedef SimpleInt Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class StatfsReply : public ContentBase { -	public: -		struct statvfs statfs; -		int error; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; -class StatfsRequest : public RequestBase { -	public: -		std::string path; -		typedef StatfsReply Reply; -		const static uint16_t TypeID; -		virtual void Send(FILE*) const; -		virtual void Read(FILE*); -}; - -#define MSGTYPE(id, cls) \ -	const uint16_t cls::TypeID = id; \ -	namespace MsgFactories { Factory<cls> facFor##id; } -#endif - diff --git a/netfs/netfsComms.ice b/netfs/netfsComms.ice new file mode 100644 index 0000000..32c96bc --- /dev/null +++ b/netfs/netfsComms.ice @@ -0,0 +1,76 @@ +module NetFSComms { +	// Exceptions +	exception SystemError { +		int syserrno; +	}; +	// Types +	struct VFS { +		long blockSize; +		long fragmentSize; +		long blocks; +		long freeBlocks; +		long availBlocks; +		long files; +		long freeFiles; +		long availFiles; +		long FSID; +		long flags; +		long maxNameLen; +	}; +	struct Attr { +		int dev; +		long inode; +		int mode; +		int links; +		int uid; +		int gid; +		int rdev; +		long size; +		long blockSize; +		long blocks; +		long atime; +		long mtime; +		long ctime; +	}; +	sequence<byte> Buffer; +	sequence<string> NameList; +	// Interfaces +	interface Files { +		void truncate(string path, long size); +		void ftruncate(int id, long size); + +		void unlink(string path); + +		int open(string path, int flags); +		int create(string path, int flags, int mode); +		void close(int id); + +		Buffer read(int id, long offset, long size); +		void write(int id, long offset, long size, Buffer data); +	}; +	interface Dirs { +		int opendir(string path) throws SystemError; +		void closedir(int id) throws SystemError; +		NameList readdir(int id) throws SystemError; + +		void mkdir(string path, int mode) throws SystemError; +		void rmdir(string path) throws SystemError; +	}; +	interface System { +		VFS statfs(string path); +	}; +	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); +		string readlink(string path); +		void chmod(string path, int mode); +		void chown(string path, int uid, int gid); +	}; +	interface Service { +	}; +}; + diff --git a/netfs/xfers.h b/netfs/xfers.h deleted file mode 100644 index baf2eaa..0000000 --- a/netfs/xfers.h +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef XFERS_H -#define XFERS_H - -#define Xfer1(id, Ptype, Pbase, v1) \ -MSGTYPE(id, Ptype) \ -void \ -Ptype::Send(FILE*f) const \ -{ \ -	Pbase::Send(f); \ -	*f << v1; \ -} \ -void \ -Ptype::Read(FILE*f) \ -{ \ -	Pbase::Read(f); \ -	*f >> v1; \ -} - -#define Xfer2(id, Ptype, Pbase, v1, v2) \ -MSGTYPE(id, Ptype) \ -void \ -Ptype::Send(FILE*f) const \ -{ \ -	Pbase::Send(f); \ -	*f << v1; \ -	*f << v2; \ -} \ -void \ -Ptype::Read(FILE*f) \ -{ \ -	Pbase::Read(f); \ -	*f >> v1; \ -	*f >> v2; \ -} - -#define Xfer3(id, Ptype, Pbase, v1, v2, v3) \ -MSGTYPE(id, Ptype) \ -void \ -Ptype::Send(FILE*f) const \ -{ \ -	Pbase::Send(f); \ -	*f << v1; \ -	*f << v2; \ -	*f << v3; \ -} \ -void \ -Ptype::Read(FILE*f) \ -{ \ -	Pbase::Read(f); \ -	*f >> v1; \ -	*f >> v2; \ -	*f >> v3; \ -} - -#endif -  | 
