freebsd-ports/sysutils/syslinux/files/patch-mtools-syslinux.c
Martin Matuska c5912aade0 - Unbreak and update to 4.03
- Fix and rename patches to match file names
- Depend on perl5 only during build
- Make portlint happy
- Replace with sed and do it in pre-patch stage
- Use DATADIR and MANPREFIX

PR:		ports/152300
Approved by:	luigi (maintainer, private e-mail)
2010-11-18 17:42:52 +00:00

140 lines
3.8 KiB
C

--- mtools/syslinux.c.orig 2010-10-20 21:25:38.000000000 +0200
+++ mtools/syslinux.c 2010-11-16 14:59:55.668749526 +0100
@@ -20,12 +20,12 @@
*/
#define _GNU_SOURCE
-#include <alloca.h>
+//#include <alloca.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <inttypes.h>
-#include <mntent.h>
+//#include <mntent.h>
#include <paths.h>
#include <stdio.h>
#include <string.h>
@@ -42,6 +42,8 @@
#include "setadv.h"
#include "syslxopt.h"
+int verbose=0;
+
char *program; /* Name of program */
pid_t mypid;
@@ -124,6 +126,53 @@
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, (long long int)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[])
{
static unsigned char sectbuf[SECTOR_SIZE];
@@ -150,9 +199,15 @@
parse_options(argc, argv, MODE_SYSLINUX);
+ if (opt.verbose)
+ verbose = 1;
+
if (!opt.device)
usage(EX_USAGE, MODE_SYSLINUX);
+ if (opt.bimage != NULL)
+ load_boot_image(opt.bimage);
+
if (opt.sectors || opt.heads || opt.reset_adv || opt.set_once
|| (opt.update_only > 0) || opt.menu_save) {
fprintf(stderr,
@@ -216,11 +271,9 @@
/* These are needed for some flash memories */
"MTOOLS_SKIP_CHECK=1\n"
"MTOOLS_FAT_COMPATIBILITY=1\n"
- "drive s:\n"
- " file=\"/proc/%lu/fd/%d\"\n"
+ "drive s: file=\"%s\"\n"
" offset=%llu\n",
- (unsigned long)mypid,
- dev_fd, (unsigned long long)opt.offset);
+ opt.device, (unsigned long long)opt.offset);
if (ferror(mtc) || fclose(mtc))
die_err(mtools_conf);
@@ -239,9 +292,11 @@
syslinux_reset_adv(syslinux_adv);
/* This command may fail legitimately */
+ if (verbose) fprintf(stderr, "doing mattrib\n");
status = system("mattrib -h -r -s s:/ldlinux.sys 2>/dev/null");
(void)status; /* Keep _FORTIFY_SOURCE happy */
+ if (verbose) fprintf(stderr, "doing mcopy\n");
mtp = popen("mcopy -D o -D O -o - s:/ldlinux.sys", "w");
if (!mtp ||
fwrite(syslinux_ldlinux, 1, syslinux_ldlinux_len, mtp)
@@ -259,7 +314,9 @@
+ SECTOR_SIZE - 1) >> SECTOR_SHIFT;
sectors = calloc(ldlinux_sectors, sizeof *sectors);
fs = libfat_open(libfat_xpread, dev_fd);
+ if (verbose) fprintf(stderr, "libfat_open returns %p\n", fs);
ldlinux_cluster = libfat_searchdir(fs, 0, "LDLINUX SYS", NULL);
+ if (verbose) fprintf(stderr, "libfat_searchdir returns %d\n", ldlinux_cluster);
secp = sectors;
nsectors = 0;
s = libfat_clustertosector(fs, ldlinux_cluster);
@@ -267,6 +324,7 @@
*secp++ = s;
nsectors++;
s = libfat_nextsector(fs, s);
+ if (verbose) fprintf(stderr, "libfat_nextsector returns %d\n", (int)s);
}
libfat_close(fs);