| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- //===----------------------------------------------------------------------===//
- //
- // This source file is part of the Swift System open source project
- //
- // Copyright (c) 2025 - 2026 Apple Inc. and the Swift System project authors
- // Licensed under Apache License v2.0 with Runtime Library Exception
- //
- // See https://swift.org/LICENSE.txt for license information
- //
- //===----------------------------------------------------------------------===//
- // |------------------------|
- // | Swift API to C Mapping |
- // |------------------------------------------------------------------|
- // | FileFlags | Darwin | FreeBSD | OpenBSD |
- // |------------------|---------------|---------------|---------------|
- // | noDump | UF_NODUMP | UF_NODUMP | UF_NODUMP |
- // | userImmutable | UF_IMMUTABLE | UF_IMMUTABLE | UF_IMMUTABLE |
- // | userAppend | UF_APPEND | UF_APPEND | UF_APPEND |
- // | archived | SF_ARCHIVED | SF_ARCHIVED | SF_ARCHIVED |
- // | systemImmutable | SF_IMMUTABLE | SF_IMMUTABLE | SF_IMMUTABLE |
- // | systemAppend | SF_APPEND | SF_APPEND | SF_APPEND |
- // | opaque | UF_OPAQUE | UF_OPAQUE | N/A |
- // | hidden | UF_HIDDEN | UF_HIDDEN | N/A |
- // | systemNoUnlink | SF_NOUNLINK | SF_NOUNLINK | N/A |
- // | compressed | UF_COMPRESSED | N/A | N/A |
- // | tracked | UF_TRACKED | N/A | N/A |
- // | dataVault | UF_DATAVAULT | N/A | N/A |
- // | restricted | SF_RESTRICTED | N/A | N/A |
- // | firmlink | SF_FIRMLINK | N/A | N/A |
- // | dataless | SF_DATALESS | N/A | N/A |
- // | userNoUnlink | N/A | UF_NOUNLINK | N/A |
- // | offline | N/A | UF_OFFLINE | N/A |
- // | readOnly | N/A | UF_READONLY | N/A |
- // | reparse | N/A | UF_REPARSE | N/A |
- // | sparse | N/A | UF_SPARSE | N/A |
- // | system | N/A | UF_SYSTEM | N/A |
- // | snapshot | N/A | SF_SNAPSHOT | N/A |
- // |------------------|---------------|---------------|---------------|
- #if SYSTEM_PACKAGE_DARWIN || os(FreeBSD) || os(OpenBSD)
- /// File-specific flags found in the `st_flags` property of a `stat` struct
- /// or used as input to `chflags()`.
- ///
- /// - Note: Only available on Darwin, FreeBSD, and OpenBSD.
- @frozen
- @available(System 1.7.0, *)
- public struct FileFlags: OptionSet, Sendable, Hashable, Codable {
-
- /// The raw C flags.
- @_alwaysEmitIntoClient
- public let rawValue: CInterop.FileFlags
- /// Creates a strongly-typed `FileFlags` from the raw C value.
- @_alwaysEmitIntoClient
- public init(rawValue: CInterop.FileFlags) { self.rawValue = rawValue }
- // MARK: Flags Available on Darwin, FreeBSD, and OpenBSD
- /// Do not dump the file during backups.
- ///
- /// The corresponding C constant is `UF_NODUMP`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var noDump: FileFlags { FileFlags(rawValue: _UF_NODUMP) }
- /// File may not be changed.
- ///
- /// The corresponding C constant is `UF_IMMUTABLE`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var userImmutable: FileFlags { FileFlags(rawValue: _UF_IMMUTABLE) }
- /// Writes to the file may only append.
- ///
- /// The corresponding C constant is `UF_APPEND`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var userAppend: FileFlags { FileFlags(rawValue: _UF_APPEND) }
- /// File has been archived.
- ///
- /// The corresponding C constant is `SF_ARCHIVED`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var archived: FileFlags { FileFlags(rawValue: _SF_ARCHIVED) }
- /// File may not be changed.
- ///
- /// The corresponding C constant is `SF_IMMUTABLE`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var systemImmutable: FileFlags { FileFlags(rawValue: _SF_IMMUTABLE) }
- /// Writes to the file may only append.
- ///
- /// The corresponding C constant is `SF_APPEND`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var systemAppend: FileFlags { FileFlags(rawValue: _SF_APPEND) }
- // MARK: Flags Available on Darwin and FreeBSD
- #if SYSTEM_PACKAGE_DARWIN || os(FreeBSD)
- /// Directory is opaque when viewed through a union mount.
- ///
- /// The corresponding C constant is `UF_OPAQUE`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var opaque: FileFlags { FileFlags(rawValue: _UF_OPAQUE) }
- /// File should not be displayed in a GUI.
- ///
- /// The corresponding C constant is `UF_HIDDEN`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var hidden: FileFlags { FileFlags(rawValue: _UF_HIDDEN) }
- /// File may not be removed or renamed.
- ///
- /// The corresponding C constant is `SF_NOUNLINK`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var systemNoUnlink: FileFlags { FileFlags(rawValue: _SF_NOUNLINK) }
- #endif
- // MARK: Flags Available on Darwin only
- #if SYSTEM_PACKAGE_DARWIN
- /// File is compressed at the file system level.
- ///
- /// The corresponding C constant is `UF_COMPRESSED`.
- /// - Note: This flag is read-only. Attempting to change it will result in undefined behavior.
- @_alwaysEmitIntoClient
- public static var compressed: FileFlags { FileFlags(rawValue: _UF_COMPRESSED) }
- /// File is tracked for the purpose of document IDs.
- ///
- /// The corresponding C constant is `UF_TRACKED`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var tracked: FileFlags { FileFlags(rawValue: _UF_TRACKED) }
- /// File requires an entitlement for reading and writing.
- ///
- /// The corresponding C constant is `UF_DATAVAULT`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var dataVault: FileFlags { FileFlags(rawValue: _UF_DATAVAULT) }
- /// File requires an entitlement for writing.
- ///
- /// The corresponding C constant is `SF_RESTRICTED`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var restricted: FileFlags { FileFlags(rawValue: _SF_RESTRICTED) }
- /// File is a firmlink.
- ///
- /// Firmlinks are used by macOS to create transparent links between
- /// the read-only system volume and writable data volume. For example,
- /// the `/Applications` folder on the system volume is a firmlink to
- /// the `/Applications` folder on the data volume, allowing the user
- /// to see both system- and user-installed applications in a single folder.
- ///
- /// The corresponding C constant is `SF_FIRMLINK`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var firmlink: FileFlags { FileFlags(rawValue: _SF_FIRMLINK) }
- /// File is a dataless placeholder (content is stored remotely).
- ///
- /// The system will attempt to materialize the file when accessed according to
- /// the dataless file materialization policy of the accessing thread or process.
- /// See `getiopolicy_np(3)`.
- ///
- /// The corresponding C constant is `SF_DATALESS`.
- /// - Note: This flag is read-only. Attempting to change it will result in undefined behavior.
- @_alwaysEmitIntoClient
- public static var dataless: FileFlags { FileFlags(rawValue: _SF_DATALESS) }
- #endif
- // MARK: Flags Available on FreeBSD Only
- #if os(FreeBSD)
- /// File may not be removed or renamed.
- ///
- /// The corresponding C constant is `UF_NOUNLINK`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var userNoUnlink: FileFlags { FileFlags(rawValue: _UF_NOUNLINK) }
- /// File has the Windows offline attribute.
- ///
- /// File systems may use this flag for compatibility with the Windows `FILE_ATTRIBUTE_OFFLINE` attribute,
- /// but otherwise provide no special handling when it's set.
- ///
- /// The corresponding C constant is `UF_OFFLINE`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var offline: FileFlags { FileFlags(rawValue: _UF_OFFLINE) }
- /// File is read-only.
- ///
- /// File systems may use this flag for compatibility with the Windows `FILE_ATTRIBUTE_READONLY` attribute.
- ///
- /// The corresponding C constant is `UF_READONLY`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var readOnly: FileFlags { FileFlags(rawValue: _UF_READONLY) }
- /// File contains a Windows reparse point.
- ///
- /// File systems may use this flag for compatibility with the Windows `FILE_ATTRIBUTE_REPARSE_POINT` attribute.
- ///
- /// The corresponding C constant is `UF_REPARSE`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var reparse: FileFlags { FileFlags(rawValue: _UF_REPARSE) }
- /// File is sparse.
- ///
- /// File systems may use this flag for compatibility with the Windows `FILE_ATTRIBUTE_SPARSE_FILE` attribute,
- /// or to indicate a sparse file.
- ///
- /// The corresponding C constant is `UF_SPARSE`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var sparse: FileFlags { FileFlags(rawValue: _UF_SPARSE) }
- /// File has the Windows system attribute.
- ///
- /// File systems may use this flag for compatibility with the Windows `FILE_ATTRIBUTE_SYSTEM` attribute,
- /// but otherwise provide no special handling when it's set.
- ///
- /// The corresponding C constant is `UF_SYSTEM`.
- /// - Note: This flag may be changed by the file owner or superuser.
- @_alwaysEmitIntoClient
- public static var system: FileFlags { FileFlags(rawValue: _UF_SYSTEM) }
- /// File is a snapshot.
- ///
- /// The corresponding C constant is `SF_SNAPSHOT`.
- /// - Note: This flag may only be changed by the superuser.
- @_alwaysEmitIntoClient
- public static var snapshot: FileFlags { FileFlags(rawValue: _SF_SNAPSHOT) }
- #endif
- }
- #endif
|