xref: /haiku/src/add-ons/kernel/file_systems/netfs/client/ShareVolume.h (revision 59ecfa6cb620abe17a41ad72d746d8a35f671ad6)
15a1d355fSStephan Aßmus // ShareVolume.h
25a1d355fSStephan Aßmus 
35a1d355fSStephan Aßmus #ifndef NET_FS_SHARE_VOLUME_H
45a1d355fSStephan Aßmus #define NET_FS_SHARE_VOLUME_H
55a1d355fSStephan Aßmus 
65a1d355fSStephan Aßmus #include <fsproto.h>
75a1d355fSStephan Aßmus 
85a1d355fSStephan Aßmus #include <util/DoublyLinkedList.h>
95a1d355fSStephan Aßmus 
105a1d355fSStephan Aßmus #include "EntryInfo.h"
115a1d355fSStephan Aßmus #include "FSObject.h"
125a1d355fSStephan Aßmus #include "Locker.h"
135a1d355fSStephan Aßmus #include "RequestHandler.h"
145a1d355fSStephan Aßmus #include "RequestMemberArray.h"
155a1d355fSStephan Aßmus #include "ServerNodeID.h"
165a1d355fSStephan Aßmus #include "Volume.h"
175a1d355fSStephan Aßmus 
185a1d355fSStephan Aßmus class AttrDirInfo;
195a1d355fSStephan Aßmus class ExtendedServerInfo;
205a1d355fSStephan Aßmus class ExtendedShareInfo;
215a1d355fSStephan Aßmus class Node;
225a1d355fSStephan Aßmus class ReadQueryReply;
235a1d355fSStephan Aßmus class RemoteShareDirIterator;
245a1d355fSStephan Aßmus class RequestConnection;
255a1d355fSStephan Aßmus class RootShareVolume;
265a1d355fSStephan Aßmus class ServerConnection;
275a1d355fSStephan Aßmus class ServerConnectionProvider;
285a1d355fSStephan Aßmus class ShareAttrDirIterator;
295a1d355fSStephan Aßmus class ShareDir;
305a1d355fSStephan Aßmus class ShareDirEntry;
315a1d355fSStephan Aßmus class ShareNode;
325a1d355fSStephan Aßmus class WalkReply;
335a1d355fSStephan Aßmus 
345a1d355fSStephan Aßmus class ShareVolume : public Volume {
355a1d355fSStephan Aßmus public:
365a1d355fSStephan Aßmus 								ShareVolume(VolumeManager* volumeManager,
375a1d355fSStephan Aßmus 									ServerConnectionProvider*
385a1d355fSStephan Aßmus 										connectionProvider,
395a1d355fSStephan Aßmus 									ExtendedServerInfo* serverInfo,
405a1d355fSStephan Aßmus 									ExtendedShareInfo* shareInfo);
415a1d355fSStephan Aßmus 								~ShareVolume();
425a1d355fSStephan Aßmus 
435a1d355fSStephan Aßmus 			int32				GetID() const;
445a1d355fSStephan Aßmus 
455a1d355fSStephan Aßmus 			bool				IsReadOnly() const;
465a1d355fSStephan Aßmus 			bool				SupportsQueries() const;
475a1d355fSStephan Aßmus 
485a1d355fSStephan Aßmus 			status_t			Init(const char* name);
495a1d355fSStephan Aßmus 			void				Uninit();
505a1d355fSStephan Aßmus 
515a1d355fSStephan Aßmus 	virtual	Node*				GetRootNode() const;
525a1d355fSStephan Aßmus 
535a1d355fSStephan Aßmus 	virtual	void				PrepareToUnmount();
545a1d355fSStephan Aßmus 
555a1d355fSStephan Aßmus 	virtual	void				RemoveChildVolume(Volume* volume);
565a1d355fSStephan Aßmus 
575a1d355fSStephan Aßmus 			// FS
585a1d355fSStephan Aßmus 	virtual	status_t			Unmount();
595a1d355fSStephan Aßmus 	virtual	status_t			Sync();
605a1d355fSStephan Aßmus 
615a1d355fSStephan Aßmus 			// vnodes
625a1d355fSStephan Aßmus 	virtual	status_t			ReadVNode(vnode_id vnid, char reenter,
635a1d355fSStephan Aßmus 									Node** node);
645a1d355fSStephan Aßmus 	virtual	status_t			WriteVNode(Node* node, char reenter);
655a1d355fSStephan Aßmus 	virtual	status_t			RemoveVNode(Node* node, char reenter);
665a1d355fSStephan Aßmus 
675a1d355fSStephan Aßmus 			// nodes
685a1d355fSStephan Aßmus 	virtual	status_t			FSync(Node* node);
695a1d355fSStephan Aßmus 	virtual	status_t			ReadStat(Node* node, struct stat* st);
705a1d355fSStephan Aßmus 	virtual	status_t			WriteStat(Node* node, struct stat *st,
715a1d355fSStephan Aßmus 									uint32 mask);
725a1d355fSStephan Aßmus 	virtual	status_t			Access(Node* node, int mode);
735a1d355fSStephan Aßmus 
745a1d355fSStephan Aßmus 			// files
755a1d355fSStephan Aßmus 	virtual	status_t			Create(Node* dir, const char* name,
765a1d355fSStephan Aßmus 									int openMode, int mode, vnode_id* vnid,
775a1d355fSStephan Aßmus 									void** cookie);
785a1d355fSStephan Aßmus 	virtual	status_t			Open(Node* node, int openMode,
795a1d355fSStephan Aßmus 									void** cookie);
805a1d355fSStephan Aßmus 	virtual	status_t			Close(Node* node, void* cookie);
815a1d355fSStephan Aßmus 	virtual	status_t			FreeCookie(Node* node, void* cookie);
825a1d355fSStephan Aßmus 	virtual	status_t			Read(Node* node, void* cookie, off_t pos,
835a1d355fSStephan Aßmus 									void* buffer, size_t bufferSize,
845a1d355fSStephan Aßmus 									size_t* bytesRead);
855a1d355fSStephan Aßmus 	virtual	status_t			Write(Node* node, void* cookie, off_t pos,
865a1d355fSStephan Aßmus 									const void* buffer, size_t bufferSize,
875a1d355fSStephan Aßmus 									size_t* bytesWritten);
885a1d355fSStephan Aßmus 
895a1d355fSStephan Aßmus 			// hard links / symlinks
905a1d355fSStephan Aßmus 	virtual	status_t			Link(Node* dir, const char* name,
915a1d355fSStephan Aßmus 									Node* node);
925a1d355fSStephan Aßmus 	virtual	status_t			Unlink(Node* dir, const char* name);
935a1d355fSStephan Aßmus 	virtual	status_t			Symlink(Node* dir, const char* name,
945a1d355fSStephan Aßmus 									const char* target);
955a1d355fSStephan Aßmus 	virtual	status_t			ReadLink(Node* node, char* buffer,
965a1d355fSStephan Aßmus 									size_t bufferSize, size_t* bytesRead);
975a1d355fSStephan Aßmus 	virtual	status_t			Rename(Node* oldDir, const char* oldName,
985a1d355fSStephan Aßmus 									Node* newDir, const char* newName);
995a1d355fSStephan Aßmus 
1005a1d355fSStephan Aßmus 			// directories
1015a1d355fSStephan Aßmus 	virtual	status_t			MkDir(Node* dir, const char* name,
1025a1d355fSStephan Aßmus 									int mode);
1035a1d355fSStephan Aßmus 	virtual	status_t			RmDir(Node* dir, const char* name);
1045a1d355fSStephan Aßmus 	virtual	status_t			OpenDir(Node* node, void** cookie);
1055a1d355fSStephan Aßmus 	virtual	status_t			CloseDir(Node* node, void* cookie);
1065a1d355fSStephan Aßmus 	virtual	status_t			FreeDirCookie(Node* node, void* cookie);
1075a1d355fSStephan Aßmus 	virtual	status_t			ReadDir(Node* node, void* cookie,
1085a1d355fSStephan Aßmus 									struct dirent* buffer, size_t bufferSize,
1095a1d355fSStephan Aßmus 									int32 count, int32* countRead);
1105a1d355fSStephan Aßmus 	virtual	status_t			RewindDir(Node* node, void* cookie);
1115a1d355fSStephan Aßmus 	virtual	status_t			Walk(Node* dir, const char* entryName,
1125a1d355fSStephan Aßmus 									char** resolvedPath, vnode_id* vnid);
1135a1d355fSStephan Aßmus 
1145a1d355fSStephan Aßmus 			// attributes
1155a1d355fSStephan Aßmus 	virtual	status_t			OpenAttrDir(Node* node, void** cookie);
1165a1d355fSStephan Aßmus 	virtual	status_t			CloseAttrDir(Node* node, void* cookie);
1175a1d355fSStephan Aßmus 	virtual	status_t			FreeAttrDirCookie(Node* node,
1185a1d355fSStephan Aßmus 									void* cookie);
1195a1d355fSStephan Aßmus 	virtual	status_t			ReadAttrDir(Node* node, void* cookie,
1205a1d355fSStephan Aßmus 									struct dirent* buffer, size_t bufferSize,
1215a1d355fSStephan Aßmus 									int32 count, int32* countRead);
1225a1d355fSStephan Aßmus 	virtual	status_t			RewindAttrDir(Node* node, void* cookie);
1235a1d355fSStephan Aßmus 	virtual	status_t			ReadAttr(Node* node, const char* name,
1245a1d355fSStephan Aßmus 									int type, off_t pos, void* buffer,
1255a1d355fSStephan Aßmus 									size_t bufferSize, size_t* bytesRead);
1265a1d355fSStephan Aßmus 	virtual	status_t			WriteAttr(Node* node, const char* name,
1275a1d355fSStephan Aßmus 									int type, off_t pos, const void* buffer,
1285a1d355fSStephan Aßmus 									size_t bufferSize, size_t* bytesWritten);
1295a1d355fSStephan Aßmus 	virtual	status_t			RemoveAttr(Node* node, const char* name);
1305a1d355fSStephan Aßmus 	virtual	status_t			RenameAttr(Node* node,
1315a1d355fSStephan Aßmus 									const char* oldName, const char* newName);
1325a1d355fSStephan Aßmus 	virtual	status_t			StatAttr(Node* node, const char* name,
1335a1d355fSStephan Aßmus 									struct attr_info* attrInfo);
1345a1d355fSStephan Aßmus 
1355a1d355fSStephan Aßmus 			// queries
1365a1d355fSStephan Aßmus 			status_t			GetQueryEntry(const EntryInfo& entryInfo,
1375a1d355fSStephan Aßmus 									const NodeInfo& dirInfo,
1385a1d355fSStephan Aßmus 									struct dirent* buffer, size_t bufferSize,
1395a1d355fSStephan Aßmus 									int32* countRead);
1405a1d355fSStephan Aßmus 
1415a1d355fSStephan Aßmus 
1425a1d355fSStephan Aßmus 			// service methods called from "outside"
1435a1d355fSStephan Aßmus 			void				ProcessNodeMonitoringRequest(
1445a1d355fSStephan Aßmus 									NodeMonitoringRequest* request);
1455a1d355fSStephan Aßmus 			void				ConnectionClosed();
1465a1d355fSStephan Aßmus 
1475a1d355fSStephan Aßmus private:
1485a1d355fSStephan Aßmus 			struct NodeMap;
1495a1d355fSStephan Aßmus 			struct EntryKey;
1505a1d355fSStephan Aßmus 			struct EntryMap;
1515a1d355fSStephan Aßmus 			struct LocalNodeIDMap;
1525a1d355fSStephan Aßmus 			struct RemoteNodeIDMap;
1535a1d355fSStephan Aßmus 			struct DirCookie;
1545a1d355fSStephan Aßmus 			struct AttrDirCookie;
1555a1d355fSStephan Aßmus 			struct AttrDirIteratorMap;
1565a1d355fSStephan Aßmus 
1575a1d355fSStephan Aßmus private:
1585a1d355fSStephan Aßmus 			status_t			_ReadRemoteDir(ShareDir* directory,
1595a1d355fSStephan Aßmus 									RemoteShareDirIterator* remoteIterator);
1605a1d355fSStephan Aßmus 
1615a1d355fSStephan Aßmus 			void				_HandleEntryCreatedRequest(
1625a1d355fSStephan Aßmus 									EntryCreatedRequest* request);
1635a1d355fSStephan Aßmus 			void				_HandleEntryRemovedRequest(
1645a1d355fSStephan Aßmus 									EntryRemovedRequest* request);
1655a1d355fSStephan Aßmus 			void				_HandleEntryMovedRequest(
1665a1d355fSStephan Aßmus 									EntryMovedRequest* request);
1675a1d355fSStephan Aßmus 			void				_HandleStatChangedRequest(
1685a1d355fSStephan Aßmus 									StatChangedRequest* request);
1695a1d355fSStephan Aßmus 			void				_HandleAttributeChangedRequest(
1705a1d355fSStephan Aßmus 									AttributeChangedRequest* request);
1715a1d355fSStephan Aßmus 
1725a1d355fSStephan Aßmus 			status_t			_GetLocalNodeID(NodeID remoteID, ino_t* localID,
1735a1d355fSStephan Aßmus 									bool enter);
1745a1d355fSStephan Aßmus 			status_t			_GetRemoteNodeID(ino_t localID,
1755a1d355fSStephan Aßmus 									NodeID* remoteID);
1765a1d355fSStephan Aßmus 			void				_RemoveLocalNodeID(ino_t localID);
1775a1d355fSStephan Aßmus 
1785a1d355fSStephan Aßmus 			ShareNode*			_GetNodeByLocalID(ino_t localID);
1795a1d355fSStephan Aßmus 			ShareNode*			_GetNodeByRemoteID(NodeID remoteID);
1805a1d355fSStephan Aßmus 			status_t			_LoadNode(const NodeInfo& nodeInfo,
1815a1d355fSStephan Aßmus 									ShareNode** node);
1825a1d355fSStephan Aßmus 			status_t			_UpdateNode(const NodeInfo& nodeInfo);
1835a1d355fSStephan Aßmus 
1845a1d355fSStephan Aßmus 			ShareDirEntry*		_GetEntryByLocalID(ino_t localDirID,
1855a1d355fSStephan Aßmus 									const char* name);
1865a1d355fSStephan Aßmus 			ShareDirEntry*		_GetEntryByRemoteID(NodeID remoteDirID,
1875a1d355fSStephan Aßmus 									const char* name);
1885a1d355fSStephan Aßmus 			status_t			_LoadEntry(ShareDir* directory,
1895a1d355fSStephan Aßmus 									const EntryInfo& entryInfo,
1905a1d355fSStephan Aßmus 									ShareDirEntry** entry);
1915a1d355fSStephan Aßmus 			void				_RemoveEntry(ShareDirEntry* entry);
1925a1d355fSStephan Aßmus 			bool				_IsObsoleteEntryInfo(
1935a1d355fSStephan Aßmus 									const EntryInfo& entryInfo);
1945a1d355fSStephan Aßmus 
1955a1d355fSStephan Aßmus 			status_t			_AddAttrDirIterator(ShareNode* node,
1965a1d355fSStephan Aßmus 									ShareAttrDirIterator* iterator);
1975a1d355fSStephan Aßmus 			void				_RemoveAttrDirIterator(ShareNode* node,
1985a1d355fSStephan Aßmus 									ShareAttrDirIterator* iterator);
1995a1d355fSStephan Aßmus 			status_t			_LoadAttrDir(ShareNode* node,
2005a1d355fSStephan Aßmus 									const AttrDirInfo& attrDirInfo);
2015a1d355fSStephan Aßmus 			status_t			_UpdateAttrDir(NodeID remoteID,
2025a1d355fSStephan Aßmus 									const AttrDirInfo& attrDirInfo);
2035a1d355fSStephan Aßmus 
2045a1d355fSStephan Aßmus 			void				_NodeRemoved(NodeID remoteID);
2055a1d355fSStephan Aßmus 			void				_EntryCreated(NodeID remoteDirID,
2065a1d355fSStephan Aßmus 									const char* name,
2075a1d355fSStephan Aßmus 									const EntryInfo* entryInfo, int64 revision);
2085a1d355fSStephan Aßmus 			void				_EntryRemoved(NodeID remoteDirID,
2095a1d355fSStephan Aßmus 									const char* name, int64 revision);
2105a1d355fSStephan Aßmus 			void				_EntryMoved(NodeID remoteOldDirID,
2115a1d355fSStephan Aßmus 									const char* oldName, NodeID remoteNewDirID,
2125a1d355fSStephan Aßmus 									const char* name,
2135a1d355fSStephan Aßmus 									const EntryInfo* entryInfo, int64 revision);
2145a1d355fSStephan Aßmus 
2155a1d355fSStephan Aßmus 			status_t			_Walk(NodeID remoteDirID, const char* entryName,
2165a1d355fSStephan Aßmus 									bool resolveLink, WalkReply** reply);
2175a1d355fSStephan Aßmus 			status_t			_MultiWalk(
2185a1d355fSStephan Aßmus 									RequestMemberArray<EntryInfo>& entryInfos,
2195a1d355fSStephan Aßmus 									MultiWalkReply** reply);
220*59ecfa6cSAugustin Cavalier 			status_t			_Close(intptr_t cookie);
2215a1d355fSStephan Aßmus 
2225a1d355fSStephan Aßmus 			uint32				_GetConnectionState();
2235a1d355fSStephan Aßmus 			bool				_IsConnected();
2245a1d355fSStephan Aßmus 			bool				_EnsureShareMounted();
2255a1d355fSStephan Aßmus 			status_t			_MountShare();
2265a1d355fSStephan Aßmus 
2275a1d355fSStephan Aßmus private:
2285a1d355fSStephan Aßmus 			int32				fID;
2295a1d355fSStephan Aßmus 			uint32				fFlags;
2305a1d355fSStephan Aßmus 			Locker				fMountLock;
2315a1d355fSStephan Aßmus 			ShareDir*			fRootNode;
2325a1d355fSStephan Aßmus 			NodeMap*			fNodes;			// local ID -> ShareNode
2335a1d355fSStephan Aßmus 			EntryMap*			fEntries;		// local ID, name -> ShareDirEntry
2345a1d355fSStephan Aßmus 			AttrDirIteratorMap*	fAttrDirIterators;
2355a1d355fSStephan Aßmus 				// local ID -> DoublyLinkedList<>
2365a1d355fSStephan Aßmus 			LocalNodeIDMap*		fLocalNodeIDs;	// remote ID -> local ID
2375a1d355fSStephan Aßmus 			RemoteNodeIDMap*	fRemoteNodeIDs;	// local ID -> remote ID
2385a1d355fSStephan Aßmus 			ServerConnectionProvider* fServerConnectionProvider;
2395a1d355fSStephan Aßmus 			ExtendedServerInfo*	fServerInfo;
2405a1d355fSStephan Aßmus 			ExtendedShareInfo*	fShareInfo;
2415a1d355fSStephan Aßmus 			ServerConnection*	fServerConnection;
2425a1d355fSStephan Aßmus 			RequestConnection*	fConnection;
2435a1d355fSStephan Aßmus 			uint32				fSharePermissions;
2445a1d355fSStephan Aßmus 			uint32				fConnectionState;
2455a1d355fSStephan Aßmus };
2465a1d355fSStephan Aßmus 
2475a1d355fSStephan Aßmus #endif	// NET_FS_SHARE_VOLUME_H
248