You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.7 KiB
100 lines
2.7 KiB
// sgdisk.cc
|
|
// Command-line-based version of gdisk. This program is named after sfdisk,
|
|
// and it can serve a similar role (easily scripted, etc.), but it's used
|
|
// strictly via command-line arguments, and it doesn't bear much resemblance
|
|
// to sfdisk in actual use.
|
|
//
|
|
// by Rod Smith, project began February 2009; sgdisk begun January 2010.
|
|
|
|
/* This program is copyright (c) 2009-2011 by Roderick W. Smith. It is distributed
|
|
under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
|
|
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <string.h>
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
#include <errno.h>
|
|
#include "gptcl.h"
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
|
|
using namespace std;
|
|
|
|
#define MAX_OPTIONS 50
|
|
|
|
/*
|
|
* Dump partition details in a machine readable format:
|
|
*
|
|
* DISK [mbr|gpt] [guid]
|
|
* PART [n] [type] [guid]
|
|
*/
|
|
static int android_dump(char* device) {
|
|
BasicMBRData mbrData;
|
|
GPTData gptData;
|
|
GPTPart partData;
|
|
int numParts = 0;
|
|
stringstream res;
|
|
|
|
/* Silence noisy underlying library */
|
|
int stdout = dup(STDOUT_FILENO);
|
|
int silence = open("/dev/null", 0);
|
|
dup2(silence, STDOUT_FILENO);
|
|
dup2(silence, STDERR_FILENO);
|
|
|
|
if (!mbrData.ReadMBRData((string) device)) {
|
|
cerr << "Failed to read MBR" << endl;
|
|
return 8;
|
|
}
|
|
|
|
switch (mbrData.GetValidity()) {
|
|
case mbr:
|
|
res << "DISK mbr" << endl;
|
|
for (int i = 0; i < MAX_MBR_PARTS; i++) {
|
|
if (mbrData.GetLength(i) > 0) {
|
|
res << "PART " << (i + 1) << " " << hex
|
|
<< (int) mbrData.GetType(i) << dec << endl;
|
|
}
|
|
}
|
|
break;
|
|
case gpt:
|
|
gptData.JustLooking();
|
|
if (!gptData.LoadPartitions((string) device)) {
|
|
cerr << "Failed to read GPT" << endl;
|
|
return 9;
|
|
}
|
|
|
|
res << "DISK gpt " << gptData.GetDiskGUID() << endl;
|
|
numParts = gptData.GetNumParts();
|
|
for (int i = 0; i < numParts; i++) {
|
|
partData = gptData[i];
|
|
if (partData.GetFirstLBA() > 0) {
|
|
res << "PART " << (i + 1) << " " << partData.GetType() << " "
|
|
<< partData.GetUniqueGUID() << " "
|
|
<< partData.GetDescription() << endl;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
cerr << "Unknown partition table" << endl;
|
|
return 10;
|
|
}
|
|
|
|
/* Write our actual output */
|
|
string resString = res.str();
|
|
write(stdout, resString.c_str(), resString.length());
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
for (int i = 0; i < argc; i++) {
|
|
if (!strcmp("--android-dump", argv[i])) {
|
|
return android_dump(argv[i + 1]);
|
|
}
|
|
}
|
|
|
|
GPTDataCL theGPT;
|
|
return theGPT.DoOptions(argc, argv);
|
|
}
|