static int cmd_list(int argc, char **argv) { int ret; char *object = NULL; int types = 0; if (check_argc_min(argc, 2) || check_argc_max(argc, 3)) usage(cmd_list_usage); parse_args(argc, argv, cmd_list_usage, &types, &object, NULL, NULL); if (!object) { fprintf(stderr, "ERROR: invalid arguments.\n"); usage(cmd_set_usage); } ret = dump_props(types, object, 1); return ret; }
static int cmd_set(int argc, char **argv) { int ret; char *object; char *name; char *value; int types = 0; if (check_argc_min(argc, 4) || check_argc_max(argc, 5)) usage(cmd_set_usage); parse_args(argc, argv, cmd_set_usage, &types, &object, &name, &value); if (!object || !name || !value) { fprintf(stderr, "ERROR: invalid arguments.\n"); usage(cmd_set_usage); } ret = setget_prop(types, object, name, value); return ret; }
static int cmd_get(int argc, char **argv) { int ret; char *object; char *name = NULL; int types = 0; if (check_argc_min(argc, 2) || check_argc_max(argc, 4)) usage(cmd_get_usage); parse_args(argc, argv, cmd_get_usage, &types, &object, &name, NULL); if (!object) { fprintf(stderr, "ERROR: invalid arguments.\n"); usage(cmd_set_usage); } if (name) ret = setget_prop(types, object, name, NULL); else ret = dump_props(types, object, 0); return ret; }
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 int cmd_device_scan(int argc, char **argv) { int i; int devstart; int all = 0; int ret = 0; optind = 0; while (1) { int c; static const struct option long_options[] = { { "all-devices", no_argument, NULL, 'd'}, { NULL, 0, NULL, 0} }; c = getopt_long(argc, argv, "d", long_options, NULL); if (c < 0) break; switch (c) { case 'd': all = 1; break; default: usage(cmd_device_scan_usage); } } devstart = optind; if (all && check_argc_max(argc - optind, 1)) usage(cmd_device_scan_usage); if (all || argc - optind == 0) { printf("Scanning for Btrfs filesystems\n"); ret = btrfs_scan_devices(); error_on(ret, "error %d while scanning", ret); ret = btrfs_register_all_devices(); error_on(ret, "there are %d errors while registering devices", ret); goto out; } for( i = devstart ; i < argc ; i++ ){ char *path; if (is_block_device(argv[i]) != 1) { error("not a block device: %s", argv[i]); ret = 1; goto out; } path = canonicalize_path(argv[i]); if (!path) { error("could not canonicalize path '%s': %m", argv[i]); ret = 1; goto out; } printf("Scanning for Btrfs filesystems in '%s'\n", path); if (btrfs_register_one_device(path) != 0) { ret = 1; free(path); goto out; } free(path); } out: return !!ret; }
static int cmd_scan_dev(int argc, char **argv) { int i, fd, e; int checklist = 1; int devstart = 1; if( argc > 1 && !strcmp(argv[1],"--all-devices")){ if (check_argc_max(argc, 2)) usage(cmd_scan_dev_usage); checklist = 0; devstart += 1; } if(argc<=devstart){ int ret; printf("Scanning for Btrfs filesystems\n"); if(checklist) ret = btrfs_scan_block_devices(1); else ret = btrfs_scan_one_dir("/dev", 1); if (ret){ fprintf(stderr, "ERROR: error %d while scanning\n", ret); return 18; } return 0; } fd = open("/dev/btrfs-control", O_RDWR); if (fd < 0) { perror("failed to open /dev/btrfs-control"); return 10; } for( i = devstart ; i < argc ; i++ ){ struct btrfs_ioctl_vol_args args; int ret; printf("Scanning for Btrfs filesystems in '%s'\n", argv[i]); strncpy(args.name, argv[i], BTRFS_PATH_NAME_MAX); args.name[BTRFS_PATH_NAME_MAX-1] = 0; /* * FIXME: which are the error code returned by this ioctl ? * it seems that is impossible to understand if there no is * a btrfs filesystem from an I/O error !!! */ ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args); e = errno; if( ret < 0 ){ close(fd); fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n", argv[i], strerror(e)); return 11; } } close(fd); return 0; }
static int cmd_scan_dev(int argc, char **argv) { int i; int devstart = 1; int all = 0; int ret = 0; optind = 1; while (1) { int c; static const struct option long_options[] = { { "all-devices", no_argument, NULL, 'd'}, { NULL, 0, NULL, 0} }; c = getopt_long(argc, argv, "d", long_options, NULL); if (c < 0) break; switch (c) { case 'd': all = 1; break; default: usage(cmd_scan_dev_usage); } } if (all && check_argc_max(argc, 2)) usage(cmd_scan_dev_usage); if (all || argc == 1) { printf("Scanning for Btrfs filesystems\n"); ret = btrfs_scan_lblkid(); if (ret) fprintf(stderr, "ERROR: error %d while scanning\n", ret); ret = btrfs_register_all_devices(); if (ret) fprintf(stderr, "ERROR: error %d while registering\n", ret); goto out; } for( i = devstart ; i < argc ; i++ ){ char *path; if (!is_block_device(argv[i])) { fprintf(stderr, "ERROR: %s is not a block device\n", argv[i]); ret = 1; goto out; } path = canonicalize_path(argv[i]); if (!path) { fprintf(stderr, "ERROR: Could not canonicalize path '%s': %s\n", argv[i], strerror(errno)); ret = 1; goto out; } printf("Scanning for Btrfs filesystems in '%s'\n", path); if (btrfs_register_one_device(path) != 0) { ret = 1; free(path); goto out; } free(path); } out: return !!ret; }