* Ask for a partition name for initialization only, if the disk system
supports names. * Finished interface for creating partitions. * Cosmetic changes. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22468 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
9d337ccc01
commit
2e3d6b83ca
@ -6,6 +6,7 @@
|
||||
* Ingo Weinhold <bonefish@cs.tu-berlin.de>
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -118,12 +119,15 @@ public:
|
||||
printf("%s read only: %d\n", prefix, partition->IsReadOnly());
|
||||
printf("%s mounted: %d\n", prefix, partition->IsMounted());
|
||||
printf("%s flags: %lx\n", prefix, partition->Flags());
|
||||
printf("%s name: `%s'\n", prefix, partition->Name());
|
||||
printf("%s name: \"%s\"\n", prefix, partition->Name());
|
||||
printf("%s content name: \"%s\"\n", prefix,
|
||||
partition->ContentName());
|
||||
printf("%s type: \"%s\"\n", prefix, partition->Type());
|
||||
printf("%s content type: \"%s\"\n", prefix,
|
||||
partition->ContentType());
|
||||
printf("%s params: \"%s\"\n", prefix, partition->Parameters());
|
||||
printf("%s content params: \"%s\"\n", prefix,
|
||||
partition->ContentParameters());
|
||||
// volume, icon,...
|
||||
return false;
|
||||
}
|
||||
@ -262,7 +266,7 @@ public:
|
||||
// main input loop
|
||||
while (true) {
|
||||
BString line;
|
||||
if (!_ReadLine("> ", line))
|
||||
if (!_ReadLine("party> ", line))
|
||||
return;
|
||||
|
||||
if (line == "") {
|
||||
@ -361,25 +365,20 @@ private:
|
||||
printf("\n");
|
||||
|
||||
// get the disk system
|
||||
BDiskSystem* diskSystem = NULL;
|
||||
int64 diskSystemIndex;
|
||||
do {
|
||||
_ReadNumber("disk system index [-1 to abort]: ", diskSystemIndex);
|
||||
if (diskSystemIndex < 0)
|
||||
return;
|
||||
|
||||
diskSystem = diskSystems.ItemAt(diskSystemIndex);
|
||||
if (!diskSystem)
|
||||
printf("invalid index\n");
|
||||
} while (!diskSystem);
|
||||
if (!_ReadNumber("disk system index [-1 to abort]: ", 0,
|
||||
diskSystems.CountItems() - 1, -1, "invalid index",
|
||||
diskSystemIndex)) {
|
||||
return;
|
||||
}
|
||||
BDiskSystem* diskSystem = diskSystems.ItemAt(diskSystemIndex);
|
||||
|
||||
bool supportsName = diskSystem->SupportsContentName();
|
||||
BString name;
|
||||
BString parameters;
|
||||
while (true) {
|
||||
// let the user enter name and parameters
|
||||
// TODO: Obviously we should be able to check whether the disk system supports
|
||||
// naming at all.
|
||||
if (!_ReadLine("partition name: ", name)
|
||||
if (supportsName && !_ReadLine("partition name: ", name)
|
||||
|| !_ReadLine("partition parameters: ", parameters)) {
|
||||
return;
|
||||
}
|
||||
@ -387,15 +386,16 @@ private:
|
||||
// validate parameters
|
||||
char validatedName[B_OS_NAME_LENGTH];
|
||||
strlcpy(validatedName, name.String(), sizeof(validatedName));
|
||||
if (partition->ValidateInitialize(diskSystem->Name(), validatedName,
|
||||
parameters.String()) != B_OK) {
|
||||
if (partition->ValidateInitialize(diskSystem->Name(),
|
||||
supportsName ? validatedName : NULL, parameters.String())
|
||||
!= B_OK) {
|
||||
printf("Validation of the given values failed. Sorry, can't "
|
||||
"continue.");
|
||||
"continue.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// did the disk system change the name?
|
||||
if (name == validatedName) {
|
||||
if (!supportsName || name == validatedName) {
|
||||
printf("Everything looks dandy.\n");
|
||||
} else {
|
||||
printf("The disk system adjusted the file name to \"%s\".\n",
|
||||
@ -408,8 +408,7 @@ private:
|
||||
bool changeParameters = false;
|
||||
while (true) {
|
||||
BString line;
|
||||
_ReadLine("Everything looks dandy. [c]ontinue, change "
|
||||
"[p]arameters, or [a]bort? ", line);
|
||||
_ReadLine("[c]ontinue, change [p]arameters, or [a]bort? ", line);
|
||||
if (line == "a")
|
||||
return;
|
||||
if (line == "p") {
|
||||
@ -428,7 +427,7 @@ private:
|
||||
|
||||
// initialize
|
||||
status_t error = partition->Initialize(diskSystem->Name(),
|
||||
name.String(), parameters.String());
|
||||
supportsName ? name.String() : NULL, parameters.String());
|
||||
if (error != B_OK)
|
||||
printf("Initialization failed: %s\n", strerror(error));
|
||||
}
|
||||
@ -472,7 +471,7 @@ private:
|
||||
|
||||
// get supported types
|
||||
BObjectList<BString> supportedTypes(20, true);
|
||||
char typeBuffer[B_OS_NAME_LENGTH];
|
||||
char typeBuffer[B_DISK_DEVICE_TYPE_LENGTH];
|
||||
int32 cookie = 0;
|
||||
while (diskSystem.GetNextSupportedType(partition, &cookie, typeBuffer)
|
||||
== B_OK) {
|
||||
@ -501,6 +500,23 @@ private:
|
||||
return;
|
||||
}
|
||||
|
||||
// let the user select the partition type, if there's more than one
|
||||
int64 typeIndex = 0;
|
||||
int32 supportedTypesCount = supportedTypes.CountItems();
|
||||
if (supportedTypesCount > 1) {
|
||||
// list them
|
||||
printf("Possible partition types:\n");
|
||||
for (int32 i = 0; i < supportedTypesCount; i++)
|
||||
printf("%2ld %s\n", i, supportedTypes.ItemAt(i)->String());
|
||||
|
||||
if (!_ReadNumber("supported type index [-1 to abort]: ", 0,
|
||||
supportedTypesCount - 1, -1, "invalid index", typeIndex)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const char* type = supportedTypes.ItemAt(typeIndex)->String();
|
||||
|
||||
// list partitionable spaces
|
||||
printf("Unused regions where the new partition could be created:\n");
|
||||
for (int32 i = 0; i < spacesCount; i++) {
|
||||
@ -510,11 +526,117 @@ private:
|
||||
BString offset, size;
|
||||
get_size_string(_offset, offset);
|
||||
get_size_string(_size, size);
|
||||
printf("%2ld start: %8s, size: %8s", i, offset.String(),
|
||||
printf("%2ld start: %8s, size: %8s\n", i, offset.String(),
|
||||
size.String());
|
||||
}
|
||||
|
||||
// TODO:...
|
||||
// let the user select the partitionable space, if there's more than one
|
||||
int64 spaceIndex = 0;
|
||||
if (spacesCount > 1) {
|
||||
if (!_ReadNumber("unused region index [-1 to abort]: ", 0,
|
||||
spacesCount - 1, -1, "invalid index", spaceIndex)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
off_t spaceOffset;
|
||||
off_t spaceSize;
|
||||
partitioningInfo.GetPartitionableSpaceAt(spaceIndex, &spaceOffset,
|
||||
&spaceSize);
|
||||
|
||||
off_t start;
|
||||
off_t size;
|
||||
BString parameters;
|
||||
while (true) {
|
||||
// let the user enter start, size, and parameters
|
||||
|
||||
// start
|
||||
while (true) {
|
||||
BString spaceOffsetString;
|
||||
get_size_string(spaceOffset, spaceOffsetString);
|
||||
BString prompt("partition start [default: ");
|
||||
prompt << spaceOffsetString << "]: ";
|
||||
if (!_ReadSize(prompt.String(), spaceOffset, start))
|
||||
return;
|
||||
|
||||
if (start >= spaceOffset && start <= spaceOffset + spaceSize)
|
||||
break;
|
||||
|
||||
printf("invalid partition start\n");
|
||||
}
|
||||
|
||||
// size
|
||||
off_t maxSize = spaceOffset + spaceSize - start;
|
||||
while (true) {
|
||||
BString maxSizeString;
|
||||
get_size_string(maxSize, maxSizeString);
|
||||
BString prompt("partition size [default: ");
|
||||
prompt << maxSizeString << "]: ";
|
||||
if (!_ReadSize(prompt.String(), maxSize, size))
|
||||
return;
|
||||
|
||||
if (size >= 0 && start + size <= spaceOffset + spaceSize)
|
||||
break;
|
||||
|
||||
printf("invalid partition size\n");
|
||||
}
|
||||
|
||||
// parameters
|
||||
if (!_ReadLine("partition parameters: ", parameters))
|
||||
return;
|
||||
|
||||
// validate parameters
|
||||
off_t validatedStart = start;
|
||||
off_t validatedSize = size;
|
||||
if (partition->ValidateCreateChild(&start, &size, type,
|
||||
parameters.String()) != B_OK) {
|
||||
printf("Validation of the given values failed. Sorry, can't "
|
||||
"continue.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
// did the disk system change offset or size?
|
||||
if (validatedStart == start && validatedSize == size) {
|
||||
printf("Everything looks dandy.\n");
|
||||
} else {
|
||||
BString startString, sizeString;
|
||||
get_size_string(validatedStart, startString);
|
||||
get_size_string(validatedSize, sizeString);
|
||||
printf("The disk system adjusted the partition start and "
|
||||
"size to %lld (%s) and %lld (%s).\n",
|
||||
validatedStart, startString.String(), validatedSize,
|
||||
sizeString.String());
|
||||
start = validatedStart;
|
||||
size = validatedSize;
|
||||
}
|
||||
|
||||
// let the user decide whether to continue, change parameters, or
|
||||
// abort
|
||||
bool changeParameters = false;
|
||||
while (true) {
|
||||
BString line;
|
||||
_ReadLine("[c]ontinue, change [p]arameters, or [a]bort? ", line);
|
||||
if (line == "a")
|
||||
return;
|
||||
if (line == "p") {
|
||||
changeParameters = true;
|
||||
break;
|
||||
}
|
||||
if (line == "c")
|
||||
break;
|
||||
|
||||
printf("invalid input\n");
|
||||
}
|
||||
|
||||
if (!changeParameters)
|
||||
break;
|
||||
}
|
||||
|
||||
// create child
|
||||
error = partition->CreateChild(start, size, type,
|
||||
parameters.String());
|
||||
if (error != B_OK)
|
||||
printf("Creating the partiiton failed: %s\n", strerror(error));
|
||||
}
|
||||
|
||||
void _WriteChanges()
|
||||
@ -554,11 +676,12 @@ private:
|
||||
}
|
||||
|
||||
// otherwise let the user select
|
||||
_PrintPartitionsShort();
|
||||
|
||||
partition = NULL;
|
||||
int64 partitionIndex;
|
||||
while (true) {
|
||||
_ReadNumber(prompt, partitionIndex);
|
||||
if (partitionIndex < 0)
|
||||
if (!_ReadNumber(prompt, partitionIndex) || partitionIndex < 0)
|
||||
return false;
|
||||
|
||||
FindPartitionByIndexVisitor visitor(partitionIndex);
|
||||
@ -606,6 +729,100 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
bool _ReadNumber(const char* prompt, int64 minNumber, int64 maxNumber,
|
||||
int64 abortNumber, const char* invalidNumberMessage, int64& number)
|
||||
{
|
||||
while (true) {
|
||||
BString line;
|
||||
if (!_ReadLine(prompt, line))
|
||||
return false;
|
||||
|
||||
char buffer[256];
|
||||
if (sscanf(line.String(), "%lld%s", &number, buffer) != 1) {
|
||||
printf("invalid input\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (number == abortNumber)
|
||||
return false;
|
||||
|
||||
if (number >= minNumber && number <= maxNumber)
|
||||
return true;
|
||||
|
||||
puts(invalidNumberMessage);
|
||||
}
|
||||
}
|
||||
|
||||
bool _ReadSize(const char* prompt, off_t defaultValue, off_t& size)
|
||||
{
|
||||
while (true) {
|
||||
BString _line;
|
||||
if (!_ReadLine(prompt, _line))
|
||||
return false;
|
||||
const char* line = _line.String();
|
||||
|
||||
// skip whitespace
|
||||
while (isspace(*line))
|
||||
line++;
|
||||
|
||||
if (*line == '\0') {
|
||||
size = defaultValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
// get the number
|
||||
int32 endIndex = 0;
|
||||
while (isdigit(line[endIndex]))
|
||||
endIndex++;
|
||||
|
||||
if (endIndex == 0) {
|
||||
printf("invalid input\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
size = atoll(BString(line, endIndex).String());
|
||||
|
||||
// skip whitespace
|
||||
line += endIndex;
|
||||
while (isspace(*line))
|
||||
line++;
|
||||
|
||||
// get the size modifier
|
||||
if (*line != '\0') {
|
||||
switch (*line) {
|
||||
case 'K':
|
||||
size *= 1024;
|
||||
break;
|
||||
case 'M':
|
||||
size *= 1024 * 1024;
|
||||
break;
|
||||
case 'G':
|
||||
size *= 1024LL * 1024 * 1024;
|
||||
break;
|
||||
case 'T':
|
||||
size *= 1024LL * 1024 * 1024 * 1024;
|
||||
break;
|
||||
default:
|
||||
line--;
|
||||
}
|
||||
|
||||
line++;
|
||||
}
|
||||
|
||||
if (*line == 'B')
|
||||
line++;
|
||||
|
||||
// skip whitespace
|
||||
while (isspace(*line))
|
||||
line++;
|
||||
|
||||
if (*line == '\0')
|
||||
return true;
|
||||
|
||||
printf("invalid input\n");
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
BDiskDevice* fDevice;
|
||||
bool fPrepared;
|
||||
|
Loading…
x
Reference in New Issue
Block a user