RadrootsFileMaintenanceEntry.swift (2071B)
1 import Darwin 2 import Foundation 3 4 /// Opaque captured identity. A candidate is valid only for its originating scan; 5 /// neither its name nor its age is independent authority to remove a file. 6 public struct RadrootsFileMaintenanceEntry: Sendable { 7 public enum Kind: Sendable { case regularFile, directory, other } 8 9 public let name: String 10 public let kind: Kind 11 public let sizeBytes: Int64 12 public let modifiedAt: Date 13 let scanID: UUID 14 let identity: RadrootsFileMaintenanceIdentity 15 16 init(name: String, value: stat, scanID: UUID) { 17 self.name = name 18 kind = switch value.st_mode & S_IFMT { 19 case S_IFREG: .regularFile 20 case S_IFDIR: .directory 21 default: .other 22 } 23 sizeBytes = value.st_size 24 modifiedAt = Date(timeIntervalSince1970: 25 Double(value.st_mtimespec.tv_sec) + Double(value.st_mtimespec.tv_nsec) / 1_000_000_000) 26 self.scanID = scanID 27 identity = RadrootsFileMaintenanceIdentity(value) 28 } 29 } 30 31 public struct RadrootsFileMaintenancePage: Sendable { 32 public let entries: [RadrootsFileMaintenanceEntry] 33 /// Includes ignored dot entries, disappeared entries and the coordination file. 34 public let scannedEntries: Int 35 /// End of this live stream, not a snapshot or a global absence assertion. 36 public let reachedEnd: Bool 37 } 38 39 struct RadrootsFileMaintenanceIdentity: Sendable, Equatable { 40 let device: dev_t 41 let inode: ino_t 42 let mode: mode_t 43 let links: nlink_t 44 let owner: uid_t 45 let size: off_t 46 let modifiedSeconds: Int 47 let modifiedNanos: Int 48 let changedSeconds: Int 49 let changedNanos: Int 50 51 init(_ value: stat) { 52 device = value.st_dev 53 inode = value.st_ino 54 mode = value.st_mode 55 links = value.st_nlink 56 owner = value.st_uid 57 size = value.st_size 58 modifiedSeconds = value.st_mtimespec.tv_sec 59 modifiedNanos = value.st_mtimespec.tv_nsec 60 changedSeconds = value.st_ctimespec.tv_sec 61 changedNanos = value.st_ctimespec.tv_nsec 62 } 63 }