aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjames <james>2011-08-07 11:33:43 +0000
committerjames <james>2011-08-07 11:33:43 +0000
commit5eca00f7b8db381ce2584736e3589bec47e1d46f (patch)
tree6fbe1673e67e5759be56b4d8b263d0a5a4075e44
parente2d7e909efa62075d6322df2427b03f4d2ba7024 (diff)
downloadgpt-5eca00f7b8db381ce2584736e3589bec47e1d46f.tar.gz
gpt-5eca00f7b8db381ce2584736e3589bec47e1d46f.tar.bz2
gpt-5eca00f7b8db381ce2584736e3589bec47e1d46f.zip
add support for repairing half a table
-rw-r--r--src/Makefile.am7
-rw-r--r--src/fixup.c38
-rw-r--r--src/gpt.c13
-rw-r--r--src/header.c32
-rw-r--r--src/prototypes.h78
5 files changed, 126 insertions, 42 deletions
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 <james@fishsoup.dhs.org>,
# 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
@@ -195,3 +195,35 @@ headers_get (DISK * d)
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);