blob: 87dd4c3580967887df705519ff5ef5bf0fe0c856 [file] [log] [blame]
// 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 cfg, 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.
auto url = fxl::StringPrintf("fuchsia-pkg://fuchsia.com/%s#meta/%s.cmx", argv[0], argv[0]);
fuchsia::virtualization::GuestPtr guest;
realm->LaunchInstance(url, nullptr, std::move(cfg), 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();
}