// 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 "debugd/src/storage_tool.h"

#include "debugd/src/process_with_id.h"
#include "debugd/src/process_with_output.h"

namespace debugd {

namespace {

const char kSmartctl[] = "/usr/sbin/smartctl";
const char kBadblocks[] = "/sbin/badblocks";
const char kDevice[] = "/dev/sda";

}  // namespace

std::string StorageTool::Smartctl(const std::string& option) {
  std::string path;
  if (!SandboxedProcess::GetHelperPath("storage", &path))
    return "<path too long>";

  ProcessWithOutput process;
  // Disabling sandboxing since smartctl requires higher privileges.
  process.DisableSandbox();
  if (!process.Init())
    return "<process init failed>";

  process.AddArg(kSmartctl);

  if (option == "abort_test")
    process.AddArg("-X");
  if (option == "attributes")
    process.AddArg("-A");
  if (option == "capabilities")
    process.AddArg("-c");
  if (option == "error")
    process.AddStringOption("-l", "error");
  if (option == "health")
    process.AddArg("-H");
  if (option == "selftest")
    process.AddStringOption("-l", "selftest");
  if (option == "short_test")
    process.AddStringOption("-t", "short");

  process.AddArg(kDevice);
  process.Run();
  std::string output;
  process.GetOutput(&output);
  return output;
}

std::string StorageTool::Start(const dbus::FileDescriptor& outfd) {
  ProcessWithId* p = CreateProcess(false);
  if (!p)
    return "";

  p->AddArg(kBadblocks);
  p->AddArg("-sv");
  p->AddArg(kDevice);
  p->BindFd(outfd.value(), STDOUT_FILENO);
  p->BindFd(outfd.value(), STDERR_FILENO);
  LOG(INFO) << "badblocks: running process id: " << p->id();
  p->Start();
  return p->id();
}

}  // namespace debugd
