diff --git a/Sources/System/Errno.swift b/Sources/System/Errno.swift index 43b46af5..7d22a540 100644 --- a/Sources/System/Errno.swift +++ b/Sources/System/Errno.swift @@ -11,7 +11,7 @@ /// occurred. @frozen @available(System 0.0.1, *) -public struct Errno: RawRepresentable, Error, Hashable, Codable { +public struct Errno: RawRepresentable, Error, Hashable { /// The raw C error number. @_alwaysEmitIntoClient public let rawValue: CInt @@ -1562,6 +1562,8 @@ extension Errno: CustomStringConvertible, CustomDebugStringConvertible { public var debugDescription: String { self.description } } +#if !$Embedded + @available(System 0.0.1, *) extension Errno { @_alwaysEmitIntoClient @@ -1571,3 +1573,13 @@ extension Errno { } } +@available(System 0.0.1, *) +extension Errno: Codable {} + +public typealias SystemError = any Error + +#else + +public typealias SystemError = Errno + +#endif // !$Embedded diff --git a/Sources/System/FileDescriptor.swift b/Sources/System/FileDescriptor.swift index d5f5883b..31bfdaef 100644 --- a/Sources/System/FileDescriptor.swift +++ b/Sources/System/FileDescriptor.swift @@ -15,7 +15,7 @@ /// in the same way as you manage a raw C file handle. @frozen @available(System 0.0.1, *) -public struct FileDescriptor: RawRepresentable, Hashable, Codable { +public struct FileDescriptor: RawRepresentable, Hashable { /// The raw C file handle. @_alwaysEmitIntoClient public let rawValue: CInt @@ -46,7 +46,7 @@ extension FileDescriptor { /// The desired read and write access for a newly opened file. @frozen @available(System 0.0.1, *) - public struct AccessMode: RawRepresentable, Sendable, Hashable, Codable { + public struct AccessMode: RawRepresentable, Sendable, Hashable { /// The raw C access mode. @_alwaysEmitIntoClient public var rawValue: CInt @@ -89,7 +89,7 @@ extension FileDescriptor { /// Options that specify behavior for a newly-opened file. @frozen @available(System 0.0.1, *) - public struct OpenOptions: OptionSet, Sendable, Hashable, Codable { + public struct OpenOptions: OptionSet, Sendable, Hashable { /// The raw C options. @_alwaysEmitIntoClient public var rawValue: CInt @@ -327,7 +327,7 @@ extension FileDescriptor { /// Options for specifying what a file descriptor's offset is relative to. @frozen @available(System 0.0.1, *) - public struct SeekOrigin: RawRepresentable, Sendable, Hashable, Codable { + public struct SeekOrigin: RawRepresentable, Sendable, Hashable { /// The raw C value. @_alwaysEmitIntoClient public var rawValue: CInt @@ -402,6 +402,22 @@ extension FileDescriptor { } } +#if !$Embedded + +@available(System 0.0.1, *) +extension FileDescriptor: Codable {} + +@available(System 0.0.1, *) +extension FileDescriptor.AccessMode: Codable {} + +@available(System 0.0.1, *) +extension FileDescriptor.OpenOptions: Codable {} + +@available(System 0.0.1, *) +extension FileDescriptor.SeekOrigin: Codable {} + +#endif // !$Embedded + @available(System 0.0.1, *) extension FileDescriptor.AccessMode : CustomStringConvertible, CustomDebugStringConvertible diff --git a/Sources/System/FileOperations.swift b/Sources/System/FileOperations.swift index 9ddc16c3..d6383e1c 100644 --- a/Sources/System/FileOperations.swift +++ b/Sources/System/FileOperations.swift @@ -30,24 +30,24 @@ extension FileDescriptor { options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(), permissions: FilePermissions? = nil, retryOnInterrupt: Bool = true - ) throws -> FileDescriptor { + ) throws(SystemError) -> FileDescriptor { #if !os(Windows) - return try path.withCString { + return try path.withCString { (cString) throws(SystemError) in try FileDescriptor.open( - $0, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt) + cString, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt) } - #else - return try path.withPlatformString { + #else + return try path.withPlatformString { (platformString) throws(SystemError) in try FileDescriptor.open( - $0, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt) + platformString, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt) } #endif } - #if !os(Windows) - // On Darwin, `CInterop.PlatformChar` is less available than + #if !os(Windows) + // On Darwin, `CInterop.PlatformChar` is less available than // `FileDescriptor.open`, so we need to use `CChar` instead. - + /// Opens or creates a file for reading or writing. /// /// - Parameters: @@ -69,7 +69,7 @@ extension FileDescriptor { options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(), permissions: FilePermissions? = nil, retryOnInterrupt: Bool = true - ) throws -> FileDescriptor { + ) throws(SystemError) -> FileDescriptor { try FileDescriptor._open( path, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt ).get() @@ -116,7 +116,7 @@ extension FileDescriptor { options: FileDescriptor.OpenOptions = FileDescriptor.OpenOptions(), permissions: FilePermissions? = nil, retryOnInterrupt: Bool = true - ) throws -> FileDescriptor { + ) throws(SystemError) -> FileDescriptor { try FileDescriptor._open( path, mode, options: options, permissions: permissions, retryOnInterrupt: retryOnInterrupt ).get() @@ -149,7 +149,7 @@ extension FileDescriptor { /// /// The corresponding C function is `close`. @_alwaysEmitIntoClient - public func close() throws { try _close().get() } + public func close() throws(SystemError) { try _close().get() } @usableFromInline internal func _close() -> Result<(), Errno> { @@ -169,7 +169,7 @@ extension FileDescriptor { @discardableResult public func seek( offset: Int64, from whence: FileDescriptor.SeekOrigin - ) throws -> Int64 { + ) throws(SystemError) -> Int64 { try _seek(offset: offset, from: whence).get() } @@ -187,7 +187,7 @@ extension FileDescriptor { @available(*, unavailable, renamed: "seek") public func lseek( offset: Int64, from whence: FileDescriptor.SeekOrigin - ) throws -> Int64 { + ) throws(SystemError) -> Int64 { try seek(offset: offset, from: whence) } @@ -214,7 +214,7 @@ extension FileDescriptor { public func read( into buffer: UnsafeMutableRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try _read(into: buffer, retryOnInterrupt: retryOnInterrupt).get() } @@ -222,7 +222,7 @@ extension FileDescriptor { internal func _read( into buffer: UnsafeMutableRawBufferPointer, retryOnInterrupt: Bool - ) throws -> Result { + ) throws(SystemError) -> Result { valueOrErrno(retryOnInterrupt: retryOnInterrupt) { system_read(self.rawValue, buffer.baseAddress, buffer.count) } @@ -251,7 +251,7 @@ extension FileDescriptor { fromAbsoluteOffset offset: Int64, into buffer: UnsafeMutableRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try _read( fromAbsoluteOffset: offset, into: buffer, @@ -276,7 +276,7 @@ extension FileDescriptor { fromAbsoluteOffset offset: Int64, into buffer: UnsafeMutableRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try read( fromAbsoluteOffset: offset, into: buffer, @@ -303,7 +303,7 @@ extension FileDescriptor { public func write( _ buffer: UnsafeRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try _write(buffer, retryOnInterrupt: retryOnInterrupt).get() } @@ -337,7 +337,7 @@ extension FileDescriptor { toAbsoluteOffset offset: Int64, _ buffer: UnsafeRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try _write(toAbsoluteOffset: offset, buffer, retryOnInterrupt: retryOnInterrupt).get() } @@ -359,7 +359,7 @@ extension FileDescriptor { toAbsoluteOffset offset: Int64, into buffer: UnsafeRawBufferPointer, retryOnInterrupt: Bool = true - ) throws -> Int { + ) throws(SystemError) -> Int { try write( toAbsoluteOffset: offset, buffer, @@ -402,7 +402,7 @@ extension FileDescriptor { public func duplicate( as target: FileDescriptor? = nil, retryOnInterrupt: Bool = true - ) throws -> FileDescriptor { + ) throws(SystemError) -> FileDescriptor { try _duplicate(as: target, retryOnInterrupt: retryOnInterrupt).get() } @@ -411,7 +411,7 @@ extension FileDescriptor { internal func _duplicate( as target: FileDescriptor?, retryOnInterrupt: Bool - ) throws -> Result { + ) throws(SystemError) -> Result { valueOrErrno(retryOnInterrupt: retryOnInterrupt) { if let target = target { return system_dup2(self.rawValue, target.rawValue) @@ -422,13 +422,13 @@ extension FileDescriptor { @_alwaysEmitIntoClient @available(*, unavailable, renamed: "duplicate") - public func dup() throws -> FileDescriptor { + public func dup() throws(SystemError) -> FileDescriptor { fatalError("Not implemented") } @_alwaysEmitIntoClient @available(*, unavailable, renamed: "duplicate") - public func dup2() throws -> FileDescriptor { + public func dup2() throws(SystemError) -> FileDescriptor { fatalError("Not implemented") } } @@ -444,7 +444,7 @@ extension FileDescriptor { /// The corresponding C function is `pipe`. @_alwaysEmitIntoClient @available(System 1.1.0, *) - public static func pipe() throws -> (readEnd: FileDescriptor, writeEnd: FileDescriptor) { + public static func pipe() throws(SystemError) -> (readEnd: FileDescriptor, writeEnd: FileDescriptor) { try _pipe().get() } @@ -490,7 +490,7 @@ extension FileDescriptor { public func resize( to newSize: Int64, retryOnInterrupt: Bool = true - ) throws { + ) throws(SystemError) { try _resize( to: newSize, retryOnInterrupt: retryOnInterrupt @@ -537,7 +537,7 @@ extension FilePermissions { /// afterwards, because of the way reading the creation mask works. internal static func withCreationMask( _ permissions: FilePermissions, - body: () throws -> R + body: () throws(SystemError) -> R ) rethrows -> R { let oldMask = _umask(permissions.rawValue) defer { diff --git a/Sources/System/FilePath/FilePath.swift b/Sources/System/FilePath/FilePath.swift index b27d053a..19c244ea 100644 --- a/Sources/System/FilePath/FilePath.swift +++ b/Sources/System/FilePath/FilePath.swift @@ -68,6 +68,8 @@ extension FilePath { @available(System 0.0.1, *) extension FilePath: Hashable {} +#if !$Embedded + @available(System 0.0.1, *) extension FilePath: Codable { // Encoder is synthesized; it probably should have been explicit and used @@ -88,3 +90,5 @@ extension FilePath: Codable { } } } + +#endif // !$Embedded diff --git a/Sources/System/FilePath/FilePathComponents.swift b/Sources/System/FilePath/FilePathComponents.swift index f2352617..8913616c 100644 --- a/Sources/System/FilePath/FilePathComponents.swift +++ b/Sources/System/FilePath/FilePathComponents.swift @@ -128,6 +128,8 @@ extension SystemString { } } +#if !$Embedded + // Unifying protocol for common functionality between roots, components, // and views onto SystemString and FilePath. internal protocol _StrSlice: _PlatformStringable, Hashable, Codable { @@ -138,6 +140,20 @@ internal protocol _StrSlice: _PlatformStringable, Hashable, Codable { func _invariantCheck() } + +#else + +internal protocol _StrSlice: _PlatformStringable, Hashable { + var _storage: SystemString { get } + var _range: Range { get } + + init?(_ str: SystemString) + + func _invariantCheck() +} + +#endif // !$Embedded + extension _StrSlice { internal var _slice: Slice { Slice(base: _storage, bounds: _range) diff --git a/Sources/System/FilePath/FilePathString.swift b/Sources/System/FilePath/FilePathString.swift index 45f79c8a..d61779ca 100644 --- a/Sources/System/FilePath/FilePathString.swift +++ b/Sources/System/FilePath/FilePathString.swift @@ -64,7 +64,7 @@ extension FilePath { } #if !os(Windows) - // Note: This function should have been opaque, but it shipped as + // Note: This function should have been opaque, but it shipped as // `@_alwaysEmitIntoClient` in macOS 12/iOS 15, and now it is stuck // this way forever. (Or until the language provides a way for us // to declare separate availability for a function's exported symbol @@ -84,7 +84,7 @@ extension FilePath { /// Don't try to store the pointer for later use. @_alwaysEmitIntoClient public func withPlatformString( - _ body: (UnsafePointer) throws -> Result + _ body: (UnsafePointer) throws(SystemError) -> Result ) rethrows -> Result { return try withCString(body) } @@ -102,7 +102,7 @@ extension FilePath { /// only during the execution of this method. /// Don't try to store the pointer for later use. public func withPlatformString( - _ body: (UnsafePointer) throws -> Result + _ body: (UnsafePointer) throws(SystemError) -> Result ) rethrows -> Result { return try _withPlatformString(body) } @@ -595,8 +595,8 @@ extension FilePath { /// For backwards compatibility only. This function is equivalent to /// the preferred `withPlatformString`. public func withCString( - _ body: (UnsafePointer) throws -> Result - ) rethrows -> Result { + _ body: (UnsafePointer) throws(SystemError) -> Result + ) throws(SystemError) -> Result { return try _withPlatformString(body) } } diff --git a/Sources/System/FilePath/FilePathTemp.swift b/Sources/System/FilePath/FilePathTemp.swift index c0edf95d..32587c28 100644 --- a/Sources/System/FilePath/FilePathTemp.swift +++ b/Sources/System/FilePath/FilePathTemp.swift @@ -20,8 +20,8 @@ /// deletes the directory and all of its contents before returning. internal func withTemporaryFilePath( basename: FilePath.Component, - _ body: (FilePath) throws -> R -) throws -> R { + _ body: (FilePath) throws(SystemError) -> R +) throws(SystemError) -> R { let temporaryDir = try createUniqueTemporaryDirectory(basename: basename) defer { try? _recursiveRemove(at: temporaryDir) @@ -44,9 +44,9 @@ fileprivate let base64 = Array( /// /// This function will throw if there is an error, except if the error /// is that the directory exists, in which case it returns `false`. -fileprivate func makeLockedDownDirectory(at path: FilePath) throws -> Bool { - return try path.withPlatformString { - if system_mkdir($0, 0o700) == 0 { +fileprivate func makeLockedDownDirectory(at path: FilePath) throws(SystemError) -> Bool { + return try path.withPlatformString { (platformString) throws(SystemError) in + if system_mkdir(platformString, 0o700) == 0 { return true } let err = system_errno @@ -83,7 +83,7 @@ fileprivate func createRandomString(length: Int) -> String { /// string of characters. fileprivate func createUniqueTemporaryDirectory( basename: FilePath.Component -) throws -> FilePath { +) throws(SystemError) -> FilePath { var tempDir = try _getTemporaryDirectory() tempDir.append(basename) diff --git a/Sources/System/FilePath/FilePathTempPosix.swift b/Sources/System/FilePath/FilePathTempPosix.swift index e8713c2b..d779850f 100644 --- a/Sources/System/FilePath/FilePathTempPosix.swift +++ b/Sources/System/FilePath/FilePathTempPosix.swift @@ -10,7 +10,7 @@ #if !os(Windows) /// Get the path to the system temporary directory. -internal func _getTemporaryDirectory() throws -> FilePath { +internal func _getTemporaryDirectory() throws(SystemError) -> FilePath { guard let tmp = system_getenv("TMPDIR") else { return "/tmp" } @@ -26,22 +26,22 @@ internal func _getTemporaryDirectory() throws -> FilePath { /// Removes a directory completely, including all of its contents. internal func _recursiveRemove( at path: FilePath -) throws { +) throws(SystemError) { let dirfd = try FileDescriptor.open(path, .readOnly, options: .directory) defer { try? dirfd.close() } let dot: (CInterop.PlatformChar, CInterop.PlatformChar) = (46, 0) - try withUnsafeBytes(of: dot) { + try withUnsafeBytes(of: dot) { (bytes) throws(SystemError) in try recursiveRemove( in: dirfd.rawValue, - name: $0.assumingMemoryBound(to: CInterop.PlatformChar.self).baseAddress! + name: bytes.assumingMemoryBound(to: CInterop.PlatformChar.self).baseAddress! ) } - try path.withPlatformString { - if system_rmdir($0) != 0 { + try path.withPlatformString { (platformString) throws(SystemError) in + if system_rmdir(platformString) != 0 { throw Errno.current } } @@ -81,8 +81,8 @@ fileprivate func impl_opendirat( fileprivate func forEachFile( in dirfd: CInt, subdir: UnsafePointer, - _ body: (system_dirent) throws -> () -) throws { + _ body: (system_dirent) throws(SystemError) -> () +) throws(SystemError) { guard let dir = impl_opendirat(dirfd, subdir) else { throw Errno.current } @@ -113,7 +113,7 @@ fileprivate func forEachFile( fileprivate func recursiveRemove( in dirfd: CInt, name: UnsafePointer -) throws { +) throws(SystemError) { // First, deal with subdirectories try forEachFile(in: dirfd, subdir: name) { dirent in if dirent.d_type == SYSTEM_DT_DIR { diff --git a/Sources/System/FilePermissions.swift b/Sources/System/FilePermissions.swift index f849a997..8cebee0b 100644 --- a/Sources/System/FilePermissions.swift +++ b/Sources/System/FilePermissions.swift @@ -18,7 +18,7 @@ /// perms == [.ownerReadWrite, .groupRead, .otherRead] // true @frozen @available(System 0.0.1, *) -public struct FilePermissions: OptionSet, Sendable, Hashable, Codable { +public struct FilePermissions: OptionSet, Sendable, Hashable { /// The raw C file permissions. @_alwaysEmitIntoClient public let rawValue: CModeT @@ -172,3 +172,8 @@ extension FilePermissions /// A textual representation of the file permissions, suitable for debugging. public var debugDescription: String { self.description } } + +#if !$Embedded +@available(System 0.0.1, *) +extension FilePermissions: Codable {} +#endif diff --git a/Sources/System/Internals/Exports.swift b/Sources/System/Internals/Exports.swift index d18102a2..7f76dc34 100644 --- a/Sources/System/Internals/Exports.swift +++ b/Sources/System/Internals/Exports.swift @@ -116,9 +116,9 @@ internal func system_memset( // Interop between String and platfrom string extension String { - internal func _withPlatformString( - _ body: (UnsafePointer) throws -> Result - ) rethrows -> Result { + internal func _withPlatformString( + _ body: (UnsafePointer) throws(Failure) -> Success + ) throws(Failure) -> Success { // Need to #if because CChar may be signed #if os(Windows) return try withCString(encodedAs: CInterop.PlatformUnicodeEncoding.self, body) diff --git a/Sources/System/Internals/Mocking.swift b/Sources/System/Internals/Mocking.swift index ffdaaa92..7cc09d16 100644 --- a/Sources/System/Internals/Mocking.swift +++ b/Sources/System/Internals/Mocking.swift @@ -17,7 +17,7 @@ // enabled in testing builds of System currently, to minimize runtime overhead of release builds. // -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded internal struct Trace { internal struct Entry { @@ -115,12 +115,12 @@ extension MockingDriver { } } -#endif // ENABLE_MOCKING +#endif // ENABLE_MOCKING && !$Embedded @inline(__always) internal var mockingEnabled: Bool { // Fast constant-foldable check for release builds - #if ENABLE_MOCKING + #if ENABLE_MOCKING && !$Embedded return contextualMockingEnabled #else return false @@ -129,15 +129,15 @@ internal var mockingEnabled: Bool { @inline(__always) internal var forceWindowsPaths: Bool? { - #if !ENABLE_MOCKING - return nil - #else + #if ENABLE_MOCKING && !$Embedded return MockingDriver.forceWindowsPaths + #else + return nil #endif } -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded // Strip the mock_system prefix and the arg list suffix private func originalSyscallName(_ function: String) -> String { // `function` must be of format `system_()` @@ -193,12 +193,12 @@ internal func _mockOffT( ) -> _COffT { _COffT(mockImpl(name: name, path: path, args)) } -#endif // ENABLE_MOCKING +#endif // ENABLE_MOCKING && !$Embedded // Force paths to be treated as Windows syntactically if `enabled` is // true, and as POSIX syntactically if not. internal func _withWindowsPaths(enabled: Bool, _ body: () -> ()) { - #if ENABLE_MOCKING + #if ENABLE_MOCKING && !$Embedded MockingDriver.withMockingEnabled { driver in driver.forceWindowsSyntaxForPaths = enabled body() diff --git a/Sources/System/Internals/Syscalls.swift b/Sources/System/Internals/Syscalls.swift index f6eb5339..23a0a2d4 100644 --- a/Sources/System/Internals/Syscalls.swift +++ b/Sources/System/Internals/Syscalls.swift @@ -31,7 +31,7 @@ import Android internal func system_open( _ path: UnsafePointer, _ oflag: Int32 ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(path: path, oflag) } @@ -43,7 +43,7 @@ internal func system_open( _ path: UnsafePointer, _ oflag: Int32, _ mode: CInterop.Mode ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(path: path, oflag, mode) } @@ -53,7 +53,7 @@ internal func system_open( // close internal func system_close(_ fd: Int32) -> Int32 { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd) } #endif return close(fd) @@ -63,7 +63,7 @@ internal func system_close(_ fd: Int32) -> Int32 { internal func system_read( _ fd: Int32, _ buf: UnsafeMutableRawPointer?, _ nbyte: Int ) -> Int { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mockInt(fd, buf, nbyte) } #endif return read(fd, buf, nbyte) @@ -73,7 +73,7 @@ internal func system_read( internal func system_pread( _ fd: Int32, _ buf: UnsafeMutableRawPointer?, _ nbyte: Int, _ offset: off_t ) -> Int { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mockInt(fd, buf, nbyte, offset) } #endif #if os(Android) @@ -91,7 +91,7 @@ internal func system_pread( internal func system_lseek( _ fd: Int32, _ off: off_t, _ whence: Int32 ) -> off_t { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mockOffT(fd, off, whence) } #endif return lseek(fd, off, whence) @@ -101,7 +101,7 @@ internal func system_lseek( internal func system_write( _ fd: Int32, _ buf: UnsafeRawPointer?, _ nbyte: Int ) -> Int { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mockInt(fd, buf, nbyte) } #endif return write(fd, buf, nbyte) @@ -111,7 +111,7 @@ internal func system_write( internal func system_pwrite( _ fd: Int32, _ buf: UnsafeRawPointer?, _ nbyte: Int, _ offset: off_t ) -> Int { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mockInt(fd, buf, nbyte, offset) } #endif #if os(Android) @@ -127,14 +127,14 @@ internal func system_pwrite( #if !os(WASI) internal func system_dup(_ fd: Int32) -> Int32 { - #if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd) } #endif return dup(fd) } internal func system_dup2(_ fd: Int32, _ fd2: Int32) -> Int32 { - #if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd, fd2) } #endif return dup2(fd, fd2) @@ -143,7 +143,7 @@ internal func system_dup2(_ fd: Int32, _ fd2: Int32) -> Int32 { #if !os(WASI) internal func system_pipe(_ fds: UnsafeMutablePointer) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fds) } #endif return pipe(fds) @@ -151,7 +151,7 @@ internal func system_pipe(_ fds: UnsafeMutablePointer) -> CInt { #endif internal func system_ftruncate(_ fd: Int32, _ length: off_t) -> Int32 { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd, length) } #endif return ftruncate(fd, length) @@ -161,7 +161,7 @@ internal func system_mkdir( _ path: UnsafePointer, _ mode: CInterop.Mode ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(path: path, mode) } #endif return mkdir(path, mode) @@ -170,7 +170,7 @@ internal func system_mkdir( internal func system_rmdir( _ path: UnsafePointer ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(path: path) } #endif return rmdir(path) @@ -208,7 +208,7 @@ internal func system_unlinkat( _ path: UnsafePointer, _ flag: CInt ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd, path, flag) } #endif return unlinkat(fd, path, flag) @@ -247,7 +247,7 @@ internal func system_openat( _ path: UnsafePointer, _ oflag: Int32 ) -> CInt { -#if ENABLE_MOCKING +#if ENABLE_MOCKING && !$Embedded if mockingEnabled { return _mock(fd, path, oflag) } diff --git a/Sources/System/PlatformString.swift b/Sources/System/PlatformString.swift index 7b8fd90c..0703c4bd 100644 --- a/Sources/System/PlatformString.swift +++ b/Sources/System/PlatformString.swift @@ -158,8 +158,8 @@ extension String { /// only during the execution of this method. /// Don't try to store the pointer for later use. public func withPlatformString( - _ body: (UnsafePointer) throws -> Result - ) rethrows -> Result { + _ body: (UnsafePointer) throws(SystemError) -> Result + ) throws(SystemError) -> Result { try _withPlatformString(body) } @@ -189,8 +189,8 @@ extension CInterop.PlatformUnicodeEncoding.CodeUnit { internal protocol _PlatformStringable { func _withPlatformString( - _ body: (UnsafePointer) throws -> Result - ) rethrows -> Result + _ body: (UnsafePointer) throws(SystemError) -> Result + ) throws(SystemError) -> Result init?(_platformString: UnsafePointer) } diff --git a/Sources/System/SystemString.swift b/Sources/System/SystemString.swift index 57abc625..118b99f0 100644 --- a/Sources/System/SystemString.swift +++ b/Sources/System/SystemString.swift @@ -9,7 +9,7 @@ // A platform-native character representation, currently used for file paths internal struct SystemChar: - RawRepresentable, Sendable, Comparable, Hashable, Codable { + RawRepresentable, Sendable, Comparable, Hashable { internal typealias RawValue = CInterop.PlatformChar internal var rawValue: RawValue @@ -23,6 +23,12 @@ internal struct SystemChar: } } +#if !$Embedded + +extension SystemChar: Codable {} + +#endif // !$Embedded + extension SystemChar { internal init(ascii: Unicode.Scalar) { self.init(rawValue: numericCast(UInt8(ascii: ascii))) @@ -104,7 +110,7 @@ extension SystemString { } return true } - + fileprivate func _invariantCheck() { #if DEBUG precondition(_invariantsSatisfied()) @@ -173,10 +179,14 @@ extension SystemString: RangeReplaceableCollection { } } -extension SystemString: Hashable, Codable { +extension SystemString: Hashable {} + +#if !$Embedded + +extension SystemString: Codable { // Encoder is synthesized; it probably should have been explicit and used // a single-value container, but making that change now is somewhat risky. - + // Decoder is written explicitly to ensure that we validate invariants on // untrusted input. public init(from decoder: any Decoder) throws { @@ -195,6 +205,8 @@ extension SystemString: Hashable, Codable { } } +#endif // !$Embedded + extension SystemString { internal func withNullTerminatedSystemChars( diff --git a/Sources/System/Util.swift b/Sources/System/Util.swift index e4832ac5..c100ac51 100644 --- a/Sources/System/Util.swift +++ b/Sources/System/Util.swift @@ -43,6 +43,8 @@ internal func nothingOrErrno( valueOrErrno(retryOnInterrupt: retryOnInterrupt, f).map { _ in () } } +#if !$Embedded + // Run a precondition for debug client builds internal func _debugPrecondition( _ condition: @autoclosure () -> Bool, @@ -56,6 +58,8 @@ internal func _debugPrecondition( } } +#endif // !$Embedded + extension OpaquePointer { internal var _isNULL: Bool { OpaquePointer(bitPattern: Int(bitPattern: self)) == nil