-# $NetBSD: Makefile,v 1.1.1.1 1996/01/07 21:54:16 leo Exp $
+# $NetBSD: Makefile,v 1.2 1996/01/16 15:14:53 leo Exp $
PROG = aptck.ttp
-OBJS = aptck.o biosrw.o diskio.o disklabel.o
-HEADERS = aptck.h disklabel.h
+OBJS = aptck.o biosrw.o diskio.o disklbl.o
+HEADERS = aptck.h ahdilbl.h disklbl.h
LIBS = -lxhdi
CLEAN = aptck.c
include ../Makefile.inc
-aptck.c: aptck.in biosrw.s diskio.c disklabel.c
- ${AWK} -f ./setversion $^ > aptck.c
+aptck.c: aptck.in biosrw.s diskio.c disklbl.c
+ ${AWK} -f ./setrev.awk $^ > aptck.c
${PROG}: ${OBJS} ${LDADD}
${CC} ${LDFLAGS} -o $@ ${OBJS} ${LDADD} ${LIBS}
--- /dev/null
+/* $NetBSD: ahdilbl.h,v 1.1 1996/01/16 15:15:06 leo Exp $ */
+
+/*
+ * Copyright (c) 1995 Leo Weppelman.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Leo Weppelman.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef AHDILABEL_H
+#define AHDILABEL_H
+
+/***** from src/sys/arch/atari/include/disklabel.h *************************/
+
+/*
+ * On a volume, exclusively used by NetBSD, the boot block starts at
+ * sector 0. To allow shared use of a volume between two or more OS's
+ * the vendor specific AHDI format is supported. In this case the boot
+ * block is located at the start of an AHDI partition. In any case the
+ * size of the boot block must be at least 8KB.
+ */
+#define BBMINSIZE 8192 /* minimum size of boot block */
+#define LABELSECTOR 0 /* `natural' start of boot block */
+#define LABELOFFSET 512 /* offset of disk label in bytes,
+ relative to start of boot block */
+#define LABELMAXSIZE 1024 /* maximum size of disk label */
+
+#define MAXPARTITIONS 16 /* max. # of NetBSD partitions */
+#define RAW_PART 2 /* xx?c is raw partition */
+
+#define NO_BOOT_BLOCK ((u_int)-1)
+#define MAXAUXROOTS 29 /* max. # of auxilary root sectors */
+
+struct bootblock {
+ u_int8_t bb_xxboot[LABELOFFSET]; /* first-stage boot loader */
+ u_int8_t bb_dlabel[LABELMAXSIZE];/* disk pack label */
+ u_int8_t bb_bootxx[BBMINSIZE - (LABELOFFSET + LABELMAXSIZE)];
+ /* second-stage boot loader*/
+};
+
+#define BBGETLABEL(bb, dl) *(dl) = *((struct disklabel *)(bb)->bb_dlabel)
+#define BBSETLABEL(bb, dl) *((struct disklabel *)(bb)->bb_dlabel) = *(dl)
+
+/***** from src/sys/arch/atari/include/ahdilabel.h *************************/
+
+#define AHDI_BSIZE 512 /* AHDI blocksize */
+#define AHDI_BBLOCK 0 /* AHDI bootblock (root sector) */
+#define AHDI_MAXROOTS (MAXAUXROOTS) /* max. # of AHDI rootsectors */
+#define AHDI_MAXPARTS (AHDI_MAXROOTS+3) /* max. # of AHDI partitions */
+
+/*
+ * Various `well known' AHDI partition identifiers.
+ */
+#define AHDI_MKPID(x,y,z) ( ((u_int32_t)(x) << 16) \
+ | ((u_int32_t)(y) << 8) \
+ | ((u_int32_t)(z)) \
+ )
+#define AHDI_PID_XGM AHDI_MKPID('X','G','M')
+#define AHDI_PID_GEM AHDI_MKPID('G','E','M')
+#define AHDI_PID_BGM AHDI_MKPID('B','G','M')
+#define AHDI_PID_RAW AHDI_MKPID('R','A','W')
+#define AHDI_PID_SWP AHDI_MKPID('S','W','P')
+#define AHDI_PID_NBD AHDI_MKPID('N','B','D')
+#define AHDI_PID_NBR AHDI_MKPID('N','B','R')
+#define AHDI_PID_NBS AHDI_MKPID('N','B','S')
+#define AHDI_PID_NBU AHDI_MKPID('N','B','U')
+
+/*
+ * Format of AHDI boot block.
+ */
+#define AHDI_MAXRPD 4 /* max. # of partition descriptors */
+ /* in the AHDI bootblock (aka root)*/
+#define AHDI_MAXARPD 2 /* max. # of partition descriptors */
+ /* in an AHDI auxilary root sector */
+
+struct ahdi_part {
+ u_int8_t ap_flg; /* bit 0 is in-use flag */
+ u_int8_t ap_id[3]; /* id: GEM, BGM, XGM, UNX, MIX */
+ u_int32_t ap_offs; /* block where partition starts */
+ u_int32_t ap_size; /* partition size in blocks */
+#define ap_end ap_size /* in the in-core copy, store end instead of size */
+};
+
+struct ahdi_root {
+ u_int8_t ar_fill[0x1c2];/* filler, can be boot code */
+ u_int32_t ar_hdsize; /* size of entire volume in blocks */
+ struct ahdi_part ar_parts[AHDI_MAXRPD]; /* root partition table */
+ u_int32_t ar_bslst; /* start of bad-sector list */
+ u_int32_t ar_bslsize; /* # of blocks in bad-sector list */
+ u_int16_t ar_cksum;
+};
+
+#endif /* AHDILABEL_H */
-/* $NetBSD: diskio.c,v 1.1.1.1 1996/01/07 21:54:16 leo Exp $ */
+/* $NetBSD: diskio.c,v 1.2 1996/01/16 15:15:16 leo Exp $ */
/*
* Copyright (c) 1995 Waldi Ravens.
#include <xhdi.h>
#include "libtos.h"
#include "aptck.h"
-#include "disklabel.h"
+#include "ahdilbl.h"
#include <osbind.h>
struct pun_info {
+++ /dev/null
-/* $NetBSD: disklabel.c,v 1.1.1.1 1996/01/07 21:54:16 leo Exp $ */
-
-/*
- * Copyright (c) 1995 Waldi Ravens.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Waldi Ravens.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "libtos.h"
-#include "aptck.h"
-#include "disklabel.h"
-
-static int dkcksum PROTO((struct disklabel *));
-static int bsd_label PROTO((disk_t *, u_int));
-static int ahdi_label PROTO((disk_t *));
-static int ahdi_display PROTO((disk_t *));
-static u_int ahdi_getparts PROTO((disk_t *, u_int, u_int));
-
-int
-readdisklabel(dd)
- disk_t *dd;
-{
- int e;
-
- printf("Device : %s (%s) [%s]\n", dd->sname, dd->fname, dd->product);
- printf("Medium size: %lu sectors\n", (u_long)dd->msize);
- printf("Sector size: %lu bytes\n\n", (u_long)dd->bsize);
-
- e = bsd_label(dd, LABELSECTOR);
- if (e < 0) {
- printf("Device I/O error (hardware problem?)\n\n");
- return(-1);
- }
- if (!e) {
- printf("NetBSD/Atari format, boot block: "
- "sector %u labeloffset %u\n\n",
- dd->bblock, dd->lblofs);
- return(0);
- }
-
- e = ahdi_label(dd);
- if (e < 0) {
- printf("Device I/O error (hardware problem?)\n\n");
- return(-1);
- }
- if (!e) {
- printf("AHDI format, NetBSD boot block: ");
- if (dd->bblock != NO_BOOT_BLOCK)
- printf("sector %u labeloffset %u\n\n",
- dd->bblock, dd->lblofs);
- else printf("none\n\n");
- return(0);
- }
-
- printf("Unknown label format.\n\n");
- return(-1);
-}
-
-static int
-bsd_label(dd, offset)
- disk_t *dd;
- u_int offset;
-{
- u_char *bblk;
- u_int nsec;
- int rv;
-
- nsec = (BBSIZE + (dd->bsize - 1)) / dd->bsize;
- bblk = disk_read(dd, offset, nsec);
- if (bblk) {
- u_short *end, *p;
-
- end = (u_short *)&bblk[BBSIZE - sizeof(struct disklabel)];
- rv = 1;
- for (p = (u_short *)bblk; p < end; ++p) {
- struct disklabel *dl = (struct disklabel *)p;
- if (dl->d_magic == DISKMAGIC && dl->d_magic2 == DISKMAGIC
- && dl->d_npartitions <= MAXPARTITIONS && !dkcksum(dl)) {
- dd->lblofs = (u_char *)p - bblk;
- dd->bblock = offset;
- rv = 0;
- break;
- }
- }
- free(bblk);
- }
- else rv = -1;
-
- return(rv);
-}
-
-static int
-dkcksum(dl)
- struct disklabel *dl;
-{
- u_short *start, *end, sum = 0;
-
- start = (u_short *)dl;
- end = (u_short *)&dl->d_partitions[dl->d_npartitions];
- while (start < end)
- sum ^= *start++;
- return(sum);
-}
-
-int
-ahdi_label(dd)
- disk_t *dd;
-{
- u_int i;
- int e;
-
- /*
- * The AHDI format requires a specific block size.
- */
- if (dd->bsize != AHDI_BSIZE)
- return(1);
-
- /*
- * Fetch the AHDI partition descriptors.
- */
- i = ahdi_getparts(dd, AHDI_BBLOCK, AHDI_BBLOCK);
- if (i) {
- if (i < dd->msize)
- return(-1); /* disk read error */
- else return(1); /* reading past end of medium */
- }
-
- /*
- * Display and perform sanity checks.
- */
- i = ahdi_display(dd);
- if (i)
- return(i);
-
- /*
- * Search for a NetBSD disk label
- */
- dd->bblock = NO_BOOT_BLOCK;
- for (i = 0; i < dd->nparts; ++i) {
- part_t *pd = &dd->parts[i];
- u_int id = *((u_int32_t *)&pd->id) >> 8;
- if (id == AHDI_PID_NBD || id == AHDI_PID_RAW) {
- u_int offs = pd->start;
- if ((e = bsd_label(dd, offs)) < 0) {
- return(e); /* I/O error */
- }
- if (!e) {
- dd->bblock = offs; /* got it */
- return(0);
- }
- if (id == AHDI_PID_NBD && dd->bblock == NO_BOOT_BLOCK)
- dd->bblock = offs;
- }
- }
- return(0);
-}
-
-static int
-root_cmp(x1, x2)
- const void *x1, *x2;
-{
- const u_int *r1 = x1,
- *r2 = x2;
-
- if (*r1 < *r2)
- return(-1);
- if (*r1 > *r2)
- return(1);
- return(0);
-}
-
-static int
-part_cmp(x1, x2)
- const void *x1, *x2;
-{
- const part_t *p1 = x1,
- *p2 = x2;
-
- if (p1->start < p2->start)
- return(-1);
- if (p1->start > p2->start)
- return(1);
- if (p1->end < p2->end)
- return(-1);
- if (p1->end > p2->end)
- return(1);
- if (p1->rsec < p2->rsec)
- return(-1);
- if (p1->rsec > p2->rsec)
- return(1);
- if (p1->rent < p2->rent)
- return(-1);
- if (p1->rent > p2->rent)
- return(1);
- return(0);
-}
-
-static int
-ahdi_display(dd)
- disk_t *dd;
-{
- int i, j, rv = 0;
-
- printf("Start of bad sector list : %u\n", dd->bslst);
- if (dd->bslst == 0) {
- printf("* Illegal value (zero) *\n"); rv = 1;
- }
- printf("End of bad sector list : %u\n", dd->bslend);
- if (dd->bslend == 0) {
- printf("* Illegal value (zero) *\n"); rv = 1;
- }
- printf("Medium size (in root sec): %u\n", dd->hdsize);
- if (dd->hdsize == 0) {
- printf("* Illegal value (zero) *\n"); rv = 1;
- }
-
- qsort(dd->roots, dd->nroots, sizeof *dd->roots, root_cmp);
- qsort(dd->parts, dd->nparts, sizeof *dd->parts, part_cmp);
- printf("\n root desc id start end MBs\n");
-
- for (i = 0; i < dd->nparts; ++i) {
- part_t *p1 = &dd->parts[i];
- u_int megs = p1->end - p1->start + 1,
- blpm = (1024 * 1024) / dd->bsize;
- megs = (megs + (blpm >> 1)) / blpm;
- printf("%8u %4u %s %8u %8u (%3u)\n",
- p1->rsec, p1->rent, p1->id,
- p1->start, p1->end, megs);
- for (j = 0; j < dd->nroots; ++j) {
- u_int aux = dd->roots[j];
- if (aux >= p1->start && aux <= p1->end) {
- printf("FATAL: auxilary root at %u\n", aux); rv = 1;
- }
- }
- for (j = i; j--;) {
- part_t *p2 = &dd->parts[j];
- if (p1->start >= p2->start && p1->start <= p2->end) {
- printf("FATAL: clash with %u/%u\n", p2->rsec, p2->rent); rv = 1;
- }
- if (p2->start >= p1->start && p2->start <= p1->end) {
- printf("FATAL: clash with %u/%u\n", p2->rsec, p2->rent); rv = 1;
- }
- }
- if (p1->start >= dd->bslst && p1->start <= dd->bslend) {
- printf("FATAL: partition overlaps with bad sector list\n"); rv = 1;
- }
- if (dd->bslst >= p1->start && dd->bslst <= p1->end) {
- printf("FATAL: partition overlaps with bad sector list\n"); rv = 1;
- }
- }
-
- printf("\nTotal number of auxilary roots: %u\n", dd->nroots);
- printf("Total number of partitions : %u\n", dd->nparts);
- if (dd->nparts == 0) {
- printf("* Weird # of partitions (zero) *\n"); rv = 1;
- }
- if (dd->nparts > AHDI_MAXPARTS) {
- printf("* Too many AHDI partitions for NetBSD *\n");
- printf(" Increase MAXAUXROOTS in machine/disklabel.h,\n");
- printf(" then recompile the NetBSD kernel.\n");
- rv = -1;
- }
- return(rv);
-}
-
-static u_int
-ahdi_getparts(dd, rsec, esec)
- disk_t *dd;
- u_int rsec,
- esec;
-{
- struct ahdi_part *part, *end;
- struct ahdi_root *root;
- u_int rv;
-
- root = disk_read(dd, rsec, 1);
- if (!root) {
- rv = rsec + (rsec == 0);
- goto done;
- }
-
- if (rsec == AHDI_BBLOCK)
- end = &root->ar_parts[AHDI_MAXRPD];
- else end = &root->ar_parts[AHDI_MAXARPD];
- for (part = root->ar_parts; part < end; ++part) {
- u_int id = *((u_int32_t *)&part->ap_flg);
- if (!(id & 0x01000000))
- continue;
- if ((id &= 0x00ffffff) == AHDI_PID_XGM) {
- u_int offs = part->ap_offs + esec;
- u_int i = ++dd->nroots;
- dd->roots = xrealloc(dd->roots, i * sizeof *dd->roots);
- dd->roots[--i] = offs;
- rv = ahdi_getparts(dd, offs, esec == AHDI_BBLOCK ? offs : esec);
- if (rv)
- goto done;
- } else {
- part_t *p;
- u_int i = ++dd->nparts;
- dd->parts = xrealloc(dd->parts, i * sizeof *dd->parts);
- p = &dd->parts[--i];
- *((u_int32_t *)&p->id) = id << 8;
- p->start = part->ap_offs + rsec;
- p->end = p->start + part->ap_size - 1;
- p->rsec = rsec;
- p->rent = part - root->ar_parts;
- }
- }
- dd->hdsize = root->ar_hdsize;
- dd->bslst = root->ar_bslst;
- dd->bslend = root->ar_bslst + root->ar_bslsize - 1;
- rv = 0;
-done:
- free(root);
- return(rv);
-}
+++ /dev/null
-/* $NetBSD: disklabel.h,v 1.1.1.1 1996/01/07 21:54:16 leo Exp $ */
-
-/*
- * Copyright (c) 1995 Leo Weppelman.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Leo Weppelman.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef DISKLABEL_H
-#define DISKLABEL_H
-
-/*
- * On a volume, exclusively used by NetBSD, the boot block starts at
- * sector 0. To allow shared use of a volume between two or more OS's
- * the vendor specific AHDI format is supported. In this case the boot
- * block is located at the start of an AHDI partition. In any case the
- * size of the boot block is 8KB, the disk label is at offset 7KB.
- */
-#define LABELSECTOR 0 /* `natural' start of boot block */
-#define LABELOFFSET (7 * 1024) /* offset of disk label in bytes,
- relative to start of boot block */
-#define BBSIZE (8 * 1024) /* size of boot block in bytes */
-#define MAXPARTITIONS 16 /* max. # of NetBSD partitions */
-#define RAW_PART 2 /* xx?c is raw partition */
-
-#define NO_BOOT_BLOCK ((u_int) -1)
-#define MAXAUXROOTS 60 /* max. # of auxilary root sectors */
-
-/***************************************************************************/
-
-#define AHDI_BSIZE 512 /* AHDI blocksize */
-#define AHDI_BBLOCK 0 /* AHDI bootblock (root sector) */
-#define AHDI_MAXROOTS (MAXAUXROOTS) /* max. # of AHDI rootsectors */
-#define AHDI_MAXPARTS (AHDI_MAXROOTS+3) /* max. # of AHDI partitions */
-
-/*
- * Various `well known' AHDI partition identifiers.
- */
-#define AHDI_MKPID(x,y,z) ( ((u_int32_t)(x) << 16) \
- | ((u_int32_t)(y) << 8) \
- | ((u_int32_t)(z)) \
- )
-#define AHDI_PID_XGM AHDI_MKPID('X','G','M')
-#define AHDI_PID_GEM AHDI_MKPID('G','E','M')
-#define AHDI_PID_BGM AHDI_MKPID('B','G','M')
-#define AHDI_PID_RAW AHDI_MKPID('R','A','W')
-#define AHDI_PID_SWP AHDI_MKPID('S','W','P')
-#define AHDI_PID_NBD AHDI_MKPID('N','B','D')
-#define AHDI_PID_NBR AHDI_MKPID('N','B','R')
-#define AHDI_PID_NBS AHDI_MKPID('N','B','S')
-#define AHDI_PID_NBU AHDI_MKPID('N','B','U')
-
-/*
- * Format of AHDI boot block.
- */
-#define AHDI_MAXRPD 4 /* max. # of partition descriptors */
- /* in the AHDI bootblock (aka root)*/
-#define AHDI_MAXARPD 2 /* max. # of partition descriptors */
- /* in an AHDI auxilary root sector */
-
-struct ahdi_part {
- u_int8_t ap_flg; /* bit 0 is in-use flag */
- u_int8_t ap_id[3]; /* id: GEM, BGM, XGM, UNX, MIX */
- u_int32_t ap_offs; /* block where partition starts */
- u_int32_t ap_size; /* partition size in blocks */
-#define ap_end ap_size /* in the in-core copy, store end instead of size */
-};
-
-struct ahdi_root {
- u_int8_t ar_fill[0x1c2];/* filler, can be boot code */
- u_int32_t ar_hdsize; /* size of entire volume in blocks */
- struct ahdi_part ar_parts[AHDI_MAXRPD]; /* root partition table */
- u_int32_t ar_bslst; /* start of bad-sector list */
- u_int32_t ar_bslsize; /* # of blocks in bad-sector list */
- u_int16_t ar_cksum;
-};
-
-/***************************************************************************/
-
-#define DISKMAGIC ((u_int32_t)0x82564557) /* The disk magic number */
-
-struct disklabel {
- u_int32_t d_magic; /* the magic number */
- u_int16_t d_type; /* drive type */
- u_int16_t d_subtype; /* controller/d_type specific */
- char d_typename[16]; /* type name, e.g. "eagle" */
-
- /*
- * d_packname contains the pack identifier and is returned when
- * the disklabel is read off the disk or in-core copy.
- * d_boot0 and d_boot1 are the (optional) names of the
- * primary (block 0) and secondary (block 1-15) bootstraps
- * as found in /usr/mdec. These are returned when using
- * getdiskbyname(3) to retrieve the values from /etc/disktab.
- */
- union {
- char un_d_packname[16]; /* pack identifier */
- struct {
- char *un_d_boot0; /* primary bootstrap name */
- char *un_d_boot1; /* secondary bootstrap name */
- } un_b;
- } d_un;
-#define d_packname d_un.un_d_packname
-#define d_boot0 d_un.un_b.un_d_boot0
-#define d_boot1 d_un.un_b.un_d_boot1
-
- /* disk geometry: */
- u_int32_t d_secsize; /* # of bytes per sector */
- u_int32_t d_nsectors; /* # of data sectors per track */
- u_int32_t d_ntracks; /* # of tracks per cylinder */
- u_int32_t d_ncylinders; /* # of data cylinders per unit */
- u_int32_t d_secpercyl; /* # of data sectors per cylinder */
- u_int32_t d_secperunit; /* # of data sectors per unit */
-
- /*
- * Spares (bad sector replacements) below are not counted in
- * d_nsectors or d_secpercyl. Spare sectors are assumed to
- * be physical sectors which occupy space at the end of each
- * track and/or cylinder.
- */
- u_int16_t d_sparespertrack; /* # of spare sectors per track */
- u_int16_t d_sparespercyl; /* # of spare sectors per cylinder */
- /*
- * Alternate cylinders include maintenance, replacement, configuration
- * description areas, etc.
- */
- u_int32_t d_acylinders; /* # of alt. cylinders per unit */
-
- /* hardware characteristics: */
- /*
- * d_interleave, d_trackskew and d_cylskew describe perturbations
- * in the media format used to compensate for a slow controller.
- * Interleave is physical sector interleave, set up by the
- * formatter or controller when formatting. When interleaving is
- * in use, logically adjacent sectors are not physically
- * contiguous, but instead are separated by some number of
- * sectors. It is specified as the ratio of physical sectors
- * traversed per logical sector. Thus an interleave of 1:1
- * implies contiguous layout, while 2:1 implies that logical
- * sector 0 is separated by one sector from logical sector 1.
- * d_trackskew is the offset of sector 0 on track N relative to
- * sector 0 on track N-1 on the same cylinder. Finally, d_cylskew
- * is the offset of sector 0 on cylinder N relative to sector 0
- * on cylinder N-1.
- */
- u_int16_t d_rpm; /* rotational speed */
- u_int16_t d_interleave; /* hardware sector interleave */
- u_int16_t d_trackskew; /* sector 0 skew, per track */
- u_int16_t d_cylskew; /* sector 0 skew, per cylinder */
- u_int32_t d_headswitch; /* head switch time, usec */
- u_int32_t d_trkseek; /* track-to-track seek, usec */
- u_int32_t d_flags; /* generic flags */
-#define NDDATA 5
- u_int32_t d_drivedata[NDDATA]; /* drive-type specific information */
-#define NSPARE 5
- u_int32_t d_spare[NSPARE]; /* reserved for future use */
- u_int32_t d_magic2; /* the magic number (again) */
- u_int16_t d_checksum; /* xor of data incl. partitions */
-
- /* filesystem and partition information: */
- u_int16_t d_npartitions; /* number of partitions in following */
- u_int32_t d_bbsize; /* size of boot area at sn0, bytes */
- u_int32_t d_sbsize; /* max size of fs superblock, bytes */
- struct partition { /* the partition table */
- u_int32_t p_size; /* number of sectors in partition */
- u_int32_t p_offset; /* starting sector */
- u_int32_t p_fsize; /* filesystem basic fragment size */
- u_int8_t p_fstype; /* filesystem type, see below */
- u_int8_t p_frag; /* filesystem fragments per block */
- union {
- u_int16_t cpg; /* UFS: FS cylinders per group */
- u_int16_t sgs; /* LFS: FS segment shift */
- } __partition_u1;
-#define p_cpg __partition_u1.cpg
-#define p_sgs __partition_u1.sgs
- } d_partitions[MAXPARTITIONS]; /* actually may be more */
-};
-
-#endif /* DISKLABEL_H */
--- /dev/null
+/* $NetBSD: disklbl.c,v 1.1 1996/01/16 15:15:48 leo Exp $ */
+
+/*
+ * Copyright (c) 1995 Waldi Ravens.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Waldi Ravens.
+ * 4. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "libtos.h"
+#include "aptck.h"
+#include "ahdilbl.h"
+#include "disklbl.h"
+
+static int dkcksum PROTO((struct disklabel *));
+static int bsd_label PROTO((disk_t *, u_int));
+static int ahdi_label PROTO((disk_t *));
+static int ahdi_display PROTO((disk_t *));
+static u_int ahdi_getparts PROTO((disk_t *, u_int, u_int));
+
+int
+readdisklabel(dd)
+ disk_t *dd;
+{
+ int e;
+
+ printf("Device : %s (%s) [%s]\n", dd->sname, dd->fname, dd->product);
+ printf("Medium size: %lu sectors\n", (u_long)dd->msize);
+ printf("Sector size: %lu bytes\n\n", (u_long)dd->bsize);
+
+ e = bsd_label(dd, LABELSECTOR);
+ if (e < 0) {
+ printf("Device I/O error (hardware problem?)\n\n");
+ return(-1);
+ }
+ if (!e) {
+ printf("NetBSD/Atari format, boot block: "
+ "sector %u labeloffset %u\n\n",
+ dd->bblock, dd->lblofs);
+ return(0);
+ }
+
+ e = ahdi_label(dd);
+ if (e < 0) {
+ printf("Device I/O error (hardware problem?)\n\n");
+ return(-1);
+ }
+ if (!e) {
+ printf("AHDI format, NetBSD boot block: ");
+ if (dd->bblock != NO_BOOT_BLOCK)
+ printf("sector %u labeloffset %u\n\n",
+ dd->bblock, dd->lblofs);
+ else printf("none\n\n");
+ return(0);
+ }
+
+ printf("Unknown label format.\n\n");
+ return(-1);
+}
+
+static int
+bsd_label(dd, offset)
+ disk_t *dd;
+ u_int offset;
+{
+ u_char *bblk;
+ u_int nsec;
+ int rv;
+
+ nsec = (BBSIZE + (dd->bsize - 1)) / dd->bsize;
+ bblk = disk_read(dd, offset, nsec);
+ if (bblk) {
+ u_short *end, *p;
+
+ end = (u_short *)&bblk[BBSIZE - sizeof(struct disklabel)];
+ rv = 1;
+ for (p = (u_short *)bblk; p < end; ++p) {
+ struct disklabel *dl = (struct disklabel *)p;
+ if (dl->d_magic == DISKMAGIC && dl->d_magic2 == DISKMAGIC
+ && dl->d_npartitions <= MAXPARTITIONS && !dkcksum(dl)) {
+ dd->lblofs = (u_char *)p - bblk;
+ dd->bblock = offset;
+ rv = 0;
+ break;
+ }
+ }
+ free(bblk);
+ }
+ else rv = -1;
+
+ return(rv);
+}
+
+static int
+dkcksum(dl)
+ struct disklabel *dl;
+{
+ u_short *start, *end, sum = 0;
+
+ start = (u_short *)dl;
+ end = (u_short *)&dl->d_partitions[dl->d_npartitions];
+ while (start < end)
+ sum ^= *start++;
+ return(sum);
+}
+
+int
+ahdi_label(dd)
+ disk_t *dd;
+{
+ u_int i;
+ int e;
+
+ /*
+ * The AHDI format requires a specific block size.
+ */
+ if (dd->bsize != AHDI_BSIZE)
+ return(1);
+
+ /*
+ * Fetch the AHDI partition descriptors.
+ */
+ i = ahdi_getparts(dd, AHDI_BBLOCK, AHDI_BBLOCK);
+ if (i) {
+ if (i < dd->msize)
+ return(-1); /* disk read error */
+ else return(1); /* reading past end of medium */
+ }
+
+ /*
+ * Display and perform sanity checks.
+ */
+ i = ahdi_display(dd);
+ if (i)
+ return(i);
+
+ /*
+ * Search for a NetBSD disk label
+ */
+ dd->bblock = NO_BOOT_BLOCK;
+ for (i = 0; i < dd->nparts; ++i) {
+ part_t *pd = &dd->parts[i];
+ u_int id = *((u_int32_t *)&pd->id) >> 8;
+ if (id == AHDI_PID_NBD || id == AHDI_PID_RAW) {
+ u_int offs = pd->start;
+ if ((e = bsd_label(dd, offs)) < 0) {
+ return(e); /* I/O error */
+ }
+ if (!e) {
+ dd->bblock = offs; /* got it */
+ return(0);
+ }
+ if (id == AHDI_PID_NBD && dd->bblock == NO_BOOT_BLOCK)
+ dd->bblock = offs;
+ }
+ }
+ return(0);
+}
+
+static int
+root_cmp(x1, x2)
+ const void *x1, *x2;
+{
+ const u_int *r1 = x1,
+ *r2 = x2;
+
+ if (*r1 < *r2)
+ return(-1);
+ if (*r1 > *r2)
+ return(1);
+ return(0);
+}
+
+static int
+part_cmp(x1, x2)
+ const void *x1, *x2;
+{
+ const part_t *p1 = x1,
+ *p2 = x2;
+
+ if (p1->start < p2->start)
+ return(-1);
+ if (p1->start > p2->start)
+ return(1);
+ if (p1->end < p2->end)
+ return(-1);
+ if (p1->end > p2->end)
+ return(1);
+ if (p1->rsec < p2->rsec)
+ return(-1);
+ if (p1->rsec > p2->rsec)
+ return(1);
+ if (p1->rent < p2->rent)
+ return(-1);
+ if (p1->rent > p2->rent)
+ return(1);
+ return(0);
+}
+
+static int
+ahdi_display(dd)
+ disk_t *dd;
+{
+ int i, j, rv = 0;
+
+ printf("Start of bad sector list : %u\n", dd->bslst);
+ if (dd->bslst == 0) {
+ printf("* Illegal value (zero) *\n"); rv = 1;
+ }
+ printf("End of bad sector list : %u\n", dd->bslend);
+ if (dd->bslend == 0) {
+ printf("* Illegal value (zero) *\n"); rv = 1;
+ }
+ printf("Medium size (in root sec): %u\n", dd->hdsize);
+ if (dd->hdsize == 0) {
+ printf("* Illegal value (zero) *\n"); rv = 1;
+ }
+
+ qsort(dd->roots, dd->nroots, sizeof *dd->roots, root_cmp);
+ qsort(dd->parts, dd->nparts, sizeof *dd->parts, part_cmp);
+ printf("\n root desc id start end MBs\n");
+
+ for (i = 0; i < dd->nparts; ++i) {
+ part_t *p1 = &dd->parts[i];
+ u_int megs = p1->end - p1->start + 1,
+ blpm = (1024 * 1024) / dd->bsize;
+ megs = (megs + (blpm >> 1)) / blpm;
+ printf("%8u %4u %s %8u %8u (%3u)\n",
+ p1->rsec, p1->rent, p1->id,
+ p1->start, p1->end, megs);
+ for (j = 0; j < dd->nroots; ++j) {
+ u_int aux = dd->roots[j];
+ if (aux >= p1->start && aux <= p1->end) {
+ printf("FATAL: auxilary root at %u\n", aux); rv = 1;
+ }
+ }
+ for (j = i; j--;) {
+ part_t *p2 = &dd->parts[j];
+ if (p1->start >= p2->start && p1->start <= p2->end) {
+ printf("FATAL: clash with %u/%u\n", p2->rsec, p2->rent); rv = 1;
+ }
+ if (p2->start >= p1->start && p2->start <= p1->end) {
+ printf("FATAL: clash with %u/%u\n", p2->rsec, p2->rent); rv = 1;
+ }
+ }
+ if (p1->start >= dd->bslst && p1->start <= dd->bslend) {
+ printf("FATAL: partition overlaps with bad sector list\n"); rv = 1;
+ }
+ if (dd->bslst >= p1->start && dd->bslst <= p1->end) {
+ printf("FATAL: partition overlaps with bad sector list\n"); rv = 1;
+ }
+ }
+
+ printf("\nTotal number of auxilary roots: %u\n", dd->nroots);
+ printf("Total number of partitions : %u\n", dd->nparts);
+ if (dd->nparts == 0) {
+ printf("* Weird # of partitions (zero) *\n"); rv = 1;
+ }
+ if (dd->nparts > AHDI_MAXPARTS) {
+ printf("* Too many AHDI partitions for the default NetBSD "
+ "kernel *\n Increase MAXAUXROOTS in src/sys/arch/"
+ "atari/include/disklabel.h\n to at least %u, and "
+ "recompile the NetBSD kernel.\n", dd->nroots);
+ rv = -1;
+ }
+ return(rv);
+}
+
+static u_int
+ahdi_getparts(dd, rsec, esec)
+ disk_t *dd;
+ u_int rsec,
+ esec;
+{
+ struct ahdi_part *part, *end;
+ struct ahdi_root *root;
+ u_int rv;
+
+ root = disk_read(dd, rsec, 1);
+ if (!root) {
+ rv = rsec + (rsec == 0);
+ goto done;
+ }
+
+ if (rsec == AHDI_BBLOCK)
+ end = &root->ar_parts[AHDI_MAXRPD];
+ else end = &root->ar_parts[AHDI_MAXARPD];
+ for (part = root->ar_parts; part < end; ++part) {
+ u_int id = *((u_int32_t *)&part->ap_flg);
+ if (!(id & 0x01000000))
+ continue;
+ if ((id &= 0x00ffffff) == AHDI_PID_XGM) {
+ u_int offs = part->ap_offs + esec;
+ u_int i = ++dd->nroots;
+ dd->roots = xrealloc(dd->roots, i * sizeof *dd->roots);
+ dd->roots[--i] = offs;
+ rv = ahdi_getparts(dd, offs, esec == AHDI_BBLOCK ? offs : esec);
+ if (rv)
+ goto done;
+ } else {
+ part_t *p;
+ u_int i = ++dd->nparts;
+ dd->parts = xrealloc(dd->parts, i * sizeof *dd->parts);
+ p = &dd->parts[--i];
+ *((u_int32_t *)&p->id) = id << 8;
+ p->start = part->ap_offs + rsec;
+ p->end = p->start + part->ap_size - 1;
+ p->rsec = rsec;
+ p->rent = part - root->ar_parts;
+ }
+ }
+ dd->hdsize = root->ar_hdsize;
+ dd->bslst = root->ar_bslst;
+ dd->bslend = root->ar_bslst + root->ar_bslsize - 1;
+ rv = 0;
+done:
+ free(root);
+ return(rv);
+}
--- /dev/null
+/* $NetBSD: disklbl.h,v 1.1 1996/01/16 15:15:52 leo Exp $ */
+
+/*
+ * Copyright (c) 1987, 1988, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)disklabel.h 8.2 (Berkeley) 7/10/94
+ */
+
+#ifndef DISKLABEL_H
+#define DISKLABEL_H
+
+#define DISKMAGIC ((u_int32_t)0x82564557) /* The disk magic number */
+
+struct disklabel {
+ u_int32_t d_magic; /* the magic number */
+ u_int16_t d_type; /* drive type */
+ u_int16_t d_subtype; /* controller/d_type specific */
+ char d_typename[16]; /* type name, e.g. "eagle" */
+
+ /*
+ * d_packname contains the pack identifier and is returned when
+ * the disklabel is read off the disk or in-core copy.
+ * d_boot0 and d_boot1 are the (optional) names of the
+ * primary (block 0) and secondary (block 1-15) bootstraps
+ * as found in /usr/mdec. These are returned when using
+ * getdiskbyname(3) to retrieve the values from /etc/disktab.
+ */
+ union {
+ char un_d_packname[16]; /* pack identifier */
+ struct {
+ char *un_d_boot0; /* primary bootstrap name */
+ char *un_d_boot1; /* secondary bootstrap name */
+ } un_b;
+ } d_un;
+#define d_packname d_un.un_d_packname
+#define d_boot0 d_un.un_b.un_d_boot0
+#define d_boot1 d_un.un_b.un_d_boot1
+
+ /* disk geometry: */
+ u_int32_t d_secsize; /* # of bytes per sector */
+ u_int32_t d_nsectors; /* # of data sectors per track */
+ u_int32_t d_ntracks; /* # of tracks per cylinder */
+ u_int32_t d_ncylinders; /* # of data cylinders per unit */
+ u_int32_t d_secpercyl; /* # of data sectors per cylinder */
+ u_int32_t d_secperunit; /* # of data sectors per unit */
+
+ /*
+ * Spares (bad sector replacements) below are not counted in
+ * d_nsectors or d_secpercyl. Spare sectors are assumed to
+ * be physical sectors which occupy space at the end of each
+ * track and/or cylinder.
+ */
+ u_int16_t d_sparespertrack; /* # of spare sectors per track */
+ u_int16_t d_sparespercyl; /* # of spare sectors per cylinder */
+ /*
+ * Alternate cylinders include maintenance, replacement, configuration
+ * description areas, etc.
+ */
+ u_int32_t d_acylinders; /* # of alt. cylinders per unit */
+
+ /* hardware characteristics: */
+ /*
+ * d_interleave, d_trackskew and d_cylskew describe perturbations
+ * in the media format used to compensate for a slow controller.
+ * Interleave is physical sector interleave, set up by the
+ * formatter or controller when formatting. When interleaving is
+ * in use, logically adjacent sectors are not physically
+ * contiguous, but instead are separated by some number of
+ * sectors. It is specified as the ratio of physical sectors
+ * traversed per logical sector. Thus an interleave of 1:1
+ * implies contiguous layout, while 2:1 implies that logical
+ * sector 0 is separated by one sector from logical sector 1.
+ * d_trackskew is the offset of sector 0 on track N relative to
+ * sector 0 on track N-1 on the same cylinder. Finally, d_cylskew
+ * is the offset of sector 0 on cylinder N relative to sector 0
+ * on cylinder N-1.
+ */
+ u_int16_t d_rpm; /* rotational speed */
+ u_int16_t d_interleave; /* hardware sector interleave */
+ u_int16_t d_trackskew; /* sector 0 skew, per track */
+ u_int16_t d_cylskew; /* sector 0 skew, per cylinder */
+ u_int32_t d_headswitch; /* head switch time, usec */
+ u_int32_t d_trkseek; /* track-to-track seek, usec */
+ u_int32_t d_flags; /* generic flags */
+#define NDDATA 5
+ u_int32_t d_drivedata[NDDATA]; /* drive-type specific information */
+#define NSPARE 5
+ u_int32_t d_spare[NSPARE]; /* reserved for future use */
+ u_int32_t d_magic2; /* the magic number (again) */
+ u_int16_t d_checksum; /* xor of data incl. partitions */
+
+ /* filesystem and partition information: */
+ u_int16_t d_npartitions; /* number of partitions in following */
+ u_int32_t d_bbsize; /* size of boot area at sn0, bytes */
+ u_int32_t d_sbsize; /* max size of fs superblock, bytes */
+ struct partition { /* the partition table */
+ u_int32_t p_size; /* number of sectors in partition */
+ u_int32_t p_offset; /* starting sector */
+ u_int32_t p_fsize; /* filesystem basic fragment size */
+ u_int8_t p_fstype; /* filesystem type, see below */
+ u_int8_t p_frag; /* filesystem fragments per block */
+ union {
+ u_int16_t cpg; /* UFS: FS cylinders per group */
+ u_int16_t sgs; /* LFS: FS segment shift */
+ } __partition_u1;
+#define p_cpg __partition_u1.cpg
+#define p_sgs __partition_u1.sgs
+ } d_partitions[MAXPARTITIONS]; /* actually may be more */
+};
+
+#endif /* DISKLABEL_H */
--- /dev/null
+#!/usr/bin/awk -f
+#
+# $NetBSD: setrev.awk,v 1.1 1996/01/16 15:15:55 leo Exp $
+#
+function revcmp(r1, r2, n1, n2, a1, a2, n, i) {
+ n1 = split(r1, a1, "\.")
+ n2 = split(r2, a2, "\.")
+ n = (n1 < n2) ? n1 : n2
+
+ for (i = 1; i <= n; ++i) {
+ if (a1[i] != a2[i])
+ return(a1[i] - a2[i])
+ }
+ if (n1 != n2)
+ return(n1 - n2)
+ return(0)
+}
+
+BEGIN {
+ destfile = ARGV[1]
+ rev = "0.0"
+}
+
+{
+ if (revcmp($4, rev) > 0)
+ rev = $4
+ next file
+}
+
+END {
+ while ((e = getline <destfile) > 0) {
+ if (/"\$Revision.*\$"/)
+ sub("\\\$Revision.*\\\$", "Revision " rev)
+ print
+ }
+ if (e)
+ exit(1)
+ exit(0)
+}
+++ /dev/null
-#!/usr/bin/awk -f
-#
-# $NetBSD: setversion,v 1.1.1.1 1996/01/07 21:54:17 leo Exp $
-#
-function revcmp(r1, r2, n1, n2, a1, a2, n, i) {
- n1 = split(r1, a1, "\.")
- n2 = split(r2, a2, "\.")
- n = (n1 < n2) ? n1 : n2
-
- for (i = 1; i <= n; ++i) {
- if (a1[i] != a2[i])
- return(a1[i] - a2[i])
- }
- if (n1 != n2)
- return(n1 - n2)
- return(0)
-}
-
-BEGIN {
- destfile = ARGV[1]
- rev = "0.0"
-}
-
-{
- if (revcmp($4, rev) > 0)
- rev = $4
- next file
-}
-
-END {
- while ((e = getline <destfile) > 0) {
- if (/"\$Revision.*\$"/)
- sub("\\\$Revision.*\\\$", "Revision " rev)
- print
- }
- if (e)
- exit(1)
- exit(0)
-}