/* Copyright (c) 2010 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.
 *
 * Utility for ChromeOS-specific GPT partitions, Please see corresponding .c
 * files for more details.
 */

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <uuid/uuid.h>

#include "cgpt.h"
#include "vboot_host.h"

const char* progname;
const char* command;
void (*uuid_generator)(uint8_t* buffer);

extern struct nand_layout nand;

struct {
  const char *name;
  int (*fp)(int argc, char *argv[]);
  const char *comment;
} cmds[] = {
  {"create", cmd_create, "Create or reset GPT headers and tables"},
  {"add", cmd_add, "Add, edit or remove a partition entry"},
  {"show", cmd_show, "Show partition table and entries"},
  {"repair", cmd_repair, "Repair damaged GPT headers and tables"},
  {"boot", cmd_boot, "Edit the PMBR sector for legacy BIOSes"},
  {"find", cmd_find, "Locate a partition by its GUID"},
  {"prioritize", cmd_prioritize,
   "Reorder the priority of all kernel partitions"},
  {"legacy", cmd_legacy, "Switch between GPT and Legacy GPT"},
};

void Usage(void) {
  int i;

  printf("\nUsage: %s COMMAND [OPTIONS] DRIVE\n\n"
         "Supported COMMANDs:\n\n",
         progname);

  for (i = 0; i < sizeof(cmds)/sizeof(cmds[0]); ++i) {
    printf("    %-15s  %s\n", cmds[i].name, cmds[i].comment);
  }
  printf("\nFor more detailed usage, use %s COMMAND -h\n\n", progname);
}

static int is_pow2(size_t v) {
  return v && (v & (v - 1)) == 0;
}

static int parse_nand_option(const char *arg) {
  if ('=' != arg[0])
    return -1;

  arg++;
  nand.bytes_per_page = atoi(arg);
  arg = strchr(arg, ',');
  if (!arg)
    return -1;

  arg++;
  nand.pages_per_block = atoi(arg);
  arg = strchr(arg, ',');
  if (!arg)
    return -1;

  arg++;
  nand.fts_block_offset = atoi(arg);
  arg = strchr(arg, ',');
  if (!arg)
    return -1;

  arg++;
  nand.fts_block_size = atoi(arg);
  if (nand.fts_block_size == 0 || !is_pow2(nand.pages_per_block) ||
    !is_pow2(nand.bytes_per_page) || nand.bytes_per_page < 512) {
    return -1;
  }
  return 0;
}

int main(int argc, char *argv[]) {
  int i;
  int match_count = 0;
  int match_index = 0;

  uuid_generator = uuid_generate;

  progname = strrchr(argv[0], '/');
  if (progname)
    progname++;
  else
    progname = argv[0];


  memset(&nand, 0, sizeof(nand));
  for (i = 1; i < argc; ++i) {
    if (0 == strncmp(argv[i], "-N", 2)) {
      if (!parse_nand_option(argv[i] + 2)) {
        int j;
        nand.enabled = 1;

        // Remove it form the list.
        for (j = i; j < argc - 1; j++)
          argv[j] = argv[j + 1];
        argc--;
        break;
      }
      // Bad nand config.
      printf("Nand option must fit: -N=<bytes_per_page>,<pages_per_block>,"
             "<block_offset_of_partition>,<block_size_of_partition>\n");
      return CGPT_FAILED;
    }
  }

  TryInitMtd();

  if (argc < 2) {
    Usage();
    return CGPT_FAILED;
  }

  // increment optind now, so that getopt skips argv[0] in command function
  command = argv[optind++];

  // Find the command to invoke.
  for (i = 0; command && i < sizeof(cmds)/sizeof(cmds[0]); ++i) {
    // exact match?
    if (0 == strcmp(cmds[i].name, command)) {
      match_index = i;
      match_count = 1;
      break;
    }
    // unique match?
    else if (0 == strncmp(cmds[i].name, command, strlen(command))) {
      match_index = i;
      match_count++;
    }
  }

  if (match_count == 1)
    return cmds[match_index].fp(argc, argv);

  // Couldn't find a single matching command.
  Usage();

  return CGPT_FAILED;
}
