From 5eca00f7b8db381ce2584736e3589bec47e1d46f Mon Sep 17 00:00:00 2001 From: james Date: Sun, 7 Aug 2011 11:33:43 +0000 Subject: add support for repairing half a table --- src/Makefile.am | 7 +++-- src/fixup.c | 38 +++++++++++++++++++++++++++ src/gpt.c | 13 ++++++++-- src/header.c | 32 +++++++++++++++++++++++ src/prototypes.h | 78 +++++++++++++++++++++++++++++--------------------------- 5 files changed, 126 insertions(+), 42 deletions(-) create mode 100644 src/fixup.c diff --git a/src/Makefile.am b/src/Makefile.am index ec51868..c39b9a1 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.8 2009/05/06 01:40:51 james Exp $ +# $Id: Makefile.am,v 1.9 2011/08/07 11:33:43 james Exp $ # # $Log: Makefile.am,v $ +# Revision 1.9 2011/08/07 11:33:43 james +# add support for repairing half a table +# # Revision 1.8 2009/05/06 01:40:51 james # *** empty log message *** # @@ -40,7 +43,7 @@ noinst_HEADERS = disk.h gpt.h guid.h 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 sync.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 fixup.c gpt_SOURCES = ${SRCS} gpt_LDADD = diff --git a/src/fixup.c b/src/fixup.c new file mode 100644 index 0000000..af7b6d6 --- /dev/null +++ b/src/fixup.c @@ -0,0 +1,38 @@ +#include "project.h" + + + +int +fixup (DISK * d) +{ + GPT_headers h; + int i; + + h = headers_get_one (d); + + + + + for (i = 0; i < h.header.n_partition_entries; ++i) + { + + + GPT_entry e = entry_read (d, &h.header, i); + + + entry_write (d, &h.header, i, &e); + + entry_write (d, &h.alt_header, i, &e); + } + + + header_redo_ent_crc (d, &h.header); + header_write (d, &h.header); + + header_redo_ent_crc (d, &h.alt_header); + header_write (d, &h.alt_header); + + + + return 0; +} diff --git a/src/gpt.c b/src/gpt.c index 73bf825..990d180 100644 --- a/src/gpt.c +++ b/src/gpt.c @@ -6,10 +6,13 @@ * */ -static char rcsid[] = "$Id: gpt.c,v 1.16 2009/05/06 01:35:00 james Exp $"; +static char rcsid[] = "$Id: gpt.c,v 1.17 2011/08/07 11:33:43 james Exp $"; /* * $Log: gpt.c,v $ + * Revision 1.17 2011/08/07 11:33:43 james + * add support for repairing half a table + * * Revision 1.16 2009/05/06 01:35:00 james * *** empty log message *** * @@ -107,7 +110,7 @@ main (int argc, char *argv[]) fprintf (stderr, "sizeof(off_t)=%d\n", sizeof (off_t)); - while ((c = getopt (argc, argv, "d:hlsef:unac")) != EOF) + while ((c = getopt (argc, argv, "qd:hlsef:unac")) != EOF) { switch (c) { @@ -144,6 +147,12 @@ main (int argc, char *argv[]) e = entry_read (d, &h.header, n); printf ("%lld\n", e.end); return 0; + case 'q': + if (!d) + usage (); + fixup (d); + disk_reread_kernel_table (d); + return 0; case 'n': if (!d) usage (); diff --git a/src/header.c b/src/header.c index 22c255c..e4a7e15 100644 --- a/src/header.c +++ b/src/header.c @@ -193,5 +193,37 @@ headers_get (DISK * d) memcpy (&ret.alt_header, buf, sizeof (ret.alt_header)); + return ret; +} + +GPT_headers +headers_get_one (DISK * d) +{ + GPT_headers ret; + uint8_t buf[512]; + uint64_t lbas; + int table_size; + + + + lbas = disk_lbas (d); + + disk_read (d, buf, 1, 1); + memcpy (&ret.header, buf, sizeof (ret.header)); + + table_size=ret.header.first_usable_lba; + + ret.header.last_usable_lba=lbas-table_size; + + ret.alt_header=ret.header; + + ret.header.alternate_lba=lbas-1; + + ret.alt_header.alternate_lba=1; + ret.alt_header.my_lba=lbas-1; + ret.alt_header.partition_entry_lba = (lbas - table_size)+1; + + + return ret; } diff --git a/src/prototypes.h b/src/prototypes.h index f740512..0f4144e 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -1,51 +1,53 @@ /* gpt.c */ -void usage (void); -int main (int argc, char *argv[]); +void usage(void); +int main(int argc, char *argv[]); /* version.c */ +char *get_version(void); /* util.c */ -void hexdump (FILE * f, uint8_t * data, int s, int l); -void utf16_to_ascii (void *_u16, int u16_len, void *_u8, int u8_len); -void ascii_to_utf16 (void *_u8, int u8_len, void *_u16, int u16_len); +void hexdump(FILE *f, uint8_t *data, int s, int l); +void utf16_to_ascii(void *_u16, int u16_len, void *_u8, int u8_len); +void ascii_to_utf16(void *_u8, int u8_len, void *_u16, int u16_len); /* guid.c */ -int guid_cmp (GUID * a, GUID * b); -char *guid_to_a (GUID g); -int a_to_guid (char *a, GUID * g); -GUID guid_random (void); +int guid_cmp(GUID *a, GUID *b); +char *guid_to_a(GUID g); +int a_to_guid(char *a, GUID *g); +GUID guid_random(void); /* crc.c */ -uint32_t crc32 (uint32_t crc, const void *_buf, int len); +uint32_t crc32(uint32_t crc, const void *_buf, int len); /* header.c */ -void header_calc_crc (GPT_header * h); -GPT_header header_new (GUID disk_guid, uint64_t lbas, int alt); -uint32_t header_calc_ent_crc (DISK * d, GPT_header * h); -void header_show (DISK * d, GPT_header * h); -int header_validate (DISK * d, GPT_header * h); -void header_redo_ent_crc (DISK * d, GPT_header * h); -void header_write (DISK * d, GPT_header * h); -int headers_validate (DISK * d, GPT_headers * h); -GPT_headers headers_get (DISK * d); +void header_calc_crc(GPT_header *h); +GPT_header header_new(GUID disk_guid, uint64_t lbas, int alt); +uint32_t header_calc_ent_crc(DISK *d, GPT_header *h); +void header_show(DISK *d, GPT_header *h); +int header_validate(DISK *d, GPT_header *h); +void header_redo_ent_crc(DISK *d, GPT_header *h); +void header_write(DISK *d, GPT_header *h); +int headers_validate(DISK *d, GPT_headers *h); +GPT_headers headers_get(DISK *d); +GPT_headers headers_get_one(DISK *d); /* disk.c */ -DISK *disk_open (char *fn); -void disk_read (DISK * d, void *buf, uint64_t lba, int lbas); -void disk_write (DISK * d, void *buf, uint64_t lba, int lbas); -uint64_t disk_lbas (DISK * d); -int disk_reread_kernel_table (DISK * d); +DISK *disk_open(char *fn); +void disk_read(DISK *d, void *buf, uint64_t lba, int lbas); +void disk_write(DISK *d, void *buf, uint64_t lba, int lbas); +uint64_t disk_lbas(DISK *d); +int disk_reread_kernel_table(DISK *d); /* pmbr.c */ -void mbr_entry_show (MBR_entry * e); -void mbr_show (MBR * m); -MBR mbr_new (uint64_t lbas); -void mbr_entry_from_gpt_entry (MBR_entry * m, GPT_header * h, GPT_entry * g, - int bootable, uint8_t type); +void mbr_entry_show(MBR_entry *e); +void mbr_show(MBR *m); +MBR mbr_new(uint64_t lbas); +void mbr_entry_from_gpt_entry(MBR_entry *m, GPT_header *h, GPT_entry *g, int bootable, uint8_t type); /* show.c */ -void show (DISK * d); +void show(DISK *d); /* entry.c */ -void entry_write (DISK * d, GPT_header * h, int n, GPT_entry * e); -GPT_entry entry_read (DISK * d, GPT_header * h, int n); -int entry_empty (GPT_entry * e); -void entry_show (GPT_entry * e); +void entry_write(DISK *d, GPT_header *h, int n, GPT_entry *e); +GPT_entry entry_read(DISK *d, GPT_header *h, int n); +int entry_empty(GPT_entry *e); +void entry_show(GPT_entry *e); /* new.c */ -void new (DISK * d); +void new(DISK *d); /* modify.c */ -int modify (DISK * d, int n, char *name, char *type_guid, uint64_t start, - uint64_t end, char *part_guid); +int modify(DISK *d, int n, char *name, char *type_guid, uint64_t start, uint64_t end, char *part_guid); /* sync.c */ -void sync_tables (DISK * d); +void sync_tables(DISK *d); +/* fixup.c */ +int fixup(DISK *d); -- cgit v1.2.3