diff mbox series

[bug#47615,5/9] gnu: Add mac-fdisk.

Message ID 704d44c4cb94b28a4a6d832296a602eb6ad4e711.1617711307.git.efraim@flashner.co.il
State New
Headers show
Series Add 32-bit powerpc support | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch fail View Laminar job
cbaines/issue success View issue

Commit Message

Efraim Flashner April 6, 2021, 12:32 p.m. UTC
* gnu/packages/disk.scm (mac-fdisk): New variable.
* gnu/packages/patches/mac-fdisk-gentoo-patchset.patch,
gnu/packages/patches/mac-fdisk-p18.patch: New files.
* gnu/local.mk (dist_patch_DATA): Register them.
---
 gnu/local.mk                                  |    2 +
 gnu/packages/disk.scm                         |   44 +
 .../patches/mac-fdisk-gentoo-patchset.patch   |  866 +++++++
 gnu/packages/patches/mac-fdisk-p18.patch      | 2070 +++++++++++++++++
 4 files changed, 2982 insertions(+)
 create mode 100644 gnu/packages/patches/mac-fdisk-gentoo-patchset.patch
 create mode 100644 gnu/packages/patches/mac-fdisk-p18.patch
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index ce0a79fb4d..4545cd0a7f 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1374,6 +1374,8 @@  dist_patch_DATA =						\
   %D%/packages/patches/luit-posix.patch				\
   %D%/packages/patches/lvm2-static-link.patch			\
   %D%/packages/patches/mailutils-fix-uninitialized-variable.patch	\
+  %D%/packages/patches/mac-fdisk-gentoo-patchset.patch		\
+  %D%/packages/patches/mac-fdisk-p18.patch			\
   %D%/packages/patches/make-impure-dirs.patch			\
   %D%/packages/patches/mars-install.patch			\
   %D%/packages/patches/mars-sfml-2.3.patch			\
diff --git a/gnu/packages/disk.scm b/gnu/packages/disk.scm
index ed112f2ec2..ce49f493ea 100644
--- a/gnu/packages/disk.scm
+++ b/gnu/packages/disk.scm
@@ -302,6 +302,50 @@  fdisk.  fdisk is used for the creation and manipulation of disk partition
 tables, and it understands a variety of different formats.")
     (license license:gpl3+)))
 
