Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
gptfdisk/bsd.h
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
93 lines (78 sloc)
3.68 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* bsd.h -- BSD disklabel data structure definitions, types, and functions */ | |
/* This program is copyright (c) 2009 by Roderick W. Smith. It is distributed | |
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */ | |
#include <stdint.h> | |
#include <sys/types.h> | |
#include "gptpart.h" | |
#include "diskio.h" | |
#ifndef __BSD_STRUCTS | |
#define __BSD_STRUCTS | |
#define BSD_SIGNATURE UINT32_C(0x82564557) /* BSD disklabel signature ("magic") */ | |
// BSD disklabels can start at offsets of 64 or the sector size -- at least, | |
// I *THINK* that's what's going on. I've seen them at 64 or 512 on disks | |
// with 512-byte blocks and at 2048 on disks with 2048-byte blocks. The | |
// LABEL_OFFSET2 value will be replaced by the block size in the | |
// ReadBSDData() function.... | |
#define LABEL_OFFSET1 64 | |
#define LABEL_OFFSET2 512 | |
#define NUM_OFFSETS 2 | |
// FreeBSD documents a maximum # of partitions of 8, but I saw 16 on a NetBSD | |
// disk. I'm quadrupling that for further safety. Note that BSDReadData() | |
// uses a 4096-byte I/O buffer. In combination with LABEL_OFFSET3 and the | |
// additional 148-byte offset to the actual partition data, that gives a | |
// theoretical maximum of 118.75 partitions that the program can handle before | |
// memory errors will occur. | |
#define MAX_BSD_PARTS 64 | |
using namespace std; | |
/**************************************** | |
* * | |
* BSDData class and related structures * | |
* * | |
****************************************/ | |
// Possible states of the MBR | |
enum BSDValidity {unknown, bsd_invalid, bsd}; | |
// Data for a single BSD partition record | |
// Create entries for all fields, although we only use lengthLBA, firstLBA, | |
// and fsType, to simplify loading the data from disk.... | |
struct BSDRecord { // the partition table | |
uint32_t lengthLBA; // number of sectors in partition | |
uint32_t firstLBA; // starting sector | |
uint32_t fragSize; // filesystem basic fragment size | |
uint8_t fsType; // filesystem type, see below | |
uint8_t frag; // filesystem fragments per block | |
uint16_t pcpg; // filesystem cylinders per group | |
}; | |
// Full data in tweaked BSD format | |
// For some reason this has to be packed or MS Visual C++'s debugger complains | |
// about memory errors whenever a BSDData variable is destroyed. | |
#pragma pack (8) | |
class BSDData { | |
protected: | |
// We only need a few items from the main BSD disklabel data structure.... | |
uint32_t signature; // the magic number | |
uint32_t sectorSize; // # of bytes per sector | |
uint32_t signature2; // the magic number (again) | |
uint16_t numParts; // number of partitions in table | |
struct BSDRecord* partitions; // partition array | |
// Above are basic BSD disklabel data; now add more stuff.... | |
uint64_t labelFirstLBA; // first sector of BSD disklabel (partition or disk) | |
uint64_t labelLastLBA; // final sector of BSD disklabel | |
uint64_t labelStart; // BSD disklabel start point in bytes from labelFirstLBA | |
BSDValidity state; | |
public: | |
BSDData(void); | |
~BSDData(void); | |
int ReadBSDData(const string & deviceFilename, uint64_t startSector, uint64_t endSector); | |
int ReadBSDData(DiskIO *myDisk, uint64_t startSector, uint64_t endSector); | |
void ReverseMetaBytes(void); | |
void DisplayBSDData(void); | |
int ShowState(void); // returns 1 if BSD disklabel detected | |
int IsDisklabel(void); | |
// Functions to extract data on specific partitions.... | |
uint8_t GetType(int i); | |
uint64_t GetFirstSector(int i); | |
uint64_t GetLength(int i); | |
int GetNumParts(void); | |
GPTPart AsGPT(int i); // Return BSD part. as GPT part. | |
}; // struct MBRData | |
#endif |