1 /** 2 * D header file for Darwin 3 * 4 * $(LINK2 https://opensource.apple.com/source/xnu/xnu-2422.115.4/bsd/sys/attr.h.auto.html, Apple sys/attr.h) 5 */ 6 module core.sys.darwin.sys.attr; 7 8 version (OSX) 9 version = Darwin; 10 else version (iOS) 11 version = Darwin; 12 else version (TVOS) 13 version = Darwin; 14 else version (WatchOS) 15 version = Darwin; 16 17 version (Darwin): 18 extern (C): 19 nothrow: 20 @nogc: 21 22 import core.internal.attributes : betterC; 23 import core.sys.darwin.sys.cdefs : c_ulong; 24 import core.sys.posix.sys.time : timeval; 25 26 // These functions aren't actually declared in attr.h but in unistd.h. 27 @system 28 { 29 void getattrlist(scope const char* path, scope attrlist* attrList, scope void* attrBuf, 30 size_t attrBufSize, c_ulong options); 31 32 void setattrlist(scope const char* path, scope attrlist* attrList, scope void* attrBuf, 33 size_t attrBufSize, c_ulong options); 34 35 version (TVOS) {} 36 else version (WatchOS) {} 37 else 38 int searchfs(scope const char* path, scope fssearchblock* searchBlock, 39 scope c_ulong* numMatches, uint scriptCode, uint options, scope searchstate* state); 40 } 41 42 enum 43 { 44 FSOPT_NOFOLLOW = 0x00000001, 45 FSOPT_NOINMEMUPDATE = 0x00000002, 46 FSOPT_REPORT_FULLSIZE = 0x00000004, 47 FSOPT_PACK_INVAL_ATTRS = 0x00000008, 48 FSOPT_ATTR_CMN_EXTENDED = 0x00000020, // macOS 10.10 49 } 50 51 enum SEARCHFS_MAX_SEARCHPARMS = 4096; 52 53 alias uint text_encoding_t, fsobj_type_t, fsobj_tag_t, fsfile_type_t, fsvolid_t, attrgroup_t; 54 55 struct attrlist 56 { 57 ushort bitmapcount, reserved; 58 attrgroup_t commonattr, volattr, dirattr, fileattr, forkattr; 59 } 60 enum ATTR_BIT_MAP_COUNT = 5; 61 62 struct attribute_set_t 63 { 64 attrgroup_t commonattr, volattr, dirattr, fileattr, forkattr; 65 } 66 67 struct attrreference_t 68 { 69 int attr_dataoffset; 70 uint attr_length; 71 } 72 73 struct diskextent 74 { 75 uint startblock, blockcount; 76 } 77 78 alias extentrecord = diskextent[8]; 79 80 alias vol_capabilities_set_t = uint[4]; 81 82 enum 83 { 84 VOL_CAPABILITIES_FORMAT = 0, 85 VOL_CAPABILITIES_INTERFACES = 1, 86 VOL_CAPABILITIES_RESERVED1 = 2, 87 VOL_CAPABILITIES_RESERVED2 = 3, 88 } 89 90 struct vol_capabilities_attr_t 91 { 92 vol_capabilities_set_t capabilities, valid; 93 } 94 95 enum ATTR_MAX_BUFFER = 8192; 96 97 enum 98 { 99 VOL_CAP_FMT_PERSISTENTOBJECTIDS = 0x00000001, 100 VOL_CAP_FMT_SYMBOLICLINKS = 0x00000002, 101 VOL_CAP_FMT_HARDLINKS = 0x00000004, 102 VOL_CAP_FMT_JOURNAL = 0x00000008, 103 VOL_CAP_FMT_JOURNAL_ACTIVE = 0x00000010, 104 VOL_CAP_FMT_NO_ROOT_TIMES = 0x00000020, 105 VOL_CAP_FMT_SPARSE_FILES = 0x00000040, 106 VOL_CAP_FMT_ZERO_RUNS = 0x00000080, 107 VOL_CAP_FMT_CASE_SENSITIVE = 0x00000100, 108 VOL_CAP_FMT_CASE_PRESERVING = 0x00000200, 109 VOL_CAP_FMT_FAST_STATFS = 0x00000400, 110 VOL_CAP_FMT_2TB_FILESIZE = 0x00000800, 111 VOL_CAP_FMT_OPENDENYMODES = 0x00001000, 112 VOL_CAP_FMT_HIDDEN_FILES = 0x00002000, 113 VOL_CAP_FMT_PATH_FROM_ID = 0x00004000, 114 VOL_CAP_FMT_NO_VOLUME_SIZES = 0x00008000, 115 VOL_CAP_FMT_DECMPFS_COMPRESSION = 0x00010000, 116 VOL_CAP_FMT_64BIT_OBJECT_IDS = 0x00020000, 117 VOL_CAP_FMT_DIR_HARDLINKS = 0x00040000, // macOS 10.12 118 VOL_CAP_FMT_DOCUMENT_ID = 0x00080000, // macOS 10.12 119 VOL_CAP_FMT_WRITE_GENERATION_COUNT = 0x00100000, // macOS 10.12 120 VOL_CAP_FMT_NO_IMMUTABLE_FILES = 0x00200000, // macOS 10.12.4 121 VOL_CAP_FMT_NO_PERMISSIONS = 0x00400000, // macOS 10.12.4 122 VOL_CAP_FMT_SHARED_SPACE = 0x00800000, // macOS 10.15 123 VOL_CAP_FMT_VOL_GROUPS = 0x01000000, // macOS 10.15 124 } 125 126 enum 127 { 128 VOL_CAP_INT_SEARCHFS = 0x00000001, 129 VOL_CAP_INT_ATTRLIST = 0x00000002, 130 VOL_CAP_INT_NFSEXPORT = 0x00000004, 131 VOL_CAP_INT_READDIRATTR = 0x00000008, 132 VOL_CAP_INT_EXCHANGEDATA = 0x00000010, 133 VOL_CAP_INT_COPYFILE = 0x00000020, 134 VOL_CAP_INT_ALLOCATE = 0x00000040, 135 VOL_CAP_INT_VOL_RENAME = 0x00000080, 136 VOL_CAP_INT_ADVLOCK = 0x00000100, 137 VOL_CAP_INT_FLOCK = 0x00000200, 138 VOL_CAP_INT_EXTENDED_SECURITY = 0x00000400, 139 VOL_CAP_INT_USERACCESS = 0x00000800, 140 VOL_CAP_INT_MANLOCK = 0x00001000, 141 VOL_CAP_INT_NAMEDSTREAMS = 0x00002000, 142 VOL_CAP_INT_EXTENDED_ATTR = 0x00004000, 143 VOL_CAP_INT_CLONE = 0x00010000, // macOS 10.12 144 VOL_CAP_INT_SNAPSHOT = 0x00020000, // macOS 10.12 145 VOL_CAP_INT_RENAME_SWAP = 0x00040000, // macOS 10.12 146 VOL_CAP_INT_RENAME_EXCL = 0x00080000, // macOS 10.12 147 VOL_CAP_INT_RENAME_OPENFAIL = 0x00100000, // macOS 10.15 148 } 149 150 struct vol_attributes_attr_t 151 { 152 attribute_set_t validattr, nativeattr; 153 } 154 155 enum 156 { 157 ATTR_CMN_NAME = 0x00000001, 158 ATTR_CMN_DEVID = 0x00000002, 159 ATTR_CMN_FSID = 0x00000004, 160 ATTR_CMN_OBJTYPE = 0x00000008, 161 ATTR_CMN_OBJTAG = 0x00000010, 162 ATTR_CMN_OBJID = 0x00000020, 163 ATTR_CMN_OBJPERMANENTID = 0x00000040, 164 ATTR_CMN_PAROBJID = 0x00000080, 165 ATTR_CMN_SCRIPT = 0x00000100, 166 ATTR_CMN_CRTIME = 0x00000200, 167 ATTR_CMN_MODTIME = 0x00000400, 168 ATTR_CMN_CHGTIME = 0x00000800, 169 ATTR_CMN_ACCTIME = 0x00001000, 170 ATTR_CMN_BKUPTIME = 0x00002000, 171 ATTR_CMN_FNDRINFO = 0x00004000, 172 ATTR_CMN_OWNERID = 0x00008000, 173 ATTR_CMN_GRPID = 0x00010000, 174 ATTR_CMN_ACCESSMASK = 0x00020000, 175 ATTR_CMN_FLAGS = 0x00040000, 176 177 ATTR_CMN_GEN_COUNT = 0x00080000, 178 ATTR_CMN_DOCUMENT_ID = 0x00100000, 179 180 ATTR_CMN_USERACCESS = 0x00200000, 181 ATTR_CMN_EXTENDED_SECURITY = 0x00400000, 182 ATTR_CMN_UUID = 0x00800000, 183 ATTR_CMN_GRPUUID = 0x01000000, 184 ATTR_CMN_FILEID = 0x02000000, 185 ATTR_CMN_PARENTID = 0x04000000, 186 ATTR_CMN_FULLPATH = 0x08000000, 187 ATTR_CMN_ADDEDTIME = 0x10000000, 188 ATTR_CMN_ERROR = 0x20000000, // macOS 10.10 189 ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000, // macOS 10.10 190 } 191 192 enum ATTR_CMN_RETURNED_ATTRS = 0x80000000; 193 enum ATTR_CMN_VALIDMASK = 0xFFFFFFFF; 194 enum ATTR_CMN_SETMASK = 0x51C7FF00; 195 enum ATTR_CMN_VOLSETMASK = 0x00006700; 196 197 enum 198 { 199 ATTR_VOL_FSTYPE = 0x00000001, 200 ATTR_VOL_SIGNATURE = 0x00000002, 201 ATTR_VOL_SIZE = 0x00000004, 202 ATTR_VOL_SPACEFREE = 0x00000008, 203 ATTR_VOL_SPACEAVAIL = 0x00000010, 204 ATTR_VOL_MINALLOCATION = 0x00000020, 205 ATTR_VOL_ALLOCATIONCLUMP = 0x00000040, 206 ATTR_VOL_IOBLOCKSIZE = 0x00000080, 207 ATTR_VOL_OBJCOUNT = 0x00000100, 208 ATTR_VOL_FILECOUNT = 0x00000200, 209 ATTR_VOL_DIRCOUNT = 0x00000400, 210 ATTR_VOL_MAXOBJCOUNT = 0x00000800, 211 ATTR_VOL_MOUNTPOINT = 0x00001000, 212 ATTR_VOL_NAME = 0x00002000, 213 ATTR_VOL_MOUNTFLAGS = 0x00004000, 214 ATTR_VOL_MOUNTEDDEVICE = 0x00008000, 215 ATTR_VOL_ENCODINGSUSED = 0x00010000, 216 ATTR_VOL_CAPABILITIES = 0x00020000, 217 ATTR_VOL_UUID = 0x00040000, 218 ATTR_VOL_QUOTA_SIZE = 0x10000000, // macOS 10.12.4 219 ATTR_VOL_RESERVED_SIZE = 0x20000000, // macOS 10.12.4 220 ATTR_VOL_ATTRIBUTES = 0x40000000, 221 ATTR_VOL_INFO = 0x80000000, 222 } 223 224 enum ATTR_VOL_VALIDMASK = 0xF007FFFF; 225 enum ATTR_VOL_SETMASK = 0x80002000; 226 227 enum 228 { 229 ATTR_DIR_LINKCOUNT = 0x00000001, 230 ATTR_DIR_ENTRYCOUNT = 0x00000002, 231 ATTR_DIR_MOUNTSTATUS = 0x00000004, 232 ATTR_DIR_ALLOCSIZE = 0x00000008, // macOS 10.12.4 233 ATTR_DIR_IOBLOCKSIZE = 0x00000010, // macOS 10.12.4 234 ATTR_DIR_DATALENGTH = 0x00000020, // macOS 10.12.4 235 } 236 237 enum 238 { 239 DIR_MNTSTATUS_MNTPOINT = 0x00000001, 240 DIR_MNTSTATUS_TRIGGER = 0x00000002, 241 } 242 243 enum ATTR_DIR_VALIDMASK = 0x0000003f; 244 enum ATTR_DIR_SETMASK = 0x00000000; 245 246 enum 247 { 248 ATTR_FILE_LINKCOUNT = 0x00000001, 249 ATTR_FILE_TOTALSIZE = 0x00000002, 250 ATTR_FILE_ALLOCSIZE = 0x00000004, 251 ATTR_FILE_IOBLOCKSIZE = 0x00000008, 252 ATTR_FILE_DEVTYPE = 0x00000020, 253 ATTR_FILE_FORKCOUNT = 0x00000080, 254 ATTR_FILE_FORKLIST = 0x00000100, 255 ATTR_FILE_DATALENGTH = 0x00000200, 256 ATTR_FILE_DATAALLOCSIZE = 0x00000400, 257 ATTR_FILE_RSRCLENGTH = 0x00001000, 258 ATTR_FILE_RSRCALLOCSIZE = 0x00002000, 259 } 260 261 enum ATTR_FILE_VALIDMASK = 0x000037FF; 262 enum ATTR_FILE_SETMASK = 0x00000020; 263 264 enum 265 { 266 ATTR_CMNEXT_RELPATH = 0x00000004, // macOS 10.12.4 267 ATTR_CMNEXT_PRIVATESIZE = 0x00000008, // macOS 10.12.4 268 ATTR_CMNEXT_NOFIRMLINKPATH = 0x00000020, // macOS 10.15 269 ATTR_CMNEXT_REALDEVID = 0x00000040, // macOS 10.15 270 ATTR_CMNEXT_REALFSID = 0x00000080, // macOS 10.15 271 } 272 273 enum ATTR_CMNEXT_VALIDMASK = 0x000000fc; 274 enum ATTR_CMNEXT_SETMASK = 0x00000000; 275 276 enum ATTR_BULK_REQUIRED = ATTR_CMN_NAME | ATTR_CMN_RETURNED_ATTRS; 277 278 enum 279 { 280 SRCHFS_START = 0x00000001, 281 SRCHFS_MATCHPARTIALNAMES = 0x00000002, 282 SRCHFS_MATCHDIRS = 0x00000004, 283 SRCHFS_MATCHFILES = 0x00000008, 284 SRCHFS_SKIPLINKS = 0x00000010, 285 SRCHFS_SKIPINVISIBLE = 0x00000020, 286 SRCHFS_SKIPPACKAGES = 0x00000040, 287 SRCHFS_SKIPINAPPROPRIATE = 0x00000080, 288 289 SRCHFS_NEGATEPARAMS = 0x80000000, 290 SRCHFS_VALIDOPTIONSMASK = 0x800000FF, 291 } 292 293 struct fssearchblock 294 { 295 attrlist* returnattrs; 296 void* returnbuffer; 297 size_t returnbuffersize; 298 c_ulong maxmatches; 299 timeval timelimit; 300 void* searchparams1; 301 size_t sizeofsearchparams1; 302 void* searchparams2; 303 size_t sizeofsearchparams2; 304 attrlist searchattrs; 305 } 306 307 struct searchstate 308 { 309 uint ss_union_flags; 310 uint ss_union_layer; 311 ubyte[548] ss_fsstate; 312 } 313 static assert(searchstate.sizeof == uint.sizeof * 2 + searchstate.ss_fsstate.sizeof, 314 "searchstate struct must be packed"); 315 316 enum FST_EOF = -1; 317 318 @betterC @nogc nothrow pure @safe unittest 319 { 320 // Use an enum instead of `version (Darwin)` so it works with the betterc test extractor. 321 version (OSX) enum isDarwin = true; 322 else version (iOS) enum isDarwin = true; 323 else version (TVOS) enum isDarwin = true; 324 else version (WatchOS) enum isDarwin = true; 325 else enum isDarwin = false; 326 static if (isDarwin) 327 { 328 // Verify that these types don't need __initZ and so can be used in betterC. 329 attrlist al; 330 attribute_set_t as; 331 attrreference_t ar; 332 diskextent de; 333 vol_capabilities_attr_t vca; 334 vol_attributes_attr_t vaa; 335 fssearchblock fsb; 336 searchstate ss; 337 } 338 }