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

#ifndef VBOOT_REFERENCE_CGPT_CGPT_PARAMS_H_
#define VBOOT_REFERENCE_CGPT_CGPT_PARAMS_H_

#include "cgpt.h"

// This file defines the internal methods that use the user-mode cgpt programatically.
// This is the interface for the callers such as the cgpt tool or the C++ post installer
// executable.

typedef struct CgptCreateParams {
  char *drive_name;
  int zap;
} CgptCreateParams;

typedef struct CgptAddParams {
  char *drive_name;
  uint32_t partition;
  uint64_t begin;
  uint64_t size;
  Guid type_guid;
  Guid unique_guid;
  char *label;
  int successful;
  int tries;
  int priority;
  uint16_t raw_value;
  int set_begin;
  int set_size;
  int set_type;
  int set_unique;
  int set_successful;
  int set_tries;
  int set_priority;
  int set_raw;
} CgptAddParams;

typedef struct CgptShowParams {
  char *drive_name;
  int numeric;
  int verbose;
  int quick;
  uint32_t partition;
  int single_item;

  // This is filled in by the relevant methods in cgpt_show.c
  int num_partitions;
} CgptShowParams;

typedef struct CgptRepairParams {
  char *drive_name;
  int verbose;
} CgptRepairParams;

typedef struct CgptBootParams {
  char *drive_name;
  uint32_t partition;
  char *bootfile;
  int create_pmbr;
} CgptBootParams;

typedef struct CgptPrioritizeParams {
  char *drive_name;

  uint32_t set_partition;
  int set_friends;
  int max_priority;
  int orig_priority;
} CgptPrioritizeParams;

typedef struct CgptFindParams {
  char *drive_name;

  int verbose;
  int set_unique;
  int set_type;
  int set_label;
  int oneonly;
  int numeric;
  uint8_t *matchbuf;
  uint64_t matchlen;
  uint64_t matchoffset;
  uint8_t *comparebuf;
  Guid unique_guid;
  Guid type_guid;
  char *label;
  int hits;
  int match_partnum;           // 0 for no match, 1-N for match
} CgptFindParams;

// create related methods.
int cgpt_create(CgptCreateParams *params);

// add/attribute/details related methods
int cgpt_add(CgptAddParams *params);
int cgpt_set_attributes(CgptAddParams *params);
int cgpt_get_partition_details(CgptAddParams *params);

// boot related methods.
int cgpt_boot(CgptBootParams *params);
int cgpt_get_boot_partition_number(CgptBootParams *params);

// show/get related methods.
int cgpt_show(CgptShowParams *params);
int cgpt_get_num_non_empty_partitions(CgptShowParams *params);

// repair related methods.
int cgpt_repair(CgptRepairParams *params);

// priority related methods.
int cgpt_prioritize(CgptPrioritizeParams *params);

// find related methods.
void cgpt_find(CgptFindParams *params);
#endif  // VBOOT_REFERENCE_CGPT_CGPT_PARAMS_H_
