diff options
Diffstat (limited to 'package/aboot/src/srmbootfat/srmbootraw.c')
-rw-r--r-- | package/aboot/src/srmbootfat/srmbootraw.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/package/aboot/src/srmbootfat/srmbootraw.c b/package/aboot/src/srmbootfat/srmbootraw.c new file mode 100644 index 000000000..3bba2d577 --- /dev/null +++ b/package/aboot/src/srmbootfat/srmbootraw.c @@ -0,0 +1,101 @@ +/* + * SRMbootraw - SRM boot block composer for raw boot partitions. + * Copyright (C) 1998 Nikita Schmidt <cetus@snowball.ucd.ie> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <fcntl.h> +#include <sys/types.h> + +/* We assume little endiannes and possibly other Alpha properties as well. */ +#ifndef __alpha__ +#error This stuff must be compiled for Alpha. +#endif + +#define BUFSIZE 65536 + +union bootsector { + struct { + unsigned char textlabel[64]; + unsigned char disklabel[276]; + unsigned char unused[140]; + u_int64_t count, start, flags; + u_int64_t checksum; + } srm; + struct { + u_int64_t contents[63]; + u_int64_t checksum; + } check; +}; + + +int main (int argc, char *argv[]) +{ + int device, image; + int i; + union bootsector boot; + char *buf; + unsigned long size; + ssize_t len; + u_int64_t checksum; + + if (argc != 3) + return printf ("Usage: srmbootraw <boot device> <boot image>\n"), 1; + + if ((device = open (argv[1], O_RDWR)) < 0) + return perror (argv[1]), 2; + if ((image = open (argv[2], O_RDONLY)) < 0) + return perror (argv[2]), 2; + + /* Read in the old bootsector */ + if (read (device, &boot, sizeof boot) != sizeof boot) + return fprintf (stderr, "Can't read boot sector from %s\n", argv[1]), 2; + + if (!(buf = malloc (BUFSIZE))) + return fprintf (stderr, "Can't allocate memory for %s\n", argv[2]), 2; + + /* Copy image onto the device */ + size = 0; + while ((len = read (image, buf, BUFSIZE)) > 0) + { + if (write (device, buf, len) != len) + return fprintf (stderr, "Can't write to %s\n", argv[1]), 2; + size += len; + } + close (image); + if (len == -1) + return perror (argv[2]), 2; + + /* Fill in the bootstrap information */ + boot.srm.start = 1; + boot.srm.count = (size + 511) / 512; /* Convert to sectors */ + boot.srm.flags = 0; + + /* Put the checksum and write the boot sector. */ + checksum = 0; + for (i = 0; i < 63; i++) + checksum += boot.check.contents[i]; + boot.check.checksum = checksum; + + printf ("Writing SRM boot block: starting sector %u, block count %u\n", + (unsigned)boot.srm.start, (unsigned)boot.srm.count); + + if (lseek (device, 0, SEEK_SET) == -1 + || write (device, &boot, sizeof boot) != sizeof boot) + return perror (argv[2]), 2; + + close (device); + return 0; +} |