* Allow NULL name argument on initialization.

* Some code beautification on the way.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22454 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2007-10-05 23:25:58 +00:00
parent d6e565c76b
commit aa4d8ee6ee
5 changed files with 115 additions and 86 deletions

View File

@ -980,11 +980,11 @@ status_t
BPartition::ValidateInitialize(const char *diskSystem, char *name, BPartition::ValidateInitialize(const char *diskSystem, char *name,
const char *parameters) const char *parameters)
{ {
if (!fPartitionData || !_IsShadow() || !diskSystem || !name) if (!fPartitionData || !_IsShadow() || !diskSystem)
return B_BAD_VALUE; return B_BAD_VALUE;
return _kern_validate_initialize_partition(_ShadowID(), _ChangeCounter(), return _kern_validate_initialize_partition(_ShadowID(), _ChangeCounter(),
diskSystem, name, parameters, diskSystem, name, parameters,
(parameters ? strlen(parameters)+1 : 0)); (parameters ? strlen(parameters) + 1 : 0));
} }
// Initialize // Initialize
@ -992,11 +992,11 @@ status_t
BPartition::Initialize(const char *diskSystem, const char *name, BPartition::Initialize(const char *diskSystem, const char *name,
const char *parameters) const char *parameters)
{ {
if (!fPartitionData || !_IsShadow() || !diskSystem || !name) if (!fPartitionData || !_IsShadow() || !diskSystem)
return B_BAD_VALUE; return B_BAD_VALUE;
status_t error = _kern_initialize_partition(_ShadowID(), _ChangeCounter(), status_t error = _kern_initialize_partition(_ShadowID(), _ChangeCounter(),
diskSystem, name, parameters, diskSystem, name, parameters,
(parameters ? strlen(parameters)+1 : 0)); (parameters ? strlen(parameters) + 1 : 0));
if (error == B_OK) if (error == B_OK)
error = Device()->Update(); error = Device()->Update();
return error; return error;

View File

@ -165,9 +165,9 @@ bool
KFileSystem::ValidateInitialize(KPartition *partition, char *name, KFileSystem::ValidateInitialize(KPartition *partition, char *name,
const char *parameters) const char *parameters)
{ {
return (partition && name && fModule && fModule->validate_initialize return (partition && fModule && fModule->validate_initialize
&& fModule->validate_initialize(partition->PartitionData(), name, && fModule->validate_initialize(partition->PartitionData(), name,
parameters)); parameters));
} }

View File

@ -314,7 +314,7 @@ bool
KPartitioningSystem::ValidateInitialize(KPartition *partition, char *name, KPartitioningSystem::ValidateInitialize(KPartition *partition, char *name,
const char *parameters) const char *parameters)
{ {
return (partition && name && fModule && fModule->validate_initialize return (partition && fModule && fModule->validate_initialize
&& fModule->validate_initialize(partition->PartitionData(), name, && fModule->validate_initialize(partition->PartitionData(), name,
parameters)); parameters));
} }
@ -788,7 +788,7 @@ KPartitioningSystem::Initialize(KPartition *partition, const char *name,
const char *parameters, KDiskDeviceJob *job) const char *parameters, KDiskDeviceJob *job)
{ {
// check parameters // check parameters
if (!partition || !job || !name /*|| !parameters*/) if (!partition || !job /*|| !parameters*/)
return B_BAD_VALUE; return B_BAD_VALUE;
if (!fModule->initialize) if (!fModule->initialize)
return B_ENTRY_NOT_FOUND; return B_ENTRY_NOT_FOUND;

View File

@ -401,20 +401,25 @@ BPrivate::DiskDevice::validate_initialize_partition(KPartition *partition,
int32 changeCounter, const char *diskSystemName, char *name, int32 changeCounter, const char *diskSystemName, char *name,
const char *parameters, bool requireShadow) const char *parameters, bool requireShadow)
{ {
if (!partition || !diskSystemName || !name) if (!partition || !diskSystemName)
return B_BAD_VALUE; return B_BAD_VALUE;
// truncate name to maximal size // truncate name to maximal size
name[B_OS_NAME_LENGTH] = '\0'; if (name)
name[B_OS_NAME_LENGTH] = '\0';
// check the partition // check the partition
status_t error = check_partition(partition, changeCounter, requireShadow); status_t error = check_partition(partition, changeCounter, requireShadow);
if (error != B_OK) if (error != B_OK)
return error; return error;
// get the disk system // get the disk system
KDiskDeviceManager *manager = KDiskDeviceManager::Default(); KDiskDeviceManager *manager = KDiskDeviceManager::Default();
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName); KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
if (!diskSystem) if (!diskSystem)
return B_ENTRY_NOT_FOUND; return B_ENTRY_NOT_FOUND;
DiskSystemLoader loader(diskSystem, true); DiskSystemLoader loader(diskSystem, true);
// get the info // get the info
if (diskSystem->ValidateInitialize(partition, name, parameters)) if (diskSystem->ValidateInitialize(partition, name, parameters))
return B_OK; return B_OK;

View File

@ -1022,40 +1022,52 @@ _user_validate_initialize_partition(partition_id partitionID,
int32 changeCounter, const char *_diskSystemName, char *_name, int32 changeCounter, const char *_diskSystemName, char *_name,
const char *_parameters, size_t parametersSize) const char *_parameters, size_t parametersSize)
{ {
if (!_diskSystemName || !_name if (!_diskSystemName || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|| parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE) {
return B_BAD_VALUE; return B_BAD_VALUE;
}
// copy disk system name
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH]; char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
char name[B_DISK_DEVICE_NAME_LENGTH];
char *parameters = NULL;
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName, status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
B_DISK_SYSTEM_NAME_LENGTH); B_DISK_SYSTEM_NAME_LENGTH);
if (!error)
// copy name
char name[B_DISK_DEVICE_NAME_LENGTH];
if (!error && _name)
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH, true); error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH, true);
if (error)
if (error != B_OK)
return error; return error;
// copy parameters
char *parameters = NULL;
MemoryDeleter parameterDeleter;
if (_parameters) { if (_parameters) {
parameters = static_cast<char*>(malloc(parametersSize)); parameters = static_cast<char*>(malloc(parametersSize));
if (parameters) if (!parameters)
user_memcpy(parameters, _parameters, parametersSize);
else
return B_NO_MEMORY; return B_NO_MEMORY;
parameterDeleter.SetTo(parameters);
if (user_memcpy(parameters, _parameters, parametersSize) != B_OK)
return B_BAD_ADDRESS;
} }
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
// get the partition // get the partition
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
KPartition *partition = manager->ReadLockPartition(partitionID); KPartition *partition = manager->ReadLockPartition(partitionID);
error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND; if (!partition)
if (!error) { return B_ENTRY_NOT_FOUND;
PartitionRegistrar registrar1(partition, true);
PartitionRegistrar registrar2(partition->Device(), true); // validate
DeviceReadLocker locker(partition->Device(), true); PartitionRegistrar registrar1(partition, true);
error = validate_initialize_partition(partition, changeCounter, PartitionRegistrar registrar2(partition->Device(), true);
diskSystemName, name, parameters); DeviceReadLocker locker(partition->Device(), true);
} error = validate_initialize_partition(partition, changeCounter,
if (!error) diskSystemName, _name ? name : NULL, parameters);
// copy back the modified name
if (!error && _name)
error = ddm_strlcpy(_name, name, B_DISK_DEVICE_NAME_LENGTH); error = ddm_strlcpy(_name, name, B_DISK_DEVICE_NAME_LENGTH);
free(parameters);
return error; return error;
} }
@ -1591,71 +1603,83 @@ _user_initialize_partition(partition_id partitionID, int32 changeCounter,
const char *_diskSystemName, const char *_name, const char *_parameters, const char *_diskSystemName, const char *_name, const char *_parameters,
size_t parametersSize) size_t parametersSize)
{ {
if (!_diskSystemName || !_name if (!_diskSystemName || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|| parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE) {
return B_BAD_VALUE; return B_BAD_VALUE;
}
// copy disk system name
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH]; char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
char name[B_DISK_DEVICE_NAME_LENGTH];
char *parameters = NULL;
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName, status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
B_DISK_SYSTEM_NAME_LENGTH); B_DISK_SYSTEM_NAME_LENGTH);
if (!error)
// copy name
char name[B_DISK_DEVICE_NAME_LENGTH];
if (!error && _name)
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH); error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
if (error) if (error)
return error; return error;
// copy parameters
MemoryDeleter parameterDeleter;
char *parameters = NULL;
if (_parameters) { if (_parameters) {
parameters = static_cast<char*>(malloc(parametersSize)); parameters = static_cast<char*>(malloc(parametersSize));
if (parameters) if (!parameters)
user_memcpy(parameters, _parameters, parametersSize);
else
return B_NO_MEMORY; return B_NO_MEMORY;
parameterDeleter.SetTo(parameters);
if (user_memcpy(parameters, _parameters, parametersSize) != B_OK)
return B_BAD_ADDRESS;
} }
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
// get the partition // get the partition
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
KPartition *partition = manager->WriteLockPartition(partitionID); KPartition *partition = manager->WriteLockPartition(partitionID);
error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND; if (!partition)
if (!error) { return B_ENTRY_NOT_FOUND;
PartitionRegistrar registrar1(partition, true);
PartitionRegistrar registrar2(partition->Device(), true); PartitionRegistrar registrar1(partition, true);
DeviceWriteLocker locker(partition->Device(), true); PartitionRegistrar registrar2(partition->Device(), true);
// get the disk system DeviceWriteLocker locker(partition->Device(), true);
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
error = diskSystem ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND; // get the disk system
if (!error) { KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
DiskSystemLoader loader(diskSystem, true); if (!diskSystem)
// check parameters return B_ENTRY_NOT_FOUND;
char proposedName[B_DISK_DEVICE_NAME_LENGTH]; DiskSystemLoader loader(diskSystem, true);
strcpy(proposedName, name);
error = validate_initialize_partition(partition, changeCounter, // check parameters
diskSystemName, proposedName, parameters); char proposedName[B_DISK_DEVICE_NAME_LENGTH];
if (!error) { if (_name)
error = !strcmp(name, proposedName) ? B_OK : B_BAD_VALUE; strcpy(proposedName, name);
}
if (!error) { error = validate_initialize_partition(partition, changeCounter,
// unitialize the partition's contents and set the new diskSystemName, _name ? proposedName : NULL, parameters);
// parameters if (error != B_OK)
error = partition->UninitializeContents(true); return error;
} if (_name && strcmp(name, proposedName) != 0)
if (!error) { return B_BAD_VALUE;
partition->SetDiskSystem(diskSystem);
error = partition->SetContentName(name); // unitialize the partition's contents and set the new
} // parameters
if (!error) { if ((error = partition->UninitializeContents(true)) != B_OK)
partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME); return error;
error = partition->SetContentParameters(parameters);
} partition->SetDiskSystem(diskSystem);
if (!error) {
partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS); if ((error = partition->SetContentName(_name ? name : NULL)) != B_OK)
partition->Changed(B_PARTITION_CHANGED_INITIALIZATION); return error;
// implicit content disk system changes partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME);
error = partition->DiskSystem()->ShadowPartitionChanged(
partition, B_PARTITION_INITIALIZE); if ((error = partition->SetContentParameters(parameters)) != B_OK)
} return error;
} partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS);
}
free(parameters); partition->Changed(B_PARTITION_CHANGED_INITIALIZATION);
return error;
// implicit content disk system changes
return partition->DiskSystem()->ShadowPartitionChanged(
partition, B_PARTITION_INITIALIZE);
} }