Author: mmu_man Date: 2009-10-11 22:26:39 +0200 (Sun, 11 Oct 2009) New Revision: 33534 Changeset: http://dev.haiku-os.org/changeset/33534/haiku Added: haiku/trunk/src/tools/fixup_amiga_boot_checksum/ haiku/trunk/src/tools/fixup_amiga_boot_checksum/Jamfile haiku/trunk/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c Modified: haiku/trunk/src/tools/Jamfile Log: A tool to calculate Amiga bootsector checksums. Modified: haiku/trunk/src/tools/Jamfile =================================================================== --- haiku/trunk/src/tools/Jamfile 2009-10-11 20:25:45 UTC (rev 33533) +++ haiku/trunk/src/tools/Jamfile 2009-10-11 20:26:39 UTC (rev 33534) @@ -107,6 +107,7 @@ 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 ; Added: haiku/trunk/src/tools/fixup_amiga_boot_checksum/Jamfile =================================================================== --- haiku/trunk/src/tools/fixup_amiga_boot_checksum/Jamfile (rev 0) +++ haiku/trunk/src/tools/fixup_amiga_boot_checksum/Jamfile 2009-10-11 20:26:39 UTC (rev 33534) @@ -0,0 +1,6 @@ +SubDir HAIKU_TOP src tools fixup_amiga_boot_checksum ; + +BuildPlatformMain <build>fixup_amiga_boot_checksum + : fixup_amiga_boot_checksum.c + : +; Added: haiku/trunk/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c =================================================================== --- haiku/trunk/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c (rev 0) +++ haiku/trunk/src/tools/fixup_amiga_boot_checksum/fixup_amiga_boot_checksum.c 2009-10-11 20:26:39 UTC (rev 33534) @@ -0,0 +1,42 @@ +#include <stdio.h> +#include <stdint.h> +#include <fcntl.h> +#include <unistd.h> +#include <netinet/in.h> + +#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; +}