mirror of
https://git.freebsd.org/ports.git
synced 2025-06-16 18:20:33 -04:00
filesystem or disk image. This FreeBSD port can additionally operate on plain files containing a FAT image, thus requiring no special privilege. The program relies on mtools to perform the manipulation of the FAT filesystem. WWW: http://syslinux.zytor.com/
65 lines
1.8 KiB
Text
65 lines
1.8 KiB
Text
diff -ubwr ../../work.2/syslinux-3.72/mtools/syslinux.c ./mtools/syslinux.c
|
|
--- ../../work.2/syslinux-3.72/mtools/syslinux.c 2008-11-26 13:32:57.000000000 +0100
|
|
+++ ./mtools/syslinux.c 2008-11-26 14:07:05.000000000 +0100
|
|
@@ -123,6 +123,52 @@
|
|
return xpread(pp, buf, secsize, offset);
|
|
}
|
|
|
|
+/*
|
|
+ * load a file to be used as boot image
|
|
+ */
|
|
+static int load_boot_image(const char *name)
|
|
+{
|
|
+ int l, fd;
|
|
+ struct stat sb;
|
|
+ unsigned char *buf;
|
|
+
|
|
+ memset(&sb, 0, sizeof(sb));
|
|
+ fd = open(name, O_RDONLY);
|
|
+ if (fd < 0) {
|
|
+ fprintf(stderr, "cannot open boot image %s\n", name);
|
|
+ return 1;
|
|
+ }
|
|
+ if (fstat(fd, &sb)) {
|
|
+ fprintf(stderr, "cannot stat boot image %s\n", name);
|
|
+ return 1;
|
|
+ }
|
|
+ if ( (sb.st_mode & S_IFREG) == 0) {
|
|
+ fprintf(stderr, "boot image %s is not a file 0x%x\n", name, sb.st_mode);
|
|
+ return 1;
|
|
+ }
|
|
+ if (sb.st_size < 1024 || sb.st_size > 0x8000) {
|
|
+ fprintf(stderr, "boot image %s bad size %lld\n", name, sb.st_size);
|
|
+ return 1;
|
|
+ }
|
|
+ buf = calloc(1, sb.st_size);
|
|
+ if (buf == NULL) {
|
|
+ fprintf(stderr, "malloc failed for boot image %s\n", name);
|
|
+ return 1;
|
|
+ }
|
|
+ l = read(fd, buf, sb.st_size);
|
|
+ if (l != sb.st_size) {
|
|
+ fprintf(stderr, "read failed for boot image %s got %d\n", name, l);
|
|
+ return 1;
|
|
+ }
|
|
+ if (buf[0] != 0xeb || buf[0x200] != 0x0d) {
|
|
+ fprintf(stderr, "bad content for boot image %s\n", name);
|
|
+ return 1;
|
|
+ }
|
|
+ syslinux_bootsect = buf;
|
|
+ syslinux_ldlinux = buf + 512;
|
|
+ syslinux_ldlinux_len = sb.st_size - 512;
|
|
+ return 0;
|
|
+}
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
@@ -163,6 +209,8 @@
|
|
stupid = 1;
|
|
} else if ( *opt == 'v' ) {
|
|
verbose++;
|
|
+ } else if ( *opt == 'b' && argp[1] ) {
|
|
+ load_boot_image(*++argp);
|
|
} else if ( *opt == 'r' ) {
|
|
raid_mode = 1;
|
|
} else if ( *opt == 'f' ) {
|