Index: cgpt/cmd_repair.c |
diff --git a/cgpt/cmd_repair.c b/cgpt/cmd_repair.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aafdc9382d78bcf39150200178def6fe4f5df7e2 |
--- /dev/null |
+++ b/cgpt/cmd_repair.c |
@@ -0,0 +1,85 @@ |
+// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "cgpt.h" |
+ |
+#include <getopt.h> |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include <string.h> |
+ |
+#include "cgptlib_internal.h" |
+ |
+static void Usage(void) |
+{ |
+ printf("\nUsage: %s repair [OPTIONS] DRIVE\n\n" |
+ "Repair damaged GPT headers and tables.\n\n" |
+ "Options:\n" |
+ " -v Verbose\n" |
+ "\n", progname); |
+} |
+ |
+int cmd_repair(int argc, char *argv[]) { |
+ struct drive drive; |
+ int verbose = 0; |
+ |
+ int c; |
+ int errorcnt = 0; |
+ |
+ opterr = 0; // quiet, you |
+ while ((c=getopt(argc, argv, ":hv")) != -1) |
+ { |
+ switch (c) |
+ { |
+ case 'v': |
+ verbose++; |
+ break; |
+ |
+ case 'h': |
+ Usage(); |
+ return CGPT_OK; |
+ case '?': |
+ Error("unrecognized option: -%c\n", optopt); |
+ errorcnt++; |
+ break; |
+ case ':': |
+ Error("missing argument to -%c\n", optopt); |
+ errorcnt++; |
+ break; |
+ default: |
+ errorcnt++; |
+ break; |
+ } |
+ } |
+ if (errorcnt) |
+ { |
+ Usage(); |
+ return CGPT_FAILED; |
+ } |
+ |
+ if (optind >= argc) { |
+ Error("missing drive argument\n"); |
+ return CGPT_FAILED; |
+ } |
+ |
+ if (CGPT_OK != DriveOpen(argv[optind], &drive)) |
+ return CGPT_FAILED; |
+ |
+ int gpt_retval = GptSanityCheck(&drive.gpt); |
+ if (verbose) |
+ printf("GptSanityCheck() returned %d: %s\n", |
+ gpt_retval, GptError(gpt_retval)); |
+ |
+ GptRepair(&drive.gpt); |
+ if (drive.gpt.modified & GPT_MODIFIED_HEADER1) |
+ printf("Primary Header is updated.\n"); |
+ if (drive.gpt.modified & GPT_MODIFIED_ENTRIES1) |
+ printf("Primary Entries is updated.\n"); |
+ if (drive.gpt.modified & GPT_MODIFIED_ENTRIES2) |
+ printf("Secondary Entries is updated.\n"); |
+ if (drive.gpt.modified & GPT_MODIFIED_HEADER2) |
+ printf("Secondary Header is updated.\n"); |
+ |
+ return DriveClose(&drive, 1); |
+} |