| // Copyright 2018 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/virtualization/bin/guest/launch.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <zircon/status.h> | |
| #include "src/lib/fxl/strings/string_printf.h" | |
| #include "src/virtualization/bin/guest/serial.h" | |
| void handle_launch(int argc, const char** argv, async::Loop* loop, | |
| fuchsia::virtualization::GuestConfig guest_config, | |
| sys::ComponentContext* context) { | |
| // Create environment. | |
| fuchsia::virtualization::ManagerPtr manager; | |
| zx_status_t status = context->svc()->Connect(manager.NewRequest()); | |
| if (status != ZX_OK) { | |
| printf("Failed to connect to guest manager: %s\n", zx_status_get_string(status)); | |
| return; | |
| } | |
| fuchsia::virtualization::RealmPtr realm; | |
| manager->Create(argv[0], realm.NewRequest()); | |
| // Launch guest. | |
| fuchsia::virtualization::LaunchInfo launch_info; | |
| launch_info.url = fxl::StringPrintf("fuchsia-pkg://fuchsia.com/%s#meta/%s.cmx", argv[0], argv[0]); | |
| launch_info.guest_config = std::move(guest_config); | |
| fuchsia::virtualization::GuestPtr guest; | |
| realm->LaunchInstance(std::move(launch_info), guest.NewRequest(), [](uint32_t) {}); | |
| // Setup serial console. | |
| SerialConsole console(loop); | |
| guest->GetSerial([&console](zx::socket socket) { console.Start(std::move(socket)); }); | |
| guest.set_error_handler([&loop](zx_status_t status) { | |
| printf("Connection to guest closed: %s\n", zx_status_get_string(status)); | |
| loop->Quit(); | |
| }); | |
| loop->Run(); | |
| } |