Early support for larger-than-512-byte sectors and even earlier support
for sgdisk program. (The latter is just proof-of-concept at this point;
it doesn't do anything useful.)
diff --git a/gpt.cc b/gpt.cc
index 7204f2c..7352edc 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -49,6 +49,7 @@
    bsdFound = 0;
    sectorAlignment = 8; // Align partitions on 4096-byte boundaries by default
    srand((unsigned int) time(NULL));
+   mainHeader.numParts = 0;
    SetGPTSize(NUM_GPT_ENTRIES);
 } // GPTData default constructor
 
@@ -68,6 +69,7 @@
    bsdFound = 0;
    sectorAlignment = 8; // Align partitions on 4096-byte boundaries by default
    srand((unsigned int) time(NULL));
+   mainHeader.numParts = 0;
    LoadPartitions(filename);
 } // GPTData(char* filename) constructor
 
@@ -601,9 +603,9 @@
    uint32_t newCRC, sizeOfParts;
 
    // Seek to and read the main GPT header
-   lseek64(fd, 512, SEEK_SET);
-   if (read(fd, &mainHeader, 512) != 512) { // read main GPT header
-      fprintf(stderr, "Warning! Error %d reading secondary GPT header!", errno);
+   lseek64(fd, blockSize, SEEK_SET);
+   if (myRead(fd, (char*) &mainHeader, 512) != 512) { // read main GPT header
+      fprintf(stderr, "Warning! Error %d reading main GPT header!\n", errno);
    } // if
    mainCrcOk = CheckHeaderCRC(&mainHeader);
    if (IsLittleEndian() == 0) // big-endian system; adjust header byte order....
@@ -618,19 +620,19 @@
       if (mainHeader.backupLBA < diskSize) {
          seekTo = mainHeader.backupLBA * blockSize;
       } else {
-         seekTo = (diskSize * blockSize) - UINT64_C(512);
+         seekTo = (diskSize * blockSize) - blockSize;
          printf("Warning! Disk size is smaller than the main header indicates! Loading\n"
                 "secondary header from the last sector of the disk! You should use 'v' to\n"
                 "verify disk integrity, and perhaps options on the experts' menu to repair\n"
                 "the disk.\n");
       } // else
    } else {
-      seekTo = (diskSize * blockSize) - UINT64_C(512);
+      seekTo = (diskSize * blockSize) - blockSize;
    } // if/else (mainCrcOk)
 
    if (lseek64(fd, seekTo, SEEK_SET) != (off_t) -1) {
-      if (read(fd, &secondHeader, 512) != 512) { // read secondary GPT header
-         fprintf(stderr, "Warning! Error %d reading secondary GPT header!", errno);
+      if (myRead(fd, (char*) &secondHeader, 512) != 512) { // read secondary GPT header
+         fprintf(stderr, "Warning! Error %d reading secondary GPT header!\n", errno);
       } // if
       secondCrcOk = CheckHeaderCRC(&secondHeader);
       if (IsLittleEndian() == 0) // big-endian system; adjust header byte order....
@@ -681,7 +683,7 @@
       if ((lseek64(fd, seekTo, SEEK_SET) != (off_t) -1) && (secondCrcOk)) {
          sizeOfParts = secondHeader.numParts * secondHeader.sizeOfPartitionEntries;
          storage = (char*) malloc(sizeOfParts);
-         if (read(fd, storage, sizeOfParts) != sizeOfParts) {
+         if (myRead(fd, storage, sizeOfParts) != sizeOfParts) {
             fprintf(stderr, "Warning! Error %d reading backup partition table!\n", errno);
          } // if
          newCRC = chksum_crc32((unsigned char*) storage,  sizeOfParts);
@@ -716,7 +718,7 @@
       // matches the stored value
       lseek64(fd, mainHeader.partitionEntriesLBA * blockSize, SEEK_SET);
       sizeOfParts = mainHeader.numParts * mainHeader.sizeOfPartitionEntries;
-      if (read(fd, partitions, sizeOfParts) != sizeOfParts) {
+      if (myRead(fd, (char*) partitions, sizeOfParts) != sizeOfParts) {
          fprintf(stderr, "Warning! Error %d when loading the main partition table!\n", errno);
       } // if
       newCRC = chksum_crc32((unsigned char*) partitions, sizeOfParts);
@@ -740,7 +742,7 @@
       if (lseek64(fd, seekTo, SEEK_SET) != (off_t) -1) {
          SetGPTSize(secondHeader.numParts);
          sizeOfParts = secondHeader.numParts * secondHeader.sizeOfPartitionEntries;
-         if (read(fd, partitions, sizeOfParts) != sizeOfParts) {
+         if (myRead(fd, (char*) partitions, sizeOfParts) != sizeOfParts) {
             fprintf(stderr, "Warning! Read error %d! Misbehavior now likely!\n", errno);
          } // if
          newCRC = chksum_crc32((unsigned char*) partitions, sizeOfParts);
@@ -852,15 +854,21 @@
          protectiveMBR.WriteMBRData(fd);
 
          // Now write the main GPT header...
-         if (allOK)
-            if (write(fd, &mainHeader, 512) == -1)
-               allOK = 0;
+         if (allOK) {
+            if (lseek64(fd, blockSize, SEEK_SET) != (off_t) -1) {
+               if (myWrite(fd, (char*) &mainHeader, 512) == -1)
+                  allOK = 0;
+	       } else allOK = 0; // if (lseek64()...)
+	 } // if (allOK)
 
          // Now write the main partition tables...
          if (allOK) {
-            if (write(fd, partitions, GPT_SIZE * numParts) == -1)
+	    offset = mainHeader.partitionEntriesLBA * blockSize;
+	    if (lseek64(fd, offset, SEEK_SET) != (off_t) - 1) {
+            if (myWrite(fd, (char*) partitions, GPT_SIZE * numParts) == -1)
                allOK = 0;
-         } // if
+            } else allOK = 0; // if (lseek64()...)
+         } // if (allOK)
 
          // Now seek to near the end to write the secondary GPT....
          if (allOK) {
@@ -872,14 +880,19 @@
          } // if
 
          // Now write the secondary partition tables....
-         if (allOK)
-            if (write(fd, partitions, GPT_SIZE * numParts) == -1)
+         if (allOK) {
+            if (myWrite(fd, (char*) partitions, GPT_SIZE * numParts) == -1)
                allOK = 0;
+	 } // if (allOK)
 
          // Now write the secondary GPT header...
-         if (allOK)
-            if (write(fd, &secondHeader, 512) == -1)
-               allOK = 0;
+         if (allOK) {
+	    offset = mainHeader.backupLBA * blockSize;
+	    if (lseek64(fd, offset, SEEK_SET) != (off_t) - 1) {
+               if (myWrite(fd, (char*) &secondHeader, 512) == -1)
+                  allOK = 0;
+	       } else allOK = 0; // if (lseek64()...)
+	 } // if (allOK)
 
          // re-read the partition table
          if (allOK) {
@@ -944,17 +957,17 @@
 
       // Now write the main GPT header...
       if (allOK)
-         if (write(fd, &mainHeader, 512) == -1)
+         if (myWrite(fd, (char*) &mainHeader, 512) == -1)
             allOK = 0;
 
       // Now write the secondary GPT header...
       if (allOK)
-         if (write(fd, &secondHeader, 512) == -1)
+         if (myWrite(fd, (char*) &secondHeader, 512) == -1)
             allOK = 0;
 
       // Now write the main partition tables...
       if (allOK) {
-         if (write(fd, partitions, GPT_SIZE * numParts) == -1)
+         if (myWrite(fd, (char*) partitions, GPT_SIZE * numParts) == -1)
             allOK = 0;
       } // if
 
@@ -997,7 +1010,7 @@
 
       // Load the main GPT header, check its vaility, and set the GPT
       // size based on the data
-      if (read(fd, &mainHeader, 512)) {
+      if (myRead(fd, (char*) &mainHeader, 512)) {
          fprintf(stderr, "Warning! Read error %d; strange behavior now likely!\n", errno);
       } // if
       mainCrcOk = CheckHeaderCRC(&mainHeader);
@@ -1009,7 +1022,7 @@
 
       // Load the backup GPT header in much the same way as the main
       // GPT header....
-      if (read(fd, &secondHeader, 512) != 512) {
+      if (myRead(fd, (char*) &secondHeader, 512) != 512) {
          fprintf(stderr, "Warning! Read error %d; strange behavior now likely!\n", errno);
       } // if
       secondCrcOk = CheckHeaderCRC(&secondHeader);
@@ -1045,7 +1058,7 @@
          // Load main partition table, and record whether its CRC
          // matches the stored value
          sizeOfParts = numParts * sizeOfEntries;
-         if (read(fd, partitions, sizeOfParts) != sizeOfParts) {
+         if (myRead(fd, (char*) partitions, sizeOfParts) != sizeOfParts) {
             fprintf(stderr, "Warning! Read error %d; strange behavior now likely!\n", errno);
          } // if
 
@@ -1109,6 +1122,7 @@
    BytesToSI(diskSize * blockSize, sizeInSI);
    printf("Disk %s: %llu sectors, %s\n", device,
           (unsigned long long) diskSize, sizeInSI);
+   printf("Logical sector size: %d bytes\n", blockSize);
    printf("Disk identifier (GUID): %s\n", GUIDToStr(mainHeader.diskGUID, tempStr));
    printf("Partition table holds up to %lu entries\n", (unsigned long) mainHeader.numParts);
    printf("First usable sector is %llu, last usable sector is %llu\n",
@@ -1302,8 +1316,9 @@
 // If prompt == 0, don't ask user about proceeding and do NOT wipe out
 // MBR. (Set prompt == 0 when doing a GPT-to-MBR conversion.)
 int GPTData::DestroyGPT(int prompt) {
-   int fd, i, sum;
+   int fd, i, sum, tableSize;
    char blankSector[512], goOn = 'Y', blank = 'N';
+   char* emptyTable;
 
    for (i = 0; i < 512; i++) {
       blankSector[i] = '\0';
@@ -1326,24 +1341,24 @@
       } // if
 #endif
       if (fd != -1) {
-         lseek64(fd, mainHeader.currentLBA * 512, SEEK_SET); // seek to GPT header
-         if (write(fd, blankSector, 512) != 512) { // blank it out
+         lseek64(fd, mainHeader.currentLBA * blockSize, SEEK_SET); // seek to GPT header
+         if (myWrite(fd, blankSector, 512) != 512) { // blank it out
             fprintf(stderr, "Warning! GPT main header not overwritten! Error is %d\n", errno);
          } // if
-         lseek64(fd, mainHeader.partitionEntriesLBA * 512, SEEK_SET); // seek to partition table
-         sum = 0;
-         for (i = 0; i < GetBlocksInPartTable(); i++)
-            sum += write(fd, blankSector, 512);
-         if (sum != 512 * GetBlocksInPartTable())
+         lseek64(fd, mainHeader.partitionEntriesLBA * blockSize, SEEK_SET); // seek to partition table
+         tableSize = mainHeader.numParts * mainHeader.sizeOfPartitionEntries;
+         emptyTable = (char*) malloc(tableSize);
+         for (i = 0; i < tableSize; i++)
+            emptyTable[i] = (char) 0;
+         sum = myWrite(fd, emptyTable, tableSize);
+         if (sum != tableSize)
             fprintf(stderr, "Warning! GPT main partition table not overwritten! Error is %d\n", errno);
-         lseek64(fd, secondHeader.partitionEntriesLBA * 512, SEEK_SET); // seek to partition table
-         sum = 0;
-         for (i = 0; i < GetBlocksInPartTable(); i++)
-            sum += write(fd, blankSector, 512);
-         if (sum != 512 * GetBlocksInPartTable())
+         lseek64(fd, secondHeader.partitionEntriesLBA * blockSize, SEEK_SET); // seek to partition table
+         sum = myWrite(fd, emptyTable, tableSize);
+         if (sum != tableSize)
             fprintf(stderr, "Warning! GPT backup partition table not overwritten! Error is %d\n", errno);
-         lseek64(fd, secondHeader.currentLBA * 512, SEEK_SET); // seek to GPT header
-         if (write(fd, blankSector, 512) != 512) { // blank it out
+         lseek64(fd, secondHeader.currentLBA * blockSize, SEEK_SET); // seek to GPT header
+         if (myWrite(fd, blankSector, 512) != 512) { // blank it out
             fprintf(stderr, "Warning! GPT backup header not overwritten! Error is %d\n", errno);
          } // if
          if (prompt) {
@@ -1357,7 +1372,7 @@
          // structures).
          if (blank == 'Y') {
             lseek64(fd, 0, SEEK_SET);
-            if (write(fd, blankSector, 512) != 512) { // blank it out
+            if (myWrite(fd, blankSector, 512) != 512) { // blank it out
                fprintf(stderr, "Warning! MBR not overwritten! Error is %d!\n", errno);
             } // if
          } else {