// 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.

#ifndef SRC_SYS_LIB_CHREALM_CHREALM_H_
#define SRC_SYS_LIB_CHREALM_CHREALM_H_

#include <lib/fdio/spawn.h>
#include <zircon/status.h>
#include <zircon/types.h>

#include <string>
#include <vector>

namespace chrealm {

// Like |RunBinaryInRealmAsync|, but waits for the process to terminate.
zx_status_t RunBinaryInRealm(const std::string& realm_path, const char** argv, int64_t* return_code,
                             std::string* error);

// Spawns a process running the binary with a namespace reflecting |realm_path|.
// Does not block for the command to finish.
//
// |realm_path| is an argument to the realm directory in /hub.
// |argv| is a null-terminated list of arguments for the job.
// |job| is the job to run the process under. If invalid, defaults to the
// realm's job.
//
// |flags| is the set of flags to pass to |fdio_spawn|. FDIO_CLONE_NAMESPACE
// is masked out.
//
// |additional_actions| is a set of actions to pass to |fdio_spawn|, in
// addition to the actions to build the namespace. Defaults to empty.
//
// |proc| is a handle to the process that was launched.
zx_status_t SpawnBinaryInRealmAsync(const std::string& realm_path, const char** argv,
                                    zx_handle_t job, int32_t flags,
                                    const std::vector<fdio_spawn_action_t>& additional_actions,
                                    zx_handle_t* proc, std::string* error);

}  // namespace chrealm

#endif  // SRC_SYS_LIB_CHREALM_CHREALM_H_
