diff --git a/Sources/ContainerPlugin/PluginConfig.swift b/Sources/ContainerPlugin/PluginConfig.swift index 5fdf2a99..49fbcd70 100644 --- a/Sources/ContainerPlugin/PluginConfig.swift +++ b/Sources/ContainerPlugin/PluginConfig.swift @@ -79,7 +79,6 @@ public struct PluginConfig: Sendable, Codable { public let services: [Service] /// An optional parameter that include any command line arguments /// that must be passed to the plugin binary when it is loaded. - /// This parameter is used only when `servicesConfig.loadAtBoot` is `true` public let defaultArguments: [String] } diff --git a/Sources/ContainerPlugin/PluginLoader.swift b/Sources/ContainerPlugin/PluginLoader.swift index 08a0293d..90693d5f 100644 --- a/Sources/ContainerPlugin/PluginLoader.swift +++ b/Sources/ContainerPlugin/PluginLoader.swift @@ -225,7 +225,7 @@ extension PluginLoader { let plist = LaunchPlist( label: id, - arguments: [plugin.binaryURL.path] + (args ?? serviceConfig.defaultArguments), + arguments: [plugin.binaryURL.path] + (args ?? ["start"]) + serviceConfig.defaultArguments, environment: env, limitLoadToSessionType: [.Aqua, .Background, .System], runAtLoad: serviceConfig.runAtLoad, diff --git a/Sources/Helpers/NetworkVmnet/NetworkVmnetHelper+Start.swift b/Sources/Helpers/NetworkVmnet/NetworkVmnetHelper+Start.swift index f82629fd..d39b589c 100644 --- a/Sources/Helpers/NetworkVmnet/NetworkVmnetHelper+Start.swift +++ b/Sources/Helpers/NetworkVmnet/NetworkVmnetHelper+Start.swift @@ -19,10 +19,16 @@ import ContainerNetworkService import ContainerNetworkServiceClient import ContainerResource import ContainerXPC +import ContainerizationError import ContainerizationExtras import Foundation import Logging +enum Variant: String, ExpressibleByArgument { + case reserved + case allocationOnly +} + extension NetworkVmnetHelper { struct Start: AsyncParsableCommand { static let configuration = CommandConfiguration( @@ -45,6 +51,14 @@ extension NetworkVmnetHelper { @Option(name: .customLong("subnet-v6"), help: "CIDR address for the IPv6 prefix") var ipv6Subnet: String? + @Option(name: .long, help: "Variant of the network helper to use.") + var variant: Variant = { + guard #available(macOS 26, *) else { + return .allocationOnly + } + return .reserved + }() + func run() async throws { let commandName = NetworkVmnetHelper._commandName let log = setupLogger(id: id, debug: debug) @@ -63,7 +77,11 @@ extension NetworkVmnetHelper { ipv4Subnet: ipv4Subnet, ipv6Subnet: ipv6Subnet, ) - let network = try Self.createNetwork(configuration: configuration, log: log) + let network = try Self.createNetwork( + configuration: configuration, + variant: self.variant, + log: log + ) try await network.start() let server = try await NetworkService(network: network, log: log) let xpc = XPCServer( @@ -86,12 +104,19 @@ extension NetworkVmnetHelper { } } - private static func createNetwork(configuration: NetworkConfiguration, log: Logger) throws -> Network { - guard #available(macOS 26, *) else { + private static func createNetwork(configuration: NetworkConfiguration, variant: Variant, log: Logger) throws -> Network { + switch variant { + case .allocationOnly: return try AllocationOnlyVmnetNetwork(configuration: configuration, log: log) + case .reserved: + guard #available(macOS 26, *) else { + throw ContainerizationError( + .invalidArgument, + message: "variant ReservedVmnetNetwork is only available on macOS 26+" + ) + } + return try ReservedVmnetNetwork(configuration: configuration, log: log) } - - return try ReservedVmnetNetwork(configuration: configuration, log: log) } } } diff --git a/config/container-core-images-config.json b/config/container-core-images-config.json index 755c2656..2624f4bc 100644 --- a/config/container-core-images-config.json +++ b/config/container-core-images-config.json @@ -11,6 +11,6 @@ "description": "Provide an XPC interface to interact with an image store." } ], - "defaultArguments": ["start"] + "defaultArguments": [] } }