static int _cmd_device_usage(int fd, const char *path, unsigned unit_mode) { int i; int ret = 0; struct chunk_info *chunkinfo = NULL; struct device_info *devinfo = NULL; int chunkcount = 0; int devcount = 0; ret = load_chunk_and_device_info(fd, &chunkinfo, &chunkcount, &devinfo, &devcount); if (ret) goto out; for (i = 0; i < devcount; i++) { printf("%s, ID: %llu\n", devinfo[i].path, devinfo[i].devid); print_device_sizes(&devinfo[i], unit_mode); print_device_chunks(&devinfo[i], chunkinfo, chunkcount, unit_mode); printf("\n"); } out: free(devinfo); free(chunkinfo); return ret; }
int cmd_filesystem_usage(int argc, char **argv) { int ret = 0; unsigned unit_mode; int i; int more_than_one = 0; int tabular = 0; unit_mode = get_unit_mode_from_arg(&argc, argv, 1); optind = 1; while (1) { int c; c = getopt(argc, argv, "T"); if (c < 0) break; switch (c) { case 'T': tabular = 1; break; default: usage(cmd_filesystem_usage_usage); } } if (check_argc_min(argc - optind, 1)) usage(cmd_filesystem_usage_usage); for (i = optind; i < argc; i++) { int fd; DIR *dirstream = NULL; struct chunk_info *chunkinfo = NULL; struct device_info *devinfo = NULL; int chunkcount = 0; int devcount = 0; fd = open_file_or_dir(argv[i], &dirstream); if (fd < 0) { fprintf(stderr, "ERROR: can't access '%s'\n", argv[i]); ret = 1; goto out; } if (more_than_one) printf("\n"); ret = load_chunk_and_device_info(fd, &chunkinfo, &chunkcount, &devinfo, &devcount); if (ret) goto cleanup; ret = print_filesystem_usage_overall(fd, chunkinfo, chunkcount, devinfo, devcount, argv[i], unit_mode); if (ret) goto cleanup; printf("\n"); ret = print_filesystem_usage_by_chunk(fd, chunkinfo, chunkcount, devinfo, devcount, argv[i], unit_mode, tabular); cleanup: close_file_or_dir(fd, dirstream); free(chunkinfo); free(devinfo); if (ret) goto out; more_than_one = 1; } out: return !!ret; }