Index: src/platform/vboot_reference/utility/cgpt/cgpt_options.c |
diff --git a/src/platform/vboot_reference/utility/cgpt/cgpt_options.c b/src/platform/vboot_reference/utility/cgpt/cgpt_options.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1162ed831bb902d4d2bbf40477cc61b250f9ea8f |
--- /dev/null |
+++ b/src/platform/vboot_reference/utility/cgpt/cgpt_options.c |
@@ -0,0 +1,122 @@ |
+/* 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. |
+ * |
+ * Update GPT attribute bits. |
+ */ |
+#include <getopt.h> |
+#include <stdio.h> |
+#include <stdlib.h> |
+#include "cgpt.h" |
+#include "utility.h" |
+ |
+/* Special validator. Set 'integer' as 1 to indicate the option is present. */ |
+int AssignTrue(const char *argument, void *pointer, void *integer) { |
+ *(int*)integer = 1; |
+ return CGPT_OK; |
+} |
+ |
+/* Validator function. Returns 1 if 'argument' is between 'max' and 'min' |
+ * in 'valid_range'. */ |
+int InNumberRange(const char *argument, void *valid_range, void *parsed) { |
+ struct number_range *range = valid_range; |
+ char *endptr; |
+ int number; |
+ |
+ assert(valid_range); |
+ |
+ number = strtol(argument, &endptr, 10); |
+ if (*endptr) { |
+ printf("[ERROR] argument '%s' is not a number.\n", argument); |
+ return CGPT_FAILED; |
+ } |
+ |
+ if (number < range->min) { |
+ printf("[ERROR] argument is too small (min is %d, but you gave: %d).\n", |
+ range->min, number); |
+ return CGPT_FAILED; |
+ } else if (number > range->max) { |
+ printf("[ERROR] argument is too large (max is %d, but you gave: %d).\n", |
+ range->max, number); |
+ return CGPT_FAILED; |
+ } else { |
+ if (parsed) *(int*)parsed = number; |
+ return CGPT_OK; |
+ } |
+} |
+ |
+void ShowOptions(const struct option *opts, |
+ const struct option_details *details, |
+ const int num) { |
+ int i; |
+ for (i = 0; i < num; ++i) { |
+ char buf[32]; |
+ snprintf(buf, sizeof(buf), "--%s %s", opts[i].name, |
+ opts[i].has_arg ? "ARG" : ""); |
+ printf(" %-20s (-%c) %s\n", buf, opts[i].val, details[i].comment); |
+ } |
+} |
+ |
+int HandleOptions(const int argc, |
+ char *const *argv, |
+ const char *short_options, |
+ const int option_count, |
+ const struct option *options, |
+ const struct option_details *details) { |
+ while (1) { |
+ int index; |
+ int option; |
+ |
+ /* We assume every short option has an entry in long option (for validator). |
+ * So please add corresponding entry in attribute_options if you add short |
+ * option. */ |
+ index = NOT_INITED; |
+ option = getopt_long(argc, argv, short_options, options, &index); |
+ if (option == -1) { |
+ break; |
+ } else if (option == 0) { |
+ /* option 'val' has been saved in 'flag'. We do nothing here. */ |
+ } else { |
+ /* Short option doesn't update 'index'. We search whole array to find out |
+ * the corresponding long option. */ |
+ if (index == NOT_INITED) { |
+ for (index = 0; index < option_count; ++index) |
+ if (option == options[index].val) break; |
+ /* assumes every short option has a corresponding long option. */ |
+ assert(index < option_count); |
+ } |
+ assert(option == options[index].val); |
+ |
+ /* Calls validator if an argument is provided. */ |
+ if (details[index].validator && |
+ CGPT_OK != details[index].validator( |
+ optarg ? argv[optind - 1] : 0, |
+ details[index].valid_range, |
+ details[index].parsed)) { |
+ printf("[ERROR] The argument of '%s' is invalid.\n", |
+ options[index].name); |
+ return CGPT_FAILED; |
+ } |
+ } |
+ } |
+ return CGPT_OK; |
+} |
+ |
+int OpenDriveInLastArgument(const int argc, |
+ char *const *argv, |
+ struct drive *drive) { |
+ /* Then, we need a non-option argument. */ |
+ if (optind == (argc - 1)) { |
+ char *drive_path; |
+ drive_path = argv[optind]; |
+ if (CGPT_OK != DriveOpen(drive_path, drive)) { |
+ printf("[ERROR] DriveOpen(%s) error!\n", drive_path); |
+ return CGPT_FAILED; |
+ } |
+ } else { |
+ printf("[ERROR] One (and only one) non-option argument is required.\n"); |
+ return CGPT_FAILED; |
+ } |
+ |
+ return CGPT_OK; |
+} |