1/* 2 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef USERLAND_FS_FS_CAPABILITIES_H 6#define USERLAND_FS_FS_CAPABILITIES_H 7 8#include <string.h> 9#include <stdio.h> 10 11#include <bitset> 12 13#include "Debug.h" 14 15enum client_fs_type { 16 CLIENT_FS_BEOS_KERNEL = 0, 17 CLIENT_FS_HAIKU_KERNEL, 18 CLIENT_FS_FUSE 19}; 20 21// FS capabilities 22enum { 23 // FS operations 24 FS_CAPABILITY_MOUNT = 0, 25 26 FS_CAPABILITY_COUNT 27}; 28 29// Volume capabilities 30enum { 31 // general operations 32 FS_VOLUME_CAPABILITY_UNMOUNT, 33 34 FS_VOLUME_CAPABILITY_READ_FS_INFO, 35 FS_VOLUME_CAPABILITY_WRITE_FS_INFO, 36 FS_VOLUME_CAPABILITY_SYNC, 37 38 FS_VOLUME_CAPABILITY_GET_VNODE, 39 40 // index directory & index operations 41 FS_VOLUME_CAPABILITY_OPEN_INDEX_DIR, 42 FS_VOLUME_CAPABILITY_CLOSE_INDEX_DIR, 43 FS_VOLUME_CAPABILITY_FREE_INDEX_DIR_COOKIE, 44 FS_VOLUME_CAPABILITY_READ_INDEX_DIR, 45 FS_VOLUME_CAPABILITY_REWIND_INDEX_DIR, 46 47 FS_VOLUME_CAPABILITY_CREATE_INDEX, 48 FS_VOLUME_CAPABILITY_REMOVE_INDEX, 49 FS_VOLUME_CAPABILITY_READ_INDEX_STAT, 50 51 // query operations 52 FS_VOLUME_CAPABILITY_OPEN_QUERY, 53 FS_VOLUME_CAPABILITY_CLOSE_QUERY, 54 FS_VOLUME_CAPABILITY_FREE_QUERY_COOKIE, 55 FS_VOLUME_CAPABILITY_READ_QUERY, 56 FS_VOLUME_CAPABILITY_REWIND_QUERY, 57 58 // support for FS layers 59 FS_VOLUME_CAPABILITY_ALL_LAYERS_MOUNTED, 60 FS_VOLUME_CAPABILITY_CREATE_SUB_VNODE, 61 FS_VOLUME_CAPABILITY_DELETE_SUB_VNODE, 62 63 FS_VOLUME_CAPABILITY_COUNT 64}; 65 66// VNode capabilities 67enum { 68 // vnode operations 69 FS_VNODE_CAPABILITY_LOOKUP, 70 FS_VNODE_CAPABILITY_GET_VNODE_NAME, 71 72 FS_VNODE_CAPABILITY_PUT_VNODE, 73 FS_VNODE_CAPABILITY_REMOVE_VNODE, 74 75 // VM file access 76 FS_VNODE_CAPABILITY_CAN_PAGE, 77 FS_VNODE_CAPABILITY_READ_PAGES, 78 FS_VNODE_CAPABILITY_WRITE_PAGES, 79 80 // asynchronous I/O 81 FS_VNODE_CAPABILITY_IO, 82 FS_VNODE_CAPABILITY_CANCEL_IO, 83 84 // cache file access 85 FS_VNODE_CAPABILITY_GET_FILE_MAP, 86 87 // common operations 88 FS_VNODE_CAPABILITY_IOCTL, 89 FS_VNODE_CAPABILITY_SET_FLAGS, 90 FS_VNODE_CAPABILITY_SELECT, 91 FS_VNODE_CAPABILITY_DESELECT, 92 FS_VNODE_CAPABILITY_FSYNC, 93 94 FS_VNODE_CAPABILITY_READ_SYMLINK, 95 FS_VNODE_CAPABILITY_CREATE_SYMLINK, 96 97 FS_VNODE_CAPABILITY_LINK, 98 FS_VNODE_CAPABILITY_UNLINK, 99 FS_VNODE_CAPABILITY_RENAME, 100 101 FS_VNODE_CAPABILITY_ACCESS, 102 FS_VNODE_CAPABILITY_READ_STAT, 103 FS_VNODE_CAPABILITY_WRITE_STAT, 104 105 // file operations 106 FS_VNODE_CAPABILITY_CREATE, 107 FS_VNODE_CAPABILITY_OPEN, 108 FS_VNODE_CAPABILITY_CLOSE, 109 FS_VNODE_CAPABILITY_FREE_COOKIE, 110 FS_VNODE_CAPABILITY_READ, 111 FS_VNODE_CAPABILITY_WRITE, 112 113 // directory operations 114 FS_VNODE_CAPABILITY_CREATE_DIR, 115 FS_VNODE_CAPABILITY_REMOVE_DIR, 116 FS_VNODE_CAPABILITY_OPEN_DIR, 117 FS_VNODE_CAPABILITY_CLOSE_DIR, 118 FS_VNODE_CAPABILITY_FREE_DIR_COOKIE, 119 FS_VNODE_CAPABILITY_READ_DIR, 120 FS_VNODE_CAPABILITY_REWIND_DIR, 121 122 // attribute directory operations 123 FS_VNODE_CAPABILITY_OPEN_ATTR_DIR, 124 FS_VNODE_CAPABILITY_CLOSE_ATTR_DIR, 125 FS_VNODE_CAPABILITY_FREE_ATTR_DIR_COOKIE, 126 FS_VNODE_CAPABILITY_READ_ATTR_DIR, 127 FS_VNODE_CAPABILITY_REWIND_ATTR_DIR, 128 129 // attribute operations 130 FS_VNODE_CAPABILITY_CREATE_ATTR, 131 FS_VNODE_CAPABILITY_OPEN_ATTR, 132 FS_VNODE_CAPABILITY_CLOSE_ATTR, 133 FS_VNODE_CAPABILITY_FREE_ATTR_COOKIE, 134 FS_VNODE_CAPABILITY_READ_ATTR, 135 FS_VNODE_CAPABILITY_WRITE_ATTR, 136 137 FS_VNODE_CAPABILITY_READ_ATTR_STAT, 138 FS_VNODE_CAPABILITY_WRITE_ATTR_STAT, 139 FS_VNODE_CAPABILITY_RENAME_ATTR, 140 FS_VNODE_CAPABILITY_REMOVE_ATTR, 141 142 // support for node and FS layers 143 FS_VNODE_CAPABILITY_CREATE_SPECIAL_NODE, 144 FS_VNODE_CAPABILITY_GET_SUPER_VNODE, 145 146 FS_VNODE_CAPABILITY_COUNT 147}; 148 149namespace UserlandFSUtil { 150 151template<const int CapabilityCount> 152struct FSCapabilitiesBase { 153 std::bitset<CapabilityCount> capabilities; 154 155 inline void ClearAll(); 156 157 inline void Set(uint32 capability, bool set = true); 158 inline void Clear(uint32 capability); 159 inline bool Get(uint32 capability) const; 160 161 inline uint32 GetHashCode() const; 162 163 inline bool operator==( 164 const FSCapabilitiesBase<CapabilityCount>& 165 other) const; 166 167 inline void Dump() const; 168}; 169 170 171// ClearAll 172template<const int CapabilityCount> 173inline void 174FSCapabilitiesBase<CapabilityCount>::ClearAll() 175{ 176 capabilities.reset(); 177} 178 179 180// Set 181template<const int CapabilityCount> 182inline void 183FSCapabilitiesBase<CapabilityCount>::Set(uint32 capability, bool set) 184{ 185 if (capability >= CapabilityCount) 186 return; 187 188 capabilities.set(capability, set); 189} 190 191 192// Clear 193template<const int CapabilityCount> 194inline void 195FSCapabilitiesBase<CapabilityCount>::Clear(uint32 capability) 196{ 197 if (capability >= CapabilityCount) 198 return; 199 200 capabilities.reset(capability); 201} 202 203 204// Get 205template<const int CapabilityCount> 206inline bool 207FSCapabilitiesBase<CapabilityCount>::Get(uint32 capability) const 208{ 209 if (capability >= CapabilityCount) 210 return false; 211 212 return capabilities.test(capability); 213} 214 215 216// GetHashCode 217template<const int CapabilityCount> 218inline uint32 219FSCapabilitiesBase<CapabilityCount>::GetHashCode() const 220{ 221 uint32 hash = 0; 222 for (int i = 0; i < CapabilityCount; i++) 223 hash ^= capabilities.test(i) << (i % 32); 224 return hash; 225} 226 227 228// == 229template<const int CapabilityCount> 230inline bool 231FSCapabilitiesBase<CapabilityCount>::operator==( 232 const FSCapabilitiesBase<CapabilityCount>& other) const 233{ 234 return capabilities == other.capabilities; 235} 236 237 238// Dump 239template<const int CapabilityCount> 240inline void 241FSCapabilitiesBase<CapabilityCount>::Dump() const 242{ 243 D( 244 PRINT(("FSCapabilities[%s]\n", capabilities.to_string().c_str())); 245 ) 246} 247 248 249typedef FSCapabilitiesBase<FS_CAPABILITY_COUNT> FSCapabilities; 250typedef FSCapabilitiesBase<FS_VOLUME_CAPABILITY_COUNT> FSVolumeCapabilities; 251typedef FSCapabilitiesBase<FS_VNODE_CAPABILITY_COUNT> FSVNodeCapabilities; 252 253} // namespace UserlandFSUtil 254 255using UserlandFSUtil::FSCapabilities; 256using UserlandFSUtil::FSVolumeCapabilities; 257using UserlandFSUtil::FSVNodeCapabilities; 258 259#endif // USERLAND_FS_FS_CAPABILITIES_H 260