1/*
2    MBRPart class, part of GPT fdisk program family.
3    Copyright (C) 2011  Roderick W. Smith
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2 of the License, or
8    (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License along
16    with this program; if not, write to the Free Software Foundation, Inc.,
17    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19
20#ifndef MBRPART_H
21#define MBRPART_H
22
23#include <stdint.h>
24
25#define MAX_HEADS 255        /* numbered 0 - 254 */
26#define MAX_SECSPERTRACK 63  /* numbered 1 - 63 */
27#define MAX_CYLINDERS 1024   /* numbered 0 - 1023 */
28
29#define NONE 0    /* don't include partition when writing */
30#define PRIMARY 1 /* write partition as primary */
31#define LOGICAL 2 /* write partition as logical */
32#define EBR 4     /* sector is used as an EBR or MBR */
33#define INVALID 8 /* sector number is too large for disk */
34
35using namespace std;
36
37// Data for a single MBR partition record
38// Note that firstSector and lastSector are in CHS addressing, which
39// splits the bits up in a weird way.
40// On read or write of MBR entries, firstLBA is an absolute disk sector.
41// On read of logical entries, it's relative to the EBR record for that
42// partition. When writing EBR records, it's relative to the extended
43// partition's start.
44#pragma pack(1)
45struct MBRRecord {
46   uint8_t status;
47   uint8_t firstSector[3];
48   uint8_t partitionType;
49   uint8_t lastSector[3];
50   uint32_t firstLBA; // see above
51   uint32_t lengthLBA;
52}; // struct MBRRecord
53
54class MBRPart {
55protected:
56   uint8_t status;
57   uint8_t firstSector[3];
58   uint8_t partitionType;
59   uint8_t lastSector[3];
60   uint32_t firstLBA; // see above
61   uint32_t lengthLBA;
62   int includeAs; // PRIMARY, LOGICAL, or NONE
63   int canBeLogical;
64   int canBePrimary;
65   static uint32_t numHeads;
66   static uint32_t numSecspTrack;
67   static uint64_t diskSize;
68   static uint32_t blockSize;
69   static int numInstances;
70
71public:
72    MBRPart();
73    MBRPart(const MBRPart& other);
74    virtual ~MBRPart();
75    virtual MBRPart& operator=(const MBRPart& orig);
76    virtual MBRPart& operator=(const struct MBRRecord& orig);
77    bool operator<(const MBRPart &other) const;
78
79    // Set information on partitions or disks...
80    void SetGeometry(uint32_t heads, uint32_t sectors, uint64_t ds, uint32_t bs);
81    void Empty(void);
82    void SetStartLBA(uint64_t s);
83    void SetLengthLBA(uint64_t l);
84    void SetLocation(uint64_t start, uint64_t length);
85    int SetType(uint8_t typeCode, int isExtended = 0);
86    void SetStatus(uint8_t s) {status = s;}
87    void SetInclusion(int status = PRIMARY) {includeAs = status;}
88    void SetCanBeLogical(int c) {canBeLogical = c;}
89    void SetCanBePrimary(int c) {canBePrimary = c;}
90    void StoreInStruct(struct MBRRecord *theStruct);
91
92    // Get information on partitions or disk....
93    uint8_t GetType(void) {return partitionType;}
94    uint8_t GetStatus(void) {return status;}
95    uint64_t GetStartLBA(void) {return firstLBA;}
96    uint64_t GetLengthLBA(void) {return lengthLBA;}
97    uint64_t GetLastLBA(void) const;
98    uint8_t GetInclusion(void) {return includeAs;}
99    int CanBeLogical(void) {return canBeLogical;}
100    int CanBePrimary(void) {return canBePrimary;}
101    int DoTheyOverlap (const MBRPart& other);
102
103    // Adjust information on partitions or disks...
104    int RecomputeCHS(void);
105    int LBAtoCHS(uint32_t lba, uint8_t * chs);
106    void ReverseByteOrder(void);
107
108    // User I/O...
109    void ShowData(int isGpt);
110}; // MBRPart
111
112#endif // MBRPART_H
113