diff --git a/src/tools/Jamfile b/src/tools/Jamfile index 5cd5e472fb..89ed1b8925 100644 --- a/src/tools/Jamfile +++ b/src/tools/Jamfile @@ -107,6 +107,7 @@ SubInclude HAIKU_TOP src tools bfs_shell ; SubInclude HAIKU_TOP src tools cppunit ; SubInclude HAIKU_TOP src tools docbook ; SubInclude HAIKU_TOP src tools elfsymbolpatcher ; +SubInclude HAIKU_TOP src tools fixup_amiga_boot_checksum ; SubInclude HAIKU_TOP src tools fixup_tos_boot_checksum ; SubInclude HAIKU_TOP src tools fs_shell ; SubInclude HAIKU_TOP src tools gensyscalls ; diff --git a/src/tools/fixup_amiga_boot_checksum/Jamfile b/src/tools/fixup_amiga_boot_checksum/Jamfile new file mode 100644 index 0000000000..30b050b59d --- /dev/null +++ b/src/tools/fixup_amiga_boot_checksum/Jamfile @@ -0,0 +1,6 @@ +SubDir HAIKU_TOP src tools fixup_amiga_boot_checksum ; + +BuildPlatformMain fixup_amiga_boot_checksum + : fixup_amiga_boot_checksum.c + : +; diff --git a/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c b/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c new file mode 100644 index 0000000000..870db1cb5b --- /dev/null +++ b/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c @@ -0,0 +1,42 @@ +#include +#include +#include +#include +#include + +#define BB_SIZE (2*512) + +int main(int argc, char **argv) +{ + int fd, i; + uint32_t sum; + uint8_t bootblock[BB_SIZE]; + uint32_t *p = (uint32_t *)bootblock; + fd = open(argv[1], O_RDWR); + if (fd < 0) { + return 1; + } + if (read(fd, bootblock, BB_SIZE) < BB_SIZE) { + perror("read"); + return 1; + } + if (ntohl(p[0]) != 'DOS\0') { + fprintf(stderr, "bad bootblock signature!\n"); + return 1; + } + p[1] = 0; + for (sum = 0, i = 0; i < (BB_SIZE)/sizeof(uint32_t); i++) { + uint32_t old = sum; + // big endian + sum += ntohl(*p++); + // overflow + if (sum < old) + sum++; + } + fprintf(stderr, "checksum: %lu\n", sum); + // big endian + ((uint32_t *)bootblock)[1] = htonl(sum); + lseek(fd, 0LL, SEEK_SET); + write(fd, bootblock, BB_SIZE); + return 0; +}