diff options
author | srs5694 <srs5694@users.sourceforge.net> | 2009-08-26 14:39:40 -0400 |
---|---|---|
committer | srs5694 <srs5694@users.sourceforge.net> | 2009-08-26 14:39:40 -0400 |
commit | 86dd784a0410a689a5423632b346eb398839ee2a (patch) | |
tree | 78acd44e588499866b2938b3a90f257f3facd09a | |
parent | 2a9f5da3c3c4ccccd291462bda9d2aefcd485ff8 (diff) | |
download | sgdisk-86dd784a0410a689a5423632b346eb398839ee2a.tar.gz |
Miscellaneous bug fixes to new big-endian code
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | gdisk.cc | 2 | ||||
-rw-r--r-- | gpt.cc | 4 | ||||
-rw-r--r-- | mbr.cc | 88 | ||||
-rw-r--r-- | mbr.h | 2 | ||||
-rw-r--r-- | parttypes.cc | 3 |
6 files changed, 59 insertions, 42 deletions
@@ -14,6 +14,8 @@ - Added code to identify and warn of the presence of an Apple Partition Map (APM) on the disk. +- Enabled MBR conversion code to handle multiple logical partitions. + 0.3.4: ------ @@ -24,7 +24,7 @@ int main(int argc, char* argv[]) { int doMore = 1; char* device = NULL; - printf("GPT fdisk (gdisk) version 0.3.4\n\n"); + printf("GPT fdisk (gdisk) version 0.3.5\n\n"); if (argc == 2) { // basic usage if (SizesOK()) { @@ -731,7 +731,8 @@ int GPTData::XFormPartitions(MBRData* origParts) { origType = origParts->GetType(i); // don't convert extended, hybrid protective, or null (non-existent) partitions - if ((origType != 0x05) && (origType != 0x0f) && (origType != 0x00) && (origType != 0xEE)) { + if ((origType != 0x05) && (origType != 0x0f) && (origType != 0x85) && + (origType != 0x00) && (origType != 0xEE)) { partitions[i].firstLBA = (uint64_t) origParts->GetFirstSector(i); partitions[i].lastLBA = partitions[i].firstLBA + (uint64_t) origParts->GetLength(i) - 1; @@ -1904,4 +1905,3 @@ int SizesOK(void) { } // if return (allOK); } // SizesOK() - @@ -119,7 +119,7 @@ int MBRData::ReadMBRData(char* deviceFilename) { // Read data from MBR. void MBRData::ReadMBRData(int fd) { - int allOK = 1, i; + int allOK = 1, i, maxLogicals = 0; int err; // Clear logical partition array @@ -176,9 +176,13 @@ void MBRData::ReadMBRData(int fd) { if ((partitions[i].partitionType == 0x05) || (partitions[i].partitionType == 0x0f) || (partitions[i].partitionType == 0x85)) { // Found it, so call a recursive algorithm to load everything from them.... - allOK = ReadLogicalPart(fd, partitions[i].firstLBA, UINT32_C(0), 0); - } // if - } // for + maxLogicals = ReadLogicalPart(fd, partitions[i].firstLBA, UINT32_C(0), maxLogicals); + if ((maxLogicals < 0) || (maxLogicals > NUM_LOGICALS)) { + allOK = 0; + fprintf(stderr, "Error reading logical partitions! List may be truncated!\n"); + } // if maxLogicals valid + } // if primary partition is extended + } // for primary partition loop if (allOK) { // Loaded logicals OK state = mbr; } else { @@ -270,46 +274,54 @@ void MBRData::WriteMBRData(int fd) { } // MBRData::WriteMBRData(int fd) // This is a recursive function to read all the logical partitions, following the -// logical partition linked list from the disk and storing the basic data in +// logical partition linked list from the disk and storing the basic data in the +// logicals[] array. Returns last index to logicals[] uses, or -1 if there was a +// problem int MBRData::ReadLogicalPart(int fd, uint32_t extendedStart, uint32_t diskOffset, int partNum) { - int allOK = 1; struct EBRRecord ebr; off_t offset; - offset = (off_t) (extendedStart + diskOffset) * blockSize; - if (lseek64(fd, offset, SEEK_SET) == (off_t) -1) { // seek to EBR record - fprintf(stderr, "Unable to seek to %lu! Aborting!\n", (unsigned long) offset); - allOK = 0; - } - if (read(fd, &ebr, 512) != 512) { // Load the data.... - fprintf(stderr, "Error seeking to or reading logical partition data from %lu!\nAborting!\n", - (unsigned long) offset); - allOK = 0; - } else if (IsLittleEndian() != 1) { // Reverse byte ordering of some data.... - ReverseBytes((char*) &ebr.MBRSignature, 2); - ReverseBytes((char*) &ebr.partitions[0].firstLBA, 4); - ReverseBytes((char*) &ebr.partitions[0].lengthLBA, 4); - } // if/else/if - - if (ebr.MBRSignature != MBR_SIGNATURE) { - allOK = 0; - printf("MBR signature in logical partition invalid; read 0x%04X, but should be 0x%04X\n", - (unsigned int) ebr.MBRSignature, (unsigned int) MBR_SIGNATURE); - } /* if */ - - // Copy over the basic data.... - logicals[partNum].status = ebr.partitions[0].status; - logicals[partNum].firstLBA = ebr.partitions[0].firstLBA + diskOffset + extendedStart; - logicals[partNum].lengthLBA = ebr.partitions[0].lengthLBA; - logicals[partNum].partitionType = ebr.partitions[0].partitionType; + if ((partNum < NUM_LOGICALS) && (partNum >= 0)) { + offset = (off_t) (extendedStart + diskOffset) * blockSize; + if (lseek64(fd, offset, SEEK_SET) == (off_t) -1) { // seek to EBR record + fprintf(stderr, "Unable to seek to %lu! Aborting!\n", (unsigned long) offset); + partNum = -1; + } + if (read(fd, &ebr, 512) != 512) { // Load the data.... + fprintf(stderr, "Error seeking to or reading logical partition data from %lu!\nAborting!\n", + (unsigned long) offset); + partNum = -1; + } else if (IsLittleEndian() != 1) { // Reverse byte ordering of some data.... + ReverseBytes((char*) &ebr.MBRSignature, 2); + ReverseBytes((char*) &ebr.partitions[0].firstLBA, 4); + ReverseBytes((char*) &ebr.partitions[0].lengthLBA, 4); + ReverseBytes((char*) &ebr.partitions[1].firstLBA, 4); + ReverseBytes((char*) &ebr.partitions[1].lengthLBA, 4); + } // if/else/if + + if (ebr.MBRSignature != MBR_SIGNATURE) { + partNum = -1; + fprintf(stderr, "MBR signature in logical partition invalid; read 0x%04X, but should be 0x%04X\n", + (unsigned int) ebr.MBRSignature, (unsigned int) MBR_SIGNATURE); + } // if - // Find the next partition (if there is one) and recurse.... - if ((ebr.partitions[1].firstLBA != UINT32_C(0)) && allOK) { - allOK = ReadLogicalPart(fd, extendedStart, ebr.partitions[1].firstLBA, - partNum + 1); - } // if - return (allOK); + // Copy over the basic data.... + logicals[partNum].status = ebr.partitions[0].status; + logicals[partNum].firstLBA = ebr.partitions[0].firstLBA + diskOffset + extendedStart; + logicals[partNum].lengthLBA = ebr.partitions[0].lengthLBA; + logicals[partNum].partitionType = ebr.partitions[0].partitionType; + + // Find the next partition (if there is one) and recurse.... + if ((ebr.partitions[1].firstLBA != UINT32_C(0)) && (partNum >= 0) && + (partNum < (NUM_LOGICALS - 1))) { + partNum = ReadLogicalPart(fd, extendedStart, ebr.partitions[1].firstLBA, + partNum + 1); + } else { + partNum++; + } // if another partition + } // Not enough space for all the logicals (or previous error encountered) + return (partNum); } // MBRData::ReadLogicalPart() // Show the MBR data to the user.... @@ -78,6 +78,8 @@ public: void ReadMBRData(int fd); int WriteMBRData(void); void WriteMBRData(int fd); + // ReadLogicalPart() returns last partition # read to logicals[] array, + // or -1 if there was a problem.... int ReadLogicalPart(int fd, uint32_t extendedStart, uint32_t diskOffset, int partNum); void DisplayMBRData(void); diff --git a/parttypes.cc b/parttypes.cc index 3f81797..cb61621 100644 --- a/parttypes.cc +++ b/parttypes.cc @@ -300,7 +300,8 @@ struct GUIDData PartTypes::IDToGUID(uint16_t ID) { } // while if (!found) { theGUID = IDToGUID(0x0700); // assign a default type code - printf("Exact type match not found; assigning type code for 'Linux/Windows data'\n"); + printf("Exact type match not found for type code %lx; assigning type code for\n'Linux/Windows data'\n", + ID); } // if (!found) return theGUID; } // PartTypes::IDToGUID() |