Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(697)

Unified Diff: src/platform/vboot_reference/utility/cgpt/cgpt_options.c

Issue 2374001: cgpt supports dev and add/delete/modify commands. (Closed) Base URL: ssh://git@chromiumos-git/chromeos
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
index dae4bce9111697448aeae458b9e5efc3b140ddc8..d657abc86e4563380f5280f45efca95803a5aee4 100644
--- a/src/platform/vboot_reference/utility/cgpt/cgpt_options.c
+++ b/src/platform/vboot_reference/utility/cgpt/cgpt_options.c
@@ -5,6 +5,7 @@
* Update GPT attribute bits.
*/
#include <getopt.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "cgpt.h"
@@ -16,6 +17,12 @@ int AssignTrue(const char *argument, void *pointer, void *integer) {
return CGPT_OK;
}
+/* Special validator. Copy string to 'parsed' with max 'valid_range' bytes. */
+int CopyString(const char *argument, void *max_len, void *dst) {
+ memcpy(dst, argument, (intptr_t)max_len);
+ 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) {
@@ -23,23 +30,27 @@ int InNumberRange(const char *argument, void *valid_range, void *parsed) {
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;
+ if (range) {
+ 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;
+ }
} else {
+ /* no range to check, assign integer. */
if (parsed) *(int*)parsed = number;
return CGPT_OK;
}
@@ -51,6 +62,7 @@ void ShowOptions(const struct option *opts,
int i;
for (i = 0; i < num; ++i) {
char buf[32];
+ if (!opts[i].name) break;
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);
@@ -76,6 +88,14 @@ int HandleOptions(const int argc,
break;
} else if (option == 0) {
/* option 'val' has been saved in 'flag'. We do nothing here. */
+ } else if (option == ':') {
+ printf("[ERROR] Missing parameter for option.\n");
+ ShowOptions(options, details, option_count);
+ return CGPT_FAILED;
+ } else if (option == '?') {
+ printf("[ERROR] unknown option name: %s\n", argv[optind - 1]);
+ ShowOptions(options, details, option_count);
+ return CGPT_FAILED;
} else {
/* Short option doesn't update 'index'. We search whole array to find out
* the corresponding long option. */
« no previous file with comments | « src/platform/vboot_reference/utility/cgpt/cgpt_dev.c ('k') | src/platform/vboot_reference/utility/cgpt/cgpt_repair.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698