/* 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;
    }
  }

  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;
}
