From 24c1249c07254fc8357a97c0be65267826d74eb8 Mon Sep 17 00:00:00 2001 From: james Date: Mon, 12 Nov 2007 13:28:04 +0000 Subject: *** empty log message *** --- src/Makefile.am | 7 +++-- src/gpt.c | 15 +++++++-- src/gpt.h | 3 ++ src/pmbr.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/prototypes.h | 5 +++ src/show.c | 2 +- version-md5sums | 1 + version-micro | 2 +- 8 files changed, 122 insertions(+), 6 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 207f842..6bc1acf 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,9 +5,12 @@ # Copyright (c) 2007 James McKenzie , # All rights reserved. # -# $Id: Makefile.am,v 1.5 2007/09/10 11:23:08 root Exp $ +# $Id: Makefile.am,v 1.6 2007/11/12 13:28:04 james Exp $ # # $Log: Makefile.am,v $ +# Revision 1.6 2007/11/12 13:28:04 james +# *** empty log message *** +# # Revision 1.5 2007/09/10 11:23:08 root # *** empty log message *** # @@ -31,7 +34,7 @@ noinst_HEADERS=project.h prototypes.h bin_PROGRAMS = gpt -SRCS=gpt.c version.c util.c guid.c crc.c header.c disk.c pmbr.c show.c entry.c new.c modify.c +SRCS=gpt.c version.c util.c guid.c crc.c header.c disk.c pmbr.c show.c entry.c new.c modify.c sync.c gpt_SOURCES = ${SRCS} gpt_LDADD = diff --git a/src/gpt.c b/src/gpt.c index 1f6c96f..b81964d 100644 --- a/src/gpt.c +++ b/src/gpt.c @@ -6,10 +6,13 @@ * */ -static char rcsid[] = "$Id: gpt.c,v 1.11 2007/10/17 09:51:42 james Exp $"; +static char rcsid[] = "$Id: gpt.c,v 1.12 2007/11/12 13:28:04 james Exp $"; /* * $Log: gpt.c,v $ + * Revision 1.12 2007/11/12 13:28:04 james + * *** empty log message *** + * * Revision 1.11 2007/10/17 09:51:42 james * *** empty log message *** * @@ -68,6 +71,9 @@ fprintf(stderr, "gpt -d disk-device -a n name type start end\n" " set partiton n, type can either be a named\n" " type or a hexadecimal GUID\n" +"gpt -d disk-device -c fill the PMBR with entries taken from\n" +" the first few GPT entries, using dark\n" +" voodoo\n" ); exit(1); } @@ -87,7 +93,7 @@ main (int argc, char *argv[]) extern int optind; - while ((c=getopt(argc,argv,"d:hlsef:una"))!=EOF) { + while ((c=getopt(argc,argv,"d:hlsef:unac"))!=EOF) { switch(c) { case 'd': d=disk_open(optarg); @@ -129,6 +135,11 @@ main (int argc, char *argv[]) if (!d) usage(); show(d); return 0; + case 'c': + if (!d) usage(); + sync_tables(d); + //show(d); + return 0; default: usage(); } diff --git a/src/gpt.h b/src/gpt.h index bcadd31..16711df 100644 --- a/src/gpt.h +++ b/src/gpt.h @@ -49,6 +49,9 @@ typedef struct #define MBR_PARTITION_TYPE_EFI 0xee +#define MBR_PARTITION_TYPE_LINUX 0x83 +#define MBR_PARTITION_TYPE_SWAP 0x82 +#define MBR_PARTITION_TYPE_UNKOWN 0xff #define MBR_PARTITION_BOOTABLE 0x80 #define MBR_SECTOR(a) ((a) & 0x3f) diff --git a/src/pmbr.c b/src/pmbr.c index a9bbfb8..a958f83 100644 --- a/src/pmbr.c +++ b/src/pmbr.c @@ -62,3 +62,96 @@ mbr_new (uint64_t lbas) return ret; } + + +static CHS +sector_to_chs (uint32_t lba) +{ + CHS ret; + int c; + int h; + int s; + + c = lba / (63 * 255); + + if (c > 1023) + { + ret.head = 254; + ret.cs = MBR_CS (1023, 63); + return ret; + } + + lba -= (c * 63 * 255); + h = lba / 63; + lba -= (h * 63); + s = lba + 1; + + + ret.head = h; + ret.cs = MBR_CS (c, s); + + return ret; +} + +void +mbr_set_entry0_from_gpt_header (MBR_entry * m, GPT_header * h) +{ + MBR ret = { 0 }; + uint32_t start = 1; + uint32_t end = h->first_usable_lba - 1; + + + m->bootable = 0; + m->chs_start = sector_to_chs (start); + m->system = MBR_PARTITION_TYPE_EFI; + m->chs_end = sector_to_chs (end); + m->start = start; + m->size = (end - start) + 1; + +} + +void +mbr_entry_from_gpt_entry (MBR_entry * m, GPT_entry * g, int bootable, + uint8_t type) +{ + MBR ret = { 0 }; + uint32_t start = g->start; + uint32_t end = g->end; + + + m->system = type; + m->bootable = bootable ? MBR_PARTITION_BOOTABLE : 0x00; + m->chs_start = sector_to_chs (start); + m->chs_end = sector_to_chs (end); + m->start = start; + m->size = (end - start) + 1; +} + +void +mbr_wedge_entry (MBR_entry * m) +{ + MBR ret = { 0 }; + + int c = MBR_CYLINDER (m->chs_end.cs); + int s = MBR_SECTOR (m->chs_end.cs); + int h = m->chs_end.head; + + while ((s != 63) || (h != 254)) + { + s++; + if (s == 64) + { + s = 1; + h++; + if (h == 255) + { + c++; + h = 0; + } + } + m->size++; + } + + m->chs_end.head = h; + m->chs_end.cs = MBR_CS (c, s); +} diff --git a/src/prototypes.h b/src/prototypes.h index 28fd0fa..201f984 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -32,6 +32,9 @@ uint64_t disk_lbas(DISK *d); void mbr_entry_show(MBR_entry *e); void mbr_show(MBR *m); MBR mbr_new(uint64_t lbas); +void mbr_set_entry0_from_gpt_header(MBR_entry *m, GPT_header *h); +void mbr_entry_from_gpt_entry(MBR_entry *m, GPT_entry *g, int bootable, uint8_t type); +void mbr_wedge_entry(MBR_entry *m); /* show.c */ void show(DISK *d); /* entry.c */ @@ -43,3 +46,5 @@ void entry_show(GPT_entry *e); void new(DISK *d); /* modify.c */ int modify(DISK *d, int n, char *name, char *type_guid, uint64_t start, uint64_t end); +/* sync.c */ +void sync_tables(DISK *d); diff --git a/src/show.c b/src/show.c index 0047e97..20decd1 100644 --- a/src/show.c +++ b/src/show.c @@ -15,7 +15,7 @@ show (DISK * d) m = (MBR *) buf; mbr_show (m); - h=headers_get(d); + h=headers_get(d); header_show (d, &h.header); header_show (d, &h.alt_header); diff --git a/version-md5sums b/version-md5sums index e69de29..b65eb1e 100644 --- a/version-md5sums +++ b/version-md5sums @@ -0,0 +1 @@ +745c00d2207e046f159b63dffbfbe491 1.0.1 diff --git a/version-micro b/version-micro index 573541a..d00491f 100644 --- a/version-micro +++ b/version-micro @@ -1 +1 @@ -0 +1 -- cgit v1.2.3