19b7f2d1bSPawel Dziepak /* 29b7f2d1bSPawel Dziepak * Copyright 2012 Haiku, Inc. All rights reserved. 39b7f2d1bSPawel Dziepak * Distributed under the terms of the MIT License. 49b7f2d1bSPawel Dziepak * 59b7f2d1bSPawel Dziepak * Authors: 69b7f2d1bSPawel Dziepak * Paweł Dziepak, pdziepak@quarnos.org 79b7f2d1bSPawel Dziepak */ 89b7f2d1bSPawel Dziepak #ifndef FILEINFO_H 99b7f2d1bSPawel Dziepak #define FILEINFO_H 109b7f2d1bSPawel Dziepak 119b7f2d1bSPawel Dziepak 129b7f2d1bSPawel Dziepak #include <stdlib.h> 139b7f2d1bSPawel Dziepak #include <string.h> 149b7f2d1bSPawel Dziepak 159b7f2d1bSPawel Dziepak #include <SupportDefs.h> 169b7f2d1bSPawel Dziepak 179b7f2d1bSPawel Dziepak 189b7f2d1bSPawel Dziepak #define NFS4_FHSIZE 128 199b7f2d1bSPawel Dziepak 2000a8558cSPawel Dziepak struct FileHandle { 219b7f2d1bSPawel Dziepak uint8 fSize; 2200a8558cSPawel Dziepak uint8 fData[NFS4_FHSIZE]; 239b7f2d1bSPawel Dziepak 2400a8558cSPawel Dziepak inline FileHandle(); 2500a8558cSPawel Dziepak inline FileHandle(const FileHandle& fh); 2600a8558cSPawel Dziepak inline FileHandle& operator=(const FileHandle& fh); 27*4a153753SPawel Dziepak 28*4a153753SPawel Dziepak inline bool operator>(const FileHandle& handle) const; 29*4a153753SPawel Dziepak inline bool operator<(const FileHandle& handle) const; 309b7f2d1bSPawel Dziepak }; 319b7f2d1bSPawel Dziepak 329b7f2d1bSPawel Dziepak 3300a8558cSPawel Dziepak class FileSystem; 34209c46eeSPawel Dziepak class RequestBuilder; 359b7f2d1bSPawel Dziepak 369b7f2d1bSPawel Dziepak // Complete information needed to identify a file in any situation. 3700a8558cSPawel Dziepak // Unfortunately just a FileHandle is not enough even when they are persistent 3800a8558cSPawel Dziepak // since OPEN requires both parent FileHandle and file name (just like LOOKUP). 399b7f2d1bSPawel Dziepak struct FileInfo { 409b7f2d1bSPawel Dziepak uint64 fFileId; 4100a8558cSPawel Dziepak FileHandle fHandle; 429b7f2d1bSPawel Dziepak 4300a8558cSPawel Dziepak FileHandle fParent; 449b7f2d1bSPawel Dziepak const char* fName; 459b7f2d1bSPawel Dziepak const char* fPath; 469b7f2d1bSPawel Dziepak 479b7f2d1bSPawel Dziepak inline FileInfo(); 489b7f2d1bSPawel Dziepak inline ~FileInfo(); 499b7f2d1bSPawel Dziepak inline FileInfo(const FileInfo& fi); 509b7f2d1bSPawel Dziepak inline FileInfo& operator=(const FileInfo& fi); 519b7f2d1bSPawel Dziepak 5200a8558cSPawel Dziepak status_t UpdateFileHandles(FileSystem* fs); 53209c46eeSPawel Dziepak 54209c46eeSPawel Dziepak static status_t ParsePath(RequestBuilder& req, uint32& count, 55209c46eeSPawel Dziepak const char* _path); 569b7f2d1bSPawel Dziepak }; 579b7f2d1bSPawel Dziepak 5800a8558cSPawel Dziepak struct FileSystemId { 599b7f2d1bSPawel Dziepak uint64 fMajor; 609b7f2d1bSPawel Dziepak uint64 fMinor; 619b7f2d1bSPawel Dziepak 6200a8558cSPawel Dziepak inline bool operator==(const FileSystemId& fsid) const; 6300a8558cSPawel Dziepak inline bool operator!=(const FileSystemId& fsid) const; 649b7f2d1bSPawel Dziepak }; 659b7f2d1bSPawel Dziepak 669b7f2d1bSPawel Dziepak 679b7f2d1bSPawel Dziepak inline 6800a8558cSPawel Dziepak FileHandle::FileHandle() 699b7f2d1bSPawel Dziepak : 709b7f2d1bSPawel Dziepak fSize(0) 719b7f2d1bSPawel Dziepak { 729b7f2d1bSPawel Dziepak } 739b7f2d1bSPawel Dziepak 749b7f2d1bSPawel Dziepak 759b7f2d1bSPawel Dziepak inline 7600a8558cSPawel Dziepak FileHandle::FileHandle(const FileHandle& fh) 779b7f2d1bSPawel Dziepak : 789b7f2d1bSPawel Dziepak fSize(fh.fSize) 799b7f2d1bSPawel Dziepak { 8000a8558cSPawel Dziepak memcpy(fData, fh.fData, fSize); 819b7f2d1bSPawel Dziepak } 829b7f2d1bSPawel Dziepak 839b7f2d1bSPawel Dziepak 8400a8558cSPawel Dziepak inline FileHandle& 8500a8558cSPawel Dziepak FileHandle::operator=(const FileHandle& fh) 869b7f2d1bSPawel Dziepak { 879b7f2d1bSPawel Dziepak fSize = fh.fSize; 8800a8558cSPawel Dziepak memcpy(fData, fh.fData, fSize); 899b7f2d1bSPawel Dziepak return *this; 909b7f2d1bSPawel Dziepak } 919b7f2d1bSPawel Dziepak 929b7f2d1bSPawel Dziepak 93*4a153753SPawel Dziepak inline bool 94*4a153753SPawel Dziepak FileHandle::operator>(const FileHandle& handle) const 95*4a153753SPawel Dziepak { 96*4a153753SPawel Dziepak if (fSize > handle.fSize) 97*4a153753SPawel Dziepak return true; 98*4a153753SPawel Dziepak return memcmp(fData, handle.fData, fSize) > 0; 99*4a153753SPawel Dziepak } 100*4a153753SPawel Dziepak 101*4a153753SPawel Dziepak 102*4a153753SPawel Dziepak inline bool 103*4a153753SPawel Dziepak FileHandle::operator<(const FileHandle& handle) const 104*4a153753SPawel Dziepak { 105*4a153753SPawel Dziepak if (fSize < handle.fSize) 106*4a153753SPawel Dziepak return true; 107*4a153753SPawel Dziepak return memcmp(fData, handle.fData, fSize) < 0; 108*4a153753SPawel Dziepak } 109*4a153753SPawel Dziepak 110*4a153753SPawel Dziepak 1119b7f2d1bSPawel Dziepak inline 1129b7f2d1bSPawel Dziepak FileInfo::FileInfo() 1139b7f2d1bSPawel Dziepak : 1149b7f2d1bSPawel Dziepak fFileId(0), 1159b7f2d1bSPawel Dziepak fName(NULL), 1169b7f2d1bSPawel Dziepak fPath(NULL) 1179b7f2d1bSPawel Dziepak { 1189b7f2d1bSPawel Dziepak } 1199b7f2d1bSPawel Dziepak 1209b7f2d1bSPawel Dziepak 1219b7f2d1bSPawel Dziepak inline 1229b7f2d1bSPawel Dziepak FileInfo::~FileInfo() 1239b7f2d1bSPawel Dziepak { 1249b7f2d1bSPawel Dziepak free(const_cast<char*>(fName)); 1259b7f2d1bSPawel Dziepak free(const_cast<char*>(fPath)); 1269b7f2d1bSPawel Dziepak } 1279b7f2d1bSPawel Dziepak 1289b7f2d1bSPawel Dziepak 1299b7f2d1bSPawel Dziepak inline 1309b7f2d1bSPawel Dziepak FileInfo::FileInfo(const FileInfo& fi) 1319b7f2d1bSPawel Dziepak : 1329b7f2d1bSPawel Dziepak fFileId(fi.fFileId), 1339b7f2d1bSPawel Dziepak fHandle(fi.fHandle), 1349b7f2d1bSPawel Dziepak fParent(fi.fParent), 1359b7f2d1bSPawel Dziepak fName(strdup(fi.fName)), 1369b7f2d1bSPawel Dziepak fPath(strdup(fi.fPath)) 1379b7f2d1bSPawel Dziepak { 1389b7f2d1bSPawel Dziepak } 1399b7f2d1bSPawel Dziepak 1409b7f2d1bSPawel Dziepak 1419b7f2d1bSPawel Dziepak inline FileInfo& 1429b7f2d1bSPawel Dziepak FileInfo::operator=(const FileInfo& fi) 1439b7f2d1bSPawel Dziepak { 1449b7f2d1bSPawel Dziepak fFileId = fi.fFileId; 1459b7f2d1bSPawel Dziepak fHandle = fi.fHandle; 1469b7f2d1bSPawel Dziepak fParent = fi.fParent; 1479b7f2d1bSPawel Dziepak 1489b7f2d1bSPawel Dziepak free(const_cast<char*>(fName)); 1499b7f2d1bSPawel Dziepak fName = strdup(fi.fName); 1509b7f2d1bSPawel Dziepak 1519b7f2d1bSPawel Dziepak free(const_cast<char*>(fPath)); 1529b7f2d1bSPawel Dziepak fPath = strdup(fi.fPath); 1539b7f2d1bSPawel Dziepak 1549b7f2d1bSPawel Dziepak return *this; 1559b7f2d1bSPawel Dziepak } 1569b7f2d1bSPawel Dziepak 1579b7f2d1bSPawel Dziepak 1589b7f2d1bSPawel Dziepak inline bool 15900a8558cSPawel Dziepak FileSystemId::operator==(const FileSystemId& fsid) const 1609b7f2d1bSPawel Dziepak { 1619b7f2d1bSPawel Dziepak return fMajor == fsid.fMajor && fMinor == fsid.fMinor; 1629b7f2d1bSPawel Dziepak } 1639b7f2d1bSPawel Dziepak 1649b7f2d1bSPawel Dziepak 1659b7f2d1bSPawel Dziepak inline bool 16600a8558cSPawel Dziepak FileSystemId::operator!=(const FileSystemId& fsid) const 1679b7f2d1bSPawel Dziepak { 1689b7f2d1bSPawel Dziepak return !operator==(fsid); 1699b7f2d1bSPawel Dziepak } 1709b7f2d1bSPawel Dziepak 1719b7f2d1bSPawel Dziepak 1729b7f2d1bSPawel Dziepak #endif // FILEHINFO_H 1739b7f2d1bSPawel Dziepak 174