From 7c8d16d63f680546b2165c1f20fa6736ce436c84 Mon Sep 17 00:00:00 2001 From: leo Date: Fri, 22 Mar 2002 21:29:23 +0000 Subject: [PATCH] Also find swap partitions in a (possibly embedded in AHDI) NetBSD label on the disk. --- .../atari/stand/tostools/file2swp/file2swp.c | 105 ++++++++++++++---- 1 file changed, 84 insertions(+), 21 deletions(-) diff --git a/sys/arch/atari/stand/tostools/file2swp/file2swp.c b/sys/arch/atari/stand/tostools/file2swp/file2swp.c index b28d19bc3c8d..40c41e4b0189 100644 --- a/sys/arch/atari/stand/tostools/file2swp/file2swp.c +++ b/sys/arch/atari/stand/tostools/file2swp/file2swp.c @@ -1,4 +1,4 @@ -/* $NetBSD: file2swp.c,v 1.1.1.1 2002/02/27 20:21:16 leo Exp $ */ +/* $NetBSD: file2swp.c,v 1.2 2002/03/22 21:29:23 leo Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -41,15 +41,18 @@ #include "libtos.h" #include "diskio.h" #include "ahdilbl.h" +#include "disklbl.h" #include "cread.h" char *Infile = "minifs.gz"; -const char version[] = "$Revision: 1.1.1.1 $"; +const char version[] = "$Revision: 1.2 $"; extern const char *program_name; int main PROTO((int, char **)); -static void usage PROTO((void)) NORETURN; +static int check_bsdlabel PROTO((disk_t *,u_int32_t,u_int32_t *,u_int32_t *)); +static int readdisklabel PROTO((disk_t *, u_int32_t *, u_int32_t *)); +static void usage PROTO((void)) NORETURN; static void usage() @@ -82,9 +85,9 @@ main(argc, argv) extern char *optarg; disk_t *dd; - ptable_t pt; int rv, c, i, fd; u_int32_t currblk; + u_int32_t start, end; char buf[AHDI_BSIZE]; i = rv = 0; @@ -119,37 +122,25 @@ main(argc, argv) /* NOT REACHED */ } dd = disk_open(*argv); - pt.nparts = 0; - pt.parts = NULL; - if (!ahdi_getparts(dd, &pt, AHDI_BBLOCK, AHDI_BBLOCK)) { - for (i = 0; i < pt.nparts; i++) { - if (!strncmp(pt.parts[i].id, "SWP", 3)) - break; - } - if (i == pt.nparts) { - eprintf("No swap ('SWP') partition found!\n"); - xexit(1); - } - } - else xexit(1); + if (readdisklabel(dd, &start, &end) != 0) + xexit(1); + if ((fd = open(Infile, O_RDONLY)) < 0) { eprintf("Unable to open <%s>\n", Infile); xexit(1); } - eprintf("Found Swap ('SWP') partition start: %d, end: %d.\n", - pt.parts[i].start, pt.parts[i].end); switch(key_wait("Are you sure (y/n)? ")) { case 'y': case 'Y': - currblk = pt.parts[i].start; + currblk = start; while(c = read(fd, buf, sizeof(buf)) > 0) { if (disk_write(dd, currblk, 1, buf) < 0) { eprintf("Error writing to swap partition\n"); xexit(1); } - if (++currblk >= pt.parts[i].end) { + if (++currblk >= end) { eprintf("Error: filesize exceeds swap " "partition size\n"); xexit(1); @@ -166,3 +157,75 @@ main(argc, argv) rv = EXIT_FAILURE; return(rv); } + +static int +check_bsdlabel(dd, offset, start, end) + disk_t *dd; + u_int32_t offset, *start, *end; +{ + struct disklabel dl; + int err; + + err = bsd_getlabel(dd, &dl, offset); + if (err < 0) { + eprintf("Device I/O error (hardware problem?)\n\n"); + return (-1); + } + if (!err) { + if (dl.d_partitions[1].p_size > 0) { + *start = dl.d_partitions[1].p_offset; + *end = *start + dl.d_partitions[1].p_size-1; + eprintf("NetBSD/Atari format%s, Swap partition start:%d, end:%d\n", + offset != 0 ? " (embedded)" : "", *start, *end); + return (0); + } + eprintf("NetBSD/Atari format: no swap defined\n"); + } + return 1; +} + +static int +readdisklabel(dd, start, end) + disk_t *dd; + u_int32_t *start, *end; +{ + ptable_t pt; + int err, i; + + + err = check_bsdlabel(dd, LABELSECTOR, start, end); + if (err != 1) + return (err); + memset(&pt, 0, sizeof(pt)); + err = ahdi_getparts(dd, &pt, AHDI_BBLOCK, AHDI_BBLOCK); + if (err < 0) { + eprintf("Device I/O error (hardware problem?)\n\n"); + return (-1); + } + if (!err) { + /* + * Check for hidden BSD labels + */ + for (i = 0; i < pt.nparts; i++) { + if (!strncmp(pt.parts[i].id, "NBD", 3)) { + err = check_bsdlabel(dd, pt.parts[i].start, start, end); + if (err != 1) + return (err); + } + } + for (i = 0; i < pt.nparts; i++) { + if (!strncmp(pt.parts[i].id, "SWP", 3)) + break; + } + if (i < pt.nparts) { + *start = pt.parts[i].start; + *end = pt.parts[i].end; + eprintf("AHDI format, SWP partition: start:%d,end: %d\n", + *start, *end); + return (0); + } + eprintf("AHDI format, no swap ('SWP') partition found!\n"); + } + eprintf("Unknown label format.\n\n"); + return(-1); +}