Put Partition and the new (private) NodeOpener class into the "boot" namespace.
Implemented Partition::Size() and Type() to stat its device. Partition::ReadAt() and WriteAt() now return B_BAD_VALUE if a position smaller than zero is provided (as Posix actually states). Partition::Scan() now provides the partitioning system modules with the correct file descriptor; it now opens itself (using the NodeOpener class) and no longer the descriptor of its device directly (resulting in wrong positioning). Debug output can be turned off now. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4632 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -15,6 +15,15 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
using namespace boot;
|
||||||
|
|
||||||
|
#define TRACE_PARTITIONS 0
|
||||||
|
#if TRACE_PARTITIONS
|
||||||
|
# define TRACE(x) printf x
|
||||||
|
#else
|
||||||
|
# define TRACE(x) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* supported partition modules */
|
/* supported partition modules */
|
||||||
|
|
||||||
@@ -50,6 +59,30 @@ static const int32 sNumFileSystemModules = sizeof(sFileSystemModules) / sizeof(f
|
|||||||
extern list gPartitions;
|
extern list gPartitions;
|
||||||
|
|
||||||
|
|
||||||
|
namespace boot {
|
||||||
|
|
||||||
|
class NodeOpener {
|
||||||
|
public:
|
||||||
|
NodeOpener(Node *node, int mode)
|
||||||
|
{
|
||||||
|
fFD = open_node(node, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
~NodeOpener()
|
||||||
|
{
|
||||||
|
close(fFD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int Descriptor() const { return fFD; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int fFD;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
Partition::Partition(int fd)
|
Partition::Partition(int fd)
|
||||||
:
|
:
|
||||||
fParent(NULL),
|
fParent(NULL),
|
||||||
@@ -76,7 +109,7 @@ Partition::ReadAt(void *cookie, off_t position, void *buffer, size_t bufferSize)
|
|||||||
if (position > this->size)
|
if (position > this->size)
|
||||||
return 0;
|
return 0;
|
||||||
if (position < 0)
|
if (position < 0)
|
||||||
position = 0;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
if (position + bufferSize > this->size)
|
if (position + bufferSize > this->size)
|
||||||
bufferSize = this->size - position;
|
bufferSize = this->size - position;
|
||||||
@@ -91,7 +124,7 @@ Partition::WriteAt(void *cookie, off_t position, const void *buffer, size_t buff
|
|||||||
if (position > this->size)
|
if (position > this->size)
|
||||||
return 0;
|
return 0;
|
||||||
if (position < 0)
|
if (position < 0)
|
||||||
position = 0;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
if (position + bufferSize > this->size)
|
if (position + bufferSize > this->size)
|
||||||
bufferSize = this->size - position;
|
bufferSize = this->size - position;
|
||||||
@@ -100,6 +133,28 @@ Partition::WriteAt(void *cookie, off_t position, const void *buffer, size_t buff
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
off_t
|
||||||
|
Partition::Size() const
|
||||||
|
{
|
||||||
|
struct stat stat;
|
||||||
|
if (fstat(fFD, &stat) == B_OK)
|
||||||
|
return stat.st_size;
|
||||||
|
|
||||||
|
return Node::Size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32
|
||||||
|
Partition::Type() const
|
||||||
|
{
|
||||||
|
struct stat stat;
|
||||||
|
if (fstat(fFD, &stat) == B_OK)
|
||||||
|
return stat.st_mode;
|
||||||
|
|
||||||
|
return Node::Type();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Partition *
|
Partition *
|
||||||
Partition::AddChild()
|
Partition::AddChild()
|
||||||
{
|
{
|
||||||
@@ -123,12 +178,14 @@ Partition::Scan()
|
|||||||
for (int32 i = 0; i < sNumPartitionModules; i++) {
|
for (int32 i = 0; i < sNumPartitionModules; i++) {
|
||||||
partition_module_info *module = sPartitionModules[i];
|
partition_module_info *module = sPartitionModules[i];
|
||||||
void *cookie;
|
void *cookie;
|
||||||
|
NodeOpener opener(this, O_RDONLY);
|
||||||
|
|
||||||
puts(module->pretty_name);
|
TRACE(("check for partitioning_system: %s\n", module->pretty_name));
|
||||||
if (module->identify_partition(fFD, this, &cookie) <= 0.0)
|
|
||||||
|
if (module->identify_partition(opener.Descriptor(), this, &cookie) <= 0.0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
status_t status = module->scan_partition(fFD, this, cookie);
|
status_t status = module->scan_partition(opener.Descriptor(), this, cookie);
|
||||||
module->free_identify_partition_cookie(this, cookie);
|
module->free_identify_partition_cookie(this, cookie);
|
||||||
|
|
||||||
if (status == B_OK) {
|
if (status == B_OK) {
|
||||||
@@ -138,6 +195,9 @@ Partition::Scan()
|
|||||||
Partition *child = NULL, *last = NULL;
|
Partition *child = NULL, *last = NULL;
|
||||||
|
|
||||||
while ((child = (Partition *)list_get_next_item(&fChildren, child)) != NULL) {
|
while ((child = (Partition *)list_get_next_item(&fChildren, child)) != NULL) {
|
||||||
|
TRACE(("*** scan child %p (start = %Ld, size = %Ld, parent = %p)!\n",
|
||||||
|
child, child->offset, child->size, child->Parent()));
|
||||||
|
|
||||||
child->Scan();
|
child->Scan();
|
||||||
|
|
||||||
if (child->IsFileSystem()) {
|
if (child->IsFileSystem()) {
|
||||||
@@ -166,7 +226,7 @@ Partition::Scan()
|
|||||||
for (int32 i = 0; i < sNumFileSystemModules; i++) {
|
for (int32 i = 0; i < sNumFileSystemModules; i++) {
|
||||||
file_system_module_info *module = sFileSystemModules[i];
|
file_system_module_info *module = sFileSystemModules[i];
|
||||||
|
|
||||||
puts(module->pretty_name);
|
TRACE(("check for file_system: %s\n", module->pretty_name));
|
||||||
|
|
||||||
Directory *fileSystem;
|
Directory *fileSystem;
|
||||||
if (module->get_file_system(this, &fileSystem) == B_OK) {
|
if (module->get_file_system(this, &fileSystem) == B_OK) {
|
||||||
@@ -180,6 +240,8 @@ Partition::Scan()
|
|||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace boot
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
@@ -209,6 +271,7 @@ create_child_partition(partition_id id, int32 index, partition_id childID)
|
|||||||
|
|
||||||
// we cannot do anything with the child here, because it was not
|
// we cannot do anything with the child here, because it was not
|
||||||
// yet initialized by the partition module.
|
// yet initialized by the partition module.
|
||||||
|
TRACE(("new child partition!"));
|
||||||
|
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user