Patch by Artur Wyszynski: Added support for partitions in Darwin.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28404 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -33,6 +33,13 @@
|
|||||||
# include <sys/disk.h>
|
# include <sys/disk.h>
|
||||||
# include <sys/ioctl.h>
|
# include <sys/ioctl.h>
|
||||||
|
|
||||||
|
# include "PartitionMap.h"
|
||||||
|
# include "PartitionMapParser.h"
|
||||||
|
#elif HAIKU_HOST_PLATFORM_DARWIN
|
||||||
|
# include <ctype.h>
|
||||||
|
# include <sys/disk.h>
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
|
||||||
# include "PartitionMap.h"
|
# include "PartitionMap.h"
|
||||||
# include "PartitionMapParser.h"
|
# include "PartitionMapParser.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -411,7 +418,7 @@ main(int argc, const char *const *argv)
|
|||||||
#endif // HAIKU_HOST_PLATFORM_FREEBSD
|
#endif // HAIKU_HOST_PLATFORM_FREEBSD
|
||||||
|
|
||||||
} else if (S_ISBLK(st.st_mode)) {
|
} else if (S_ISBLK(st.st_mode)) {
|
||||||
// block device: a device or partition under Linux
|
// block device: a device or partition under Linux or Darwin
|
||||||
#ifdef HAIKU_HOST_PLATFORM_LINUX
|
#ifdef HAIKU_HOST_PLATFORM_LINUX
|
||||||
|
|
||||||
// chop off the trailing number
|
// chop off the trailing number
|
||||||
@@ -490,8 +497,72 @@ main(int argc, const char *const *argv)
|
|||||||
// offset 0.
|
// offset 0.
|
||||||
}
|
}
|
||||||
|
|
||||||
#else // !HAIKU_HOST_PLATFORM_LINUX
|
#elif defined(HAIKU_HOST_PLATFORM_DARWIN)
|
||||||
|
// chop off the trailing number
|
||||||
|
int fileNameLen = strlen(fileName);
|
||||||
|
int baseNameLen = fileNameLen - 2;
|
||||||
|
|
||||||
|
// get base device name and partition index
|
||||||
|
char baseDeviceName[B_PATH_NAME_LENGTH];
|
||||||
|
int partitionIndex = atoi(fileName + baseNameLen + 1);
|
||||||
|
memcpy(baseDeviceName, fileName, baseNameLen);
|
||||||
|
baseDeviceName[baseNameLen] = '\0';
|
||||||
|
|
||||||
|
// open base device
|
||||||
|
int baseFD = open(baseDeviceName, O_RDONLY);
|
||||||
|
if (baseFD < 0) {
|
||||||
|
fprintf(stderr, "Error: Failed to open \"%s\": %s\n",
|
||||||
|
baseDeviceName, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// get device size
|
||||||
|
int64 blockSize;
|
||||||
|
int64 blockCount;
|
||||||
|
int64 deviceSize;
|
||||||
|
if (ioctl(baseFD, DKIOCGETBLOCKSIZE, &blockSize) == -1) {
|
||||||
|
fprintf(stderr, "Error: Failed to get block size "
|
||||||
|
"for \"%s\": %s\n", baseDeviceName,
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
if (ioctl(baseFD, DKIOCGETBLOCKCOUNT, &blockCount) == -1) {
|
||||||
|
fprintf(stderr, "Error: Failed to get block count "
|
||||||
|
"for \"%s\": %s\n", baseDeviceName,
|
||||||
|
strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceSize = blockSize * blockCount;
|
||||||
|
|
||||||
|
// parse the partition map
|
||||||
|
PartitionMapParser parser(baseFD, 0, deviceSize);
|
||||||
|
PartitionMap map;
|
||||||
|
error = parser.Parse(NULL, &map);
|
||||||
|
if (error != B_OK) {
|
||||||
|
fprintf(stderr, "Error: Parsing partition table on "
|
||||||
|
"device \"%s\" failed: %s\n", baseDeviceName,
|
||||||
|
strerror(error));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
close(baseFD);
|
||||||
|
|
||||||
|
// check the partition we are supposed to write at
|
||||||
|
Partition *partition = map.PartitionAt(partitionIndex - 1);
|
||||||
|
if (!partition || partition->IsEmpty()) {
|
||||||
|
fprintf(stderr, "Error: Invalid partition index %d.\n",
|
||||||
|
partitionIndex);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (partition->IsExtended()) {
|
||||||
|
fprintf(stderr, "Error: Partition %d is an extended "
|
||||||
|
"partition.\n", partitionIndex);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
partitionOffset = partition->Offset();
|
||||||
|
#else
|
||||||
// partitions are block devices under Haiku, but not under BeOS
|
// partitions are block devices under Haiku, but not under BeOS
|
||||||
#ifndef __HAIKU__
|
#ifndef __HAIKU__
|
||||||
fprintf(stderr, "Error: Block devices not supported on this "
|
fprintf(stderr, "Error: Block devices not supported on this "
|
||||||
@@ -539,8 +610,9 @@ main(int argc, const char *const *argv)
|
|||||||
= B_HOST_TO_LENDIAN_INT32((uint32)(partitionOffset / 512));
|
= B_HOST_TO_LENDIAN_INT32((uint32)(partitionOffset / 512));
|
||||||
|
|
||||||
// write the boot code
|
// write the boot code
|
||||||
printf("Writing boot code to \"%s\" (partition offset: %lld bytes) "
|
printf("Writing boot code to \"%s\" (partition offset: %lld bytes, "
|
||||||
"...\n", fileName, partitionOffset);
|
"start offset = %d) "
|
||||||
|
"...\n", fileName, partitionOffset, startOffset);
|
||||||
|
|
||||||
write_boot_code_part(fileName, fd, startOffset, bootCodeData, 0,
|
write_boot_code_part(fileName, fd, startOffset, bootCodeData, 0,
|
||||||
kFirstBootCodePartSize, dryRun);
|
kFirstBootCodePartSize, dryRun);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ SEARCH_SOURCE
|
|||||||
USES_BE_API on <build>makebootable = true ;
|
USES_BE_API on <build>makebootable = true ;
|
||||||
|
|
||||||
local hostPlatformSources ;
|
local hostPlatformSources ;
|
||||||
if $(HOST_PLATFORM) = linux || $(HOST_PLATFORM) = freebsd {
|
if $(HOST_PLATFORM) = linux || $(HOST_PLATFORM) = freebsd || $(HOST_PLATFORM) = darwin {
|
||||||
hostPlatformSources = PartitionMap.cpp PartitionMapParser.cpp ;
|
hostPlatformSources = PartitionMap.cpp PartitionMapParser.cpp ;
|
||||||
|
|
||||||
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons kernel
|
SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src add-ons kernel
|
||||||
|
|||||||
Reference in New Issue
Block a user