/*
 * Copyright 2012 Aleksas Pantechovskis, <alexp.frl@gmail.com>
 * All rights reserved. Distributed under the terms of the MIT License.
 */
 
#include <fstream>
#include <iostream>
#include <sstream>
#include <string.h>
#include <string>
 
#include <Debug.h>
#include <DiskDevice.h>
#include <DiskDeviceRoster.h>
#include <Path.h>
#include <Volume.h>
#include <VolumeRoster.h>
 
#include "MBR.h"
 
 
using namespace std;
 
const char* kUsageMessage = \
	"Usage: writembr [ device ] \n"
	"#\tRewrites the MBR for the specified device.\n"
	"#\tIf no device is specified, the boot device is used.\n"
	"#\t--help shows this usage message\n";
 
 
int
main(int argc, char** argv)
{
	if ((argc == 2 && strcmp(argv[1], "--help") == 0) || argc > 2) {
		cerr << kUsageMessage;
		return B_ERROR;
	}
 
	BPath device;
 
	if (argc == 2)
		// user specified device for rewriting
		device.SetTo(argv[1]);
 
	else if (argc == 1) {
		// no parameters specified, rewrite boot device
		BVolumeRoster volumeRoster;
		BVolume bootVolume;
		if (volumeRoster.GetBootVolume(&bootVolume) != B_OK) {
			cerr << "Can not find boot device" << endl;
			return B_ERROR;
		}
 
		BDiskDeviceRoster roster;
		BDiskDevice bootDevice;
		if(roster.FindPartitionByVolume(bootVolume, &bootDevice, NULL) != B_OK) {
			cerr << "Can not find boot device" << endl;
			return B_ERROR;
		}
 
		bootDevice.GetPath(&device);
	}
 
 
	if (strcmp(device.Leaf(), "raw") != 0) {
		cerr << device.Path() << " is not a raw device" << endl;
		return B_ERROR;
	}
 
	fstream fs;
	fs.open(device.Path(), fstream::in | fstream::out | fstream::binary);
	if (!fs.is_open()) {
		cerr << "Can't open " << device.Path() << endl;
		return B_ERROR;
	}
 
	STATIC_ASSERT(kMBRSize == 512);
 
	unsigned char MBR[kMBRSize];
	fs.read((char*)MBR, kMBRSize);
	if (fs.fail() || fs.gcount() < kMBRSize ) {
		cerr << "Cannot read " << kMBRSize
			<< " bytes from " << device.Path() << endl;
		fs.close();
		return B_ERROR;
	}
 
	// update only the code area and the MBR signature
	memcpy(MBR, kMBR, 0x1be);
	MBR[0x1FE] = kMBR[0x1FE];
	MBR[0x1FF] = kMBR[0x1FF];
 
	cerr << "About to overwrite the MBR boot code on " << device.Path()
		<< "\nThis may disable any partition managers you have installed.\n"
		<< "Are you sure you want to continue?\nyes/[no]: ";
 
	string choice;
	getline(cin, choice, '\n');
	if (choice == "no" || choice == "" || choice != "yes") {
		cerr << "MBR was NOT written" << endl;
		fs.close();
		return B_ERROR;
	}
			
	cerr << "Rewriting MBR for " << device.Path() << endl;
		
	fs.seekg(0, ios::beg);
	fs.write((char*)MBR, kMBRSize);
	if (fs.fail()) {
		cerr << "Cannot write " << kMBRSize
			<< " bytes to " << device.Path() << endl;
		fs.close();
		return B_ERROR;
	}
 
	fs.close();
 
	cerr << "MBR was written OK" << endl;
	return B_OK;
}
 

V590 Consider inspecting this expression. The expression is excessive or contains a misprint.