Initial git repository creation, version 0.3.1 plus changes
diff --git a/gdisk.cc b/gdisk.cc
new file mode 100644
index 0000000..7cfb2bf
--- /dev/null
+++ b/gdisk.cc
@@ -0,0 +1,270 @@
+// gdisk.cc
+// Program modelled after Linux fdisk, but it manipulates GPT partitions
+// rather than MBR partitions.
+//
+// by Rod Smith, February 2009
+
+//#include <iostream>
+#include <stdio.h>
+#include <string.h>
+#include <getopt.h>
+#include "mbr.h"
+#include "gpt.h"
+#include "support.h"
+
+// Function prototypes....
+// int ReadPartitions(char* filename, struct GPTData* theGPT);
+int DoCommand(char* filename, struct GPTData* theGPT);
+void ShowCommands(void);
+void ShowExpertCommands(void);
+int ExpertsMenu(char* filename, struct GPTData* theGPT);
+
+int main(int argc, char* argv[]) {
+   GPTData theGPT;
+   int doMore = 1;
+   char* device = NULL;
+
+   printf("GPT fdisk (gdisk) version 0.3.1\n\n");
+
+    if (argc == 2) { // basic usage
+      if (SizesOK()) {
+         doMore = theGPT.LoadPartitions(argv[1]);
+         while (doMore) {
+            doMore = DoCommand(argv[1], &theGPT);
+         } // while
+      } // if
+   } else if (argc == 3) { // usage with "-l" option
+      if (SizesOK()) {
+         if (strcmp(argv[1], "-l") == 0) {
+            device = argv[2];
+         } else if (strcmp(argv[2], "-l") == 0) {
+            device = argv[1];
+         } else { // 3 arguments, but none is "-l"
+            fprintf(stderr, "Usage: %s [-l] device_file\n", argv[0]);
+         } // if/elseif/else
+         if (device != NULL) {
+            doMore = theGPT.LoadPartitions(device);
+            if (doMore) theGPT.DisplayGPTData();
+         } // if
+      } // if
+   } else {
+      fprintf(stderr, "Usage: %s [-l] device_file\n", argv[0]);
+   } // if/else
+} // main
+
+// Accept a command and execute it. Returns 0 if the command includes
+// an exit condition (such as a q or w command), 1 if more commands
+// should be processed.
+int DoCommand(char* filename, struct GPTData* theGPT) {
+   char command, line[255];
+   int retval = 1;
+   PartTypes typeHelper;
+   uint32_t temp1, temp2;
+
+   printf("\nCommand (m for help): ");
+   fgets(line, 255, stdin);
+   sscanf(line, "%c", &command);
+   switch (command) {
+/*      case 'b': case 'B':
+         GetGUID();
+	 break; */
+      case 'c': case 'C':
+         if (theGPT->GetPartRange(&temp1, &temp2) > 0)
+            theGPT->SetName(theGPT->GetPartNum());
+         else
+            printf("No partitions\n");
+         break;
+      case 'd': case 'D':
+         theGPT->DeletePartition();
+         break;
+      case 'i': case 'I':
+         theGPT->ShowDetails();
+         break;
+      case 'l': case 'L':
+         typeHelper.ShowTypes();
+         break;
+      case 'n': case 'N':
+         theGPT->CreatePartition();
+         break;
+      case 'o': case 'O':
+         theGPT->ClearGPTData();
+//         theGPT->protectiveMBR.MakeProtectiveMBR();
+//         theGPT->BlankPartitions();
+         break;
+      case 'p': case 'P':
+         theGPT->DisplayGPTData();
+	 break;
+      case 'q': case 'Q':
+         retval = 0;
+	 break;
+      case 's': case 'S':
+         theGPT->SortGPT();
+         printf("You may need to edit /etc/fstab and/or your boot loader configuration!\n");
+         break;
+      case 't': case 'T':
+         theGPT->ChangePartType();
+         break;
+      case 'v': case 'V':
+         if (theGPT->Verify() > 0) { // problems found
+            printf("You may be able to correct the problems by using options on the experts\n"
+                   "menu (press 'x' at the command prompt). Good luck!\n");
+         } // if
+         break;
+      case 'w': case 'W':
+         if (theGPT->SaveGPTData() == 1)
+            retval = 0;
+         break;
+      case 'x': case 'X':
+         retval = ExpertsMenu(filename, theGPT);
+         break;
+      default:
+         ShowCommands();
+         break;
+   } // switch
+   return (retval);
+} // DoCommand()
+
+void ShowCommands(void) {
+   printf("c\tchange a partition's name\n");
+   printf("d\tdelete a partition\n");
+   printf("i\tshow detailed information on a partition\n");
+   printf("l\tlist available partition types\n");
+   printf("m\tprint this menu\n");
+   printf("n\tadd a new partition\n");
+   printf("o\tcreate a new empty GUID partition table (GPT)\n");
+   printf("p\tprint the partition table\n");
+   printf("q\tquit without saving changes\n");
+   printf("s\tsort partitions\n");
+   printf("t\tchange a partition's type code\n");
+   printf("v\tverify disk\n");
+   printf("w\twrite table to disk and exit\n");
+   printf("x\textra functionality (experts only)\n");
+} // ShowCommands()
+
+// Accept a command and execute it. Returns 0 if the command includes
+// an exit condition (such as a q or w command), 1 if more commands
+// should be processed.
+int ExpertsMenu(char* filename, struct GPTData* theGPT) {
+   char command, line[255], buFile[255];
+   int retval = 1;
+   PartTypes typeHelper;
+   uint32_t pn;
+   uint32_t temp1, temp2;
+   int goOn = 1;
+
+   do {
+      printf("\nExpert command (m for help): ");
+      fgets(line, 255, stdin);
+      sscanf(line, "%c", &command);
+      switch (command) {
+         case 'a': case 'A':
+            if (theGPT->GetPartRange(&temp1, &temp2) > 0)
+               theGPT->SetAttributes(theGPT->GetPartNum());
+           else
+               printf("No partitions\n");
+            break;
+         case 'b': case 'B':
+            theGPT->RebuildMainHeader();
+            break;
+         case 'c': case 'C':
+            printf("Warning! This will probably do weird things if you've converted an MBR to\n"
+                   "GPT form and haven't yet saved the GPT! Proceed? ");
+            if (GetYN() == 'Y')
+               theGPT->LoadSecondTableAsMain();
+            break;
+         case 'd': case 'D':
+            theGPT->RebuildSecondHeader();
+            break;
+         case 'e': case 'E':
+            printf("Warning! This will probably do weird things if you've converted an MBR to\n"
+                   "GPT form and haven't yet saved the GPT! Proceed? ");
+            if (GetYN() == 'Y')
+               theGPT->LoadMainTable();
+            break;
+         case 'f': case 'F':
+            if (theGPT->GetPartRange(&temp1, &temp2) > 0) {
+               pn = theGPT->GetPartNum();
+               printf("Enter the partition's new unique GUID:\n");
+               theGPT->SetPartitionGUID(pn, GetGUID());
+            } else printf("No partitions\n");
+            break;
+         case 'g': case 'G':
+            printf("Enter the disk's unique GUID:\n");
+            theGPT->SetDiskGUID(GetGUID());
+            break;
+/*         case 'h': case 'H':
+            theGPT->MakeHybrid();
+            break; */
+         case 'i': case 'I':
+            theGPT->ShowDetails();
+            break;
+         case 'k': case 'K':
+            printf("Enter backup filename to save: ");
+            fgets(line, 255, stdin);
+            sscanf(line, "%s", &buFile);
+	    theGPT->SaveGPTBackup(buFile);
+            break;
+         case 'l': case 'L':
+            printf("Enter backup filename to load: ");
+            fgets(line, 255, stdin);
+            sscanf(line, "%s", &buFile);
+	    theGPT->LoadGPTBackup(buFile);
+            break;
+         case 'n': case 'N':
+            theGPT->MakeProtectiveMBR();
+            break;
+         case 'o': case 'O':
+            theGPT->DisplayMBRData();
+            break;
+         case 'p': case 'P':
+            theGPT->DisplayGPTData();
+	    break;
+         case 'q': case 'Q':
+            retval = 0;
+	    goOn = 0;
+	    break;
+         case 'r': case 'R':
+            goOn = 0;
+            break;
+         case 's': case 'S':
+            theGPT->ResizePartitionTable();
+            break;
+         case 'v': case 'V':
+            theGPT->Verify();
+            break;
+         case 'w': case 'W':
+            if (theGPT->SaveGPTData() == 1) {
+               retval = 0;
+               goOn = 0;
+            } // if
+            break;
+         default:
+            ShowExpertCommands();
+            break;
+      } // switch
+   } while (goOn);
+   return (retval);
+} // ExpertsMenu()
+
+void ShowExpertCommands(void) {
+   printf("a\tset attributes\n");
+   printf("b\tuse backup GPT header (rebuilding main)\n");
+   printf("c\tload backup partition table from disk (rebuilding main)\n");
+   printf("d\tuse main GPT header (rebuilding backup)\n");
+   printf("e\tload main partition table from disk (rebuilding backup)\n");
+   printf("f\tchange partition GUID\n");
+   printf("g\tchange disk GUID\n");
+//   printf("h\tmake hybrid MBR\n");
+   printf("i\tshow detailed information on a partition\n");
+   printf("k\tsave partition data to a backup file\n");
+   printf("l\tload partition data from a backup file\n");
+   printf("m\tprint this menu\n");
+   printf("n\tcreate a new protective MBR\n");
+   printf("o\tprint protective MBR data\n");
+   printf("p\tprint the partition table\n");
+   printf("q\tquit without saving changes\n");
+   printf("r\treturn to main menu\n");
+   printf("s\tresize partition table\n");
+   printf("v\tverify disk\n");
+   printf("w\twrite table to disk and exit\n");
+} // ShowExpertCommands()