| 1 | /* | 
| 2 |  * Copyright (c) 2000-2018 Apple Computer, Inc. All rights reserved. | 
| 3 |  * | 
| 4 |  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ | 
| 5 |  * | 
| 6 |  * This file contains Original Code and/or Modifications of Original Code | 
| 7 |  * as defined in and that are subject to the Apple Public Source License | 
| 8 |  * Version 2.0 (the 'License'). You may not use this file except in | 
| 9 |  * compliance with the License. The rights granted to you under the License | 
| 10 |  * may not be used to create, or enable the creation or redistribution of, | 
| 11 |  * unlawful or unlicensed copies of an Apple operating system, or to | 
| 12 |  * circumvent, violate, or enable the circumvention or violation of, any | 
| 13 |  * terms of an Apple operating system software license agreement. | 
| 14 |  * | 
| 15 |  * Please obtain a copy of the License at | 
| 16 |  * http://www.opensource.apple.com/apsl/ and read it before using this file. | 
| 17 |  * | 
| 18 |  * The Original Code and all software distributed under the License are | 
| 19 |  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER | 
| 20 |  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, | 
| 21 |  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | 
| 22 |  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. | 
| 23 |  * Please see the License for the specific language governing rights and | 
| 24 |  * limitations under the License. | 
| 25 |  * | 
| 26 |  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ | 
| 27 |  */ | 
| 28 |  | 
| 29 | /* | 
| 30 |  * attr.h - attribute data structures and interfaces | 
| 31 |  * | 
| 32 |  * Copyright (c) 1998, Apple Computer, Inc.  All Rights Reserved. | 
| 33 |  */ | 
| 34 |  | 
| 35 | #ifndef _SYS_ATTR_H_ | 
| 36 | #define _SYS_ATTR_H_ | 
| 37 |  | 
| 38 | #include <sys/appleapiopts.h> | 
| 39 |  | 
| 40 | #ifdef __APPLE_API_UNSTABLE | 
| 41 | #include <sys/types.h> | 
| 42 | #include <sys/ucred.h> | 
| 43 | #include <sys/time.h> | 
| 44 | #include <sys/cdefs.h> | 
| 45 |  | 
| 46 | #define FSOPT_NOFOLLOW          0x00000001 | 
| 47 | #define FSOPT_NOINMEMUPDATE     0x00000002 | 
| 48 | #define FSOPT_REPORT_FULLSIZE   0x00000004 | 
| 49 | /* The following option only valid when requesting ATTR_CMN_RETURNED_ATTRS */ | 
| 50 | #define FSOPT_PACK_INVAL_ATTRS  0x00000008 | 
| 51 |  | 
| 52 | #ifdef PRIVATE | 
| 53 | #define FSOPT_EXCHANGE_DATA_ONLY 0x0000010 | 
| 54 | #endif | 
| 55 |  | 
| 56 | #define FSOPT_ATTR_CMN_EXTENDED 0x00000020 | 
| 57 | #ifdef PRIVATE | 
| 58 | #define FSOPT_LIST_SNAPSHOT     0x00000040 | 
| 59 | #ifndef FSOPT_NOFIRMLINKPATH /*a copy is in fsgetpath.h */ | 
| 60 | #define FSOPT_NOFIRMLINKPATH     0x00000080 | 
| 61 | #endif /* FSOPT_NOFIRMLINKPATH */ | 
| 62 | #define FSOPT_FOLLOW_FIRMLINK    0x00000100 | 
| 63 | #endif /* PRIVATE */ | 
| 64 | #define FSOPT_RETURN_REALDEV     0x00000200 | 
| 65 | #ifdef PRIVATE | 
| 66 | #ifndef FSOPT_ISREALFSID  /*a copy is in fsgetpath.h */ | 
| 67 | #define FSOPT_ISREALFSID         FSOPT_RETURN_REALDEV | 
| 68 | #endif | 
| 69 | #define FSOPT_UTIMES_NULL        0x00000400 | 
| 70 | #endif /* PRIVATE */ | 
| 71 | #define FSOPT_NOFOLLOW_ANY       0x00000800 | 
| 72 |  | 
| 73 | /* we currently aren't anywhere near this amount for a valid | 
| 74 |  * fssearchblock.sizeofsearchparams1 or fssearchblock.sizeofsearchparams2 | 
| 75 |  * but we put a sanity check in to avoid abuse of the value passed in from | 
| 76 |  * user land. | 
| 77 |  */ | 
| 78 | #define SEARCHFS_MAX_SEARCHPARMS  4096 | 
| 79 |  | 
| 80 | typedef u_int32_t text_encoding_t; | 
| 81 |  | 
| 82 | typedef u_int32_t fsobj_type_t; | 
| 83 |  | 
| 84 | typedef u_int32_t fsobj_tag_t; | 
| 85 |  | 
| 86 | typedef u_int32_t fsfile_type_t; | 
| 87 |  | 
| 88 | typedef u_int32_t fsvolid_t; | 
| 89 |  | 
| 90 | #include <sys/_types/_fsobj_id_t.h> /* file object id type */ | 
| 91 |  | 
| 92 | typedef u_int32_t attrgroup_t; | 
| 93 |  | 
| 94 | struct attrlist { | 
| 95 | 	u_short bitmapcount;                    /* number of attr. bit sets in list (should be 5) */ | 
| 96 | 	u_int16_t reserved;                     /* (to maintain 4-byte alignment) */ | 
| 97 | 	attrgroup_t commonattr;                 /* common attribute group */ | 
| 98 | 	attrgroup_t volattr;                    /* Volume attribute group */ | 
| 99 | 	attrgroup_t dirattr;                    /* directory attribute group */ | 
| 100 | 	attrgroup_t fileattr;                   /* file attribute group */ | 
| 101 | 	attrgroup_t forkattr;                   /* fork attribute group */ | 
| 102 | }; | 
| 103 |  | 
| 104 | #define ATTR_BIT_MAP_COUNT 5 | 
| 105 |  | 
| 106 | typedef struct attribute_set { | 
| 107 | 	attrgroup_t commonattr;                 /* common attribute group */ | 
| 108 | 	attrgroup_t volattr;                    /* Volume attribute group */ | 
| 109 | 	attrgroup_t dirattr;                    /* directory attribute group */ | 
| 110 | 	attrgroup_t fileattr;                   /* file attribute group */ | 
| 111 | 	attrgroup_t forkattr;                   /* fork attribute group */ | 
| 112 | } attribute_set_t; | 
| 113 |  | 
| 114 | #define ATTRIBUTE_SET_INIT(a)               do {(a)->commonattr = (a)->volattr = (a)->dirattr = (a)->fileattr = (a)->forkattr = 0; } while(0) | 
| 115 |  | 
| 116 |  | 
| 117 | typedef struct attrreference { | 
| 118 | 	int32_t     attr_dataoffset; | 
| 119 | 	u_int32_t   attr_length; | 
| 120 | } attrreference_t; | 
| 121 |  | 
| 122 | /* XXX PPD This is derived from HFSVolumePriv.h and should perhaps be referenced from there? */ | 
| 123 |  | 
| 124 | struct diskextent { | 
| 125 | 	u_int32_t                                       startblock;                             /* first block allocated */ | 
| 126 | 	u_int32_t                                       blockcount;                             /* number of blocks allocated */ | 
| 127 | }; | 
| 128 |  | 
| 129 | typedef struct diskextent extentrecord[8]; | 
| 130 |  | 
| 131 | typedef u_int32_t vol_capabilities_set_t[4]; | 
| 132 |  | 
| 133 | #define VOL_CAPABILITIES_FORMAT 0 | 
| 134 | #define VOL_CAPABILITIES_INTERFACES 1 | 
| 135 | #define VOL_CAPABILITIES_RESERVED1 2 | 
| 136 | #define VOL_CAPABILITIES_RESERVED2 3 | 
| 137 |  | 
| 138 | typedef struct vol_capabilities_attr { | 
| 139 | 	vol_capabilities_set_t capabilities; | 
| 140 | 	vol_capabilities_set_t valid; | 
| 141 | } vol_capabilities_attr_t; | 
| 142 |  | 
| 143 | /* | 
| 144 |  * XXX this value needs to be raised - 3893388 | 
| 145 |  */ | 
| 146 | #define ATTR_MAX_BUFFER         8192 | 
| 147 |  | 
| 148 | /* | 
| 149 |  * VOL_CAP_FMT_PERSISTENTOBJECTIDS: When set, the volume has object IDs | 
| 150 |  * that are persistent (retain their values even when the volume is | 
| 151 |  * unmounted and remounted), and a file or directory can be looked up | 
| 152 |  * by ID.  Volumes that support VolFS and can support Carbon File ID | 
| 153 |  * references should set this bit. | 
| 154 |  * | 
| 155 |  * VOL_CAP_FMT_SYMBOLICLINKS: When set, the volume supports symbolic | 
| 156 |  * links.  The symlink(), readlink(), and lstat() calls all use this | 
| 157 |  * symbolic link. | 
| 158 |  * | 
| 159 |  * VOL_CAP_FMT_HARDLINKS: When set, the volume supports hard links. | 
| 160 |  * The link() call creates hard links. | 
| 161 |  * | 
| 162 |  * VOL_CAP_FMT_JOURNAL: When set, the volume is capable of supporting | 
| 163 |  * a journal used to speed recovery in case of unplanned shutdown | 
| 164 |  * (such as a power outage or crash).  This bit does not necessarily | 
| 165 |  * mean the volume is actively using a journal for recovery. | 
| 166 |  * | 
| 167 |  * VOL_CAP_FMT_JOURNAL_ACTIVE: When set, the volume is currently using | 
| 168 |  * a journal for use in speeding recovery after an unplanned shutdown. | 
| 169 |  * This bit can be set only if VOL_CAP_FMT_JOURNAL is also set. | 
| 170 |  * | 
| 171 |  * VOL_CAP_FMT_NO_ROOT_TIMES: When set, the volume format does not | 
| 172 |  * store reliable times for the root directory, so you should not | 
| 173 |  * depend on them to detect changes, etc. | 
| 174 |  * | 
| 175 |  * VOL_CAP_FMT_SPARSE_FILES: When set, the volume supports sparse files. | 
| 176 |  * That is, files which can have "holes" that have never been written | 
| 177 |  * to, and are not allocated on disk.  Sparse files may have an | 
| 178 |  * allocated size that is less than the file's logical length. | 
| 179 |  * | 
| 180 |  * VOL_CAP_FMT_ZERO_RUNS: For security reasons, parts of a file (runs) | 
| 181 |  * that have never been written to must appear to contain zeroes.  When | 
| 182 |  * this bit is set, the volume keeps track of allocated but unwritten | 
| 183 |  * runs of a file so that it can substitute zeroes without actually | 
| 184 |  * writing zeroes to the media.  This provides performance similar to | 
| 185 |  * sparse files, but not the space savings. | 
| 186 |  * | 
| 187 |  * VOL_CAP_FMT_CASE_SENSITIVE: When set, file and directory names are | 
| 188 |  * case sensitive (upper and lower case are different).  When clear, | 
| 189 |  * an upper case character is equivalent to a lower case character, | 
| 190 |  * and you can't have two names that differ solely in the case of | 
| 191 |  * the characters. | 
| 192 |  * | 
| 193 |  * VOL_CAP_FMT_CASE_PRESERVING: When set, file and directory names | 
| 194 |  * preserve the difference between upper and lower case.  If clear, | 
| 195 |  * the volume may change the case of some characters (typically | 
| 196 |  * making them all upper or all lower case).  A volume that sets | 
| 197 |  * VOL_CAP_FMT_CASE_SENSITIVE should also set VOL_CAP_FMT_CASE_PRESERVING. | 
| 198 |  * | 
| 199 |  * VOL_CAP_FMT_FAST_STATFS: This bit is used as a hint to upper layers | 
| 200 |  * (especially Carbon) that statfs() is fast enough that its results | 
| 201 |  * need not be cached by those upper layers.  A volume that caches | 
| 202 |  * the statfs information in its in-memory structures should set this bit. | 
| 203 |  * A volume that must always read from disk or always perform a network | 
| 204 |  * transaction should not set this bit. | 
| 205 |  * | 
| 206 |  * VOL_CAP_FMT_2TB_FILESIZE: If this bit is set the volume format supports | 
| 207 |  * file sizes larger than 4GB, and potentially up to 2TB; it does not | 
| 208 |  * indicate whether the filesystem supports files larger than that. | 
| 209 |  * | 
| 210 |  * VOL_CAP_FMT_OPENDENYMODES: When set, the volume supports open deny | 
| 211 |  * modes (e.g. "open for read write, deny write"; effectively, mandatory | 
| 212 |  * file locking based on open modes). | 
| 213 |  * | 
| 214 |  * VOL_CAP_FMT_HIDDEN_FILES: When set, the volume supports the UF_HIDDEN | 
| 215 |  * file flag, and the UF_HIDDEN flag is mapped to that volume's native | 
| 216 |  * "hidden" or "invisible" bit (which may be the invisible bit from the | 
| 217 |  * Finder Info extended attribute). | 
| 218 |  * | 
| 219 |  * VOL_CAP_FMT_PATH_FROM_ID:  When set, the volume supports the ability | 
| 220 |  * to derive a pathname to the root of the file system given only the | 
| 221 |  * id of an object.  This also implies that object ids on this file | 
| 222 |  * system are persistent and not recycled.  This is a very specialized | 
| 223 |  * capability and it is assumed that most file systems will not support | 
| 224 |  * it.  Its use is for legacy non-posix APIs like ResolveFileIDRef. | 
| 225 |  * | 
| 226 |  * VOL_CAP_FMT_NO_VOLUME_SIZES: When set, the volume does not support | 
| 227 |  * returning values for total data blocks, available blocks, or free blocks | 
| 228 |  * (as in f_blocks, f_bavail, or f_bfree in "struct statfs").  Historically, | 
| 229 |  * those values were set to 0xFFFFFFFF for volumes that did not support them. | 
| 230 |  * | 
| 231 |  * VOL_CAP_FMT_DECMPFS_COMPRESSION: When set, the volume supports transparent | 
| 232 |  * decompression of compressed files using decmpfs. | 
| 233 |  * | 
| 234 |  * VOL_CAP_FMT_64BIT_OBJECT_IDS: When set, the volume uses object IDs that | 
| 235 |  * are 64-bit. This means that ATTR_CMN_FILEID and ATTR_CMN_PARENTID are the | 
| 236 |  * only legitimate attributes for obtaining object IDs from this volume and the | 
| 237 |  * 32-bit fid_objno fields of the fsobj_id_t returned by ATTR_CMN_OBJID, | 
| 238 |  * ATTR_CMN_OBJPERMID, and ATTR_CMN_PAROBJID are undefined. | 
| 239 |  * | 
| 240 |  * VOL_CAP_FMT_DIR_HARDLINKS: When set, the volume supports directory | 
| 241 |  * hard links. | 
| 242 |  * | 
| 243 |  * VOL_CAP_FMT_DOCUMENT_ID: When set, the volume supports document IDs | 
| 244 |  * (an ID which persists across object ID changes) for document revisions. | 
| 245 |  * | 
| 246 |  * VOL_CAP_FMT_WRITE_GENERATION_COUNT: When set, the volume supports write | 
| 247 |  * generation counts (a count of how many times an object has been modified) | 
| 248 |  * | 
| 249 |  * VOL_CAP_FMT_NO_IMMUTABLE_FILES: When set, the volume does not support | 
| 250 |  * setting the UF_IMMUTABLE flag. | 
| 251 |  * | 
| 252 |  * VOL_CAP_FMT_NO_PERMISSIONS: When set, the volume does not support setting | 
| 253 |  * permissions. | 
| 254 |  * | 
| 255 |  * VOL_CAP_FMT_SHARED_SPACE: When set, the volume supports sharing space with | 
| 256 |  * other filesystems i.e. multiple logical filesystems can exist in the same | 
| 257 |  * "partition". An implication of this is that the filesystem which sets | 
| 258 |  * this capability treats waitfor arguments to VFS_SYNC as bit flags. | 
| 259 |  * | 
| 260 |  * VOL_CAP_FMT_VOL_GROUPS: When set, this volume is part of a volume-group | 
| 261 |  * that implies multiple volumes must be mounted in order to boot and root the | 
| 262 |  * operating system. Typically, this means a read-only system volume and a | 
| 263 |  * writable data volume. | 
| 264 |  * | 
| 265 |  * VOL_CAP_FMT_SEALED: When set, this volume is cryptographically sealed. | 
| 266 |  * Any modifications to volume data or metadata will be detected and may | 
| 267 |  * render the volume unusable. | 
| 268 |  * | 
| 269 |  * VOL_CAP_FMT_CLONE_MAPPING: When set, this volume supports full clone tracking. | 
| 270 |  * See ATTR_CMNEXT_CLONE_REFCNT and ATTR_CMNEXT_CLONEID for more details. | 
| 271 |  * Other features like extended directory statistics, for fast directory sizing, | 
| 272 |  * and attribution tags may be supported as well. | 
| 273 |  * See VOL_CAP_INT_ATTRIBUTION_TAG for more details related to tagging. | 
| 274 |  */ | 
| 275 | #define VOL_CAP_FMT_PERSISTENTOBJECTIDS         0x00000001 | 
| 276 | #define VOL_CAP_FMT_SYMBOLICLINKS               0x00000002 | 
| 277 | #define VOL_CAP_FMT_HARDLINKS                   0x00000004 | 
| 278 | #define VOL_CAP_FMT_JOURNAL                     0x00000008 | 
| 279 | #define VOL_CAP_FMT_JOURNAL_ACTIVE              0x00000010 | 
| 280 | #define VOL_CAP_FMT_NO_ROOT_TIMES               0x00000020 | 
| 281 | #define VOL_CAP_FMT_SPARSE_FILES                0x00000040 | 
| 282 | #define VOL_CAP_FMT_ZERO_RUNS                   0x00000080 | 
| 283 | #define VOL_CAP_FMT_CASE_SENSITIVE              0x00000100 | 
| 284 | #define VOL_CAP_FMT_CASE_PRESERVING             0x00000200 | 
| 285 | #define VOL_CAP_FMT_FAST_STATFS                 0x00000400 | 
| 286 | #define VOL_CAP_FMT_2TB_FILESIZE                0x00000800 | 
| 287 | #define VOL_CAP_FMT_OPENDENYMODES               0x00001000 | 
| 288 | #define VOL_CAP_FMT_HIDDEN_FILES                0x00002000 | 
| 289 | #define VOL_CAP_FMT_PATH_FROM_ID                0x00004000 | 
| 290 | #define VOL_CAP_FMT_NO_VOLUME_SIZES             0x00008000 | 
| 291 | #define VOL_CAP_FMT_DECMPFS_COMPRESSION         0x00010000 | 
| 292 | #define VOL_CAP_FMT_64BIT_OBJECT_IDS            0x00020000 | 
| 293 | #define VOL_CAP_FMT_DIR_HARDLINKS               0x00040000 | 
| 294 | #define VOL_CAP_FMT_DOCUMENT_ID                 0x00080000 | 
| 295 | #define VOL_CAP_FMT_WRITE_GENERATION_COUNT      0x00100000 | 
| 296 | #define VOL_CAP_FMT_NO_IMMUTABLE_FILES          0x00200000 | 
| 297 | #define VOL_CAP_FMT_NO_PERMISSIONS              0x00400000 | 
| 298 | #define VOL_CAP_FMT_SHARED_SPACE                0x00800000 | 
| 299 | #define VOL_CAP_FMT_VOL_GROUPS                  0x01000000 | 
| 300 | #define VOL_CAP_FMT_SEALED                      0x02000000 | 
| 301 | #define VOL_CAP_FMT_CLONE_MAPPING               0x04000000 | 
| 302 |  | 
| 303 | /* | 
| 304 |  * VOL_CAP_INT_SEARCHFS: When set, the volume implements the | 
| 305 |  * searchfs() system call (the vnop_searchfs vnode operation). | 
| 306 |  * | 
| 307 |  * VOL_CAP_INT_ATTRLIST: When set, the volume implements the | 
| 308 |  * getattrlist() and setattrlist() system calls (vnop_getattrlist | 
| 309 |  * and vnop_setattrlist vnode operations) for the volume, files, | 
| 310 |  * and directories.  The volume may or may not implement the | 
| 311 |  * readdirattr() system call.  XXX Is there any minimum set | 
| 312 |  * of attributes that should be supported?  To determine the | 
| 313 |  * set of supported attributes, get the ATTR_VOL_ATTRIBUTES | 
| 314 |  * attribute of the volume. | 
| 315 |  * | 
| 316 |  * VOL_CAP_INT_NFSEXPORT: When set, the volume implements exporting | 
| 317 |  * of NFS volumes. | 
| 318 |  * | 
| 319 |  * VOL_CAP_INT_READDIRATTR: When set, the volume implements the | 
| 320 |  * readdirattr() system call (vnop_readdirattr vnode operation). | 
| 321 |  * | 
| 322 |  * VOL_CAP_INT_EXCHANGEDATA: When set, the volume implements the | 
| 323 |  * exchangedata() system call (VNOP_EXCHANGE vnode operation). | 
| 324 |  * | 
| 325 |  * VOL_CAP_INT_COPYFILE: When set, the volume implements the | 
| 326 |  * VOP_COPYFILE vnode operation.  (XXX There should be a copyfile() | 
| 327 |  * system call in <unistd.h>.) | 
| 328 |  * | 
| 329 |  * VOL_CAP_INT_ALLOCATE: When set, the volume implements the | 
| 330 |  * VNOP_ALLOCATE vnode operation, which means it implements the | 
| 331 |  * F_PREALLOCATE selector of fcntl(2). | 
| 332 |  * | 
| 333 |  * VOL_CAP_INT_VOL_RENAME: When set, the volume implements the | 
| 334 |  * ATTR_VOL_NAME attribute for both getattrlist() and setattrlist(). | 
| 335 |  * The volume can be renamed by setting ATTR_VOL_NAME with setattrlist(). | 
| 336 |  * | 
| 337 |  * VOL_CAP_INT_ADVLOCK: When set, the volume implements POSIX style | 
| 338 |  * byte range locks via vnop_advlock (accessible from fcntl(2)). | 
| 339 |  * | 
| 340 |  * VOL_CAP_INT_FLOCK: When set, the volume implements whole-file flock(2) | 
| 341 |  * style locks via vnop_advlock.  This includes the O_EXLOCK and O_SHLOCK | 
| 342 |  * flags of the open(2) call. | 
| 343 |  * | 
| 344 |  * VOL_CAP_INT_EXTENDED_SECURITY: When set, the volume implements | 
| 345 |  * extended security (ACLs). | 
| 346 |  * | 
| 347 |  * VOL_CAP_INT_USERACCESS:  When set, the volume supports the | 
| 348 |  * ATTR_CMN_USERACCESS attribute (used to get the user's access | 
| 349 |  * mode to the file). | 
| 350 |  * | 
| 351 |  * VOL_CAP_INT_MANLOCK: When set, the volume supports AFP-style | 
| 352 |  * mandatory byte range locks via an ioctl(). | 
| 353 |  * | 
| 354 |  * VOL_CAP_INT_EXTENDED_ATTR: When set, the volume implements | 
| 355 |  * native extended attribues. | 
| 356 |  * | 
| 357 |  * VOL_CAP_INT_NAMEDSTREAMS: When set, the volume supports | 
| 358 |  * native named streams. | 
| 359 |  * | 
| 360 |  * VOL_CAP_INT_CLONE: When set, the volume supports clones. | 
| 361 |  * | 
| 362 |  * VOL_CAP_INT_SNAPSHOT: When set, the volume supports snapshots. | 
| 363 |  * | 
| 364 |  * VOL_CAP_INT_RENAME_SWAP: When set, the volume supports swapping | 
| 365 |  * file system objects. | 
| 366 |  * | 
| 367 |  * VOL_CAP_INT_RENAME_EXCL: When set, the volume supports an | 
| 368 |  * exclusive rename operation. | 
| 369 |  * | 
| 370 |  * VOL_CAP_INT_RENAME_OPENFAIL: When set, the volume may fail rename | 
| 371 |  * operations on files that are open. | 
| 372 |  * | 
| 373 |  * VOL_CAP_INT_RENAME_SECLUDE: When set, the volume supports a | 
| 374 |  * seclude rename operation. | 
| 375 |  * | 
| 376 |  * VOL_CAP_INT_ATTRIBUTION_TAG: When set, the volume supports establishing | 
| 377 |  * an owner relationship between a file (excluding small files) and a process | 
| 378 |  * on the first read/write/truncate/clone operation. | 
| 379 |  */ | 
| 380 | #define VOL_CAP_INT_SEARCHFS                    0x00000001 | 
| 381 | #define VOL_CAP_INT_ATTRLIST                    0x00000002 | 
| 382 | #define VOL_CAP_INT_NFSEXPORT                   0x00000004 | 
| 383 | #define VOL_CAP_INT_READDIRATTR                 0x00000008 | 
| 384 | #define VOL_CAP_INT_EXCHANGEDATA                0x00000010 | 
| 385 | #define VOL_CAP_INT_COPYFILE                    0x00000020 | 
| 386 | #define VOL_CAP_INT_ALLOCATE                    0x00000040 | 
| 387 | #define VOL_CAP_INT_VOL_RENAME                  0x00000080 | 
| 388 | #define VOL_CAP_INT_ADVLOCK                     0x00000100 | 
| 389 | #define VOL_CAP_INT_FLOCK                       0x00000200 | 
| 390 | #define VOL_CAP_INT_EXTENDED_SECURITY           0x00000400 | 
| 391 | #define VOL_CAP_INT_USERACCESS                  0x00000800 | 
| 392 | #define VOL_CAP_INT_MANLOCK                     0x00001000 | 
| 393 | #define VOL_CAP_INT_NAMEDSTREAMS                0x00002000 | 
| 394 | #define VOL_CAP_INT_EXTENDED_ATTR               0x00004000 | 
| 395 | #ifdef PRIVATE | 
| 396 | /* Volume supports kqueue notifications for remote events */ | 
| 397 | #define VOL_CAP_INT_REMOTE_EVENT                0x00008000 | 
| 398 | #endif /* PRIVATE */ | 
| 399 | #define VOL_CAP_INT_CLONE                       0x00010000 | 
| 400 | #define VOL_CAP_INT_SNAPSHOT                    0x00020000 | 
| 401 | #define VOL_CAP_INT_RENAME_SWAP                 0x00040000 | 
| 402 | #define VOL_CAP_INT_RENAME_EXCL                 0x00080000 | 
| 403 | #define VOL_CAP_INT_RENAME_OPENFAIL             0x00100000 | 
| 404 | #define VOL_CAP_INT_RENAME_SECLUDE              0x00200000 | 
| 405 | #define VOL_CAP_INT_ATTRIBUTION_TAG             0x00400000 | 
| 406 |  | 
| 407 | typedef struct vol_attributes_attr { | 
| 408 | 	attribute_set_t validattr; | 
| 409 | 	attribute_set_t nativeattr; | 
| 410 | } vol_attributes_attr_t; | 
| 411 |  | 
| 412 | #define ATTR_CMN_NAME                           0x00000001 | 
| 413 | #define ATTR_CMN_DEVID                          0x00000002 | 
| 414 | #define ATTR_CMN_FSID                           0x00000004 | 
| 415 | #define ATTR_CMN_OBJTYPE                        0x00000008 | 
| 416 | #define ATTR_CMN_OBJTAG                         0x00000010 | 
| 417 | #define ATTR_CMN_OBJID                          0x00000020 | 
| 418 | #define ATTR_CMN_OBJPERMANENTID                 0x00000040 | 
| 419 | #define ATTR_CMN_PAROBJID                       0x00000080 | 
| 420 | #define ATTR_CMN_SCRIPT                         0x00000100 | 
| 421 | #define ATTR_CMN_CRTIME                         0x00000200 | 
| 422 | #define ATTR_CMN_MODTIME                        0x00000400 | 
| 423 | #define ATTR_CMN_CHGTIME                        0x00000800 | 
| 424 | #define ATTR_CMN_ACCTIME                        0x00001000 | 
| 425 | #define ATTR_CMN_BKUPTIME                       0x00002000 | 
| 426 | #define ATTR_CMN_FNDRINFO                       0x00004000 | 
| 427 | #define ATTR_CMN_OWNERID                        0x00008000 | 
| 428 | #define ATTR_CMN_GRPID                          0x00010000 | 
| 429 | #define ATTR_CMN_ACCESSMASK                     0x00020000 | 
| 430 | #define ATTR_CMN_FLAGS                          0x00040000 | 
| 431 |  | 
| 432 | /* The following were defined as:				*/ | 
| 433 | /*      #define ATTR_CMN_NAMEDATTRCOUNT		0x00080000	*/ | 
| 434 | /*      #define ATTR_CMN_NAMEDATTRLIST		0x00100000	*/ | 
| 435 | /* These bits have been salvaged for use as:			*/ | 
| 436 | /*	#define ATTR_CMN_GEN_COUNT		0x00080000	*/ | 
| 437 | /*	#define ATTR_CMN_DOCUMENT_ID		0x00100000	*/ | 
| 438 | /* They can only be used with the  FSOPT_ATTR_CMN_EXTENDED	*/ | 
| 439 | /* option flag.                                                 */ | 
| 440 |  | 
| 441 | #define ATTR_CMN_GEN_COUNT                      0x00080000 | 
| 442 | #define ATTR_CMN_DOCUMENT_ID                    0x00100000 | 
| 443 |  | 
| 444 | #define ATTR_CMN_USERACCESS                     0x00200000 | 
| 445 | #define ATTR_CMN_EXTENDED_SECURITY              0x00400000 | 
| 446 | #define ATTR_CMN_UUID                           0x00800000 | 
| 447 | #define ATTR_CMN_GRPUUID                        0x01000000 | 
| 448 | #define ATTR_CMN_FILEID                         0x02000000 | 
| 449 | #define ATTR_CMN_PARENTID                       0x04000000 | 
| 450 | #define ATTR_CMN_FULLPATH                       0x08000000 | 
| 451 | #define ATTR_CMN_ADDEDTIME                      0x10000000 | 
| 452 | #define ATTR_CMN_ERROR                          0x20000000 | 
| 453 | #define ATTR_CMN_DATA_PROTECT_FLAGS             0x40000000 | 
| 454 |  | 
| 455 | /* | 
| 456 |  * ATTR_CMN_RETURNED_ATTRS is only valid with getattrlist(2) and | 
| 457 |  * getattrlistbulk(2). It is always the first attribute in the return buffer. | 
| 458 |  */ | 
| 459 | #define ATTR_CMN_RETURNED_ATTRS                 0x80000000 | 
| 460 |  | 
| 461 | #define ATTR_CMN_VALIDMASK                      0xFFFFFFFF | 
| 462 | /* | 
| 463 |  * The settable ATTR_CMN_* attributes include the following: | 
| 464 |  * ATTR_CMN_SCRIPT | 
| 465 |  * ATTR_CMN_CRTIME | 
| 466 |  * ATTR_CMN_MODTIME | 
| 467 |  * ATTR_CMN_CHGTIME | 
| 468 |  * | 
| 469 |  * ATTR_CMN_ACCTIME | 
| 470 |  * ATTR_CMN_BKUPTIME | 
| 471 |  * ATTR_CMN_FNDRINFO | 
| 472 |  * ATTR_CMN_OWNERID | 
| 473 |  * | 
| 474 |  * ATTR_CMN_GRPID | 
| 475 |  * ATTR_CMN_ACCESSMASK | 
| 476 |  * ATTR_CMN_FLAGS | 
| 477 |  * | 
| 478 |  * ATTR_CMN_EXTENDED_SECURITY | 
| 479 |  * ATTR_CMN_UUID | 
| 480 |  * | 
| 481 |  * ATTR_CMN_GRPUUID | 
| 482 |  * | 
| 483 |  * ATTR_CMN_DATA_PROTECT_FLAGS | 
| 484 |  */ | 
| 485 | #define ATTR_CMN_SETMASK                        0x51C7FF00 | 
| 486 | #define ATTR_CMN_VOLSETMASK                     0x00006700 | 
| 487 |  | 
| 488 | #define ATTR_VOL_FSTYPE                         0x00000001 | 
| 489 | #define ATTR_VOL_SIGNATURE                      0x00000002 | 
| 490 | #define ATTR_VOL_SIZE                           0x00000004 | 
| 491 | #define ATTR_VOL_SPACEFREE                      0x00000008 | 
| 492 | #define ATTR_VOL_SPACEAVAIL                     0x00000010 | 
| 493 | #define ATTR_VOL_MINALLOCATION                  0x00000020 | 
| 494 | #define ATTR_VOL_ALLOCATIONCLUMP                0x00000040 | 
| 495 | #define ATTR_VOL_IOBLOCKSIZE                    0x00000080 | 
| 496 | #define ATTR_VOL_OBJCOUNT                       0x00000100 | 
| 497 | #define ATTR_VOL_FILECOUNT                      0x00000200 | 
| 498 | #define ATTR_VOL_DIRCOUNT                       0x00000400 | 
| 499 | #define ATTR_VOL_MAXOBJCOUNT                    0x00000800 | 
| 500 | #define ATTR_VOL_MOUNTPOINT                     0x00001000 | 
| 501 | #define ATTR_VOL_NAME                           0x00002000 | 
| 502 | #define ATTR_VOL_MOUNTFLAGS                     0x00004000 | 
| 503 | #define ATTR_VOL_MOUNTEDDEVICE                  0x00008000 | 
| 504 | #define ATTR_VOL_ENCODINGSUSED                  0x00010000 | 
| 505 | #define ATTR_VOL_CAPABILITIES                   0x00020000 | 
| 506 | #define ATTR_VOL_UUID                           0x00040000 | 
| 507 | #define ATTR_VOL_FSTYPENAME                     0x00100000 | 
| 508 | #define ATTR_VOL_FSSUBTYPE                      0x00200000 | 
| 509 | #define ATTR_VOL_SPACEUSED                      0x00800000 | 
| 510 | #define ATTR_VOL_QUOTA_SIZE                     0x10000000 | 
| 511 | #define ATTR_VOL_RESERVED_SIZE                  0x20000000 | 
| 512 | #define ATTR_VOL_ATTRIBUTES                     0x40000000 | 
| 513 | #define ATTR_VOL_INFO                           0x80000000 | 
| 514 |  | 
| 515 | #define ATTR_VOL_VALIDMASK                      0xF0B7FFFF | 
| 516 |  | 
| 517 | /* | 
| 518 |  * The list of settable ATTR_VOL_* attributes include the following: | 
| 519 |  * ATTR_VOL_NAME | 
| 520 |  * ATTR_VOL_INFO | 
| 521 |  */ | 
| 522 | #define ATTR_VOL_SETMASK                        0x80002000 | 
| 523 |  | 
| 524 |  | 
| 525 | /* File/directory attributes: */ | 
| 526 | #define ATTR_DIR_LINKCOUNT                      0x00000001 | 
| 527 | #define ATTR_DIR_ENTRYCOUNT                     0x00000002 | 
| 528 | #define ATTR_DIR_MOUNTSTATUS                    0x00000004 | 
| 529 | #define ATTR_DIR_ALLOCSIZE                      0x00000008 | 
| 530 | #define ATTR_DIR_IOBLOCKSIZE                    0x00000010 | 
| 531 | #define ATTR_DIR_DATALENGTH                     0x00000020 | 
| 532 |  | 
| 533 | /* ATTR_DIR_MOUNTSTATUS Flags: */ | 
| 534 | #define   DIR_MNTSTATUS_MNTPOINT                0x00000001 | 
| 535 | #define   DIR_MNTSTATUS_TRIGGER                 0x00000002 | 
| 536 |  | 
| 537 | #define ATTR_DIR_VALIDMASK                      0x0000003f | 
| 538 | #define ATTR_DIR_SETMASK                        0x00000000 | 
| 539 |  | 
| 540 | #define ATTR_FILE_LINKCOUNT                     0x00000001 | 
| 541 | #define ATTR_FILE_TOTALSIZE                     0x00000002 | 
| 542 | #define ATTR_FILE_ALLOCSIZE                     0x00000004 | 
| 543 | #define ATTR_FILE_IOBLOCKSIZE                   0x00000008 | 
| 544 | #define ATTR_FILE_DEVTYPE                       0x00000020 | 
| 545 | #define ATTR_FILE_FORKCOUNT                     0x00000080 | 
| 546 | #define ATTR_FILE_FORKLIST                      0x00000100 | 
| 547 | #define ATTR_FILE_DATALENGTH                    0x00000200 | 
| 548 | #define ATTR_FILE_DATAALLOCSIZE                 0x00000400 | 
| 549 | #define ATTR_FILE_RSRCLENGTH                    0x00001000 | 
| 550 | #define ATTR_FILE_RSRCALLOCSIZE                 0x00002000 | 
| 551 |  | 
| 552 | #define ATTR_FILE_VALIDMASK                     0x000037FF | 
| 553 | /* | 
| 554 |  * Settable ATTR_FILE_* attributes include: | 
| 555 |  * ATTR_FILE_DEVTYPE | 
| 556 |  */ | 
| 557 | #define ATTR_FILE_SETMASK                       0x00000020 | 
| 558 |  | 
| 559 | /* CMNEXT attributes extend the common attributes, but in the forkattr field */ | 
| 560 | #define ATTR_CMNEXT_RELPATH     0x00000004 | 
| 561 | #define ATTR_CMNEXT_PRIVATESIZE 0x00000008 | 
| 562 | #define ATTR_CMNEXT_LINKID      0x00000010 | 
| 563 | #define ATTR_CMNEXT_NOFIRMLINKPATH     0x00000020 | 
| 564 | #define ATTR_CMNEXT_REALDEVID   0x00000040 | 
| 565 | #define ATTR_CMNEXT_REALFSID    0x00000080 | 
| 566 | #define ATTR_CMNEXT_CLONEID     0x00000100 | 
| 567 | #define ATTR_CMNEXT_EXT_FLAGS   0x00000200 | 
| 568 | #define ATTR_CMNEXT_RECURSIVE_GENCOUNT 0x00000400 | 
| 569 | #define ATTR_CMNEXT_ATTRIBUTION_TAG    0x00000800 | 
| 570 | #define ATTR_CMNEXT_CLONE_REFCNT       0x00001000 | 
| 571 |  | 
| 572 | #define ATTR_CMNEXT_VALIDMASK   0x00001ffc | 
| 573 | #define ATTR_CMNEXT_SETMASK             0x00000000 | 
| 574 |  | 
| 575 | /* Deprecated fork attributes */ | 
| 576 | #define ATTR_FORK_TOTALSIZE                     0x00000001 | 
| 577 | #define ATTR_FORK_ALLOCSIZE                     0x00000002 | 
| 578 | #define ATTR_FORK_RESERVED                      0xffffffff | 
| 579 |  | 
| 580 | #define ATTR_FORK_VALIDMASK                     0x00000003 | 
| 581 | #define ATTR_FORK_SETMASK                       0x00000000 | 
| 582 |  | 
| 583 | /* Obsolete, implemented, not supported */ | 
| 584 | #define ATTR_CMN_NAMEDATTRCOUNT                 0x00080000 | 
| 585 | #define ATTR_CMN_NAMEDATTRLIST                  0x00100000 | 
| 586 | #define ATTR_FILE_CLUMPSIZE                     0x00000010      /* obsolete */ | 
| 587 | #define ATTR_FILE_FILETYPE                      0x00000040      /* always zero */ | 
| 588 | #define ATTR_FILE_DATAEXTENTS                   0x00000800      /* obsolete, HFS-specific */ | 
| 589 | #define ATTR_FILE_RSRCEXTENTS                   0x00004000      /* obsolete, HFS-specific */ | 
| 590 |  | 
| 591 | /* Required attributes for getattrlistbulk(2) */ | 
| 592 | #define ATTR_BULK_REQUIRED (ATTR_CMN_NAME | ATTR_CMN_RETURNED_ATTRS) | 
| 593 |  | 
| 594 | /* | 
| 595 |  * Searchfs | 
| 596 |  */ | 
| 597 | #define SRCHFS_START                            0x00000001 | 
| 598 | #define SRCHFS_MATCHPARTIALNAMES                0x00000002 | 
| 599 | #define SRCHFS_MATCHDIRS                        0x00000004 | 
| 600 | #define SRCHFS_MATCHFILES                       0x00000008 | 
| 601 | #define SRCHFS_SKIPLINKS                        0x00000010 | 
| 602 | #define SRCHFS_SKIPINVISIBLE                    0x00000020 | 
| 603 | #define SRCHFS_SKIPPACKAGES                     0x00000040 | 
| 604 | #define SRCHFS_SKIPINAPPROPRIATE                0x00000080 | 
| 605 |  | 
| 606 | #define SRCHFS_NEGATEPARAMS                     0x80000000 | 
| 607 | #define SRCHFS_VALIDOPTIONSMASK                 0x800000FF | 
| 608 |  | 
| 609 | struct fssearchblock { | 
| 610 | 	struct attrlist         *returnattrs; | 
| 611 | 	void                            *returnbuffer; | 
| 612 | 	size_t                          returnbuffersize; | 
| 613 | 	u_long                          maxmatches; | 
| 614 | 	struct timeval          timelimit; | 
| 615 | 	void                            *searchparams1; | 
| 616 | 	size_t                          sizeofsearchparams1; | 
| 617 | 	void                            *searchparams2; | 
| 618 | 	size_t                          sizeofsearchparams2; | 
| 619 | 	struct attrlist         searchattrs; | 
| 620 | }; | 
| 621 |  | 
| 622 | #ifdef KERNEL | 
| 623 | /* LP64 version of fssearchblock.  all pointers and longs | 
| 624 |  * grow when we're dealing with a 64-bit process. | 
| 625 |  * WARNING - keep in sync with fssearchblock | 
| 626 |  */ | 
| 627 |  | 
| 628 | struct user64_fssearchblock { | 
| 629 | 	user64_addr_t         returnattrs; | 
| 630 | 	user64_addr_t         returnbuffer; | 
| 631 | 	user64_size_t         returnbuffersize; | 
| 632 | 	user64_ulong_t        maxmatches; | 
| 633 | 	struct user64_timeval   timelimit; | 
| 634 | 	user64_addr_t         searchparams1; | 
| 635 | 	user64_size_t         sizeofsearchparams1; | 
| 636 | 	user64_addr_t         searchparams2; | 
| 637 | 	user64_size_t         sizeofsearchparams2; | 
| 638 | 	struct attrlist         searchattrs; | 
| 639 | }; | 
| 640 |  | 
| 641 | struct user32_fssearchblock { | 
| 642 | 	user32_addr_t         returnattrs; | 
| 643 | 	user32_addr_t         returnbuffer; | 
| 644 | 	user32_size_t         returnbuffersize; | 
| 645 | 	user32_ulong_t        maxmatches; | 
| 646 | 	struct user32_timeval   timelimit; | 
| 647 | 	user32_addr_t         searchparams1; | 
| 648 | 	user32_size_t         sizeofsearchparams1; | 
| 649 | 	user32_addr_t         searchparams2; | 
| 650 | 	user32_size_t         sizeofsearchparams2; | 
| 651 | 	struct attrlist         searchattrs; | 
| 652 | }; | 
| 653 |  | 
| 654 | #endif /* KERNEL */ | 
| 655 |  | 
| 656 | struct searchstate { | 
| 657 | 	uint32_t                        ss_union_flags;         // for SRCHFS_START | 
| 658 | 	uint32_t                        ss_union_layer;         // 0 = top | 
| 659 | 	u_char                          ss_fsstate[548];        // fs private | 
| 660 | } __attribute__((packed)); | 
| 661 |  | 
| 662 | #define FST_EOF (-1)                            /* end-of-file offset */ | 
| 663 |  | 
| 664 | #endif /* __APPLE_API_UNSTABLE */ | 
| 665 | #endif /* !_SYS_ATTR_H_ */ | 
| 666 |  |