/* Copyright (c) 2013 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 <stdint.h>

#include "gpt.h"

enum {
	CGPT_OK = 0,
	CGPT_FAILED,
};

typedef struct CgptCreateParams {
	char *drive_name;
	uint64_t drive_size;
	int zap;
	uint64_t padding;
} CgptCreateParams;

typedef struct CgptAddParams {
	char *drive_name;
	uint64_t drive_size;
	uint32_t partition;
	uint64_t begin;
	uint64_t size;
	Guid type_guid;
	Guid unique_guid;
	char *label;
	int successful;
	int tries;
	int priority;
	int required;
	int legacy_boot;
	uint32_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_required;
	int set_legacy_boot;
	int set_raw;
} CgptAddParams;

typedef struct CgptEditParams {
	char *drive_name;
	Guid unique_guid;
	int set_unique;
} CgptEditParams;

typedef struct CgptShowParams {
	char *drive_name;
	uint64_t drive_size;
	int numeric;
	int verbose;
	int quick;
	uint32_t partition;
	int single_item;
	int debug;
	int num_partitions;
} CgptShowParams;

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

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

typedef struct CgptPrioritizeParams {
	char *drive_name;
	uint64_t drive_size;
	uint32_t set_partition;
	int set_friends;
	int max_priority;
	int orig_priority;
} CgptPrioritizeParams;

struct CgptFindParams;
typedef void (*CgptFindShowFn)(struct CgptFindParams *params, char *filename,
			       int partnum, GptEntry *entry);
typedef struct CgptFindParams {
	char *drive_name;
	uint64_t drive_size;
	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;           /* 1-based; 0 means no match */
	/* when working with MTD, we actually work on a temp file, but we still
	 * need to print the device name. so this parameter is here to properly
	 * show the correct device name in that special case. */
	CgptFindShowFn show_fn;
} CgptFindParams;

enum {
	CGPT_LEGACY_MODE_LEGACY = 0,
	CGPT_LEGACY_MODE_EFIPART,
	CGPT_LEGACY_MODE_IGNORE_PRIMARY,
};

typedef struct CgptLegacyParams {
	char *drive_name;
	uint64_t drive_size;
	int mode;
} CgptLegacyParams;

#endif  /* VBOOT_REFERENCE_CGPT_CGPT_PARAMS_H_ */
