xref: /aosp_15_r20/external/gptfdisk/sgdisk.cc (revision 57696d54d05c64fd1b1787f8371dbcf104911cfb)
1*57696d54SAkhilesh Sanikop // sgdisk.cc
2*57696d54SAkhilesh Sanikop // Command-line-based version of gdisk. This program is named after sfdisk,
3*57696d54SAkhilesh Sanikop // and it can serve a similar role (easily scripted, etc.), but it's used
4*57696d54SAkhilesh Sanikop // strictly via command-line arguments, and it doesn't bear much resemblance
5*57696d54SAkhilesh Sanikop // to sfdisk in actual use.
6*57696d54SAkhilesh Sanikop //
7*57696d54SAkhilesh Sanikop // by Rod Smith, project began February 2009; sgdisk begun January 2010.
8*57696d54SAkhilesh Sanikop 
9*57696d54SAkhilesh Sanikop /* This program is copyright (c) 2009-2011 by Roderick W. Smith. It is distributed
10*57696d54SAkhilesh Sanikop   under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
11*57696d54SAkhilesh Sanikop 
12*57696d54SAkhilesh Sanikop #include <iostream>
13*57696d54SAkhilesh Sanikop #include <fstream>
14*57696d54SAkhilesh Sanikop #include <string.h>
15*57696d54SAkhilesh Sanikop #include <string>
16*57696d54SAkhilesh Sanikop #include <iostream>
17*57696d54SAkhilesh Sanikop #include <sstream>
18*57696d54SAkhilesh Sanikop #include <errno.h>
19*57696d54SAkhilesh Sanikop #include "gptcl.h"
20*57696d54SAkhilesh Sanikop #include <fcntl.h>
21*57696d54SAkhilesh Sanikop #include <unistd.h>
22*57696d54SAkhilesh Sanikop 
23*57696d54SAkhilesh Sanikop using namespace std;
24*57696d54SAkhilesh Sanikop 
25*57696d54SAkhilesh Sanikop #define MAX_OPTIONS 50
26*57696d54SAkhilesh Sanikop 
27*57696d54SAkhilesh Sanikop /*
28*57696d54SAkhilesh Sanikop  * Dump partition details in a machine readable format:
29*57696d54SAkhilesh Sanikop  *
30*57696d54SAkhilesh Sanikop  * DISK [mbr|gpt] [guid]
31*57696d54SAkhilesh Sanikop  * PART [n] [type] [guid]
32*57696d54SAkhilesh Sanikop  */
android_dump(char * device)33*57696d54SAkhilesh Sanikop static int android_dump(char* device) {
34*57696d54SAkhilesh Sanikop     BasicMBRData mbrData;
35*57696d54SAkhilesh Sanikop     GPTData gptData;
36*57696d54SAkhilesh Sanikop     GPTPart partData;
37*57696d54SAkhilesh Sanikop     int numParts = 0;
38*57696d54SAkhilesh Sanikop     stringstream res;
39*57696d54SAkhilesh Sanikop 
40*57696d54SAkhilesh Sanikop     /* Silence noisy underlying library */
41*57696d54SAkhilesh Sanikop     int stdout = dup(STDOUT_FILENO);
42*57696d54SAkhilesh Sanikop     int silence = open("/dev/null", 0);
43*57696d54SAkhilesh Sanikop     dup2(silence, STDOUT_FILENO);
44*57696d54SAkhilesh Sanikop     dup2(silence, STDERR_FILENO);
45*57696d54SAkhilesh Sanikop 
46*57696d54SAkhilesh Sanikop     if (!mbrData.ReadMBRData((string) device)) {
47*57696d54SAkhilesh Sanikop         cerr << "Failed to read MBR" << endl;
48*57696d54SAkhilesh Sanikop         return 8;
49*57696d54SAkhilesh Sanikop     }
50*57696d54SAkhilesh Sanikop 
51*57696d54SAkhilesh Sanikop     switch (mbrData.GetValidity()) {
52*57696d54SAkhilesh Sanikop     case mbr:
53*57696d54SAkhilesh Sanikop         res << "DISK mbr" << endl;
54*57696d54SAkhilesh Sanikop         for (int i = 0; i < MAX_MBR_PARTS; i++) {
55*57696d54SAkhilesh Sanikop             if (mbrData.GetLength(i) > 0) {
56*57696d54SAkhilesh Sanikop                 res << "PART " << (i + 1) << " " << hex
57*57696d54SAkhilesh Sanikop                         << (int) mbrData.GetType(i) << dec << endl;
58*57696d54SAkhilesh Sanikop             }
59*57696d54SAkhilesh Sanikop         }
60*57696d54SAkhilesh Sanikop         break;
61*57696d54SAkhilesh Sanikop     case hybrid:
62*57696d54SAkhilesh Sanikop     case gpt:
63*57696d54SAkhilesh Sanikop         gptData.JustLooking();
64*57696d54SAkhilesh Sanikop         if (!gptData.LoadPartitions((string) device)) {
65*57696d54SAkhilesh Sanikop             cerr << "Failed to read GPT" << endl;
66*57696d54SAkhilesh Sanikop             return 9;
67*57696d54SAkhilesh Sanikop         }
68*57696d54SAkhilesh Sanikop 
69*57696d54SAkhilesh Sanikop         res << "DISK gpt " << gptData.GetDiskGUID() << endl;
70*57696d54SAkhilesh Sanikop         numParts = gptData.GetNumParts();
71*57696d54SAkhilesh Sanikop         for (int i = 0; i < numParts; i++) {
72*57696d54SAkhilesh Sanikop             partData = gptData[i];
73*57696d54SAkhilesh Sanikop             if (partData.GetFirstLBA() > 0) {
74*57696d54SAkhilesh Sanikop                 res << "PART " << (i + 1) << " " << partData.GetType() << " "
75*57696d54SAkhilesh Sanikop                         << partData.GetUniqueGUID() << " "
76*57696d54SAkhilesh Sanikop                         << partData.GetDescription() << endl;
77*57696d54SAkhilesh Sanikop             }
78*57696d54SAkhilesh Sanikop         }
79*57696d54SAkhilesh Sanikop         break;
80*57696d54SAkhilesh Sanikop     default:
81*57696d54SAkhilesh Sanikop         cerr << "Unknown partition table" << endl;
82*57696d54SAkhilesh Sanikop         return 10;
83*57696d54SAkhilesh Sanikop     }
84*57696d54SAkhilesh Sanikop 
85*57696d54SAkhilesh Sanikop     /* Write our actual output */
86*57696d54SAkhilesh Sanikop     string resString = res.str();
87*57696d54SAkhilesh Sanikop     write(stdout, resString.c_str(), resString.length());
88*57696d54SAkhilesh Sanikop     return 0;
89*57696d54SAkhilesh Sanikop }
90*57696d54SAkhilesh Sanikop 
main(int argc,char * argv[])91*57696d54SAkhilesh Sanikop int main(int argc, char *argv[]) {
92*57696d54SAkhilesh Sanikop     for (int i = 0; i < argc; i++) {
93*57696d54SAkhilesh Sanikop         if (!strcmp("--android-dump", argv[i])) {
94*57696d54SAkhilesh Sanikop             return android_dump(argv[i + 1]);
95*57696d54SAkhilesh Sanikop         }
96*57696d54SAkhilesh Sanikop     }
97*57696d54SAkhilesh Sanikop 
98*57696d54SAkhilesh Sanikop     GPTDataCL theGPT;
99*57696d54SAkhilesh Sanikop     return theGPT.DoOptions(argc, argv);
100*57696d54SAkhilesh Sanikop }
101