// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

[DartPackage="mojo_services"]
module native_support;

import "files/interfaces/file.mojom";
import "files/interfaces/types.mojom";

// Interface for dealing with (e.g., starting) "native" processes.
[ServiceName="native_support::Process"]
interface Process {
  // Spawns a process, optionally redirecting stdin/stdout/stderr from/to the
  // corresponding |mojo.files.File| (if null, redirects from/to /dev/null).
  // |path| is the path to the binary to execute; |argv| is the argv to give to
  // the process (if null, it just takes |argv[0]| to be |path| with no other
  // arguments); |envp| is the environment to give to the process, consisting of
  // an array of "strings" of the form "NAME=value" (if null, simply inherits
  // the environment from the parent, whatever that is).
  // TODO(vtl): This should really take an array of |mojo.files.File|s (or maybe
  // two, one for input and the other for output), corresponding to FDs, but the
  // C++ bindings generator doesn't support arrays of interfaces yet
  // (https://github.com/domokit/mojo/issues/412).
  // TODO(vtl): The implementation currently ignores |argv[0]| and always fills
  // it in with |path|.
  // TODO(vtl): Inheriting |envp| from the parent is somewhat dubious, and
  // there's also no way to just specify modifications or limit inheritance.
  Spawn(array<uint8> path,
        array<array<uint8>>? argv,
        array<array<uint8>>? envp,
        mojo.files.File? stdin_file,
        mojo.files.File? stdout_file,
        mojo.files.File? stderr_file,
        ProcessController& process_controller)
      => (mojo.files.Error error);
  // Like |Spawn()|, except that the child's stdin/stdout/stderr are redirected
  // from/to |terminal_file|, which should be a |mojo.files.File| for a terminal
  // (i.e., one that behaves like one, including responding to the required
  // ioctls).
  SpawnWithTerminal(array<uint8> path,
                    array<array<uint8>>? argv,
                    array<array<uint8>>? envp,
                    mojo.files.File terminal_file,
                    ProcessController& process_controller)
      => (mojo.files.Error error);
};

// Interface for controlling a process started by one of |Process|'s facilities
// (in particular, |Spawn()| or |SpawnWithTerminal()|).
// TODO(vtl): What does it do if this is closed (without being detached)? Kill
// with SIGHUP?
interface ProcessController {
  // Wait for process completion.
  // TODO(vtl): Add options (e.g., timeout)?
  Wait() => (mojo.files.Error error, int32 exit_status);

  // Kill the process with the given signal (note: does not wait). |signal|
  // should be nonnegative. This is not valid after a successful call to
  // |Wait()|.
  // TODO(vtl): Add constants for signals. (For standard POSIX signals, the
  // values should be the same as the POSIX-specified values, so using POSIX
  // macros for the values should always be OK.)
  Kill(int32 signal) => (mojo.files.Error error);

  // TODO(vtl): Add a "Detach()"?
};
