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
//
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
#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] ;
};
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)
#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)
//
// 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
//
NAMES plist[] = {
"Drvr", "Apple_Driver",
+ "Dr43", "Apple_Driver43",
"Free", "Apple_Free",
" HFS", "Apple_HFS",
" MFS", "Apple_MFS",
// 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);
//
}
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) {
}
}
printf("\n");
+#endif
}
{
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);
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) {
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);
}
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) {
bytes = bytes / 1024.0;
j = 'G';
}
- 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);
- }
+ printf(" (%#5.1f%c) ", bytes, j);
+
+ 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");
}
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);
}
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',
(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);
}
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <setjmp.h>
#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"
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)))
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 "
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++];
}
}
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) {
case lower: i += low; break;
case upper: i += high; break;
case deflt: i += dflt; break;
+ default: break;
}
}
else
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;
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),
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 "
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;
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;
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)
"(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
twice, the second time works. - biro@yggdrasil.com */
sync();
sleep(2);
- if(i = ioctl(fd, BLKRRPART))
+ if((i = ioctl(fd, BLKRRPART)))
error = errno;
}
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();
exit(1);
}
}
+ }
}
void main(int argc, char **argv)
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <fcntl.h>
#include <ctype.h>
#include <setjmp.h>
#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
{
#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
{
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);
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);
#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);
#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
#include <stdlib.h>
#include <fcntl.h>
#include <SCSI.h>
+#else
+#ifdef __GLIBC__
+#include <sys/types.h>
+#endif
#endif
#include <unistd.h>
#include <string.h>
#define SCSI_FD 8
#define loff_t long
#define llseek lseek
+#else
+#define llseek lseek64
#endif
#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");
}
#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
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";
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;
// 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");
}
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);
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);
extern const char * kFreeType;
extern const char * kMapType;
extern const char * kUnixType;
+extern const char * kBootstrapType;
+extern const char * kBootstrapName;
extern const char * kFreeName;
#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"
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);
main(int argc, char **argv)
{
int name_index;
+ int err=0;
if (sizeof(DPME) != PBLOCK_SIZE) {
fatal(-1, "Size of partion map entry (%d) "
} else if (!vflag) {
usage("no device argument");
do_help();
+ err=-EINVAL; // debatable
}
+ exit(err);
}
#else
main()
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");
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
}
+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)
{
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;
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);
}