static void parse_args(int argc, char **argv, const char * const *usage_str, int *types, char **object, char **name, char **value, int min_nonopt_args) { int ret; char *type_str = NULL; int max_nonopt_args = 1; optind = 1; while (1) { int c = getopt(argc, argv, "t:"); if (c < 0) break; switch (c) { case 't': type_str = optarg; break; default: usage(usage_str); } } if (name) max_nonopt_args++; if (value) max_nonopt_args++; if (check_argc_min(argc - optind, min_nonopt_args) || check_argc_max(argc - optind, max_nonopt_args)) usage(usage_str); *types = 0; if (type_str) { if (!strcmp(type_str, "s") || !strcmp(type_str, "subvol")) { *types = prop_object_subvol; } else if (!strcmp(type_str, "f") || !strcmp(type_str, "filesystem")) { *types = prop_object_root; } else if (!strcmp(type_str, "i") || !strcmp(type_str, "inode")) { *types = prop_object_inode; } else if (!strcmp(type_str, "d") || !strcmp(type_str, "device")) { *types = prop_object_dev; } else { error("invalid object type: %s", type_str); usage(usage_str); } } *object = argv[optind++]; if (optind < argc) *name = argv[optind++]; if (optind < argc) *value = argv[optind++]; if (!*types) { ret = autodetect_object_types(*object, types); if (ret < 0) { error("failed to detect object type: %s", strerror(-ret)); usage(usage_str); } if (!*types) { error("object is not a btrfs object: %s", *object); usage(usage_str); } } }
static void parse_args(int argc, char **argv, const char * const *usage_str, int *types, char **object, char **name, char **value) { int ret; char *type_str = NULL; optind = 1; while (1) { int c = getopt(argc, argv, "t:"); if (c < 0) break; switch (c) { case 't': type_str = optarg; break; default: usage(usage_str); } } *types = 0; if (type_str) { if (!strcmp(type_str, "s") || !strcmp(type_str, "subvol")) { *types = prop_object_subvol; } else if (!strcmp(type_str, "f") || !strcmp(type_str, "filesystem")) { *types = prop_object_root; } else if (!strcmp(type_str, "i") || !strcmp(type_str, "inode")) { *types = prop_object_inode; } else if (!strcmp(type_str, "d") || !strcmp(type_str, "device")) { *types = prop_object_dev; } else { fprintf(stderr, "ERROR: invalid object type.\n"); usage(usage_str); } } if (object && optind < argc) *object = argv[optind++]; if (name && optind < argc) *name = argv[optind++]; if (value && optind < argc) *value = argv[optind++]; if (optind != argc) { fprintf(stderr, "ERROR: invalid arguments.\n"); usage(usage_str); } if (!*types && object && *object) { ret = autodetect_object_types(*object, types); if (ret < 0) { fprintf(stderr, "ERROR: failed to detect object type. %s\n", strerror(-ret)); usage(usage_str); } if (!*types) { fprintf(stderr, "ERROR: object is not a btrfs object.\n"); usage(usage_str); } } }