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

// A simple utility to remove and add partitions to an MTD device.

#define PROGRAM_NAME "nand_partition"

#include <base/command_line.h>
#include <base/macros.h>
#include <base/strings/string_number_conversions.h>

#include "installer/nand_partition.h"

using std::string;

namespace {

const char kHelpMessage[] = (
    PROGRAM_NAME ":\n"
    "  add <dev> <part_no> <start> <length>\n"
    "  del <dev> <part_no>\n"
    "\n"
    "  both start and length are in bytes.\n"
);
const char kCommandAdd[] = "add";
const char kCommandDel[] = "del";

int ShowHelp() {
  printf("%s\n", kHelpMessage);
  return 1;
}

}  // namespace

int main(int argc, char** argv) {
  base::CommandLine::Init(argc, argv);
  base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();

  base::CommandLine::StringVector args = cmdline->GetArgs();
  if (args.size() > 2) {
    int optind = 0;
    string command = args[optind++];
    string dev = args[optind++];
    string s_part_no = args[optind++];
    int part_no = 0;
    if (!base::StringToInt(s_part_no, &part_no)) {
      return ShowHelp();
    }

    if (command == kCommandDel && args.size() == 3) {
      return (brillo::installer::RemoveNandPartition(dev, part_no) ?
              EXIT_SUCCESS : EXIT_FAILURE);
    } else if (command == kCommandAdd && args.size() == 5) {
      string s_offset = args[optind++];
      string s_length = args[optind++];

      uint64_t offset, length;
      if (!base::StringToUint64(s_offset, &offset) ||
          !base::StringToUint64(s_length, &length)) {
        return ShowHelp();
      }

      return brillo::installer::AddNandPartition(
          dev, part_no, offset, length) ? EXIT_SUCCESS : EXIT_FAILURE;
    }
  }

  return ShowHelp();
}
