// Copyright (c) 2012 The Chromium OS 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 "cros-disks/glib_process.h"

#include <base/logging.h>

namespace cros_disks {

GlibProcess::GlibProcess() : status_(0), child_watch_id_(0) {}

GlibProcess::~GlibProcess() {
  // If the process has not yet terminated or |callback_| has not been called,
  // we need to remove the event source returned by g_child_watch_add() to
  // prevent |callback_| from being triggered after this object is destructed.
  if (child_watch_id_ != 0) {
    g_source_remove(child_watch_id_);
    child_watch_id_ = 0;

    g_spawn_close_pid(pid());
    set_pid(kInvalidProcessId);
  }
}

bool GlibProcess::Start() {
  CHECK_EQ(kInvalidProcessId, pid()) << "Process has already started.";

  char** arguments = GetArguments();
  CHECK(arguments) << "No argument is provided.";

  GSpawnFlags flags = static_cast<GSpawnFlags>(
      G_SPAWN_DO_NOT_REAP_CHILD |  // Required for g_child_watch_add to work
      G_SPAWN_SEARCH_PATH | G_SPAWN_STDOUT_TO_DEV_NULL |
      G_SPAWN_STDERR_TO_DEV_NULL);
  pid_t child_pid = kInvalidProcessId;
  GError* error = nullptr;
  gboolean ok = g_spawn_async(nullptr,  // Inherit parent's working directory
                              arguments,
                              nullptr,  // Inherit parent's environment
                              flags,
                              nullptr,  // No setup function
                              nullptr,  // No user data
                              &child_pid, &error);

  if (ok) {
    set_pid(child_pid);
    child_watch_id_ =
        g_child_watch_add(child_pid, &GlibProcess::OnChildWatchNotify, this);
  }
  if (error) {
    LOG(ERROR) << "Failed to spawn a process: " << error->message;
    g_error_free(error);
  }
  return ok;
}

void GlibProcess::OnTerminated(int status) {
  status_ = status;
  child_watch_id_ = 0;

  char** arguments = GetArguments();
  CHECK(arguments);

  if (WIFEXITED(status)) {
    LOG(INFO) << "Process '" << arguments[0] << "' (pid " << pid()
              << ") terminated normally with an exit status "
              << WEXITSTATUS(status) << ".";
  } else if (WIFSIGNALED(status)) {
    LOG(INFO) << "Process '" << arguments[0] << "' (pid " << pid()
              << ") terminated by a signal " << WTERMSIG(status) << ".";
  }

  if (!callback_.is_null())
    callback_.Run(this);
}

// static
void GlibProcess::OnChildWatchNotify(GPid pid, gint status, gpointer data) {
  cros_disks::GlibProcess* process =
      static_cast<cros_disks::GlibProcess*>(data);
  CHECK(process);
  CHECK_EQ(process->pid(), pid);
  process->OnTerminated(status);
  g_spawn_close_pid(pid);
}

}  // namespace cros_disks
