// 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);
}
