static status_t apple_scan_partition(int fd, partition_data *partition, void *_cookie) { TRACE(("apple_scan_partition(cookie = %p)\n", _cookie)); apple_driver_descriptor &descriptor = *(apple_driver_descriptor *)_cookie; partition->status = B_PARTITION_VALID; partition->flags |= B_PARTITION_PARTITIONING_SYSTEM | B_PARTITION_READ_ONLY; partition->content_size = descriptor.BlockSize() * descriptor.BlockCount(); // scan all children apple_partition_map partitionMap; uint32 index = 0, cookie = 0; status_t status; while ((status = get_next_partition(fd, descriptor, cookie, partitionMap)) == B_OK) { TRACE(("apple: found partition: name = \"%s\", type = \"%s\"\n", partitionMap.name, partitionMap.type)); if (partitionMap.Start(descriptor) + partitionMap.Size(descriptor) > (uint64)partition->size) { TRACE(("apple: child partition exceeds existing space (%Ld bytes)\n", partitionMap.Size(descriptor))); continue; } partition_data *child = create_child_partition(partition->id, index++, partition->offset + partitionMap.Start(descriptor), partitionMap.Size(descriptor), -1); if (child == NULL) { TRACE(("apple: Creating child at index %ld failed\n", index - 1)); return B_ERROR; } child->block_size = partition->block_size; } if (status == B_ENTRY_NOT_FOUND) return B_OK; return status; }
static status_t scan_partition(int fd, partition_data *partition, void *cookie) { DEBUG_INIT_ETC(NULL, ("fd: %d, id: %ld, offset: %Ld, size: %Ld, " "block_size: %ld, cookie: %p", fd, partition->id, partition->offset, partition->size, partition->block_size, cookie)); Disc *disc = static_cast<Disc*>(cookie); partition->status = B_PARTITION_VALID; partition->flags |= B_PARTITION_PARTITIONING_SYSTEM | B_PARTITION_READ_ONLY; partition->content_size = partition->size; Session *session = NULL; status_t error = B_OK; for (int i = 0; (session = disc->GetSession(i)); i++) { partition_data *child = create_child_partition(partition->id, i, partition->offset + session->Offset(), session->Size(), -1); if (!child) { PRINT(("Unable to create child at index %d.\n", i)); // something went wrong error = B_ERROR; break; } child->block_size = session->BlockSize(); child->flags |= session->Flags(); child->type = strdup(session->Type()); delete session; if (!child->type) { error = B_NO_MEMORY; break; } child->parameters = NULL; } PRINT(("error: 0x%lx, `%s'\n", error, strerror(error))); RETURN(error); }