summaryrefslogtreecommitdiff
path: root/cgpt
diff options
context:
space:
mode:
Diffstat (limited to 'cgpt')
-rw-r--r--cgpt/cgpt_legacy.c21
-rw-r--r--cgpt/cmd_legacy.c17
2 files changed, 34 insertions, 4 deletions
diff --git a/cgpt/cgpt_legacy.c b/cgpt/cgpt_legacy.c
index b7582123..d5df34d5 100644
--- a/cgpt/cgpt_legacy.c
+++ b/cgpt/cgpt_legacy.c
@@ -10,6 +10,7 @@
int CgptLegacy(CgptLegacyParams *params) {
struct drive drive;
+ int gpt_retval;
GptHeader *h1, *h2;
if (params == NULL)
@@ -19,14 +20,32 @@ int CgptLegacy(CgptLegacyParams *params) {
params->drive_size))
return CGPT_FAILED;
+ if (GPT_SUCCESS != (gpt_retval = GptSanityCheck(&drive.gpt))) {
+ Error("GptSanityCheck() returned %d: %s\n",
+ gpt_retval, GptError(gpt_retval));
+ return CGPT_FAILED;
+ }
+
h1 = (GptHeader *)drive.gpt.primary_header;
h2 = (GptHeader *)drive.gpt.secondary_header;
- if (params->efipart) {
+ if (params->mode == CGPT_LEGACY_MODE_EFIPART) {
+ drive.gpt.ignored = MASK_NONE;
memcpy(h1->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
memcpy(h2->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
RepairEntries(&drive.gpt, MASK_SECONDARY);
drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
GPT_MODIFIED_HEADER2);
+ } else if (params->mode == CGPT_LEGACY_MODE_IGNORE_PRIMARY) {
+ if (!(drive.gpt.valid_headers & MASK_SECONDARY) ||
+ !(drive.gpt.valid_entries & MASK_SECONDARY) ||
+ drive.gpt.ignored & MASK_SECONDARY) {
+ Error("Refusing to mark primary GPT ignored unless secondary is valid.");
+ return CGPT_FAILED;
+ }
+ memset(h1, 0, sizeof(*h1));
+ memcpy(h1->signature, GPT_HEADER_SIGNATURE_IGNORED,
+ GPT_HEADER_SIGNATURE_SIZE);
+ drive.gpt.modified |= GPT_MODIFIED_HEADER1;
} else {
memcpy(h1->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
memcpy(h2->signature, GPT_HEADER_SIGNATURE2, GPT_HEADER_SIGNATURE_SIZE);
diff --git a/cgpt/cmd_legacy.c b/cgpt/cmd_legacy.c
index 5fd742cc..e45b305c 100644
--- a/cgpt/cmd_legacy.c
+++ b/cgpt/cmd_legacy.c
@@ -19,6 +19,7 @@ static void Usage(void)
" default 0, meaning partitions and GPT structs are\n"
" both on DRIVE\n"
" -e Switch GPT header signature back to \"EFI PART\"\n"
+ " -p Switch primary GPT header signature to \"IGNOREME\"\n"
"\n", progname);
}
@@ -31,7 +32,7 @@ int cmd_legacy(int argc, char *argv[]) {
int errorcnt = 0;
opterr = 0; // quiet, you
- while ((c=getopt(argc, argv, ":heD:")) != -1)
+ while ((c=getopt(argc, argv, ":hepD:")) != -1)
{
switch (c)
{
@@ -44,9 +45,19 @@ int cmd_legacy(int argc, char *argv[]) {
}
break;
case 'e':
- params.efipart = 1;
+ if (params.mode) {
+ Error("Incompatible flags, pick either -e or -p\n");
+ errorcnt++;
+ }
+ params.mode = CGPT_LEGACY_MODE_EFIPART;
+ break;
+ case 'p':
+ if (params.mode) {
+ Error("Incompatible flags, pick either -e or -p\n");
+ errorcnt++;
+ }
+ params.mode = CGPT_LEGACY_MODE_IGNORE_PRIMARY;
break;
-
case 'h':
Usage();
return CGPT_OK;