blob: 573d4f80e73337e35df067ff8b95a6167d9a298c [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 "garnet/bin/guest/cli/launch.h"
#include <fuchsia/sys/cpp/fidl.h>
#include <fuchsia/guest/cpp/fidl.h>
#include <fuchsia/ui/policy/cpp/fidl.h>
#include <fuchsia/ui/views_v1/cpp/fidl.h>
#include "garnet/bin/guest/cli/serial.h"
#include "lib/app/cpp/environment_services.h"
#include "lib/svc/cpp/services.h"
void handle_launch(int argc, const char* argv[]) {
async::Loop loop(&kAsyncLoopConfigMakeDefault);
// Create environment.
fuchsia::guest::GuestManagerSyncPtr guestmgr;
fuchsia::sys::ConnectToEnvironmentService(guestmgr.NewRequest());
fuchsia::guest::GuestEnvironmentSyncPtr guest_env;
guestmgr->CreateEnvironment(argv[0], guest_env.NewRequest());
// Launch guest.
fuchsia::guest::GuestControllerPtr guest_controller;
fuchsia::guest::GuestLaunchInfo launch_info;
launch_info.url = argv[0];
for (int i = 0; i < argc - 1; ++i) {
launch_info.vmm_args.push_back(argv[i + 1]);
}
fuchsia::guest::GuestInfo guest_info;
guest_env->LaunchGuest(std::move(launch_info), guest_controller.NewRequest(),
&guest_info);
guest_controller.set_error_handler([&loop] { loop.Shutdown(); });
// Create the framebuffer view.
::fuchsia::ui::views_v1::ViewProviderSyncPtr view_provider;
guest_controller->GetViewProvider(view_provider.NewRequest());
fidl::InterfaceHandle<::fuchsia::ui::views_v1_token::ViewOwner> view_owner;
view_provider->CreateView(view_owner.NewRequest(), nullptr);
// Ask the presenter to display it.
fuchsia::ui::policy::PresenterSyncPtr presenter;
fuchsia::sys::ConnectToEnvironmentService(presenter.NewRequest());
presenter->Present(std::move(view_owner), nullptr);
// Open the serial service of the guest and process IO.
zx::socket socket;
SerialConsole console(&loop);
guest_controller->GetSerial(
[&console](zx::socket socket) { console.Start(std::move(socket)); });
loop.Run();
}