+(define-public mac-fdisk
+  (package
+    (name "mac-fdisk")
+    (version "0.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (string-append "mirror://debian/pool/main/m/mac-fdisk/"
+                            "mac-fdisk_" version ".orig.tar.gz"))
+        (sha256
+         (base32 "0rkaqp82l47pg0ymqys07mljf3widv2yk4hhgs2yz8hwli5zqnbh"))
+        (patches (search-patches "mac-fdisk-p18.patch"
+                                 "mac-fdisk-gentoo-patchset.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (delete 'configure)        ; no configure script.
+         (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out  (assoc-ref outputs "out"))
+                    (sbin (string-append out "/sbin"))
+                    (man8 (string-append out "/share/man/man8")))
+               (mkdir-p sbin)
+               (mkdir-p man8)
+               (copy-file "fdisk" (string-append sbin "/mac-fdisk"))
+               (copy-file "pdisk" (string-append sbin "/pmac-fdisk"))
+               (copy-file "mac-fdisk.8.in" (string-append man8 "/mac-fdisk.8"))
+               (copy-file "pmac-fdisk.8.in" (string-append man8 "/pmac-fdisk.8"))
+               #t))))
+       #:make-flags (list "CC=gcc")
+       #:tests? #f))                ; no tests
+    (home-page "https://tracker.debian.org/pkg/mac-fdisk")
+    (synopsis "Apple disk partition manipulation tool")
+    (description "The @code{fdisk} utilities from the MkLinux project, adopted
+for Linux/m68k.  @code{mac-fdisk} allows you to create and edit the partition
+table of a disk.  It supports only the Apple partition format used on Macintosh
+and PowerMac, use @code{pmac-fdisk} for PC partition format disks as used on
+PowerPC machines.  @code{mac-fdisk} is an interactive tool with a menu similar
+to PC @code{fdisk}, supported options are somewhat different from PC
+@code{fdisk} due to the differences in partition format.")
+    (supported-systems '("powerpc-linux" "i686-linux" "x86_64-linux"))
+    (license license:gpl2)))
+
 (define-public gptfdisk
   (package
     (name "gptfdisk")
diff --git a/gnu/packages/patches/mac-fdisk-gentoo-patchset.patch b/gnu/packages/patches/mac-fdisk-gentoo-patchset.patch
new file mode 100644
index 0000000000..b1bd38f671
--- /dev/null
+++ b/gnu/packages/patches/mac-fdisk-gentoo-patchset.patch
@@ -0,0 +1,866 @@ 
+https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-fs/mac-fdisk/files
+
+---
+ bitfield.c      | 16 +++++-----
+ bitfield.h      |  4 +--
+ dump.c          | 42 ++++++++++++--------------
+ errors.c        | 11 ++++---
+ fdisk.c         | 68 ++++++++++++++++++++++++++++++++++++++----
+ fdisk.h         |  5 ++++
+ fdisklabel.c    | 79 +++++++++++++++++++++++++++----------------------
+ fdisklabel.h    |  2 +-
+ io.c            |  8 +++--
+ kernel-defs.h   |  6 ++++
+ partition_map.c | 43 ++++++++++++++++-----------
+ pdisk.c         |  7 ++---
+ 12 files changed, 186 insertions(+), 105 deletions(-)
+
+diff --git a/bitfield.c b/bitfield.c
+index 687e8bd..02e7f68 100644
+--- a/bitfield.c
++++ b/bitfield.c
+@@ -67,13 +67,12 @@ const unsigned long masks[] = {
+ //
+ // Routines
+ //
+-unsigned long
+-bitfield_set(unsigned long *bf, int base, int length, unsigned long value)
++unsigned int
++bitfield_set(unsigned int *bf, int base, int length, unsigned int value)
+ {
+-    unsigned long t;
+-    unsigned long m;
++    unsigned int t;
++    unsigned int m;
+     int s;
+-    int i;
+ 
+     // compute shift & mask, coerce value to correct number of bits,
+     // zap the old bits and stuff the new value
+@@ -86,12 +85,11 @@ bitfield_set(unsigned long *bf, int base, int length, unsigned long value)
+ }
+ 
+ 
+-unsigned long
+-bitfield_get(unsigned long bf, int base, int length)
++unsigned int
++bitfield_get(unsigned int bf, int base, int length)
+ {
+-    unsigned long m;
++    unsigned int m;
+     int s;
+-    int i;
+ 
+     // compute shift & mask
+     // return the correct number of bits (shifted to low end)
+diff --git a/bitfield.h b/bitfield.h
+index ff56759..abfdf05 100644
+--- a/bitfield.h
++++ b/bitfield.h
+@@ -63,5 +63,5 @@
+ //
+ // Forward declarations
+ //
+-unsigned long bitfield_set(unsigned long *bf, int base, int length, unsigned long value);
+-unsigned long bitfield_get(unsigned long bf, int base, int length);
++unsigned int bitfield_set(unsigned int *bf, int base, int length, unsigned int value);
++unsigned int bitfield_get(unsigned int bf, int base, int length);
+diff --git a/dump.c b/dump.c
+index 4153dc5..edeeb31 100644
+--- a/dump.c
++++ b/dump.c
+@@ -30,10 +30,8 @@
+  */
+ 
+ #include <stdio.h>
+-#ifndef __linux__
+ #include <stdlib.h>
+ #include <unistd.h>
+-#endif
+ #include <string.h>
+ #include <errno.h>
+ #include <fcntl.h>
+@@ -63,16 +61,16 @@ typedef struct names {
+ // Global Constants
+ //
+ NAMES plist[] = {
+-    "Drvr", "Apple_Driver",
+-    "Dr43", "Apple_Driver43",
+-    "Free", "Apple_Free",
+-    " HFS", "Apple_HFS",
+-    " MFS", "Apple_MFS",
+-    "PDOS", "Apple_PRODOS",
+-    "junk", "Apple_Scratch",
+-    "unix", "Apple_UNIX_SVR2",
+-    " map", "Apple_partition_map",
+-    0,	0
++    {"Drvr"}, {"Apple_Driver"},
++    {"Dr43"}, {"Apple_Driver43"},
++    {"Free"}, {"Apple_Free"},
++    {" HFS"}, {"Apple_HFS"},
++    {" MFS"}, {"Apple_MFS"},
++    {"PDOS"}, {"Apple_PRODOS"},
++    {"junk"}, {"Apple_Scratch"},
++    {"unix"}, {"Apple_UNIX_SVR2"},
++    {" map"}, {"Apple_partition_map"},
++    {0},	{0}
+ };
+ 
+ const char * kStringEmpty	= "";
+@@ -164,10 +162,10 @@ dump_partition_map(partition_map_header *map, int disk_order)
+     }
+ #ifdef __mc68000__
+     printf("%*s  type name         "
+-	    "%*s   %-*s ( size )  system\n", strlen(map->name)+1, "#", j, "length", j, "base");
++	    "%*s   %-*s ( size )  system\n", (int)strlen(map->name)+1, "#", j, "length", j, "base");
+ #else
+     printf("%*s                    type name               "
+-	    "%*s   %-*s ( size )  system\n", strlen(map->name)+1, "#", j, "length", j, "base");
++	    "%*s   %-*s ( size )  system\n", (int)strlen(map->name)+1, "#", j, "length", j, "base");
+ #endif
+ 
+     /* Grok devfs names. (courtesy Colin Walters)*/
+@@ -201,7 +199,6 @@ dump_partition_entry(partition_map *entry, int digits, char *dev)
+     partition_map_header *map;
+     int j;
+     DPME *p;
+-    BZB *bp;
+     char *s;
+ #ifdef __mc68000__
+     int aflag = 1;
+@@ -224,13 +221,13 @@ dump_partition_entry(partition_map *entry, int digits, char *dev)
+ 	    }
+ 	}
+ #ifdef __mc68000__
+-	printf("%s%-2d %.4s %-12.12s ", dev, entry->disk_address, s, p->dpme_name);
++	printf("%s%-2d %.4s %-12.12s ", dev, (int)entry->disk_address, s, p->dpme_name);
+ #else
+-	printf("%s%-4d  %.4s %-18.32s ", dev, entry->disk_address, s, p->dpme_name);
++	printf("%s%-4d  %.4s %-18.32s ", dev, (int)entry->disk_address, s, p->dpme_name);
+ #endif
+     } else {
+ 	printf("%s%-4d %20.32s %-18.32s ", dev, 
+-		entry->disk_address, p->dpme_type, p->dpme_name);
++		(int)entry->disk_address, p->dpme_type, p->dpme_name);
+     }
+ 
+     if (pflag) {
+@@ -314,7 +311,6 @@ list_all_disks()
+     int i;
+     int fd;
+     DPME * data;
+-    long t;
+ 
+     data = (DPME *) malloc(PBLOCK_SIZE);
+     if (data == NULL) {
+@@ -382,7 +378,7 @@ show_data_structures(partition_map_header *map)
+     printf("Header:\n");
+     printf("fd=%d (%s)\n", map->fd, (map->regular_file)?"file":"device");
+     printf("map %d blocks out of %d,  media %u blocks\n",
+-	    map->blocks_in_map, map->maximum_in_map, map->media_size);
++	    map->blocks_in_map, map->maximum_in_map, (unsigned int)map->media_size);
+     printf("Map is%s writeable", (map->writeable)?kStringEmpty:kStringNot);
+     printf(", but%s changed\n", (map->changed)?kStringEmpty:kStringNot);
+     printf("\n");
+@@ -426,7 +422,7 @@ u32     dpme_reserved_3[62]     ;
+     for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) {
+ 	p = entry->data;
+ 	printf("%2d: %20.32s ",
+-		entry->disk_address, p->dpme_type);
++		(int)entry->disk_address, p->dpme_type);
+ 	printf("%7u @ %-7u ", p->dpme_pblocks, p->dpme_pblock_start);
+ 	printf("%c%c%c%c%c%c%c%c%c%c ",
+ 		(dpme_valid_get(p))?'V':'v',
+@@ -449,7 +445,7 @@ u32     dpme_reserved_3[62]     ;
+ 	    "goto_address checksum processor\n");
+     for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) {
+ 	p = entry->data;
+-	printf("%2d: ", entry->disk_address);
++	printf("%2d: ", (int)entry->disk_address);
+ 	printf("%7u ", p->dpme_boot_block);
+ 	printf("%7u ", p->dpme_boot_bytes);
+ 	printf("%8x ", p->dpme_load_addr);
+@@ -466,7 +462,7 @@ xx: cccc RU *dd s...
+ */
+     for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) {
+ 	p = entry->data;
+-	printf("%2d: ", entry->disk_address);
++	printf("%2d: ", (int)entry->disk_address);
+ 
+ 	bp = (BZB *) (p->dpme_bzb);
+ 	j = -1;
+diff --git a/errors.c b/errors.c
+index 47c9c30..4e9e486 100644
+--- a/errors.c
++++ b/errors.c
+@@ -26,12 +26,11 @@
+  */
+ 
+ #include <stdio.h>
+-#ifndef __linux__
+ #include <stdlib.h>
+-#endif
+ #include <string.h>
+ #include <stdarg.h>
+ 
++#include <errno.h>
+ #include "errors.h"
+ #include "pdisk.h"
+ 
+@@ -115,8 +114,8 @@ fatal(int value, char *fmt, ...)
+     va_end(ap);
+ 
+ #ifdef __linux__
+-    if (value > 0 && value < sys_nerr) {
+-	fprintf(stderr, "  (%s)\n", sys_errlist[value]);
++    if (value > 0 && value < errno) {
++	fprintf(stderr, "  (%s)\n", strerror(value));
+     } else {
+ 	fprintf(stderr, "\n");
+     }
+@@ -144,8 +143,8 @@ error(int value, char *fmt, ...)
+     va_end(ap);
+ 
+ #ifdef __linux__
+-    if (value > 0 && value < sys_nerr) {
+-	fprintf(stderr, "  (%s)\n", sys_errlist[value]);
++    if (value > 0 && value < errno) {
++	fprintf(stderr, "  (%s)\n", strerror(value));
+     } else {
+ 	fprintf(stderr, "\n");
+     }
+diff --git a/fdisk.c b/fdisk.c
+index d77619b..dec19ae 100644
+--- a/fdisk.c
++++ b/fdisk.c
+@@ -59,9 +59,14 @@
+  */
+ 
+ 
++#ifndef _LARGEFILE64_SOURCE
++#define _LARGEFILE64_SOURCE
++#endif
++#include <sys/types.h>
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <fcntl.h>
+ #include <ctype.h>
+ #include <setjmp.h>
+@@ -70,12 +75,65 @@
+ 
+ #include <sys/ioctl.h>
+ 
+-typedef unsigned short kdev_t;	/* BAD hack; kdev_t is not exported */
+-
+ #include "kernel-defs.h"
+ 
+ #include "fdisk.h"
+ 
++/* ----------- */
++#define _PPC64_TYPES_H
++#define BITS_PER_LONG 64
++
++typedef __signed__ char __s8;
++typedef signed char s8;
++typedef unsigned char u8;
++typedef unsigned char __u8;
++
++typedef __signed__ short __s16;
++typedef signed short s16;
++/*typedef unsigned short __u16;*/
++typedef unsigned short u16;
++
++typedef __signed__ int __s32;
++typedef signed int s32;
++/*typedef unsigned int __u32;*/
++typedef unsigned int u32;
++
++typedef __signed__ long __s64;
++typedef signed long s64;
++typedef unsigned long __u64;
++typedef unsigned long u64;
++
++typedef struct {
++        __u32 u[4];
++} __attribute((aligned(16))) __vector128;
++
++typedef __vector128 vector128;
++
++typedef u32 dma_addr_t;
++typedef u64 dma64_addr_t;
++
++typedef struct {
++        unsigned long entry;
++        unsigned long toc;
++        unsigned long env;
++} func_descr_t;
++
++typedef unsigned int umode_t;
++
++#define BITS_TO_LONGS(bits) \
++        (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
++#define DECLARE_BITMAP(name,bits) \
++        unsigned long name[BITS_TO_LONGS(bits)]
++#define CLEAR_BITMAP(name,bits) \
++        memset(name, 0, BITS_TO_LONGS(bits)*sizeof(unsigned long))
++
++/* hd/ide ctl's that pass (arg) ptrs to user space are numbered 0x030n/0x031n */
++#define HDIO_GETGEO             0x0301  /* get device geometry */
++
++#define BLKRRPART  _IO(0x12,95) /* re-read partition table */
++
++/* ---------- */
++
+ #define hex_val(c)	({ \
+ 				char _c = (c); \
+ 				isdigit(_c) ? _c - '0' : \
+@@ -192,10 +250,10 @@ char read_char(char *mesg);
+ 
+ jmp_buf listingbuf;
+ 
+-inline unsigned short __swap16(unsigned short x) {
++static inline unsigned short __swap16(unsigned short x) {
+ 	return (((__u16)(x) & 0xFF) << 8) | (((__u16)(x) & 0xFF00) >> 8);
+ }
+-inline __u32 __swap32(__u32 x) {
++static inline __u32 __swap32(__u32 x) {
+ 	return (((__u32)(x) & 0xFF) << 24) | (((__u32)(x) & 0xFF00) << 8) | (((__u32)(x) & 0xFF0000) >> 8) | (((__u32)(x) & 0xFF000000) >> 24);
+ }
+ 
+@@ -1415,7 +1473,7 @@ void try(char *device)
+ 	}
+ }
+ 
+-void main(int argc, char **argv)
++int main(int argc, char **argv)
+ {
+ 	if (argc > 3)
+ 		fatal(usage);
+diff --git a/fdisk.h b/fdisk.h
+index 2b6ddc8..0a0566d 100644
+--- a/fdisk.h
++++ b/fdisk.h
+@@ -2,6 +2,11 @@
+    fdisk.h
+ */
+ 
++#ifdef __linux__
++#define _FILE_OFFSET_BITS 64
++#define _LARGE_FILES
++#endif
++
+ #define SECTOR_SIZE	512
+ #define NETBSD_PARTITION 0xa5
+ #define cround(n)	(((n) + display_factor * unit_flag) / display_factor)
+diff --git a/fdisklabel.c b/fdisklabel.c
+index 70c3cfa..7622bc2 100644
+--- a/fdisklabel.c
++++ b/fdisklabel.c
+@@ -35,9 +35,14 @@
+    SUCH DAMAGE.
+ */
+ 
++#ifndef _LARGEFILE64_SOURCE
++#define _LARGEFILE64_SOURCE
++#endif
++#include <sys/types.h>
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <string.h>
+ #include <fcntl.h>
+ #include <ctype.h>
+ #include <setjmp.h>
+@@ -46,6 +51,8 @@
+ #include <sys/ioctl.h>
+ #include <sys/param.h>
+ 
++#include <asm/types.h>
++
+ #include "kernel-defs.h"
+ 
+ #include "fdisk.h"
+@@ -68,7 +75,7 @@ static int bsd_initlabel  (struct partition *p, struct disklabel *d, int pindex)
+ static int bsd_readlabel  (struct partition *p, struct disklabel *d);
+ static int bsd_writelabel (struct partition *p, struct disklabel *d);
+ static void sync_disks (void);
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+ static int bsd_translate_fstype (int linux_type);
+ static void bsd_link_part (void);
+ #endif
+@@ -78,7 +85,7 @@ void alpha_bootblock_checksum (char *boot);
+ 
+ static struct disklabel bsd_dlabel;
+ static char buffer[BSD_BBSIZE];
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+ static struct partition *bsd_part;
+ static int bsd_part_index;
+ #endif
+@@ -95,13 +102,13 @@ bmenu (void)
+ 	"   n   add a new BSD partition\n"
+ 	"   p   print BSD partition table\n"
+ 	"   q   quit without saving changes\n"
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+ 	"   r   return to main menu\n"
+ #endif
+ 	"   s   show complete disklabel\n"
+ 	"   t   change a partition's filesystem id\n"
+ 	"   w   write disklabel to disk\n"
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+ 	"   x   link BSD partition to non-BSD partition"
+ #endif
+ 	);
+@@ -110,7 +117,7 @@ bmenu (void)
+ void
+ bselect (void)
+ {
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   int t;
+ 
+   for (t=0; t<4; t++)
+@@ -181,7 +188,7 @@ bselect (void)
+       case 'w':
+ 	bsd_write_disklabel ();
+ 	break;
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+       case 'r':
+ 	return;
+       case 'x':
+@@ -219,7 +226,7 @@ bsd_new_part (void)
+   if (!bsd_check_new_partition (&i))
+     return;
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   begin = bsd_part -> start_sect;
+   end = begin + bsd_part -> nr_sects - 1;
+ #elif defined (__alpha__) || defined (__powerpc__)
+@@ -253,7 +260,7 @@ bsd_print_disklabel (int show_all)
+ 
+   if (show_all)
+   {
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+     fprintf(f, "# %s%d:\n", disk_device, bsd_part_index+1);
+ #elif defined (__alpha__) || defined (__powerpc__)
+     fprintf(f, "# %s:\n", disk_device);
+@@ -262,8 +269,8 @@ bsd_print_disklabel (int show_all)
+       fprintf(f, "type: %s\n", bsd_dktypenames[lp->d_type]);
+     else
+       fprintf(f, "type: %d\n", lp->d_type);
+-    fprintf(f, "disk: %.*s\n", sizeof(lp->d_typename), lp->d_typename);
+-    fprintf(f, "label: %.*s\n", sizeof(lp->d_packname), lp->d_packname);
++    fprintf(f, "disk: %.*s\n", (int)sizeof(lp->d_typename), lp->d_typename);
++    fprintf(f, "label: %.*s\n", (int)sizeof(lp->d_packname), lp->d_packname);
+     fprintf(f, "flags:");
+     if (lp->d_flags & BSD_D_REMOVABLE)
+       fprintf(f, " removable");
+@@ -272,17 +279,17 @@ bsd_print_disklabel (int show_all)
+     if (lp->d_flags & BSD_D_BADSECT)
+       fprintf(f, " badsect");
+     fprintf(f, "\n");
+-    fprintf(f, "bytes/sector: %d\n", lp->d_secsize);
+-    fprintf(f, "sectors/track: %d\n", lp->d_nsectors);
+-    fprintf(f, "tracks/cylinder: %d\n", lp->d_ntracks);
+-    fprintf(f, "sectors/cylinder: %d\n", lp->d_secpercyl);
+-    fprintf(f, "cylinders: %d\n", lp->d_ncylinders);
++    fprintf(f, "bytes/sector: %d\n", (int)lp->d_secsize);
++    fprintf(f, "sectors/track: %d\n", (int)lp->d_nsectors);
++    fprintf(f, "tracks/cylinder: %d\n", (int)lp->d_ntracks);
++    fprintf(f, "sectors/cylinder: %d\n", (int)lp->d_secpercyl);
++    fprintf(f, "cylinders: %d\n", (int)lp->d_ncylinders);
+     fprintf(f, "rpm: %d\n", lp->d_rpm);
+     fprintf(f, "interleave: %d\n", lp->d_interleave);
+     fprintf(f, "trackskew: %d\n", lp->d_trackskew);
+     fprintf(f, "cylinderskew: %d\n", lp->d_cylskew);
+-    fprintf(f, "headswitch: %d\t\t# milliseconds\n", lp->d_headswitch);
+-    fprintf(f, "track-to-track seek: %d\t# milliseconds\n", lp->d_trkseek);
++    fprintf(f, "headswitch: %d\t\t# milliseconds\n", (int)lp->d_headswitch);
++    fprintf(f, "track-to-track seek: %d\t# milliseconds\n", (int)lp->d_trkseek);
+     fprintf(f, "drivedata: ");
+     for (i = NDDATA - 1; i >= 0; i--)
+       if (lp->d_drivedata[i])
+@@ -290,7 +297,7 @@ bsd_print_disklabel (int show_all)
+     if (i < 0)
+       i = 0;
+     for (j = 0; j <= i; j++)
+-      fprintf(f, "%d ", lp->d_drivedata[j]);
++      fprintf(f, "%d ", (int)lp->d_drivedata[j]);
+   }
+   fprintf (f, "\n%d partitions:\n", lp->d_npartitions);
+   fprintf (f, "#        size   offset    fstype   [fsize bsize   cpg]\n");
+@@ -298,7 +305,7 @@ bsd_print_disklabel (int show_all)
+   for (i = 0; i < lp->d_npartitions; i++, pp++) {
+     if (pp->p_size) {
+       fprintf(f, "  %c: %8d %8d  ", 'a' + i,
+-	      pp->p_size, pp->p_offset);
++	      (int)pp->p_size, (int)pp->p_offset);
+       if ((unsigned) pp->p_fstype < BSD_FSMAXTYPES)
+ 	fprintf(f, "%8.8s", bsd_fstypes[pp->p_fstype].name);
+       else
+@@ -307,12 +314,12 @@ bsd_print_disklabel (int show_all)
+       {
+         case BSD_FS_UNUSED:
+ 	  fprintf(f, "    %5d %5d %5.5s ",
+-		  pp->p_fsize, pp->p_fsize * pp->p_frag, "");
++		  (int)pp->p_fsize, (int)pp->p_fsize * pp->p_frag, "");
+ 	  break;
+ 	  
+ 	case BSD_FS_BSDFFS:
+ 	  fprintf(f, "    %5d %5d %5d ",
+-		  pp->p_fsize, pp->p_fsize * pp->p_frag,
++		  (int)pp->p_fsize, (int)pp->p_fsize * pp->p_frag,
+ 		  pp->p_cpg);
+ 	  break;
+ 	  
+@@ -322,21 +329,21 @@ bsd_print_disklabel (int show_all)
+       }
+       fprintf(f, "\t# (Cyl. %4d",
+ #if 0
+-	      pp->p_offset / lp->d_secpercyl); /* differs from Linux fdisk */
++	      (int)(pp->p_offset / lp->d_secpercyl)); /* differs from Linux fdisk */
+ #else
+-	      pp->p_offset / lp->d_secpercyl + 1);
++	      (int)(pp->p_offset / lp->d_secpercyl + 1));
+ #endif
+       if (pp->p_offset % lp->d_secpercyl)
+ 	putc('*', f);
+       else
+ 	putc(' ', f);
+       fprintf(f, "- %d",
+-	      (pp->p_offset + 
++	      (int)((pp->p_offset + 
+ 	       pp->p_size + lp->d_secpercyl - 1) /
+ #if 0
+-	      lp->d_secpercyl - 1); /* differs from Linux fdisk */
++	      lp->d_secpercyl - 1)); /* differs from Linux fdisk */
+ #else
+-	      lp->d_secpercyl);
++	      lp->d_secpercyl));
+ #endif
+       if (pp->p_size % lp->d_secpercyl)
+ 	putc('*', f);
+@@ -348,7 +355,7 @@ bsd_print_disklabel (int show_all)
+ static void
+ bsd_write_disklabel (void)
+ {
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   printf ("Writing disklabel to %s%d.\n", disk_device, bsd_part_index+1);
+   bsd_writelabel (bsd_part, &bsd_dlabel);
+ #elif defined (__alpha__) || defined (__powerpc__)
+@@ -362,7 +369,7 @@ bsd_create_disklabel (void)
+ {
+   char c;
+ 
+-#if defined (i386)
++#if defined (i386) || defined(__amd64)
+   fprintf (stderr, "%s%d contains no disklabel.\n",
+ 	   disk_device, bsd_part_index+1);
+ #elif defined (__alpha__) || defined (__powerpc__)
+@@ -372,7 +379,7 @@ bsd_create_disklabel (void)
+   while (1)
+     if ((c = tolower (read_char ("Do you want to create a disklabel? (y/n) "))) == 'y')
+     {
+-#if defined (i386)
++#if defined (i386) || defined(__amd64)
+       if (bsd_initlabel (bsd_part, &bsd_dlabel, bsd_part_index) == 1)
+ #elif defined (__alpha__) || defined (__powerpc__) || defined (__mc68000__)
+       if (bsd_initlabel (NULL, &bsd_dlabel, 0) == 1)
+@@ -503,7 +510,7 @@ bsd_write_bootstrap (void)
+ 
+   bcopy (&dl, d, sizeof (struct disklabel));
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   sector = bsd_part -> start_sect;
+ #elif defined (__powerpc__)
+   sector = 0;
+@@ -517,7 +524,7 @@ bsd_write_bootstrap (void)
+   if (BSD_BBSIZE != write (fd, buffer, BSD_BBSIZE))
+     fatal (unable_to_write);
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   printf ("Bootstrap installed on %s%d.\n", disk_device, bsd_part_index+1);
+ #elif defined (__alpha__) || defined (__powerpc__)
+   printf ("Bootstrap installed on %s.\n", disk_device);
+@@ -621,7 +628,7 @@ bsd_initlabel (struct partition *p, struct disklabel *d, int pindex)
+   d -> d_subtype = BSD_DSTYPE_INDOSPART & pindex;
+ #endif
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   d -> d_flags = BSD_D_DOSPART;
+ #else
+   d -> d_flags = 0;
+@@ -644,7 +651,7 @@ bsd_initlabel (struct partition *p, struct disklabel *d, int pindex)
+   d -> d_bbsize = BSD_BBSIZE;
+   d -> d_sbsize = BSD_SBSIZE;
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   d -> d_npartitions = 4;
+   pp = &d -> d_partitions[2]; /* Partition C should be the NetBSD partition */
+   pp -> p_offset = p -> start_sect;
+@@ -670,7 +677,7 @@ bsd_readlabel (struct partition *p, struct disklabel *d)
+ {
+   int t, sector;
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   sector = p -> start_sect;
+ #elif defined (__alpha__) || defined (__powerpc__)
+   sector = 0;
+@@ -704,7 +711,7 @@ bsd_writelabel (struct partition *p, struct disklabel *d)
+ {
+   int sector;
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+   sector = p -> start_sect + BSD_LABELSECTOR;
+ #elif defined (__alpha__) || defined (__powerpc__)
+   sector = BSD_LABELSECTOR;
+@@ -745,7 +752,7 @@ sync_disks (void)
+   sleep (4);
+ }
+ 
+-#if defined (i386)
++#if defined (i386) || defined (__amd64)
+ static int
+ bsd_translate_fstype (int linux_type)
+ {
+diff --git a/fdisklabel.h b/fdisklabel.h
+index a9c4d2e..44cb89f 100644
+--- a/fdisklabel.h
++++ b/fdisklabel.h
+@@ -35,7 +35,7 @@
+ #define	BSD_MAXPARTITIONS 8
+ #define BSD_LINUX_BOOTDIR "/usr/ucb/mdec"
+ 
+-#if defined (i386)
++#if defined (i386) || defined(__amd64)
+ #define BSD_LABELSECTOR   1
+ #define BSD_LABELOFFSET   0
+ #define	BSD_BBSIZE        8192		/* size of boot area, with label */
+diff --git a/io.c b/io.c
+index 0937e29..0ee7873 100644
+--- a/io.c
++++ b/io.c
+@@ -25,16 +25,20 @@
+  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+  */
+ 
++#define _LARGEFILE64_SOURCE
+ #include <stdio.h>
+-#ifndef __linux__
+ #include <stdlib.h>
+ #include <fcntl.h>
++#ifndef __linux__
+ #include <SCSI.h>
+ #else
+ #ifdef __GLIBC__
+ #include <sys/types.h>
++#include <sys/stat.h>
+ #endif
+ #endif
++#include <linux/unistd.h>
++#include <sys/types.h>
+ #include <unistd.h>
+ #include <string.h>
+ #include <stdarg.h>
+@@ -466,7 +470,7 @@ write_block(int fd, unsigned long num, char *buf)
+     long t;
+ 
+     if (rflag) {
+-	printf("Can't write block %u to file", num);
++	printf("Can't write block %u to file", (unsigned int)num);
+ 	return 0;
+     }
+ #ifndef __linux__
+diff --git a/kernel-defs.h b/kernel-defs.h
+index 5f15fd4..4dd4414 100644
+--- a/kernel-defs.h
++++ b/kernel-defs.h
+@@ -15,8 +15,14 @@ struct hd_geometry {
+ /* from asm/ioctl.h */
+ #define _IOC_NRBITS	8
+ #define _IOC_TYPEBITS	8
++
++#ifndef _IOC_SIZEBITS
+ #define _IOC_SIZEBITS	13
++#endif
++
++#ifndef _IOC_DIRBITS
+ #define _IOC_DIRBITS	3
++#endif
+ 
+ #define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)
+ #define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
+diff --git a/partition_map.c b/partition_map.c
+index 6ca2c16..4aaf4b0 100644
+--- a/partition_map.c
++++ b/partition_map.c
+@@ -25,11 +25,15 @@
+  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+  */
+ 
++//
++// Defines
++//
++// #define TEST_COMPUTE
++
+ #include <stdio.h>
+-#ifndef __linux__
++#include <string.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+-#endif
+ #include <errno.h>
+ 
+ #include <fcntl.h>
+@@ -37,6 +41,10 @@
+ #include <sys/ioctl.h>
+ #include "kernel-defs.h"
+ #include <sys/stat.h>
++#ifdef TEST_COMPUTE
++#include <linux/fs.h>
++#endif
++
+ #endif
+ 
+ #include "partition_map.h"
+@@ -46,10 +54,6 @@
+ #include "errors.h"
+ 
+ 
+-//
+-// Defines
+-//
+-// #define TEST_COMPUTE
+ 
+ 
+ //
+@@ -106,7 +110,6 @@ open_partition_map(char *name, int *valid_file)
+     int fd;
+     partition_map_header * map;
+     int writeable;
+-    unsigned long length;
+ #ifdef __linux__
+     struct stat info;
+ #endif
+@@ -403,9 +406,7 @@ create_partition_map(char *name)
+ {
+     int fd;
+     partition_map_header * map;
+-    unsigned long length;
+     DPME *data;
+-    int ok;
+     unsigned long number;
+ #ifdef __linux__
+     struct stat info;
+@@ -434,13 +435,13 @@ create_partition_map(char *name)
+     map->maximum_in_map = -1;
+ 
+     number = compute_device_size(fd);
+-    printf("size of 'device' is %u blocks: ", number);
++    printf("size of 'device' is %u blocks: ", (unsigned int)number);
+     flush_to_newline(0);
+     get_number_argument("what should be the size? ", (long *)&number, number);
+     if (number < 4) {
+ 	number = 4;
+     }
+-    printf("new size of 'device' is %u blocks\n", number);
++    printf("new size of 'device' is %u blocks\n", (unsigned int)number);
+     map->media_size = number;
+ 
+ #ifdef __linux__
+@@ -670,7 +671,7 @@ compute_device_size(int fd)
+     loff_t pos;
+ #endif
+     char* data;
+-    unsigned long l, r, x;
++    unsigned long long l, r, x;
+     int valid;
+ 
+ #ifdef TEST_COMPUTE
+@@ -724,9 +725,11 @@ compute_device_size(int fd)
+ 	    } else {
+ 		r = r * 2;
+ 	    }
+-	    if (r >= (1024*1024*1024)) {
+-		break;
+-	    }
++// 	    There's no explanation for this, but I suspect the author was trying to
++// 	    prevent going over the 32 bit size
++//	    if (r >= (1024*1024*1024*2)) {
++//		break;
++//	    }
+ 	}
+ 	// binary search for end
+ 	while (l <= r) {
+@@ -744,11 +747,17 @@ compute_device_size(int fd)
+ 	if (valid != 0) {
+ 	    x = x + 1;
+ 	}
+-	// printf("size in blocks = %d\n", x);
++#ifdef TEST_COMPUTE
++	printf("size in blocks = %d\n", x);
++#endif
+ 	free(data);
+     }
++    
++    // Add a warning just in case...
++    if(x > 0x80000000)
++    	printf("Warning: Large disks may not work with this tool!\n");
+ 
+-    return x;
++    return (unsigned long) x;
+ }
+ 
+ 
+diff --git a/pdisk.c b/pdisk.c
+index a9bc629..ec85f6d 100644
+--- a/pdisk.c
++++ b/pdisk.c
+@@ -32,10 +32,11 @@
+ #include <getopt.h>
+ #include <stddef.h>
+ #else
++#include <SIOUX.h>
++#endif
+ #include <stdlib.h>
+ #include <unistd.h>
+-#include <SIOUX.h>
+-#endif
++#include <string.h>
+ #include <errno.h>
+ 
+ #ifdef __linux__
+@@ -436,7 +437,6 @@ do_create_partition(partition_map_header *map, int get_type)
+ {
+     long base;
+     long length;
+-    long mult;
+     char *name;
+     char *type_name;
+ 
+@@ -598,7 +598,6 @@ do_delete_partition(partition_map_header *map)
+ void
+ do_reorder(partition_map_header *map)
+ {
+-    partition_map * cur;
+     long old_index;
+     long index;
+ 
+-- 
+2.26.2
+
diff --git a/gnu/packages/patches/mac-fdisk-p18.patch b/gnu/packages/patches/mac-fdisk-p18.patch
new file mode 100644
index 0000000000..98fbd3a8bf
--- /dev/null
+++ b/gnu/packages/patches/mac-fdisk-p18.patch
@@ -0,0 +1,2070 @@ 
+This is the result of unzipping the 0.1-18 diff.gz
+https://cdn-aws.deb.debian.org/debian/pool/main/m/mac-fdisk/mac-fdisk_0.1-18.diff.gz
+
+---
+ Makefile             |   9 +-
+ debian/README.debian |  18 +++
+ debian/changelog     | 185 ++++++++++++++++++++++++++++++
+ debian/compat        |   1 +
+ debian/control       |  58 ++++++++++
+ debian/copyright     |  25 +++++
+ debian/postinst      |  50 +++++++++
+ debian/rules         | 154 +++++++++++++++++++++++++
+ dpme.h               |  11 +-
+ dump.c               | 164 +++++++++++++++++----------
+ fdisk.c              |  48 ++++----
+ fdisklabel.c         |  15 +--
+ fdisklabel.h         |   6 +
+ io.c                 |  10 +-
+ kernel-defs.h        |  64 +++++++++++
+ mac-fdisk.8.in       | 262 +++++++++++++++++++++++++++++++++++++++++++
+ partition_map.c      |  37 +++---
+ partition_map.h      |   2 +
+ pdisk.c              |  55 +++++++--
+ pmac-fdisk.8.in      | 222 ++++++++++++++++++++++++++++++++++++
+ 20 files changed, 1281 insertions(+), 115 deletions(-)
+ create mode 100644 debian/README.debian
+ create mode 100644 debian/changelog
+ create mode 100644 debian/compat
+ create mode 100644 debian/control
+ create mode 100644 debian/copyright
+ create mode 100644 debian/postinst
+ create mode 100644 debian/rules
+ create mode 100644 kernel-defs.h
+ create mode 100644 mac-fdisk.8.in
+ create mode 100644 pmac-fdisk.8.in
+
+diff --git a/Makefile b/Makefile
+index f26608f..0adf886 100644
+--- a/Makefile
++++ b/Makefile
+@@ -5,7 +5,14 @@ pdisk: pdisk.o dump.o partition_map.o convert.o io.o errors.o bitfield.o
+ fdisk: fdisk.o fdisklabel.o
+ 
+ clean:
+-	rm -f *.o pdisk fdisk
++	rm -f *.o pdisk fdisk mac-fdisk pmac-fdisk
++
++install: pdisk fdisk
++	-rm -f pmac-fdisk mac-fdisk
++	ln pdisk mac-fdisk
++	ln fdisk pmac-fdisk
++	install -o root -g root -m 0755 mac-fdisk ${DESTDIR}/sbin
++	install -o root -g root -m 0755 pmac-fdisk ${DESTDIR}/sbin
+ 
+ distribution:
+ 	cd ..; tar cvf pdisk.src.tar.`date +%y%m%d` --files-from pdisk/list.src
+diff --git a/debian/README.debian b/debian/README.debian
+new file mode 100644
+index 0000000..b9de127
+--- /dev/null
++++ b/debian/README.debian
+@@ -0,0 +1,18 @@
++mac-fdisk for DEBIAN
++----------------------
++
++Comments regarding mac-fdisk
++
++mac-fdisk provides Apple partition format utilities required for
++installation of Debian/68k on Apple Macintosh computers. The Debian version
++of mac-fdisk is derived from pdisk 0.4a2 (pdisk.970115.tar) by Eryk Vershen 
++(eryk@apple.com).
++pmac-fdisk is a version of the PC partition format utilities for PowerPC
++computers, taken from the same pdisk source version and can be used for
++installation of Debian/68k on PC partition format disks on Macintosh.
++
++Modifications have been made to the pdisk partition table output code to permit
++parsing the output of 'mac-fdisk -l' in a manner consistent with other Linux
++fdisk utilities. (Christiaan Welvaart, <>)
++
++Michael Schmitz <schmitz@lcbvax.cchem.berkeley.edu>, Sat, 28 Feb 1998 12:58:07 -0800
+diff --git a/debian/changelog b/debian/changelog
+new file mode 100644
+index 0000000..a6bc796
+--- /dev/null
++++ b/debian/changelog
+@@ -0,0 +1,185 @@
++mac-fdisk (0.1-18) unstable; urgency=medium
++
++  * New maintainer:
++    - Set myself as maintainer in debian/control
++  * Add missing debian/compat, set to 9
++  * Stop building udeb packages:
++    - Remove references to {mac,pmac}-fdisk-udeb from debian/control
++    - Remove references to udeb packages from debian/rules
++  * Add missing pmac-fdisk-cross package to debian/control as it
++    is actually being built in debian/rules (Closes: #408341)
++  * Build cross packages on i386 as well (Closes: #202019)
++  * Add Vcs-Git and Vcs-Browser URLs to debian/control
++  * Set Priority to optional in debian/control
++  * Remove Priority extra for cross packages in debian/control
++  * Set Section utils for {mac,pmac}-fdisk in debian/control
++  * Remove unnecessary build dependencies coreutils and grep
++  * Update and amend long and short descriptions in debian/control
++  * Remove trailing white-spaces in debian/control
++  * Remove cruft and fix formatting in debian/changelog
++
++ -- John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>  Fri, 22 Sep 2017 16:12:01 +0200
++
++mac-fdisk (0.1-17) unstable; urgency=low
++
++  * Fix postinst failure - dpkg --print-installation-architecture
++    is no longer supported. Patch by Finn Thain <fthain@telegraphics.com.au>
++    Closes: #644845.
++
++ -- Michael Schmitz <schmitzmic@gmail.com>  Tue, 11 AUg 2017 15:49:23 +1200
++
++mac-fdisk (0.1-16) unstable; urgency=low
++
++  * Fix udeb shlib dependencies - patch by Frans Pop <elendil@planet.nl>
++    Closes: #562190.
++
++ -- Michael Schmitz <schmitz@debian.org>  Sun, 03 Jan 2010 13:47:27 +1200
++
++mac-fdisk (0.1-15) unstable; urgency=low
++
++  * Rebuild against current glibc to get rid of sys_errlist type size
++    warning (bug reported by Rick Thomas).
++    Closes: #451386.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Mon, 25 Sep 2005 14:50:13 +0100
++
++mac-fdisk (0.1-14) unstable; urgency=low
++
++  * Fix dpme.h u32 typedef which caused a mismatch between disk and memory
++    partition map format.
++    Closes: #389379.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Mon, 25 Sep 2005 14:50:13 +0100
++
++mac-fdisk (0.1-13) unstable; urgency=low
++
++  * Add patch for broken dpkg --print-gnu-build-architecture
++    (patch by Andreas Jochens <aj@andaco.de>).
++    Closes: #328102.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Wed, 14 Sep 2005 17:25:23 +0100
++
++mac-fdisk (0.1-12) unstable; urgency=low
++
++  * Add makefile support for ppc64 arch (patch by Andreas Jochens
++    <aj@andaco.de>).
++    Closes: #307897.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Mon, 09 May 2005 12:58:47 +0100
++
++mac-fdisk (0.1-11) unstable; urgency=low
++
++  * Big fat overdue cleanup - back in business after replacing my stolen
++    Powerbook.
++  * fixes as suggested in proposed NMU: changes mostly by Frank Lichtenheld
++    <djpig@debian.org>, with subarchitecture modifications by Colin Watson
++    <cjwatson@debian.org>.
++  * Copy needed kernel definitions from kernel-headers 2.4.25 (powerpc) and
++    2.4.26-m68k (cjwatson; Closes: #262457).
++  * Add Subarchitecture: fields in DEBIAN/control of the udebs. "mac" for
++    mac-fdisk-udeb on m68k, "powermac_oldworld powermac_newworld" for
++    mac-fdisk-udeb on powerpc, and "chrp chrp_pegasos prep iseries" for
++    pmac-fdisk-udeb on powerpc (djpig; Closes: #250581).
++  * Remove XSI:sms in debian/rules and debian/postinst, patch by David
++    Weinehall (djpig; Closes: #254918).
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Thu, 26 Aug 2004 14:23:13 +0200
++
++mac-fdisk (0.1-10) unstable; urgency=high
++
++  * Added .udeb magic to rules (kudos to Gaudenz Steinlin
++    <gaudenz@soziologie.ch>); kept mac-fdisk in /sbin though).
++    Closes: #188420.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Wed, 04 Jun 2003 17:06:02 +0200
++
++mac-fdisk (0.1-9) unstable; urgency=high
++
++  * Rebuilt with woody binutils to allow for prelinking. Closes: #176353.
++
++  * Set 'automagically mount on boot' flag when creating HFS partitions
++    (thanks to Derrick Pates <dpates@dsdk12.net> for finding the
++    undocumented bit!). Experimental, but this is unstable, right?
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Fri, 24 Jan 2003 16:20:20 +0200
++
++mac-fdisk (0.1-8) unstable; urgency=high
++
++  * Update mac-fdisk man page (kudos to Chris Tillman). Closes: #121928.
++
++  * Remove mac-fdisk-cross from control file; remove Sparc from Arch: entries
++    (to get rid of outdated mac-fdisk-cross 0.1-1 in the archive). Change
++    package descrption line for pmac-fdisk to emphasize it's a fdisk clone.
++
++  * Change sync() to ioctl(fd, BLKFLSBUF) to flush partition table to disk
++    on write - hopefully work around a kernel bug on new machines.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Fri, 07 Dec 2001 13:38:10 +0200
++
++mac-fdisk (0.1-7) unstable; urgency=high
++
++  * Bugfix: mac-fdisk didn't properly handle devfs device names. Mangle disk
++    name (.../disc) in dump routine to end in .../part%d (patch by Colin
++    Walters <walters@verbum.org>). Closes: #110056.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Mon, 04 Sep 2001 16:02:45 +0200
++
++mac-fdisk (0.1-6.0potato1) stable; urgency=high
++
++  * Feature added: menu option to create bootstrap partition needed for
++    powerpc NewWorld machines with the proper type and size (patch supplied
++    by Ethan Benson). This should help newbies that won't read the docs
++    anyway. Closes: #99660.
++
++  * Bugfix: mac-fdisk used to get the disk size wrong when brute force
++    probing for end-of-disk by seek&read. Turns out gcc did not cope with
++    arithmetics on long long types without explicit cast. Closes: #99700.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Fri, 15 Jun 2001 12:16:35 +0200
++
++mac-fdisk (0.1-6) unstable; urgency=high
++
++  * Feature added: menu option to create bootstrap partition needed for
++    powerpc NewWorld machines with the proper type and size (patch supplied
++    by Ethan Benson). This should help newbies that won't read the docs
++    anyway. Closes: #99660.
++
++  * Bugfix: mac-fdisk used to get the disk size wrong when brute force
++    probing for end-of-disk by seek&read. Turns out gcc did not cope with
++    arithmetics on long long types without explicit cast. Closes: #99700.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Mon, 04 Jun 2001 13:54:21 +0200
++
++mac-fdisk (0.1-5) unstable; urgency=low
++
++  * Bugfix: fix build problems for glibc 2.2 (remove string.h includes,
++    use lseek64 for llseek, fix some petty gcc warnings)
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Wed, 02 Mar 2001 19:42:01 +0200
++
++mac-fdisk (0.1-4) unstable; urgency=low
++
++  * Bugfix: correct off-by-one error on moving a partition downwards in the
++    partition map. Clarification of various program messages and prompts
++    (closes #69148, #69149 and #69152). Update of mac-fdisk man page.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Wed, 08 Oct 2000 17:49:07 +0200
++
++mac-fdisk (0.1-3) unstable; urgency=low
++
++  * PowerPC install fixes (work around lack of /proc/hardware), rename pmac-fdisk
++    package (previously pmac-fdisk-cross). Add pmac-fdisk man page.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Wed, 08 Mar 2000 18:29:07 +0200
++
++mac-fdisk (0.1-2) unstable; urgency=low
++
++  * Change man page name and install location, changed man page, rebuild for 2.2.
++
++ -- Michael Schmitz <schmitz@biophys.uni-duesseldorf.de>  Fri, 22 Oct 1999 20:29:07 +0200
++
++mac-fdisk (0.1-1) unstable; urgency=low
++
++  * Initial Release. (built from previous pdisk-0.4a2 with fixes by Roman Hodek)
++
++ -- Michael Schmitz <schmitz@lcbvax.cchem.berkeley.edu>  Sat, 28 Feb 1998 21:58:07 -0800
+diff --git a/debian/compat b/debian/compat
+new file mode 100644
+index 0000000..ec63514
+--- /dev/null
++++ b/debian/compat
+@@ -0,0 +1 @@
++9
+diff --git a/debian/control b/debian/control
+new file mode 100644
+index 0000000..b0e71d9
+--- /dev/null
++++ b/debian/control
+@@ -0,0 +1,58 @@
++Source: mac-fdisk
++Section: base
++Priority: optional
++Build-Depends: debhelper
++Maintainer: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
++Standards-Version: 3.5.8.0
++Vcs-Git: git://github.com/glaubitz/mac-fdisk-debian.git
++Vcs-Browser: https://github.com/glaubitz/mac-fdisk-debian
++
++Package: mac-fdisk
++Architecture: m68k powerpc ppc64
++Section: utils
++Depends: ${shlibs:Depends}
++Description: Apple disk partition manipulation tool
++ The fdisk utilities from the MkLinux project, adopted for Linux/m68k.
++ Mac-fdisk allows you to create and edit the partition table of a disk.
++ It supports only the Apple partition format used on Macintosh and PowerMac,
++ use pmac-fdisk for PC partition format disks as used on PowerPC machines.
++ Mac-fdisk is an interactive tool with a menu similar to PC fdisk, supported
++ options are somewhat different from PC fdisk due to the differences in
++ partition format.
++
++Package: pmac-fdisk
++Architecture: powerpc ppc64
++Section: utils
++Depends: ${shlibs:Depends}
++Description: Apple fdisk partition manipulation tool for PowerPC
++ The fdisk utilities from the MkLinux project, adopted for Linux/ppc.
++ Pmac-fdisk allows you to create and edit the partition table of a disk.
++ It supports the PC partition format as used on PowerPC. It is an
++ interactive tool similar to PC fdisk.
++
++Package: mac-fdisk-cross
++Architecture: i386 m68k
++Section: otherosfs
++Depends: ${shlibs:Depends}
++Description: Apple disk partition manipulation tool, cross version
++ The fdisk utilities from the MkLinux project, adopted for Linux/m68k.
++ Mac-fdisk allows you to create and edit the partition table of a disk.
++ It supports only the Apple partition format used on Macintosh and PowerMac,
++ use pmac-fdisk for PC partition format disks as used on PowerPC machines.
++ Mac-fdisk is an interactive tool with a menu similar to PC fdisk, supported
++ options are somewhat different from PC fdisk due to the differences in
++ partition format.
++ .
++ This package contains the cross version of the package.
++
++Package: pmac-fdisk-cross
++Architecture: i386 m68k
++Section: otherosfs
++Depends: ${shlibs:Depends}
++Description: fdisk partition manipulation tool for PowerPC, cross version
++ The fdisk utilities from the MkLinux project, adopted for Linux/ppc.
++ Pmac-fdisk allows you to create and edit the partition table of a disk.
++ It supports the PC partition format as used on PowerPC. It is an
++ interactive tool similar to PC fdisk.
++ .
++ This package contains the cross version of the package.
+diff --git a/debian/copyright b/debian/copyright
+new file mode 100644
+index 0000000..9a1bd62
+--- /dev/null
++++ b/debian/copyright
+@@ -0,0 +1,25 @@
++This package was debianized by Michael Schmitz schmitz@lcbvax.cchem.berkeley.edu on
++Sun, 11 Jan 1998 22:58:07 -0800.
++
++It was downloaded from ftp.mklinux.apple.com:/pub/Other_Tools/
++
++Copyright:
++
++ * Copyright 1996,1997 by Apple Computer, Inc.
++ *              All Rights Reserved 
++ *  
++ * Permission to use, copy, modify, and distribute this software and 
++ * its documentation for any purpose and without fee is hereby granted, 
++ * provided that the above copyright notice appears in all copies and 
++ * that both the copyright notice and this permission notice appear in 
++ * supporting documentation. 
++ *  
++ * APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 
++ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
++ * FOR A PARTICULAR PURPOSE. 
++ *  
++ * IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 
++ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 
++ * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 
++ * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
++ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
+diff --git a/debian/postinst b/debian/postinst
+new file mode 100644
+index 0000000..4c4a47e
+--- /dev/null
++++ b/debian/postinst
+@@ -0,0 +1,50 @@
++#! /bin/sh
++set -e
++
++Arch=`dpkg --print-architecture`
++
++#
++# make symlink /sbin/fdisk point to the native fdisk
++#
++
++# This is also true if /sbin/fdisk is a dangling symlink; in that case we
++# want to update the link, too.
++if [ ! -e /sbin/fdisk ]; then
++	machine=""
++	if [ "$Arch" = "m68k" ]; then
++		case `awk '$1 == "Model:" { print $2 }' /proc/hardware` in
++			Atari)
++				machine=atari
++				;;
++			Amiga)
++				machine=amiga
++				;;
++			Macintosh)
++				machine=mac
++				;;
++			Motorola) # MVME
++				;;
++		esac
++	elif [ "$Arch" = "powerpc" ]; then
++		# case `awk '$1 == "motherboard" { print $6 }' /proc/cpuinfo` in
++		# case `cat /proc/cpuinfo | grep -E "^motherboard" | sed -e 's/.* \([a-zA-Z]*\)$/\1/'` in
++		case `awk '$1 == "motherboard" { print $NF }' /proc/cpuinfo` in
++			Macintosh)
++				machine=mac
++				;;
++			*)
++				machine=pmac
++				;;
++		esac
++
++	fi
++	if [ -n "$machine" ] && [ -f /sbin/$machine-fdisk ]; then
++		ln -sf $machine-fdisk /sbin/fdisk
++	else
++		echo "No native fdisk for this machine type!"
++	fi
++fi
++
++#DEBHELPER#
++
++exit 0
+diff --git a/debian/rules b/debian/rules
+new file mode 100644
+index 0000000..c978557
+--- /dev/null
++++ b/debian/rules
+@@ -0,0 +1,154 @@
++#!/usr/bin/make -f
++# Made with the aid of debmake, by Christoph Lameter,
++# based on the sample debian/rules file for GNU hello by Ian Jackson.
++
++export DH_VERBOSE=1
++
++#BUILDARCH = $(shell dpkg --print-gnu-build-architecture)
++BUILDARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH_CPU)
++POWERPC = $(findstring $(BUILDARCH),powerpc ppc64)
++
++packmn  = mac-fdisk
++packmc  = mac-fdisk-cross
++packpmn = pmac-fdisk
++packpmc = pmac-fdisk-cross
++tmpmn   = debian/tmp
++tmpmc   = debian/$(packmc)
++tmppmn  = debian/$(packpmn)
++tmppmc  = debian/$(packpmc)
++docmn   = $(tmpmn)/usr/share/doc/$(packmn)
++docmc   = $(tmpmc)/usr/share/doc/$(packmc)
++docpmn  = $(tmppmn)/usr/share/doc/$(packpmn)
++docpmc  = $(tmppmc)/usr/share/doc/$(packpmc)
++
++ifeq "$(BUILDARCH)" "powerpc"
++mac_subarches=powermac_oldworld powermac_newworld
++pmac_subarches=chrp chrp_pegasos prep iseries
++else
++mac_subarches=mac
++endif
++
++build:
++	$(checkdir)
++	make CFLAGS="-O2 -g -Wall"
++	touch build
++
++clean:
++	$(checkdir)
++	-rm -f build
++	-make clean
++	-rm -f `find . -name "*~"`
++	-rm -rf $(tmpmn) $(tmpmc) $(tmppmn) $(tmppmc) debian/files* core debian/*substvars
++
++binary-indep: build
++	$(checkdir)
++# There are no architecture-independent files to be uploaded
++# generated by this package.  If there were any they would be
++# made here.
++
++binary-arch: build
++	dh_testdir pdisk.h
++	dh_testroot
++	dh_clean -k
++	#dh_installdirs
++	# we don't want to package the pdisk man page
++	mv pdisk.8 pdisk.8.in
++	set -e; if [ "$(BUILDARCH)" = "m68k" ] || [ -n "$(POWERPC)" ]; then \
++		install -d $(tmpmn)/sbin; \
++		install -m 755 pdisk $(tmpmn)/sbin/mac-fdisk; \
++		install -d $(tmpmn)/usr/share/man/man8; \
++		install -m 644 mac-fdisk.8.in $(tmpmn)/usr/share/man/man8/mac-fdisk.8; \
++		dh_installdocs README -p$(packmn); \
++		dh_installmanpages -p$(packmn); \
++		dh_installchangelogs HISTORY -p$(packmn); \
++	else \
++		install -d $(tmpmc)/usr/sbin; \
++		install -m 755 pdisk $(tmpmc)/usr/sbin/mac-fdisk; \
++		install -d $(tmpmn)/usr/share/man/man8; \
++		install -m 644 mac-fdisk.8.in $(tmpmn)/usr/share/man/man8/mac-fdisk.8; \
++		dh_installdocs README -p$(packmc); \
++		dh_installmanpages  -p$(packmc); \
++		dh_installchangelogs HISTORY -p$(packmc); \
++	fi
++	set -e; if [ -n "$(POWERPC)" ]; then \
++		install -d $(tmppmn)/sbin; \
++		install -m 755 fdisk $(tmppmn)/sbin/pmac-fdisk; \
++		install -d $(tmppmn)/usr/share/man/man8; \
++		install -m 644 pmac-fdisk.8.in $(tmppmn)/usr/share/man/man8/pmac-fdisk.8; \
++		dh_installdocs README -p$(packpmn); \
++		dh_installmanpages  -p$(packpmn); \
++		dh_installchangelogs HISTORY -p$(packpmn); \
++	else \
++		install -d $(tmppmc)/usr/sbin; \
++		install -m 755 fdisk $(tmppmc)/usr/sbin/pmac-fdisk; \
++		install -d $(tmppmc)/usr/share/man/man8; \
++		install -m 644 pmac-fdisk.8.in $(tmppmc)/usr/share/man/man8/pmac-fdisk.8; \
++		dh_installdocs README -p$(packpmc); \
++		dh_installmanpages  -p$(packpmc); \
++		dh_installchangelogs HISTORY -p$(packpmc); \
++	fi
++	# install README.Debian also in cross package (not done by dh_installdocs)
++	set -e; if [ "$(BUILDARCH)" != "m68k" ] && ! [ -n "$(POWERPC)" ]; then \
++		install -m 644 debian/README.debian $(docmc)/README.Debian; \
++	fi
++	# and move the pdisk man page back again ...
++	mv pdisk.8.in pdisk.8
++
++	# build native pdisk only for m68k, cross package only for others
++	set -e; if [ "$(BUILDARCH)" = "m68k" ] || [ -n "$(POWERPC)" ]; then \
++		dh_strip -p$(packmn) -P$(tmpmn); \
++		dh_compress -p$(packmn) -P$(tmpmn); \
++		dh_fixperms -p$(packmn) -P$(tmpmn); \
++		dh_installdeb -p$(packmn) -P$(tmpmn); \
++		dh_shlibdeps -p$(packmn) -P$(tmpmn); \
++		dh_gencontrol -p$(packmn) -P$(tmpmn); \
++		dh_md5sums -p$(packmn) -P$(tmpmn); \
++	else \
++		dh_strip -p$(packmc); \
++		dh_compress -p$(packmc); \
++		dh_fixperms -p$(packmc); \
++		dh_installdeb -p$(packmc); \
++		dh_shlibdeps -p$(packmc); \
++		dh_gencontrol -p$(packmc); \
++		dh_md5sums -p$(packmc); \
++	fi
++	# build native fdisk only for powerpc, cross package only for others
++	set -e; if [ -n "$(POWERPC)" ]; then \
++		dh_strip -p$(packpmn); \
++		dh_compress -p$(packpmn); \
++		dh_fixperms -p$(packpmn); \
++		dh_installdeb -p$(packpmn); \
++		dh_shlibdeps -p$(packpmn); \
++		dh_gencontrol -p$(packpmn); \
++		dh_md5sums -p$(packpmn); \
++	else \
++		dh_strip -p$(packpmc); \
++		dh_compress -p$(packpmc); \
++		dh_fixperms -p$(packpmc); \
++		dh_installdeb -p$(packpmc); \
++		dh_shlibdeps -p$(packpmc); \
++		dh_gencontrol -p$(packpmc); \
++		dh_md5sums -p$(packpmc); \
++	fi
++	set -e; if [ "$(BUILDARCH)" = "m68k" ] || [ -n "$(POWERPC)" ]; then \
++		dh_builddeb -p$(packmn) -P$(tmpmn); \
++	else \
++		dh_builddeb -p$(packmc); \
++	fi
++	set -e; if [ -n "$(POWERPC)" ]; then \
++		dh_builddeb -p$(packpmn); \
++	else \
++		dh_builddeb -p$(packpmc); \
++	fi
++
++define checkdir
++	test -f debian/rules
++endef
++
++binary: binary-indep binary-arch
++
++checkroot:
++	$(checkdir)
++	test root = "`whoami`"
++
++.PHONY: binary binary-arch binary-indep clean checkroot
+diff --git a/dpme.h b/dpme.h
+index 2994266..c2a9958 100644
+--- a/dpme.h
++++ b/dpme.h
+@@ -61,7 +61,7 @@
+ //
+ typedef	unsigned char	u8;
+ typedef	unsigned short	u16;
+-typedef	unsigned long	u32;
++typedef	unsigned int	u32;
+ 
+ 
+ // Physical block zero of the disk has this format
+@@ -113,10 +113,17 @@ struct dpme {
+ #endif
+     u32     dpme_boot_block         ;
+     u32     dpme_boot_bytes         ;
++#ifdef __linux__
++    u32     dpme_load_addr          ;
++    u32     dpme_load_addr_2        ;
++    u32     dpme_goto_addr          ;
++    u32     dpme_goto_addr_2        ;
++#else
+     u8     *dpme_load_addr          ;
+     u8     *dpme_load_addr_2        ;
+     u8     *dpme_goto_addr          ;
+     u8     *dpme_goto_addr_2        ;
++#endif
+     u32     dpme_checksum           ;
+     char    dpme_process_id[16]     ;
+     u32     dpme_boot_args[32]      ;
+@@ -124,6 +131,7 @@ struct dpme {
+ };
+ typedef struct dpme DPME;
+ 
++#define	dpme_automount_set(p, v)	bitfield_set(&p->dpme_flags, 30, 1, v) /* MSch */
+ #define	dpme_os_specific_1_set(p, v)	bitfield_set(&p->dpme_flags, 8, 1, v)
+ #define	dpme_os_specific_2_set(p, v)	bitfield_set(&p->dpme_flags, 7, 1, v)
+ #define	dpme_os_pic_code_set(p, v)	bitfield_set(&p->dpme_flags, 6, 1, v)
+@@ -134,6 +142,7 @@ typedef struct dpme DPME;
+ #define	dpme_allocated_set(p, v)	bitfield_set(&p->dpme_flags, 1, 1, v)
+ #define	dpme_valid_set(p, v)		bitfield_set(&p->dpme_flags, 0, 1, v)
+ 
++#define	dpme_automount_get(p)		bitfield_get(p->dpme_flags, 30, 1)	/* MSch */
+ #define	dpme_os_specific_1_get(p)	bitfield_get(p->dpme_flags, 8, 1)
+ #define	dpme_os_specific_2_get(p)	bitfield_get(p->dpme_flags, 7, 1)
+ #define	dpme_os_pic_code_get(p)		bitfield_get(p->dpme_flags, 6, 1)
+diff --git a/dump.c b/dump.c
+index 61ad91b..4153dc5 100644
+--- a/dump.c
++++ b/dump.c
+@@ -3,7 +3,11 @@
+ //
+ // Written by Eryk Vershen (eryk@apple.com)
+ //
+-
++/*
++ * Linux/m68k version by Christiaan Welvaart
++ * minor fixes and glibc change by Michael Schmitz
++ */
++ 
+ /*
+  * Copyright 1996,1997 by Apple Computer, Inc.
+  *              All Rights Reserved 
+@@ -60,6 +64,7 @@ typedef struct names {
+ //
+ NAMES plist[] = {
+     "Drvr", "Apple_Driver",
++    "Dr43", "Apple_Driver43",
+     "Free", "Apple_Free",
+     " HFS", "Apple_HFS",
+     " MFS", "Apple_MFS",
+@@ -83,7 +88,7 @@ const char * kStringNot		= " not";
+ // Forward declarations
+ //
+ void dump_block_zero(partition_map_header *map);
+-void dump_partition_entry(partition_map *entry, int digits);
++void dump_partition_entry(partition_map *entry, int digits, char *dev);
+ 
+ 
+ //
+@@ -119,6 +124,7 @@ dump_block_zero(partition_map_header *map)
+     }
+     printf("\nBlock size=%u, Number of Blocks=%u\n",
+ 	    p->sbBlkSize, p->sbBlkCount);
++#ifndef __mc68000__
+     printf("DeviceType=0x%x, DeviceId=0x%x\n",
+ 	    p->sbDevType, p->sbDevId);
+     if (p->sbDrvrCount > 0) {
+@@ -130,6 +136,7 @@ dump_block_zero(partition_map_header *map)
+ 	}
+     }
+     printf("\n");
++#endif
+ }
+ 
+ 
+@@ -138,31 +145,50 @@ dump_partition_map(partition_map_header *map, int disk_order)
+ {
+     partition_map * entry;
+     int j;
++    size_t len;
++    char *buf;
+ 
+     if (map == NULL) {
+ 	bad_input("No partition map exists");
+ 	return;
+     }
++#ifdef __mc68000__
++    printf("Disk %s\n", map->name);
++#else
+     printf("%s\n", map->name);
++#endif
+ 
+     j = number_of_digits(map->media_size);
+     if (j < 7) {
+ 	j = 7;
+     }
+-    printf("   #:                 type name               "
+-	    "%*s   %-*s ( size )\n", j, "length", j, "base");
++#ifdef __mc68000__
++    printf("%*s  type name         "
++	    "%*s   %-*s ( size )  system\n", strlen(map->name)+1, "#", j, "length", j, "base");
++#else
++    printf("%*s                    type name               "
++	    "%*s   %-*s ( size )  system\n", strlen(map->name)+1, "#", j, "length", j, "base");
++#endif
++
++    /* Grok devfs names. (courtesy Colin Walters)*/
++
++    len = strlen(map->name);
++    buf = strdup(map->name);
++    if (len >= 4 && !strcmp(buf+len-4, "disc")) {
++	strcpy(buf+len-4, "part");
++    }
+ 
+     if (disk_order) {
+ 	for (entry = map->disk_order; entry != NULL;
+ 		entry = entry->next_on_disk) {
+ 
+-	    dump_partition_entry(entry, j);
++	    dump_partition_entry(entry, j, buf);
+ 	}
+     } else {
+ 	for (entry = map->base_order; entry != NULL;
+ 		entry = entry->next_by_base) {
+ 
+-	    dump_partition_entry(entry, j);
++	    dump_partition_entry(entry, j, buf);
+ 	}
+     }
+     dump_block_zero(map);
+@@ -170,18 +196,23 @@ dump_partition_map(partition_map_header *map, int disk_order)
+ 
+ 
+ void
+-dump_partition_entry(partition_map *entry, int digits)
++dump_partition_entry(partition_map *entry, int digits, char *dev)
+ {
+     partition_map_header *map;
+     int j;
+     DPME *p;
+     BZB *bp;
+     char *s;
++#ifdef __mc68000__
++    int aflag = 1;
++#else
+     int aflag = 0;
++#endif
+     int pflag = 1;
+     u32 size;
+     double bytes;
+ 
++
+     map = entry->the_map;
+     p = entry->data;
+     if (aflag) {
+@@ -192,9 +223,13 @@ dump_partition_entry(partition_map *entry, int digits)
+ 		break;
+ 	    }
+ 	}
+-	printf("%4d: %.4s %-18.32s ", entry->disk_address, s, p->dpme_name);
++#ifdef __mc68000__
++	printf("%s%-2d %.4s %-12.12s ", dev, entry->disk_address, s, p->dpme_name);
++#else
++	printf("%s%-4d  %.4s %-18.32s ", dev, entry->disk_address, s, p->dpme_name);
++#endif
+     } else {
+-	printf("%4d: %20.32s %-18.32s ",
++	printf("%s%-4d %20.32s %-18.32s ", dev, 
+ 		entry->disk_address, p->dpme_type, p->dpme_name);
+     }
+ 
+@@ -217,7 +252,10 @@ dump_partition_entry(partition_map *entry, int digits)
+ 	printf("@~%-*u", digits, p->dpme_pblock_start + p->dpme_lblock_start);
+     }
+     
++    j = 's';
++
+     bytes = size / ONE_KILOBYTE_IN_BLOCKS;
++    j = 'k';
+     if (bytes >= 1024.0) {
+ 	bytes = bytes / 1024.0;
+ 	if (bytes < 1024.0) {
+@@ -226,58 +264,45 @@ dump_partition_entry(partition_map *entry, int digits)
+ 	    bytes = bytes / 1024.0;
+ 	    j = 'G';
+ 	}
+-	printf(" (%#5.1f%c)", bytes, j);
+     }
++    printf(" (%#5.1f%c)  ", bytes, j);
+ 
+-#if 0
+-    // Old A/UX fields that no one pays attention to anymore.
+-    bp = (BZB *) (p->dpme_bzb);
+-    j = -1;
+-    if (bp->bzb_magic == BZBMAGIC) {
+-	switch (bp->bzb_type) {
+-	case FSTEFS:
+-	    s = "EFS";
+-	    break;
+-	case FSTSFS:
+-	    s = "SFS";
+-	    j = 1;
+-	    break;
+-	case FST:
+-	default:
+-	    if (bzb_root_get(bp) != 0) {
+-		if (bzb_usr_get(bp) != 0) {
+-		    s = "RUFS";
+-		} else {
+-		    s = "RFS";
+-		}
+-		j = 0;
+-	    } else if (bzb_usr_get(bp) != 0) {
+-		s = "UFS";
+-		j = 2;
+-	    } else {
+-		s = "FS";
+-	    }
+-	    break;
+-	}
+-	if (bzb_slice_get(bp) != 0) {
+-	    printf(" s%1d %4s", bzb_slice_get(bp)-1, s);
+-	} else if (j >= 0) {
+-	    printf(" S%1d %4s", j, s);
+-	} else {
+-	    printf("    %4s", s);
+-	}
+-	if (bzb_crit_get(bp) != 0) {
+-	    printf(" K%1d", bp->bzb_cluster);
+-	} else if (j < 0) {
+-	    printf("   ");
+-	} else {
+-	    printf(" k%1d", bp->bzb_cluster);
+-	}
+-	if (bp->bzb_mount_point[0] != 0) {
+-	    printf("  %.64s", bp->bzb_mount_point);
+-	}
++    if (!strcmp(p->dpme_type, "Apple_UNIX_SVR2"))
++    {
++         if (!strcmp(p->dpme_name, "Swap") || !strcmp(p->dpme_name, "swap"))
++            printf("Linux swap");
++         else
++            printf("Linux native");
+     }
+-#endif
++    else
++    if (!strcmp(p->dpme_type, "Apple_Bootstrap"))
++         printf("NewWorld bootblock");
++    else
++    if (!strcmp(p->dpme_type, "Apple_Scratch"))
++         printf("Linux swap");  //not just linux, but who cares
++    else
++    if (!strcmp(p->dpme_type, "Apple_HFS"))
++         printf("HFS");
++    else
++    if (!strcmp(p->dpme_type, "Apple_MFS"))
++        printf("MFS");
++    else
++    if (!strcmp(p->dpme_type, "Apple_Driver"))
++        printf("Driver");
++    else
++    if (!strcmp(p->dpme_type, "Apple_Driver43"))
++        printf("Driver 4.3");
++    else
++    if (!strcmp(p->dpme_type, "Apple_partition_map"))
++        printf("Partition map");
++    else
++    if (!strcmp(p->dpme_type, "Apple_PRODOS"))
++        printf("ProDOS");
++    else
++    if (!strcmp(p->dpme_type, "Apple_Free"))
++        printf("Free space");
++    else
++        printf("Unknown");
+     printf("\n");
+ }
+ 
+@@ -316,6 +341,24 @@ list_all_disks()
+ 
+ 	dump(name);
+     }
++#ifdef __linux__
++    for (i = 0; i < 4; i++) {
++	sprintf(name, "/dev/hd%c", 'a'+i);
++	if ((fd = open_device(name, O_RDONLY)) < 0) {
++	    if (errno == EACCES) {
++		error(errno, "can't open file '%s'", name);
++	    }
++	    continue;
++	}
++	if (read_block(fd, 1, (char *)data, 1) == 0) {
++	    close_device(fd);
++	    continue;
++	}
++	close_device(fd);
++
++	dump(name);
++    }
++#endif
+     free(data);
+ }
+ 
+@@ -385,7 +428,7 @@ u32     dpme_reserved_3[62]     ;
+ 	printf("%2d: %20.32s ",
+ 		entry->disk_address, p->dpme_type);
+ 	printf("%7u @ %-7u ", p->dpme_pblocks, p->dpme_pblock_start);
+-	printf("%c%c%c%c%c%c%c%c%c ",
++	printf("%c%c%c%c%c%c%c%c%c%c ",
+ 		(dpme_valid_get(p))?'V':'v',
+ 		(dpme_allocated_get(p))?'A':'a',
+ 		(dpme_in_use_get(p))?'I':'i',
+@@ -394,7 +437,8 @@ u32     dpme_reserved_3[62]     ;
+ 		(dpme_writable_get(p))?'W':'w',
+ 		(dpme_os_pic_code_get(p))?'P':'p',
+ 		(dpme_os_specific_1_get(p))?'1':'.',
+-		(dpme_os_specific_2_get(p))?'2':'.');
++		(dpme_os_specific_2_get(p))?'2':'.',
++		(dpme_automount_get(p))?'M':'m');
+ 	if (p->dpme_lblock_start != 0 || p->dpme_pblocks != p->dpme_lblocks) {
+ 	    printf("(%u @ %u)", p->dpme_lblocks, p->dpme_lblock_start);
+ 	}
+diff --git a/fdisk.c b/fdisk.c
+index 11e92db..d77619b 100644
+--- a/fdisk.c
++++ b/fdisk.c
+@@ -62,7 +62,6 @@
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
+ #include <fcntl.h>
+ #include <ctype.h>
+ #include <setjmp.h>
+@@ -71,9 +70,9 @@
+ 
+ #include <sys/ioctl.h>
+ 
+-#include <linux/genhd.h>
+-#include <linux/hdreg.h>
+-#include <linux/fs.h>
++typedef unsigned short kdev_t;	/* BAD hack; kdev_t is not exported */
++
++#include "kernel-defs.h"
+ 
+ #include "fdisk.h"
+ 
+@@ -428,7 +427,7 @@ void read_extended(struct partition *p)
+ 		offsets[partitions] = extended_offset + SWAP32(p->start_sect);
+ 		if (!extended_offset)
+ 			extended_offset = SWAP32(p->start_sect);
+-		if (llseek(fd, (loff_t)offsets[partitions]
++		if (lseek64(fd, (loff_t)offsets[partitions]
+ 			       * SECTOR_SIZE, SEEK_SET) < 0)
+ 			fatal(unable_to_seek);
+ 		if (!(buffers[partitions] = (char *) malloc(SECTOR_SIZE)))
+@@ -438,14 +437,14 @@ void read_extended(struct partition *p)
+ 		part_table[partitions] = ext_pointers[partitions] = NULL;
+ 		q = p = offset(buffers[partitions], 0);
+ 		for (i = 0; i < 4; i++, p++) {
+-			if (p->sys_ind == EXTENDED)
++			if (p->sys_ind == EXTENDED) {
+ 				if (ext_pointers[partitions])
+ 					fprintf(stderr, "Warning: extra link "
+ 						"pointer in partition table "
+ 						"%d\n", partitions + 1);
+ 				else
+ 					ext_pointers[partitions] = p;
+-			else if (p->sys_ind)
++			} else if (p->sys_ind) {
+ 				if (part_table[partitions])
+ 					fprintf(stderr,
+ 						"Warning: ignoring extra data "
+@@ -453,15 +452,18 @@ void read_extended(struct partition *p)
+ 						partitions + 1);
+ 				else
+ 					part_table[partitions] = p;
++			}
+ 		}
+-		if (!part_table[partitions])
++		if (!part_table[partitions]) {
+ 			if (q != ext_pointers[partitions])
+ 				part_table[partitions] = q;
+ 			else part_table[partitions] = q + 1;
+-		if (!ext_pointers[partitions])
++		}
++		if (!ext_pointers[partitions]) {
+ 			if (q != part_table[partitions])
+ 				ext_pointers[partitions] = q;
+ 			else ext_pointers[partitions] = q + 1;
++		}
+ 		p = ext_pointers[partitions++];
+ 	}
+ }
+@@ -497,11 +499,12 @@ void get_boot(void)
+ 	warn_geometry();
+ 
+ 	for (i = 0; i < 4; i++)
+-		if(part_table[i]->sys_ind == EXTENDED)
++		if(part_table[i]->sys_ind == EXTENDED) {
+ 			if (partitions != 4)
+ 				fprintf(stderr, "Ignoring extra extended "
+ 					"partition %d\n", i + 1);
+ 			else read_extended(part_table[ext_index = i]);
++		}
+ 
+ 	for (i = 3; i < partitions; i++)
+ 		if (SWAP16(*table_check(buffers[i])) != PART_TABLE_FLAG) {
+@@ -621,6 +624,7 @@ uint read_int(uint low, uint dflt, uint high, enum offset base, char *mesg)
+ 			case lower: i += low; break;
+ 			case upper: i += high; break;
+ 			case deflt: i += dflt; break;
++			default: break;
+ 			}
+ 		}
+ 		else
+@@ -844,12 +848,12 @@ static void check_consistency(struct partition *p, int partition)
+ 		return;		/* do not check extended partitions */
+ 
+ /* physical beginning c, h, s */
+-	pbc = p->cyl & 0xff | (p->sector << 2) & 0x300;
++	pbc = (p->cyl & 0xff) | ((p->sector << 2) & 0x300);
+ 	pbh = p->head;
+ 	pbs = p->sector & 0x3f;
+ 
+ /* physical ending c, h, s */
+-	pec = p->end_cyl & 0xff | (p->end_sector << 2) & 0x300;
++	pec = (p->end_cyl & 0xff) | ((p->end_sector << 2) & 0x300);
+ 	peh = p->end_head;
+ 	pes = p->end_sector & 0x3f;
+ 
+@@ -941,7 +945,7 @@ void x_list_table(int extend)
+ 		disk_device, heads, sectors, cylinders);
+         printf("Nr AF  Hd Sec  Cyl  Hd Sec  Cyl   Start    Size ID\n");
+ 	for (i = 0 ; i < partitions; i++)
+-		if (p = q[i]) {
++		if ((p = q[i])) {
+                         printf("%2d %02x%4d%4d%5d%4d%4d%5d%8d%8d %02x\n",
+ 				i + 1, p->boot_ind, p->head,
+ 				sector(p->sector),
+@@ -1026,7 +1030,7 @@ void verify(void)
+ 				last[i]);
+ 			total += last[i] + 1 - first[i];
+ 			for (j = 0; j < i; j++)
+-			if (first[i] >= first[j] && first[i] <= last[j]
++			if ((first[i] >= first[j] && first[i] <= last[j])
+ 					|| (last[i] <= last[j] &&
+ 					last[i] >= first[j])) {
+ 				printf("Warning: partition %d overlaps "
+@@ -1060,11 +1064,11 @@ void verify(void)
+ 	if (total > heads * sectors * cylinders)
+ 		printf("Total allocated sectors %d greater than the maximum "
+ 			"%d\n", total, heads * sectors * cylinders);
+-	else if (total = heads * sectors * cylinders - total)
++	else if ((total = heads * sectors * cylinders - total))
+ 		printf("%d unallocated sectors\n", total);
+ }
+ 
+-void add_partition(int n, int sys)
++static void add_partition(int n, int sys)
+ {
+ 	char mesg[48];
+ 	int i, read = 0;
+@@ -1100,11 +1104,12 @@ void add_partition(int n, int sys)
+ 		for (i = 0; i < partitions; i++) {
+ 			if (start == offsets[i])
+ 				start += sector_offset;
+-			if (start >= first[i] && start <= last[i])
++			if (start >= first[i] && start <= last[i]) {
+ 				if (n < 4)
+ 					start = last[i] + 1;
+ 				else
+ 					start = last[i] + sector_offset;
++			}
+ 		}
+ 		if (start > limit)
+ 			break;
+@@ -1249,7 +1254,7 @@ void write_table(void)
+ 	for (i = 3; i < partitions; i++)
+ 		if (changed[i]) {
+ 			*table_check(buffers[i]) = SWAP16(PART_TABLE_FLAG);
+-			if (llseek(fd, (loff_t)offsets[i]
++			if (lseek64(fd, (loff_t)offsets[i]
+ 					* SECTOR_SIZE, SEEK_SET) < 0)
+ 				fatal(unable_to_seek);
+ 			if (write(fd, buffers[i], SECTOR_SIZE) != SECTOR_SIZE)
+@@ -1262,7 +1267,7 @@ void write_table(void)
+ 	       "(Reboot to ensure the partition table has been updated.)\n");
+ 	sync();
+ 	sleep(2);
+-	if (i = ioctl(fd, BLKRRPART)) {
++	if ((i = ioctl(fd, BLKRRPART))) {
+                 error = errno;
+         } else {
+                 /* some kernel versions (1.2.x) seem to have trouble
+@@ -1270,7 +1275,7 @@ void write_table(void)
+ 		   twice, the second time works. - biro@yggdrasil.com */
+                 sync();
+                 sleep(2);
+-                if(i = ioctl(fd, BLKRRPART))
++                if((i = ioctl(fd, BLKRRPART)))
+                         error = errno;
+         }
+ 
+@@ -1391,7 +1396,7 @@ void xselect(void)
+ void try(char *device)
+ {
+ 	disk_device = device;
+-	if (!setjmp(listingbuf))
++	if (!setjmp(listingbuf)) {
+ 		if ((fd = open(disk_device, type_open)) >= 0) {
+ 			close(fd);
+ 			get_boot();
+@@ -1407,6 +1412,7 @@ void try(char *device)
+ 		    exit(1);
+ 		 }
+ 	      }
++	}
+ }
+ 
+ void main(int argc, char **argv)
+diff --git a/fdisklabel.c b/fdisklabel.c
+index 9344339..70c3cfa 100644
+--- a/fdisklabel.c
++++ b/fdisklabel.c
+@@ -38,7 +38,6 @@
+ #include <unistd.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include <string.h>
+ #include <fcntl.h>
+ #include <ctype.h>
+ #include <setjmp.h>
+@@ -47,9 +46,7 @@
+ #include <sys/ioctl.h>
+ #include <sys/param.h>
+ 
+-#include <linux/genhd.h>
+-#include <linux/hdreg.h>
+-#include <linux/fs.h>
++#include "kernel-defs.h"
+ 
+ #include "fdisk.h"
+ #define DKTYPENAMES
+@@ -377,7 +374,7 @@ bsd_create_disklabel (void)
+     {
+ #if defined (i386)
+       if (bsd_initlabel (bsd_part, &bsd_dlabel, bsd_part_index) == 1)
+-#elif defined (__alpha__) || defined (__powerpc__)
++#elif defined (__alpha__) || defined (__powerpc__) || defined (__mc68000__)
+       if (bsd_initlabel (NULL, &bsd_dlabel, 0) == 1)
+ #endif
+       {
+@@ -515,7 +512,7 @@ bsd_write_bootstrap (void)
+   alpha_bootblock_checksum (buffer);
+ #endif
+ 
+-  if (llseek (fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
++  if (lseek64 (fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
+     fatal (unable_to_seek);
+   if (BSD_BBSIZE != write (fd, buffer, BSD_BBSIZE))
+     fatal (unable_to_write);
+@@ -679,7 +676,7 @@ bsd_readlabel (struct partition *p, struct disklabel *d)
+   sector = 0;
+ #endif
+ 
+-  if (llseek (fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
++  if (lseek64 (fd, sector * SECTOR_SIZE, SEEK_SET) == -1)
+     fatal (unable_to_seek);
+   if (BSD_BBSIZE != read (fd, buffer, BSD_BBSIZE))
+     fatal (unable_to_read);
+@@ -724,12 +721,12 @@ bsd_writelabel (struct partition *p, struct disklabel *d)
+ 
+ #if defined (__alpha__) && BSD_LABELSECTOR == 0
+   alpha_bootblock_checksum (buffer);
+-  if (llseek (fd, 0, SEEK_SET) == -1)
++  if (lseek64 (fd, 0, SEEK_SET) == -1)
+     fatal (unable_to_seek);
+   if (BSD_BBSIZE != write (fd, buffer, BSD_BBSIZE))
+     fatal (unable_to_write);
+ #else
+-  if (llseek (fd, sector * SECTOR_SIZE + BSD_LABELOFFSET, SEEK_SET) == -1)
++  if (lseek64 (fd, sector * SECTOR_SIZE + BSD_LABELOFFSET, SEEK_SET) == -1)
+     fatal (unable_to_seek);
+   if (sizeof (struct disklabel) != write (fd, d, sizeof (struct disklabel)))
+     fatal (unable_to_write);
+diff --git a/fdisklabel.h b/fdisklabel.h
+index 0b5227c..a9c4d2e 100644
+--- a/fdisklabel.h
++++ b/fdisklabel.h
+@@ -52,6 +52,12 @@
+ #define BSD_LABELOFFSET   0
+ #define	BSD_BBSIZE        0
+ #define	BSD_SBSIZE        0
++#elif defined (__mc68000__)
++/* LABELSECTOR, LABELOFFSET, BBSIZE & SBSIZE are undefined for __powerpc__ */
++#define BSD_LABELSECTOR   0
++#define BSD_LABELOFFSET   0
++#define	BSD_BBSIZE        0
++#define	BSD_SBSIZE        0
+ #else
+ #error unknown architecture
+ #endif
+diff --git a/io.c b/io.c
+index 0c99d94..0937e29 100644
+--- a/io.c
++++ b/io.c
+@@ -30,6 +30,10 @@
+ #include <stdlib.h>
+ #include <fcntl.h>
+ #include <SCSI.h>
++#else
++#ifdef __GLIBC__
++#include <sys/types.h>
++#endif
+ #endif
+ #include <unistd.h>
+ #include <string.h>
+@@ -51,6 +55,8 @@
+ #define SCSI_FD 8
+ #define loff_t long
+ #define llseek lseek
++#else
++#define llseek lseek64
+ #endif
+ 
+ 
+@@ -435,8 +441,8 @@ read_block(int fd, unsigned long num, char *buf, int quiet)
+ #else
+     {
+ #endif
+-	x = num * PBLOCK_SIZE;
+-	if ((x = llseek(fd, x, 0)) < 0) {
++	x = ((long long) num * PBLOCK_SIZE); /* cast to ll to work around compiler bug */
++	if ((x = lseek64(fd, x, 0)) < 0) {
+ 	    if (quiet == 0) {
+ 		error(errno, "Can't seek on file");
+ 	    }
+diff --git a/kernel-defs.h b/kernel-defs.h
+new file mode 100644
+index 0000000..5f15fd4
+--- /dev/null
++++ b/kernel-defs.h
+@@ -0,0 +1,64 @@
++/* from asm/types.h */
++typedef unsigned short __u16;
++typedef unsigned int __u32;
++
++/* from linux/hdreg.h */
++#define HDIO_GETGEO		0x0301	/* get device geometry */
++
++struct hd_geometry {
++      unsigned char heads;
++      unsigned char sectors;
++      unsigned short cylinders;
++      unsigned long start;
++};
++
++/* from asm/ioctl.h */
++#define _IOC_NRBITS	8
++#define _IOC_TYPEBITS	8
++#define _IOC_SIZEBITS	13
++#define _IOC_DIRBITS	3
++
++#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)
++#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
++#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)
++#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)
++
++#define _IOC_NRSHIFT	0
++#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)
++#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)
++#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)
++
++#ifdef __powerpc__
++#define _IOC_NONE	1U
++#define _IOC_READ	2U
++#define _IOC_WRITE	4U
++#else
++#define _IOC_NONE	0U
++#define _IOC_READ	2U
++#define _IOC_WRITE	1U
++#endif
++
++#define _IOC(dir,type,nr,size) \
++	(((dir)  << _IOC_DIRSHIFT) | \
++	 ((type) << _IOC_TYPESHIFT) | \
++	 ((nr)   << _IOC_NRSHIFT) | \
++	 ((size) << _IOC_SIZESHIFT))
++#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
++
++/* from linux/fs.h */
++#define BLKRRPART  _IO(0x12,95)      /* re-read partition table */
++#define BLKFLSBUF  _IO(0x12,97)      /* flush buffer cache */
++
++/* from linux/genhd.h */
++struct partition {
++	unsigned char boot_ind;		/* 0x80 - active */
++	unsigned char head;		/* starting head */
++	unsigned char sector;		/* starting sector */
++	unsigned char cyl;		/* starting cylinder */
++	unsigned char sys_ind;		/* What partition type */
++	unsigned char end_head;		/* end head */
++	unsigned char end_sector;	/* end sector */
++	unsigned char end_cyl;		/* end cylinder */
++	unsigned int start_sect;	/* starting sector counting from 0 */
++	unsigned int nr_sects;		/* nr of sectors in partition */
++} __attribute__((packed));
+diff --git a/mac-fdisk.8.in b/mac-fdisk.8.in
+new file mode 100644
+index 0000000..31e3643
+--- /dev/null
++++ b/mac-fdisk.8.in
+@@ -0,0 +1,262 @@
++.TH MAC-FDISK 8 "1 December 2001" "Debian" "Apple Disk Partitioning Manual"
++.SH NAME
++mac-fdisk \- Apple partition table editor for Linux
++.SH SYNOPSIS
++.B mac-fdisk
++.B "[ \-h | \--help ] [ \-v | \--version ] [ \-l | \--list device ... ]"
++.br
++.B mac-fdisk
++.B "[ \-r | \--readonly ] device ... "
++.SH DESCRIPTION
++.B mac-fdisk
++is a command line type program which partitions disks using the standard Apple
++disk partitioning scheme described in "Inside Macintosh: Devices".
++The
++.I device
++is usually one of the following:
++
++.nf
++.RS
++/dev/sda
++/dev/sdb
++/dev/sdc
++/dev/sdd
++/dev/sde
++/dev/sdf
++/dev/sdg
++/dev/hda
++/dev/hdb
++
++.RE
++.fi
++/dev/sda is the first hard disk on the SCSI bus (i.e. the
++one with the lowest id), /dev/sdb is the second hard disk, and so on.
++The
++.I partition
++is a
++.I device
++name followed by a partition number.
++The partition number is the index (starting from one) of the partition
++map entry in the partition map (and the partition map itself occupies the
++first entry).
++For example,
++.B /dev/sda2
++is the partition described by the second entry in the partiton map on /dev/sda.
++
++.SH OPTIONS
++.TP
++.B \-v | \--version
++Prints version number of the
++.B mac-fdisk
++program.
++.TP
++.B \-h | \--help
++Prints a list of available commands for the
++.B mac-fdisk
++program.
++.TP
++.B \-l | \--list
++Lists the partition tables for the specified
++.IR device(s).
++With no 
++.IR device(s)
++given, lists all SCSI and IDE devices found in the system.
++.TP
++.B \-r | \--readonly
++Prevents
++.B mac-fdisk
++from writing to the device.
++.SH "Editing Partition Tables"
++An argument which is simply the name of a
++.I device
++indicates that
++.B mac-fdisk
++should edit the partition table of that device. Once started, 
++.B mac-fdisk 
++presents an interactive command prompt to edit the partition table. 
++The partition editing commands are:
++
++.nf
++.RS
++h    list available commands
++p    print (list) the current edited partition table status
++P    print ordered by base address
++i    initialize the partition map
++s    change size of partition map
++b    create new 800K Apple_Bootstrap partition (used by yaboot)
++c    create new standard Linux type partition
++C    create new partition, specifying the partition type
++d    delete a partition
++r    reorder partition entry
++w    write the partition table to disk
++q    quit 
++
++.RE
++.fi
++Commands which take arguments prompt for each argument in turn.
++You can also type the arguments separated by spaces
++and those prompts will be skipped. The
++.B i
++and
++.B w
++commands will prompt for confirmation. None of the editing you do will 
++actually affect the state of the disk you are partitioning until the 
++.B w 
++command is issued. Then the map in its edited state will be 
++permanently written to the disk.
++
++Partitions are always specified by their number, the index of the
++partition entry in the partition map.  Many commands will change the
++index numbers of partitions which follow the affected partition; you are
++encouraged to use the 
++.B p
++command to print the partition table as frequently as necessary. For SCSI
++disks, the partition table should not contain more than fifteen partitions 
++(partition map excluded). IDE disks have a limit of 31 partitions.
++
++Here is a more-or-less typical output for the print command:
++
++.nf
++.RS
++Command (? for help): p
++/dev/sdb
++        #                type name              length   base    ( size )  system
++/dev/sdb1 Apple_partition_map Apple                 63 @ 1       ( 31.5k)  Partition map
++/dev/sdb2      Apple_Driver43 Macintosh             54 @ 64      ( 27.0k)  Driver 4.3
++/dev/sdb3      Apple_Driver43 Macintosh             74 @ 118     ( 37.0k)  Driver 4.3
++/dev/sdb4  Apple_Driver_IOKit Macintosh            512 @ 192     (256.0k)  Unknown
++/dev/sdb5       Apple_Patches Patch Partition      512 @ 704     (256.0k)  Unknown
++/dev/sdb6           Apple_HFS untitled         3072000 @ 1216    (  1.5G)  HFS
++/dev/sdb7           Apple_HFS untitled 2        333026 @ 3073216 (162.6M)  HFS
++/dev/sdb8          Apple_Free Extra                 10 @ 3406242 (  5.0k)  Free space
++
++Block size=512, Number of Blocks=3406252
++DeviceType=0x0, DeviceId=0x0
++Drivers-
++1: @ 64 for 22, type=0x1
++2: @ 118 for 36, type=0xffff
++
++.RE
++.fi
++
++The
++.B i
++(initialize) command prompts for the size of the device.  You can just
++type Return to accept the offered size, which should be correct.
++
++The
++.B b
++command is a shortcut to create the bootstrap partition used on PowerPC
++NewWorld machines. It is equivalent to creating an 800k
++.B Apple_Bootstrap
++type partition using the 
++.B C
++command described below. The sole purpose of this partition is to
++store the boot loader. In multiboot environments, the first bootable
++partition found on the disk takes precedence unless a specific boot
++partition is set in OpenFirmware, so it's best to create the bootstrap
++partition first, or move it to a position before any
++.B Apple_HFS 
++or 
++.B Apple_Boot
++partitions using the 
++.B r
++command described below. Then you will still able to boot Linux after
++the occasional OpenFirmware reset.
++
++The
++.B c
++(create new partition) command has three arguments. As mentioned
++above you can type the arguments following the command, separated by
++spaces, or respond to prompts for each argument:
++
++  1) The base address of the start of the partition.
++
++     You can specify a number in blocks (most likely reading from the
++     existing partition map) or you can also type a partition number
++     followed by the letter 'p' to indicate that the new partition
++     should take the place of that existing free space partition.
++
++  2) The length of the partition.
++
++     Again, you can specify a number in blocks or type a partition
++     number followed by the letter 'p' to indicate use of the entire
++     partition. You can also type a number followed by 'k', 'm', or
++     'g' to indicate the size in kilobytes, megabytes, or gigabytes
++     respectively. (These are powers of 1024, of course, not powers
++     of 1000.)
++
++  3) The name of the partition.
++
++     This can be a single word without quotes, or a string surrounded
++     by single or double quotes. It is best to name any swap partition
++     you create `swap'; other partition names are up to you. The names
++     are not visible to Linux.
++
++The
++.B C
++command is identical to the
++.B c
++command, with the addition of a partition type argument after the
++other arguments. The partition type used for Linux swap and data partitons
++is 
++.B APPLE_UNIX_SVR2
++(this is the partition type created by the 
++.B c
++command). Under normal circumstances, you should not need to use this
++command.
++
++The
++.B d
++command deletes the partition number specified, replacing that partition 
++with partitionable free space.
++
++The
++.B r
++(reorder) command allows the index number of partitions to be changed.
++The index numbers are constrained to be a contiguous sequence. 
++.B mac-fdisk
++will enforce this constraint by recalculating the partition numbers
++after each insert, delete or reorder operation. OpenFirmware looks for
++bootable partitions in the order specified by the index. The
++partitions are not moved on the disk. This command takes two
++arguments, the number of the partition to be moved and the partition
++number it should become.
++
++The
++.B w
++command writes the partition map out to disk. Note that partition
++maps for disks with mounted partitions cannot immediately be
++reinterpreted by the kernel. In order to use the new partition map you
++must reboot. Within the Debian installer system, 
++.B mac-fdisk 
++is normally invoked before any partitions are mounted, thus a reboot is not 
++necessary before continuing the installation.
++
++The
++.B q
++command terminates the program. If there was no 
++.B w
++command issued during the program run, then there will be no effect on the disk.
++
++.SH BUGS
++Some people believe there should really be just one disk partitioning utility.
++
++.B mac-fdisk
++should be able to create HFS partitions that work. Currently, if a
++pre-existing HFS partition is resized, MacOS will continue to use the
++partition size stored in the HFS 'superblock' instead of using the size from
++the partition table (the MacOS volume on the partition remains valid even
++though the sizes don't match anymore). This can have undesired side effects
++especially when creating a smaller HFS partition followed by a few Linux 
++partitions in place of the previous HFS partition space. To avoid this 
++issue, create MacOS partitions within MacOS and then don't resize them 
++in 
++.B mac-fdisk.
++
++.SH "SEE ALSO"
++.BR fdisk (8), 
++.BR mkswap (8),
++.BR mkfs (8)
++.SH AUTHOR
++Eryk Vershen (eryk@apple.com), man page revised by Chris Tillman (tillman@azstarnet.com)
+diff --git a/partition_map.c b/partition_map.c
+index 113f66b..6ca2c16 100644
+--- a/partition_map.c
++++ b/partition_map.c
+@@ -30,14 +30,12 @@
+ #include <stdlib.h>
+ #include <unistd.h>
+ #endif
+-#include <string.h>
+ #include <errno.h>
+ 
+ #include <fcntl.h>
+ #ifdef __linux__
+ #include <sys/ioctl.h>
+-#include <linux/fs.h>
+-#include <linux/hdreg.h>
++#include "kernel-defs.h"
+ #include <sys/stat.h>
+ #endif
+ 
+@@ -65,6 +63,8 @@
+ const char * kFreeType	= "Apple_Free";
+ const char * kMapType	= "Apple_partition_map";
+ const char * kUnixType	= "Apple_UNIX_SVR2";
++const char * kBootstrapType = "Apple_Bootstrap";
++const char * kBootstrapName = "bootstrap";
+ 
+ const char * kFreeName = "Extra";
+ 
+@@ -288,15 +288,17 @@ write_partition_map(partition_map_header *map)
+ 	    free(block);
+ 	}
+     }
+-    printf("The partition table has been altered!\n\n");
++    printf("The partition map has been saved successfully!\n\n");
+ 
+ #ifdef __linux__
+     if (map->regular_file) {
+ 	close_device(map->fd);
+     } else {
+-	// printf("Calling ioctl() to re-read partition table.\n"
+-	//       "(Reboot to ensure the partition table has been updated.)\n");
+-	sync();
++	// printf("Calling ioctl() to re-read partition table.\n");
++	if ((i = ioctl(fd, BLKFLSBUF)) != 0) {
++	    perror("ioctl(BLKFLSBUF)");
++	    sync();
++	}
+ 	sleep(2);
+ 	if ((i = ioctl(fd, BLKRRPART)) != 0) {
+ 	    saved_errno = errno;
+@@ -304,20 +306,26 @@ write_partition_map(partition_map_header *map)
+ 	    // some kernel versions (1.2.x) seem to have trouble
+ 	    // rereading the partition table, but if asked to do it
+ 	    // twice, the second time works. - biro@yggdrasil.com */
+-	    sync();
++	    // printf("Again calling ioctl() to re-read partition table.\n");
++	    if ((i = ioctl(fd, BLKFLSBUF)) != 0) {
++	    	perror("ioctl(BLKFLSBUF)");
++		sync();
++	    }
+ 	    sleep(2);
+ 	    if ((i = ioctl(fd, BLKRRPART)) != 0) {
+ 		saved_errno = errno;
+ 	    }
+ 	}
++	printf("Syncing disks.\n");
++	if ((i = ioctl(fd, BLKFLSBUF)) != 0) {
++	    perror("ioctl(BLKFLSBUF)");
++	    sync();
++	}
+ 	close_device(map->fd);
+-
+-	// printf("Syncing disks.\n");
+-	sync();
+ 	sleep(4);		/* for sync() */
+ 
+ 	if (i < 0) {
+-	    error(saved_errno, "Re-read of partition table failed");
++	    error(saved_errno, "Re-read of partition map failed");
+ 	    printf("Reboot your system to ensure the "
+ 		    "partition table is updated.\n");
+ 	}
+@@ -692,9 +700,9 @@ compute_device_size(int fd)
+ 		geometry.heads*geometry.sectors*geometry.cylinders);
+     }
+ 
+-    if ((pos = llseek(fd, 0, SEEK_END)) < 0) {
++    if ((pos = lseek64(fd, 0, SEEK_END)) < 0) {
+ 	printf("llseek to end of device failed\n");
+-    } else if ((pos = llseek(fd, 0, SEEK_CUR)) < 0) {
++    } else if ((pos = lseek64(fd, 0, SEEK_CUR)) < 0) {
+ 	printf("llseek to end of device failed on second try\n");
+     } else {
+ 	printf("llseek: pos = %d, blocks=%d\n", pos, pos/PBLOCK_SIZE);
+@@ -895,6 +903,7 @@ move_entry_in_map(long old_index, long index, partition_map_header *map)
+ 	printf("No such partition\n");
+     } else {
+ 	remove_from_disk_order(cur);
++	if (old_index < index) index++; /* renumber_disk_addresses(map); */
+ 	cur->disk_address = index;
+ 	insert_in_disk_order(cur);
+ 	renumber_disk_addresses(map);
+diff --git a/partition_map.h b/partition_map.h
+index 90f2210..526f605 100644
+--- a/partition_map.h
++++ b/partition_map.h
+@@ -69,6 +69,8 @@ typedef struct partition_map partition_map;
+ extern const char * kFreeType;
+ extern const char * kMapType;
+ extern const char * kUnixType;
++extern const char * kBootstrapType;
++extern const char * kBootstrapName;
+ 
+ extern const char * kFreeName;
+ 
+diff --git a/pdisk.c b/pdisk.c
+index 52f98c7..a9bc629 100644
+--- a/pdisk.c
++++ b/pdisk.c
+@@ -30,18 +30,17 @@
+ #include <stdio.h>
+ #ifdef __linux__
+ #include <getopt.h>
++#include <stddef.h>
+ #else
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <SIOUX.h>
+ #endif
+-#include <string.h>
+ #include <errno.h>
+ 
+ #ifdef __linux__
+ #include <sys/ioctl.h>
+-#include <linux/fs.h>
+-#include <linux/hdreg.h>
++#include "kernel-defs.h"
+ #endif
+ 
+ #include "pdisk.h"
+@@ -94,6 +93,7 @@ int rflag;
+ void do_add_intel_partition(partition_map_header *map);
+ void do_change_map_size(partition_map_header *map);
+ void do_create_partition(partition_map_header *map, int get_type);
++void do_create_bootstrap_partition(partition_map_header *map);
+ void do_delete_partition(partition_map_header *map);
+ int do_expert(partition_map_header *map);
+ void do_reorder(partition_map_header *map);
+@@ -114,6 +114,7 @@ int
+ main(int argc, char **argv)
+ {
+     int name_index;
++    int err=0;
+ 
+     if (sizeof(DPME) != PBLOCK_SIZE) {
+ 	fatal(-1, "Size of partion map entry (%d) "
+@@ -150,7 +151,9 @@ main(int argc, char **argv)
+     } else if (!vflag) {
+ 	usage("no device argument");
+  	do_help();
++	err=-EINVAL;	// debatable
+     }
++    exit(err);
+ }
+ #else
+ main()
+@@ -351,7 +354,8 @@ edit(char *name)
+ 	    printf("  P    (print ordered by base address)\n");
+ 	    printf("  i    initialize partition map\n");
+ 	    printf("  s    change size of partition map\n");
+-	    printf("  c    create new partition\n");
++	    printf("  b    create new 800K bootstrap partition\n");
++	    printf("  c    create new Linux partition\n");
+ 	    printf("  C    (create with type also specified)\n");
+ 	    printf("  d    delete a partition\n");
+ 	    printf("  r    reorder partition entry in map\n");
+@@ -378,6 +382,10 @@ edit(char *name)
+ 	case 'i':
+ 	    map = init_partition_map(name, map);
+ 	    break;
++	case 'B':
++	case 'b':
++	    do_create_bootstrap_partition(map);
++	    break;
+ 	case 'C':
+ 	    get_type = 1;
+ 	    // fall through
+@@ -471,6 +479,30 @@ do_create_partition(partition_map_header *map, int get_type)
+ }
+ 
+ 
++void
++do_create_bootstrap_partition(partition_map_header *map)
++{
++    long base;
++
++    if (map == NULL) {
++	bad_input("No partition map exists");
++	return;
++    }
++ 
++    if (!rflag && map->writeable == 0) {
++	printf("The map is not writeable.\n");
++    }
++
++    // XXX add help feature (i.e. '?' in any argument routine prints help string)
++    if (get_base_argument(&base, map) == 0) {
++	return;
++    }
++
++    // create 800K type Apple_Bootstrap partition named `bootstrap'
++    add_partition_to_map(kBootstrapName, kBootstrapType, base, 1600, map);
++}
++
++
+ int
+ get_base_argument(long *number, partition_map_header *map)
+ {
+@@ -508,7 +540,7 @@ get_size_argument(long *number, partition_map_header *map)
+     int result = 0;
+     long multiple;
+ 
+-    if (get_number_argument("Length in blocks: ", number, kDefault) == 0) {
++    if (get_number_argument("Length (in blocks, kB (k), MB (M) or GB (G)): ", number, kDefault) == 0) {
+ 	bad_input("Bad length");
+     } else {
+ 	result = 1;
+@@ -605,13 +637,22 @@ do_write_partition_map(partition_map_header *map)
+ 	bad_input("The map is not writeable.");
+ 	return;
+     }
+-    printf("Writing the map destroys what was there before. ");
+-    if (get_okay("Is that okay? [n/y]: ", 0) != 1) {
++//    printf("Writing the map destroys what was there before. ");
++    printf("IMPORTANT: You are about to write a changed partition map to disk. \n");
++    printf("For any partition you changed the start or size of, writing out \n");
++    printf("the map causes all data on that partition to be LOST FOREVER. \n");
++    printf("Make sure you have a backup of any data on such partitions you \n");
++    printf("want to keep before answering 'yes' to the question below! \n\n");
++    if (get_okay("Write partition map? [n/y]: ", 0) != 1) {
+ 	return;
+     }
+ 
+     write_partition_map(map);
+ 
++    printf("\nPartition map written to disk. If any partitions on this disk \n");
++    printf("were still in use by the system (see messages above), you will need \n");
++    printf("to reboot in order to utilize the new partition map.\n\n");
++
+     // exit(0);
+ }
+ 
+diff --git a/pmac-fdisk.8.in b/pmac-fdisk.8.in
+new file mode 100644
+index 0000000..8e32c0c
+--- /dev/null
++++ b/pmac-fdisk.8.in
+@@ -0,0 +1,222 @@
++.\" Copyright 1992, 1993 Rickard E. Faith (faith@cs.unc.edu)
++.\" Copyright 1998 Andries E. Brouwer (aeb@cwi.nl)
++.\" Copyright 2000 Michael Schmitz (schmitz@biophys.uni-duesseldorf.de)
++.\" May be distributed under the GNU General Public License
++.TH PMAC-FDISK 8 "11 June 1998" "Linux 2.0" "Linux Programmer's Manual"
++.SH NAME
++pmac-fdisk \- Partition table manipulator for Linux
++.SH SYNOPSIS
++.BI "pmac-fdisk [\-u] " device
++.sp
++.BI "pmac-fdisk \-l [\-u] " "device ..."
++.sp
++.BI "pmac-fdisk \-s " "partition ..."
++.sp
++.BI "pmac-fdisk \-v
++.SH DESCRIPTION
++Hard disks can be divided into one or more logical disks called
++.IR partitions .
++This division is described in the
++.I "partition table"
++found in sector 0 of the disk.
++
++In the BSD world one talks about `disk slices' and a `disklabel'.
++
++Linux needs at least one partition, namely for its root file system.
++It can use swap files and/or swap partitions, but the latter are more
++efficient. So, usually one will want a second Linux partition
++dedicated as swap partition.
++On Intel compatible hardware, the BIOS that boots the system
++can often only access the first 1024 cylinders of the disk.
++For this reason people with large disks often create a third partition,
++just a few MB large, typically mounted on
++.IR /boot ,
++to store the kernel image and a few auxiliary files needed at boot time,
++so as to make sure that this stuff is accessible to the BIOS.
++There may be reasons of security, ease of administration and backup,
++or testing, to use more than the minimum number of partitions.
++
++.B pmac-fdisk
++(in the first form of invocation)
++is a menu driven program for creation and manipulation of
++partition tables.
++It understands DOS type partition tables and BSD or SUN type disklabels.
++
++The
++.I device
++is usually one of the following:
++.br
++.nf
++.RS
++/dev/hda
++/dev/hdb
++/dev/sda
++/dev/sdb
++.RE
++.fi
++(/dev/hd[a-h] for IDE disks, /dev/sd[a-p] for SCSI disks).
++A device name refers to the entire disk.
++
++The
++.I partition
++is a
++.I device
++name followed by a partition number.  For example,
++.B /dev/hda1
++is the first partition on the first IDE hard disk in the system.
++IDE disks can have up to 63 partitions, SCSI disks up to 15.
++See also
++.IR /usr/src/linux/Documentation/devices.txt .
++
++A BSD/SUN type disklabel can describe 8 partitions,
++the third of which should be a `whole disk' partition.
++Do not start a partition that actually uses its first sector
++(like a swap partition) at cylinder 0, since that will
++destroy the disklabel.
++
++An IRIX/SGI type disklabel can describe 16 partitions,
++the eleventh of which should be an entire `volume' partition,
++while the ninth should be labeled `volume header'.
++The volume header will also cover the partition table, i.e.,
++it starts at block zero and extends by default over five cylinders.
++The remaining space in the volume header may be used by header
++directory entries.  No partitions may overlap with the volume header.
++Also do not change its type and make some file system on it, since
++you will lose the partition table.  Use this type of label only when
++working with Linux on IRIX/SGI machines or IRIX/SGI disks under Linux.
++
++A DOS type partition table can describe an unlimited number
++of partitions. In sector 0 there is room for the description
++of 4 partitions (called `primary'). One of these may be an
++extended partition; this is a box holding logical partitions,
++with descriptors found in a linked list of sectors, each
++preceding the corresponding logical partitions.
++The four primary partitions, present or not, get numbers 1-4.
++Logical partitions start numbering from 5.
++
++In a DOS type partition table the starting offset and the size
++of each partition is stored in two ways: as an absolute number
++of sectors (given in 32 bits) and as a Cylinders/Heads/Sectors
++triple (given in 10+8+6 bits). The former is OK - with 512-byte
++sectors this will work up to 2 TB. The latter has two different
++problems. First of all, these C/H/S fields can be filled only
++when the number of heads and the number of sectors per track
++are known. Secondly, even if we know what these numbers should be,
++the 24 bits that are available do not suffice.
++DOS uses C/H/S only, Windows uses both, Linux never uses C/H/S.
++
++If possible,
++.B pmac-fdisk
++will obtain the disk geometry automatically.  This is not
++necessarily the physical disk geometry (indeed, modern disks do not
++really have anything like a physical geometry, certainly not something
++that can be described in simplistic Cylinders/Heads/Sectors form),
++but is the disk geometry that MS-DOS uses for the partition table.
++
++Usually all goes well by default, and there are no problems if
++Linux is the only system on the disk. However, if the disk has
++to be shared with other operating systems, it is often a good idea
++to let an fdisk from another operating system make at least one
++partition. When Linux boots it looks at the partition table, and
++tries to deduce what (fake) geometry is required for good
++cooperation with other systems.
++
++Whenever a partition table is printed out, a consistency check is performed
++on the partition table entries.  This check verifies that the physical and
++logical start and end points are identical, and that the partition starts
++and ends on a cylinder boundary (except for the first partition).
++
++Some versions of MS-DOS create a first partition which does not begin
++on a cylinder boundary, but on sector 2 of the first cylinder.
++Partitions beginning in cylinder 1 cannot begin on a cylinder boundary, but
++this is unlikely to cause difficulty unless you have OS/2 on your machine.
++
++A sync() and a BLKRRPART ioctl() (reread partition table from disk)
++are performed before exiting when the partition table has been updated.
++Long ago it used to be necessary to reboot after the use of pmac-fdisk.
++I do not think this is the case anymore - indeed, rebooting too quickly
++might cause loss of not-yet-written data. Note that both the kernel
++and the disk hardware may buffer data.
++
++.SH "DOS 6.x WARNING"
++
++The DOS 6.x FORMAT command looks for some information in the first
++sector of the data area of the partition, and treats this information
++as more reliable than the information in the partition table.  DOS
++FORMAT expects DOS FDISK to clear the first 512 bytes of the data area
++of a partition whenever a size change occurs.  DOS FORMAT will look at
++this extra information even if the /U flag is given -- we consider
++this a bug in DOS FORMAT and DOS FDISK.
++
++The bottom line is that if you use pmac-fdisk to change the size of a
++DOS partition table entry, then you must also use
++.B dd
++to zero the first 512 bytes of that partition before using DOS FORMAT to
++format the partition.  For example, if you were using pmac-fdisk to make a 
++DOS partition table entry for /dev/hda1, then (after exiting pmac-fdisk 
++and rebooting Linux so that the partition table information is valid) you
++would use the command "dd if=/dev/zero of=/dev/hda1 bs=512 count=1" to zero
++the first 512 bytes of the partition.
++
++.B BE EXTREMELY CAREFUL
++if you use the
++.B dd
++command, since a small typo can make all of the data on your disk useless.
++
++For best results, you should always use an OS-specific partition table
++program.  For example, you should make DOS partitions with the DOS FDISK
++program and Linux partitions with the Linux pmac-fdisk program.
++
++.SH OPTIONS
++.TP
++.B \-v
++Print version number of
++.B pmac-fdisk
++program and exit.
++.TP
++.B \-l
++List the partition tables for
++.BR /dev/hd[a-d] ,
++.BR /dev/sd[a-h] ,
++and then exit.
++.TP
++.B \-u
++When listing partition tables, give sizes in sectors instead
++of cylinders.
++.TP
++.BI "\-s " partition
++The
++.I size
++of the partition (in blocks) is printed on the standard output.
++.SH BUGS
++There are several *fdisk programs around.
++Each has its problems and strengths.
++Try them in the order
++.BR cfdisk ,
++.BR pmac-fdisk ,
++.BR sfdisk .
++(Indeed,
++.B cfdisk
++is a beautiful program that has strict requirements on
++the partition tables it accepts, and produces high quality partition
++tables. Use it if you can. 
++.B pmac-fdisk
++is a buggy program that does fuzzy things - usually it happens to
++produce reasonable results. Its single advantage is that it has
++some support for BSD disk labels and other non-DOS partition tables.
++Avoid it if you can.
++.B sfdisk
++is for hackers only - the user interface is terrible, but it is
++more correct than pmac-fdisk and more powerful than both pmac-fdisk and cfdisk.
++Moreover, it can be used noninteractively.)
++.PP
++The IRIX/SGI type disklabel is currently not supported by the kernel.
++Moreover, IRIX/SGI header directories are not fully supported yet.
++.PP
++The option `dump partition table to file' is missing.
++.\" .SH AUTHORS
++.\" A. V. Le Blanc (LeBlanc@mcc.ac.uk)
++.\" Bernhard Fastenrath (fasten@informatik.uni-bonn.de)
++.\" Jakub Jelinek (jj@sunsite.mff.cuni.cz)
++.\" Andreas Neuper (ANeuper@GUUG.de)
++.\" and many others.
+-- 
+2.26.2
+